java在編譯和運行時做了什麼
⑴ 簡述java程序從編寫到運行的基本步驟,並說明Java的基本工作原理
Java編譯原理:
Java 虛擬機(JVM)是可運行Java 代碼的假想計算機。只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證經過編譯的任何Java代碼能夠在該系統上運行。
一.Java源文件的編譯、下載 、解釋和執行
Java應用程序的開發周期包括編譯、下載 、解釋和執行幾個部分。Java編譯程序將Java源程序翻譯為JVM可執行代碼?位元組碼。這一編譯過程同C/C++ 的編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬體平台運行而產生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將這些符號引用信息保留在位元組碼中,由解釋器在運行過程中創立內存布局,然後再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全 性。
運行JVM位元組碼的工作是由解釋器來完成的。解釋執行過程分三部進行:代碼的裝入、代碼的校驗和代碼的執行。裝入代碼的工作由"類裝載器"(class loader)完成。類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。當類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本台計算機上的所有類都在同一地址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入了運行程序需要的所有類後,解釋器便可確定整個可執行程序的內存布局。解釋器為符號引用同特定的地址空間建立對應關系及查詢表。通過在這一階段確定代碼的內存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問。
隨後,被裝入的代碼由位元組碼校驗器進行檢查。校驗器可發現操作數棧溢出,非法數據類型轉化等多種錯誤。通過校驗後,代碼便開始執行了。
Java位元組碼的執行有兩種方式:
1.即時編譯方式:解釋器先將位元組碼編譯成機器碼,然後再執行該機器碼。
2.解釋執行方式:解釋器通過每次解釋並執行一小段代碼來完成Java位元組碼程 序的所有操作。
通常採用的是第二種方法。由於JVM規格描述具有足夠的靈活性,這使得將位元組碼翻譯為機器代碼的工作
具有較高的效率。對於那些對運行速度要求較高的應用程序,解釋器可將Java位元組碼即時編譯為機器碼,從而很好地保證了Java代碼的可移植性和高性能。
⑵ 說說java文件編譯時都做了哪些事情
java有反射機制,執行編譯時會嘗試找到JRE安裝所在目錄,然後找到jvm.dll,接著啟動JVM進行初始化動作,產生3個類載入器,用來將所用到的類文件載入到內存中,會自動導入java.lang下的類文件和你想導入的類文件,查看你的代碼中是否有未處理的可控式異常,JVM會查看你寫的代碼是否符合語法,.JVM會將你所寫的java文件編譯為與系統平台無關的位元組碼文件。
⑶ java程序運行的五個步驟
1、Java程序從源文件創建到程序運行要經過兩大步驟:1、源文件由編譯器編譯成位元組碼(ByteCode) 2、位元組碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經過JVM的解釋運行,所以說Java被稱為半解釋語言("semi-interpreted" language)。
第一步(編譯): 創建完源文件之後,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點像make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報「cant find symbol」的錯誤。
編譯後的位元組碼文件格式主要分為兩部分:常量池和方法位元組碼。常量池記錄的是代碼出現過的所有token(類名,成員變數名等等)以及符號引用(方法引用,成員變數引用等等);方法位元組碼放的是類中各個方法的位元組碼。
第二步(運行):java類運行的過程大概可分為兩個過程:1、類的載入 2、類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去載入該類。也就是說,JVM並不是在一開始就把一個程序就所有的類都載入到內存中,而是到不得不用的時候才把它載入進來,而且只載入一次。
2、下面是程序運行的詳細步驟:
在編譯好java程序得到Main.class文件後,在命令行上敲java Main。系統就會啟動一個jvm進程,jvm進程從classpath路徑中找到一個名為Main.class的二進制文件,將Main的類信息載入到運行時數據區的方法區內,這個過程叫做Main類的載入。
然後JVM找到Main的主函數入口,開始執行main函數。
main函數的第一條命令是Animal animal = new Animal("Puppy");就是讓JVM創建一個Animal對象,但是這時候方法區中沒有Animal類的信息,所以JVM馬上載入Animal類,把Animal類的類型信息放到方法區中。
載入完Animal類之後,Java虛擬機做的第一件事情就是在堆區中為一個新的Animal實例分配內存, 然後調用構造函數初始化Animal實例,這個Animal實例持有著指向方法區的Animal類的類型信息(其中包含有方法表,java動態綁定的底層實現)的引用。
當使用animal.printName()的時候,JVM根據animal引用找到Animal對象,然後根據Animal對象持有的引用定位到方法區中Animal類的類型信息的方法表,獲得printName()函數的位元組碼的地址。
開始運行printName()函數。
⑷ 請問java程序在編譯和運行時有什麼區別,系統分別都會做什麼
Java程序的編譯
使用命令: javac *.java
編譯時,會將寫的.java文件(高級語言),生成相應的位元組碼文件.class文件(二進制代碼)
Java程序的執行
使用命令:java *
流程: 載入到 -- 連接 ---- 初始化 ...
運行時,首先會由將相應的.class文件,載入到內存中,並驗證.class文件的有效性,將相應類的Class載入到內存中,並對類中的靜態變數進行初始化操作,然後就由 主 類開始執行
具體的可以看一下 JVM 類載入過程,以及jVM的內存分配機制
⑸ 運行JAVA軟體需要做什麼
java環境變數配置2009-08-27 11:49windows xp下配置JDK環境變數:
1.安裝JDK,安裝過程中可以自定義安裝目錄等信息,例如我們選擇安裝目錄為D:\java\jdk1.5.0_08;
2.安裝完成後,右擊「我的電腦」,點擊「屬性」;
3.選擇「高級」選項卡,點擊「環境變數」;
4.在「系統變數」中,設置3項屬性,JAVA_HOME,PATH,CLASSPATH(大小寫無所謂),若已存在則點擊「編輯」,不存在則點擊「新建」;
5.JAVA_HOME指明JDK安裝路徑,就是剛才安裝時所選擇的路徑D:\java\jdk1.5.0_08,此路徑下包括lib,bin,jre等文件夾(此變數最好設置,因為以後運行tomcat,eclipse等都需要依*此變數);
Path使得系統可以在任何路徑下識別java命令,設為:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
CLASSPATH為java載入類(class or lib)路徑,只有類在classpath中,java命令才能識別,設為:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar (要加.表示當前路徑)
%JAVA_HOME%就是引用前面指定的JAVA_HOME;
6.「開始」->;「運行」,鍵入「cmd」;
7.鍵入命令「java -version」,「java」,「javac」幾個命令,出現畫面,說明環境變數配置成功;
8.好了,打完收工。下面開始你的第一個java程序吧。
下面講講java幾個環境變數的含義和linux下的配置方法:
通常,我們需要設置三個環境變數:JAVA_HOME、PATH 和 CLASSPATH。
JAVA_HOME:該環境變數的值就是 Java 所在的目錄,一些 Java 版的軟體和一些 Java 的工具需要用到該變數,設置 PATH 和 CLASSPATH 的時候,也可以使用該變數以方便設置。
PATH:指定一個路徑列表,用於搜索可執行文件的。執行一個可執行文件時,如果該文件不能在當前路徑下找到,則依次尋找 PATH 中的每一個路徑,直至找到。或者找完 PATH 中的路徑也不能找到,則報錯。Java 的編譯命令 (javac),執行命令 (java) 和一些工具命令 (javadoc, jdb 等) 都在其安裝路徑下的 bin 目錄中。因此我們應該將該路徑添加到 PATH 變數中。
CLASSPATH:也指定一個路徑列表,是用於搜索 Java 編譯或者運行時需要用到的類。在 CLASSPATH 列表中除了可以包含路徑外,還可以包含 .jar 文件。Java 查找類時會把這個 .jar 文件當作一個目錄來進行查找。通常,我們需要把 JDK 安裝路徑下的 jre\lib\rt.jar (Linux: jre/lib/rt.jar) 包含在 CLASSPATH 中。
PATH 和 CLASSPATH 都指定路徑列表,列表中的各項 (即各個路徑) 之間使用分隔符分隔。在 Windows 下,分隔符是分號 (;),而在 Linux 下,分隔符是冒號 (:)。
下面分別說明三個環境變數在 Windows 和 Linux 下如何設置,不過在此之前,我們需要做個假設。假設 JDK 在 Windows 下的安裝路徑是 C:\jdk\,在 Linux 下的安裝路徑是 /usr/local/jdk/。那麼,安裝後的 JDK 至少會包括如下內容:
C:\jdk (/usr/local/jdk)
|-- bin
|-- demo
|-- include
|-- jre
| |-- bin
| `-- lib
`-- lib
***** 在 Windows 下設置
Windows 下使用 set 命令設置環境變數,為了使每一次啟動計算機都設置這些環境變數,應該在系統盤根目錄下的 autoexec.bat 文件中進行設置,如:
set JAVA_HOME=C:\jdk
set PATH=%JAVA_HOME%\bin;C:\Windows;C:\Windows\Command
set CLASSPATH=%JAVA_HOME%\jre\lib\rt.jar;.
有些版本的 Windows 不能用 %變數名% 來替換環境變數的內容,那麼就只好直接寫 C:\jdk 而不是 %JAVA_HOME% 了。另外,C:\Windows 和 C:\Windows\Command 是 Windows 會自動加入路徑的,所以可以從設置中去掉。如果在 autoexec.bat 中已經設置了 PATH,那隻需要將 %JAVA_HOME%\bin 加到原來設置 PATH 的那條語句中就行了。
CLASSPATH 也可以根據需要設置或者加入其它的路徑,比如你想把自己寫的一些類放在 C:\java 中,就可以把 C:\java 也添加到 CLASSPATH 中去,set CLASSPATH=%JAVA_HOME%\jre\lib\rt.jar;C:\java;.。
注意,在 CLASSPATH 中包含了一個「當前目錄 (.)」。包含了該目錄後,就可以到任意目錄下去執行需要用到該目錄下某個類的 Java 程序,即使該路徑並未包含在 CLASSPATH 中也可以。原因很簡單:雖然沒有明確的把該路徑包含在 CLASSPATH 中,但 CLASSPATH 中的 「.」 在此時就代表了該路徑,如:
假設在 C:\java 目錄下有可運行的類 HelloJava.class,那麼
C:\> set CLASSPATH=C:\jdk\jre\lib\rt.jar;. // 設置 CLASSPATH 環境變數,注意最後有一個 「.」
C:\> cd java // 轉到 C:\java 目錄
C:\java> java HelloJava // 運行 HelloJava
Hello, Java. // 運行結果
C:\java> _
**** 在 Linux 下設置
Linux 下使用「變數名=變數值」設置變數,並使用 export 命令將其導出為環境變數。為了使每一次登錄都自動設置好這些變數,你需要在 ~/.bash_profile 里或者 ~./bashrc 里進行設置,如
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:.
設置 PATH 時用的 $JAVA_HOME 是指替換變數 JAVA_HOME 的值到 $JAVA_HOME 所在位置。如上句實際就是 export PATH=/usr/local/jdk/bin:$PATH。這句中 $PATH 也是同樣的作用,不過這里的 PATH 是指以前設置的 PATH 變數的值,而非本次設置 PATH 變數的值。
注意,在 CLASSPATH 中包含了一個「當前目錄 (.)」。包含了該目錄後,就可以到任意目錄下去執行需要用到該目錄下某個類的 Java 程序,即使該路徑並未包含在 CLASSPATH 中也可以。原因很簡單:雖然沒有明確的把該路徑包含在 CLASSPATH 中,但 CLASSPATH 中的 「.」 在此時就代表了該路徑,例如
假設在 /home/fancy/java 目錄下有可運行的類 HelloJava.class,那麼
[fancy@matrix fancy]$ export CLASSPATH=/usr/local/jdk/jre/lib/rt.jar:. // 設置 CLASSPATH,注意最後的「.」
[fancy@matrix fancy]$ cd ~/java // 轉到 /home/fancy/java
[fancy@matrix java]$ pwd // 顯示當前目錄
/home/fancy/java // 當前目錄是 /home/fancy/java
[fancy@matrix java]$ java HelloJava // 運行 HelloJava
Hello, Java // 運行結果
[fancy@matrix java]$ _
⑹ java的 編譯和運行
你知道Javac會把 .java 文件編譯成 .class 文件然後運行 對吧
你想想如果在如果編譯的時候不去讀取 .java 文件的內容 怎麼可能編譯成 .class文件呢
在編譯時證是運行了.java文件的內容發現了你這個程序有語法錯誤就會編譯失敗 就沒有必要繼續編譯成 .class文件
當然有些錯誤是可以逃避編譯器的。
你也知道Java分 運行時error和編譯時的error!
個人理解。不保證100%正確性!
⑺ java 編譯 運行
編譯就是把源程序編譯成位元組碼,這個過程編譯器會做一些詞法分析、語義分析的工作,這時候如果有關鍵詞拼寫錯誤、缺少括弧之類的各種簡單語法錯誤就會馬上被發現。
Java 通過虛擬機運行 class 文件,這個就比較復雜了,包含代碼載入、校驗、執行三個步驟。載入是由 class loader 做的,它會載入程序運行所需要的所有代碼,包括導入的類。然後虛擬機會給所有的代碼分配好內存,這時候會檢查是否包含非法法訪問,例如 Applet 程序不允許訪問本地文件系統,如果訪問了就會在此時被檢查出來。
接下來是校驗器對代碼進行校驗,操作數棧溢出、數據類型錯誤、非法類型轉換之類的非運行時錯誤會被挖掘出來。
最後就是執行階段,運行時錯誤就在程序運行的過程中被拋出,例如找不到文件異常、線程中斷異常等等,這些是動態異常,或者稱為不確定的異常,可能會拋出也可能不會,因此只能在運行過程中檢測。
⑻ 編寫和運行Java程序的步驟是什麼每一步的結果是什麼在JDK中,Java語言的編譯命令是什麼急需答案啊。
步驟:1、編寫java源文件:可用記事本等相關的文本文檔寫源代碼,也可使用java開發集成環境,如:JCreator LE JCreator pro eclipse Myeclipse 等相關的集成開發工具。
2、編譯java源文件生成class文件:手寫的源文件(即不使用開發工具所寫的),在DOS中使用javac 完整的java源文件命來編譯使其生成class文件。注意:寫源文件時,一定要注意存檔。修改源文件也是一樣需要存檔。
3、運行class文件:在dos中輸入所寫的源文件名字(不需要寫後綴名-即.class 嚴格區分大小寫 編譯不需要區分大小寫)。
如使用開發工具所寫:請參照相對應的手冊來點擊開發工具中的按鈕來編譯運行。
java語言的編譯命令就是javac 在dos中輸入javac可見到這個命令的詳細介紹。其他命令也是一樣。至於每一步的結果是什麼,在dos中運行請關注dos運行後的變化。在開發工具中運行請關注開發工具中的改變。不同的程序會產生不同的結果。如:
public class Hello
{
public static void main(String[] args)
{
System.out.println("Hello java");
}
}
這段代碼,在dos中運行後會出現hello java這句話。用開發工具所寫 ,請關注開發工具的界面。
以上內容純屬手打--panzer。希望對你有所幫助。如有疑問:開eml我:[email protected]!
⑼ Java編譯運行過程
首先把源文件編譯成位元組碼文件,即類文件;然後由解釋器負責解釋執行類文件。
程序的運行需要一定的硬體和軟體環境,這個環境被稱為平台。
window2000
,
linux
,
solaris
和
macos
都是人們所熟知的一些平台,大部分平台可以看作操作平台和硬體的集合,而
java
平台不同,它運行於其
java
虛擬機
java
應用程序介面是指經過編譯的,可在程序中直接使用的
java
應用程序介面是指經過編譯的,可在程序中直接使用的
java
代碼標准庫。
java
虛擬機負責解釋和執行
java
程序。
⑽ java在編譯階段完成哪些工作請詳細點....謝謝
首先會判斷是否存在編譯錯誤…
然後編譯源代碼到位元組碼…
然後對位元組碼做優化估計…
當然編譯的時候也要鏈接它所關聯的類…比如父類介面等等…
如果使用的javahot編譯器可能不會一次性將所有源代碼編譯為位元組碼…
這種編譯器會在每次運行的時候編譯這次需要的部分並且做優化不需要的部分不去編譯…
推薦你一本底層的書看看 叫 深入java虛擬機 很底層的書看了你就明白啦 這不是一句2句能說清楚的…