java編譯可執行
Java虛擬機(JVM)是可運行Java代碼的假想計算機。只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證經過編譯的任何Java代碼能夠在該系統上運行。本文首先簡要介紹從Java文件的編譯到最終執行的過程,隨後對JVM規格描述作一說明。
一.Java源文件的編譯、下載、解釋和執行
Java應用程序的開發周期包括編譯、下載、解釋和執行幾個部分。Java編譯程序將Java源程序翻譯為JVM可執行代碼?位元組碼。這一編譯過程同C/C++的編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬體平台運行而產生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將這些符號引用信息保留在位元組碼中,由解釋器在運行過程中創立內存布局,然後再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性。
運行JVM位元組碼的工作是由解釋器來完成的。解釋執行過程分三部進行:代碼的裝入、代碼的校驗和代碼的執行。裝入代碼的工作由"類裝載器"(class loader)完成。類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。當類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本台計算機上的所有類都在同一地址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入了運行程序需要的所有類後,解釋器便可確定整個可執行程序的內存布局。解釋器為符號引用同特定的地址空間建立對應關系及查詢表。通過在這一階段確定代碼的內存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問。
隨後,被裝入的代碼由位元組碼校驗器進行檢查。校驗器可發現操作數棧溢出,非法數據類型轉化等多種錯誤。通過校驗後,代碼便開始執行了。
Java位元組碼的執行有兩種方式:
1.即時編譯方式:解釋器先將位元組碼編譯成機器碼,然後再執行該機器碼。
2.解釋執行方式:解釋器通過每次解釋並執行一小段代碼來完成Java位元組碼程 序的所有操作。
通常採用的是第二種方法。由於JVM規格描述具有足夠的靈活性,這使得將位元組碼翻譯為機器代碼的工作
具有較高的效率。對於那些對運行速度要求較高的應用程序,解釋器可將Java位元組碼即時編譯為機器碼,從而很好地保證了Java代碼的可移植性和高性能。
二.JVM規格描述
JVM的設計目標是提供一個基於抽象規格描述的計算機模型,為解釋程序開發人員提很好的靈活性,同時也確保Java代碼可在符合該規范的任何系統上運行。JVM對其實現的某些方面給出了具體的定義,特別是對Java可執行代碼,即位元組碼(Bytecode)的格式給出了明確的規格。這一規格包括操作碼和操作數的語法和數值、標識符的數值表示方式、以及Java類文件中的Java對象、常量緩沖池在JVM的存儲映象。這些定義為JVM解釋器開發人員提供了所需的信息和開發環境。Java的設計者希望給開發人員以隨心所欲使用Java的自由。
JVM定義了控制Java代碼解釋執行和具體實現的五種規格,它們是:
JVM指令系統
JVM寄存器
JVM棧結構
JVM碎片回收堆
JVM存儲區
2.1JVM指令系統
JVM指令系統同其他計算機的指令系統極其相似。Java指令也是由 操作碼和操作數兩部分組成。操作碼為8位二進制數,操作數進緊隨在操作碼的後面,其長度根據需要而不同。操作碼用於指定一條指令操作的性質(在這里我們採用匯編符號的形式進行說明),如iload表示從存儲器中裝入一個整數,anewarray表示為一個新數組分配空間,iand表示兩個整數的"與",ret用於流程式控制制,表示從對某一方法的調用中返回。當長度大於8位時,操作數被分為兩個以上位元組存放。JVM採用了"big endian"的編碼方式來處理這種情況,即高位bits存放在低位元組中。這同 Motorola及其他的RISC CPU採用的編碼方式是一致的,而與Intel採用的"little endian "的編碼方式即低位bits存放在低位位元組的方法不同。
Java指令系統是以Java語言的實現為目的設計的,其中包含了用於調用方法和監視多先程系統的指令。Java的8位操作碼的長度使得JVM最多有256種指令,目前已使用了160多種操作碼。
2.2JVM指令系統
所有的CPU均包含用於保存系統狀態和處理器所需信息的寄存器組。如果虛擬機定義較多的寄存器,便可以從中得到更多的信息而不必對棧或內存進行訪問,這有利於提高運行速度。然而,如果虛擬機中的寄存器比實際CPU的寄存器多,在實現虛擬機時就會佔用處理器大量的時間來用常規存儲器模擬寄存器,這反而會降低虛擬機的效率。針對這種情況,JVM只設置了4個最為常用的寄存器。它們是:
pc程序計數器
optop操作數棧頂指針
frame當前執行環境指針
vars指向當前執行環境中第一個局部變數的指針
所有寄存器均為32位。pc用於記錄程序的執行。optop,frame和vars用於記錄指向Java棧區的指針。
2.3JVM棧結構
作為基於棧結構的計算機,Java棧是JVM存儲信息的主要方法。當JVM得到一個Java位元組碼應用程序後,便為該代碼中一個類的每一個方法創建一個棧框架,以保存該方法的狀態信息。每個棧框架包括以下三類信息:
局部變數
執行環境
操作數棧
局部變數用於存儲一個類的方法中所用到的局部變數。vars寄存器指向該變數表中的第一個局部變數。
執行環境用於保存解釋器對Java位元組碼進行解釋過程中所需的信息。它們是:上次調用的方法、局部變數指針和操作數棧的棧頂和棧底指針。執行環境是一個執行一個方法的控制中心。例如:如果解釋器要執行iadd(整數加法),首先要從frame寄存器中找到當前執行環境,而後便從執行環境中找到操作數棧,從棧頂彈出兩個整數進行加法運算,最後將結果壓入棧頂。
操作數棧用於存儲運算所需操作數及運算的結果。
2.4JVM碎片回收堆
Java類的實例所需的存儲空間是在堆上分配的。解釋器具體承擔為類實例分配空間的工作。解釋器在為一個實例分配完存儲空間後,便開始記錄對該實例所佔用的內存區域的使用。一旦對象使用完畢,便將其回收到堆中。
在Java語言中,除了new語句外沒有其他方法為一對象申請和釋放內存。對內存進行釋放和回收的工作是由Java運行系統承擔的。這允許Java運行系統的設計者自己決定碎片回收的方法。在SUN公司開發的Java解釋器和Hot Java環境中,碎片回收用後台線程的方式來執行。這不但為運行系統提供了良好的性能,而且使程序設計人員擺脫了自己控制內存使用的風險。
2.5JVM存儲區
JVM有兩類存儲區:常量緩沖池和方法區。常量緩沖池用於存儲類名稱、方法和欄位名稱以及串常量。方法區則用於存儲Java方法的位元組碼。對於這兩種存儲區域具體實現方式在JVM規格中沒有明確規定。這使得Java應用程序的存儲布局必須在運行過程中確定,依賴於具體平台的實現方式。
JVM是為Java位元組碼定義的一種獨立於具體平台的規格描述,是Java平台獨立性的基礎。目前的JVM還存在一些限制和不足,有待於進一步的完善,但無論如何,JVM的思想是成功的。
對比分析:如果把Java原程序想像成我們的C++原程序,Java原程序編譯後生成的位元組碼就相當於C++原程序編譯後的80x86的機器碼(二進製程序文件),JVM虛擬機相當於80x86計算機系統,Java解釋器相當於80x86CPU。在80x86CPU上運行的是機器碼,在Java解釋器上運行的是Java位元組碼。
Java解釋器相當於運行Java位元組碼的「CPU」,但該「CPU」不是通過硬體實現的,而是用軟體實現的。Java解釋器實際上就是特定的平台下的一個應用程序。只要實現了特定平台下的解釋器程序,Java位元組碼就能通過解釋器程序在該平台下運行,這是Java跨平台的根本。當前,並不是在所有的平台下都有相應Java解釋器程序,這也是Java並不能在所有的平台下都能運行的原因,它只能在已實現了Java解釋器程序的平台下運行。
㈡ java代碼編譯為可執行程序
如果打包成jar的話很好辦 如果是exe的話就有點麻煩了 可參考:
想要把java生成可執行文件需要第三方軟體的支持,不過在沒有安裝JDK的機器上是不可能運行JAVA程序的,哪怕是編譯成為exe文件。
將Java應用程序本地編譯為EXE的幾種方法(推薦使用JOVE和JET)
1. 從www.towerj.com獲得一個TowerJ編譯器,該編譯器可以將你的CLASS文件
編譯成EXE文件。
2. 利用微軟的SDK-Java 4.0所提供的jexegen.exe創建EXE文件,這個軟體可以
從微軟的網站免費下載,地址如下:
http://www.microsoft.com/java/download/dl_sdk40.htm
jexegen的語法如下:
jexegen /OUT:exe_file_name
/MAIN:main_class_name main_class_file_name.class
[and other classes]
3. Visual Cafe提供了一個能夠創建EXE文件的本地編譯器。你需要安裝該光碟
上提供的EXE組件。
4. 使用InstallAnywhere創建安裝盤。
5. 使用IBM AlphaWorks提供的一個高性能Java編譯器,該編譯器可以從下面的
地址獲得:
http://www.alphaworks.ibm.com/tech/hpc
6. JET是一個優秀的Java語言本地編譯器。該編譯器可以從這個網站獲得一個
測試版本:
http://www.excelsior-usa.com/jet.html
7. Instantiations公司的JOVE
http://www.instantiations.com/jove/...ejovesystem.htm
JOVE公司合並了以前的SuperCede,一個優秀的本地編譯器,現在SuperCede
已經不復存在了。
8. JToEXE
Bravo Zulu Consulting, Inc開發的一款本地編譯器,本來可以從該公司的
網頁上免費下載的,不過目前在該公司的主頁上找不到了。
㈢ 老鳥看過來:java怎麼編譯成可執行性文件
方法很多:
1。用jdk1.2的javac 命令
如:javac a.java
2.用JBuilder3.5,VJ++6.0,VisualCafe,VAJ等均可。
㈣ JAVA中編譯後執行
你的意思是在UitraEdit設置java環境嗎?如果你沒有設置java環境,請看下面,如果設置好了,你就在高級->工具配置->輸出(第三個選項),把顯示dos窗口選上,那裡有很多選項,自己選擇喜歡的模式
=======================================
一、定義「編譯java程序」
1、打開 高級->工具配置
2、我們先定義編譯java的工具,先點擊「插入」 按鈕
3、在「菜單項目名稱」上輸入「編譯java程序」(顯示在菜單上的名稱)
4、在「命令行」里輸入javac %n%e(%n為文件名不帶擴展名,%e為擴展名)
5、在「工作目錄」上填 %p (表示文件所在目錄)
(工具欄點陣圖可以不添)
6、切換到「輸出」項;
7、選擇「輸入到列表框」,表示講命令的結果輸出到列表框上
選擇「捕獲輸出」復選框,表示講執行的結果捕獲,輸出到下面的輸出框里
8、點擊「應用」按鈕,「確定」,一個編譯的菜單就做好了
二、定義「運行java程序」
同樣的方法可以做運行java的菜單:
1、在「菜單項目名稱」上輸入「運行java程序」(顯示在菜單上的名稱)
2、在「命令行」里輸入 java %n (%n為文件名不帶擴展名,%e為擴展名)
3、在「工作目錄」上填 %p (表示文件所在目錄)
餘下步驟和第一個配置一樣
現在你打開高級菜單,發現最下面多了二個你剛才定義的菜單;
三、定義「編譯+運行java程序」
根據上面的方法,你還可以定義其他工具比如定義一個把編譯和運行合在一起的菜單
做一個批處理的文件run.bat,放在C:盤(其他地方也可以),內容如下
javac %1.java
java %1
然後按照上面的方法:
1、在「菜單項目名稱」上輸入「編譯+運行java程序」(顯示在菜單上的名稱)
2、在「命令行」里輸入 C:\run.bat %n (%n為文件名不帶擴展名,%e為擴展名)
3、在「工作目錄」上填 %p (表示文件所在目錄)
餘下步驟和第一個配置一樣
四、自動完成
一般軟體上都有自動完成的功能,UltraEdit也可以實現
1、先講java中的關鍵字,各種類名,方法等名稱寫到一個文本文件上,以如下方式
class
private
public
...
然後存為文本,命名為「java.txt」
2、選擇菜單「高級->配置」,
在「編輯器」中選中「自動完成」,把「自動顯示自動完成對話框」打上勾
選中「自動換行/製表符設置」,在「自動完成文件」中選擇存放文本java.txt的路徑
這是當你在輸入單詞的時候會自動彈出你所自定義的單詞,很方便
㈤ Java如何編譯執行
ava的一次編譯到處運行是說,編譯好的可執行程序,只要將它放到裝有JVM的機器上就可以運行,你要在你的C,D,F盤的任何目錄下都能javac...,java...哪就要保證這些地方有*.java文件和*.java文件所編譯的*.class文件,你在DOC下只要找到相應的路勁就可以了,當然首先你是按了JVM的
㈥ java編譯成可執行文件的問題
package com.yab.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DButil {
private static String username="scott";
private static String password="tiger";
private static String url="jdbc:oracle:thin:@192.168.1.100:1521:ORCL";
static{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConn(){
Connection conn=null;
try {
System.out.println("--------------");
conn=DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("沒有獲得連接");
}
return conn;
}
public static void free(Connection conn,PreparedStatement ps,ResultSet rs){
try{
if(rs!=null) rs.close();
if(ps!=null) ps.close();
if(conn!=null) conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException {
DButil db=new DButil();
Connection conn=DriverManager.getConnection(url, username, password);
if(conn!=null){
System.out.println("連接成功");
}
System.out.println(db.getConn().getClass().getName());
}
}
㈦ java怎樣編譯成可執行程序exe
1. 從www.towerj.com獲得一個TowerJ編譯器,該編譯器可以將你的CLASS文件編譯成EXE文件。
2. 利用微軟的SDK-Java 4.0所提供的jexegen.exe創建EXE文件,這個軟體可以從微軟的網站免費下載,地址如下:http://www.microsoft.com/java/download/dl_sdk40.htm
jexegen的語法如下:
jexegen /OUT:exe_file_name
/MAIN:main_class_name main_class_file_name.class
[and other classes]
3. Visual Cafe提供了一個能夠創建EXE文件的本地編譯器。你需要安裝該光碟上提供的EXE組件。
4. 使用InstallAnywhere創建安裝盤。
5. 使用IBM AlphaWorks提供的一個高性能Java編譯器,該編譯器可以從下面的地址獲得:
http://www.alphaworks.ibm.com/tech/hpc
6. JET是一個優秀的Java語言本地編譯器。該編譯器可以從這個網站獲得一個測試版本:
http://www.excelsior-usa.com/jet.html
7. Instantiations公司的JOVE
http://www.instantiations.com/jove/...ejovesystem.htm
JOVE公司合並了以前的SuperCede,一個優秀的本地編譯器,現在SuperCede已經不復存在了。
8. JToEXE
Bravo Zulu Consulting, Inc開發的一款本地編譯器,本來可以從該公司的網頁上免費下載的,不過目前在該公司的主頁上找不到了。
㈧ Java程序也可以編譯成可執行陳旭,直接運行嗎
java並不可以直接編譯成.exe的可執行程序, java編譯結果是.class位元組碼文件,位元組碼文件的執行必須依賴於jvm
就算使用 jar2exe之類的工具將java程序打包成了.exe可執行程序, 如果在一台沒有裝有jvm的電腦上,依舊是無法運行的