java編譯器的作用就是「編譯」,即將java源代碼編譯成中間代碼位元組碼文件。
編譯時,編譯器(java.exe)首先讀入 java 源代碼,然後進行語法檢查,如果出現問題就終止編譯。語法檢查通過後,生成中間代碼即位元組碼。
位元組碼文件是一種和任何具體機器環境及操作系統環境無關的中間代碼,它是一種二進制文件,是Java源文件由Java編譯器編譯後生成的目標代碼文件。
編譯器編譯生成與平台無關的位元組碼文件後,提供給 JVM (Java虛擬機)執行。
B. java緙栬瘧鍣ㄦ槸浠涔
Java緙栬瘧鍣ㄦ槸涓縐嶅皢Java婧愪唬鐮佺紪璇戜負Java瀛楄妭鐮佺殑紼嬪簭銆侸ava婧愪唬鐮佹槸浠.java鏂囦歡鐨勫艦寮忓瓨鍌ㄧ殑錛岃孞ava瀛楄妭鐮佹槸涓縐嶇敱Java鉶氭嫙鏈猴紙JVM錛夊彲璇嗗埆鐨勪簩榪涘埗鏍煎紡銆傜紪璇戝櫒灝嗘簮浠g爜鏂囦歡杞鎹涓哄瓧鑺傜爜鏂囦歡錛岀劧鍚庡彲浠ュ湪Java鉶氭嫙鏈轟笂榪愯岃繖浜涘瓧鑺傜爜鏂囦歡銆
Java緙栬瘧鍣ㄩ氬父鏄疛ava寮鍙戝伐鍏峰寘錛圝DK錛夌殑涓閮ㄥ垎錛屾偍鍙浠ラ氳繃瀹夎匤DK鏉ヨ幏寰桱ava緙栬瘧鍣ㄣ侸DK榪樺寘鎷琂ava鉶氭嫙鏈猴紙JVM錛夊拰鍏朵粬Java寮鍙戝伐鍏鳳紝渚嬪傝皟璇曞櫒銆佹枃妗g敓鎴愬櫒絳夌瓑銆傚湪鍛戒護琛屼笅錛屾偍鍙浠ヤ嬌鐢╦avac鍛戒護鏉ヨ皟鐢↗ava緙栬瘧鍣錛屽皢婧愪唬鐮佹枃浠剁紪璇戜負瀛楄妭鐮佹枃浠躲備互涓嬫槸涓浜涘父鐢ㄧ殑Java緙栬瘧鍣ㄨ蔣浠躲
1銆丱racle JDK錛歄racle Java Development Kit鏄涓嬈劇敱Oracle鎻愪緵鐨凧ava寮鍙戝伐鍏峰寘錛屽寘鎷琂ava緙栬瘧鍣錛坖avac錛夊拰鍏朵粬寮鍙戝伐鍏楓
2銆丱penJDK錛歄penJDK鏄涓涓鍏嶈垂鐨凧ava寮鍙戝伐鍏峰寘錛屾槸Oracle JDK鐨勫紑婧愭浛浠e搧銆傚畠鍖呭惈Java緙栬瘧鍣ㄥ拰鍏朵粬寮鍙戝伐鍏楓
3銆丒clipse錛欵clipse鏄涓涓嫻佽岀殑Java闆嗘垚寮鍙戠幆澧冿紙IDE錛夛紝鍖呮嫭Java緙栬瘧鍣ㄥ拰鍏朵粬寮鍙戝伐鍏楓傚畠榪樻敮鎸佸叾浠栫紪紼嬭璦鐨勫紑鍙戙
4銆丯etBeans錛歂etBeans鏄鍙︿竴涓嫻佽岀殑Java IDE錛屽寘鎷琂ava緙栬瘧鍣ㄥ拰鍏朵粬寮鍙戝伐鍏楓傚畠涔熸敮鎸佸叾浠栫紪紼嬭璦鐨勫紑鍙戙
5銆両ntelliJ IDEA錛欼ntelliJ IDEA鏄涓嬈炬祦琛岀殑Java IDE錛屽寘鎷琂ava緙栬瘧鍣ㄥ拰鍏朵粬寮鍙戝伐鍏楓傚畠榪樻敮鎸佸叾浠栫紪紼嬭璦鐨勫紑鍙戙
6銆丣Creator錛欽Creator鏄涓嬈綣ava IDE錛屽寘鎷琂ava緙栬瘧鍣ㄥ拰鍏朵粬寮鍙戝伐鍏楓傚畠涔熸湁涓涓鍏嶈垂鐗堟湰鍜屼竴涓浠樿垂鐗堟湰銆
7銆丅lueJ錛欱lueJ鏄涓嬈句笓涓哄垵瀛﹁呰捐$殑Java IDE錛屽寘鎷琂ava緙栬瘧鍣ㄥ拰鍏朵粬寮鍙戝伐鍏楓
闄や簡榪欎簺錛岃繕鏈夎稿氬叾浠栫殑Java緙栬瘧鍣ㄥ拰闆嗘垚寮鍙戠幆澧冨彲渚涢夋嫨錛屼綘鍙浠ユ牴鎹鑷宸辯殑闇奼傚拰鍠滃ソ閫夋嫨閫傚悎鑷宸辯殑宸ュ叿銆
C. javac是什麼
Java編譯器(javac)是一個用於將Java源代碼編譯成位元組碼的程序。
拓展知識:
Java開發工具包(JDK)中的一部分,用於將Java源代碼(.java文件)轉換為Java虛擬機(JVM)可以執行的位元組碼。
當您編寫Java源代碼時,您需要使用一個文本編輯器或集成開發環境(IDE)來編寫代碼。當您保存文件時,文件將保存為.java文件。然後,您可以使用javac編譯器將這些.java文件編譯成位元組碼文件,這些文件可以在Java虛擬機上運行。
在編譯過程中,javac編譯器將讀取.java文件,將其轉換為位元組碼文件(通常為.class文件),這些文件包含Java代碼的機器代碼表示。這些位元組碼文件可以在任何支持Java虛擬機的平台上運行,而無需安裝或理解特定的本地代碼。此外,javac編譯器還具有一些其他功能,例如錯誤檢查和優化。它會在編譯過程中檢查代碼中的錯誤,並嘗試優化位元組碼以減少內存使用和提高執行速度。
總的來說,javac編譯器是Java開發過程中不可或缺的一部分,它可以將Java源代碼轉換為可在Java虛擬機上運行的位元組碼,並提供錯誤檢查和優化功能,以提高開發效率和代碼質量。
D. 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()函數。