java Java能不能像C語言不通過JVM虛擬機(jī)直接編譯成二進(jìn)制機(jī)器碼,讓計(jì)算機(jī)直接運(yùn)行?
Java能不能像C語言不通過JVM虛擬機(jī)直接編譯成二進(jìn)制機(jī)器碼,讓計(jì)算機(jī)直接運(yùn)行?從語言設(shè)計(jì)的角度看,可以通過重新設(shè)計(jì)編譯器來實(shí)現(xiàn),但從工程實(shí)踐的角度看是不可行的。首先,Java語言最大的特點(diǎn)是跨平臺(tái)
Java能不能像C語言不通過JVM虛擬機(jī)直接編譯成二進(jìn)制機(jī)器碼,讓計(jì)算機(jī)直接運(yùn)行?
從語言設(shè)計(jì)的角度看,可以通過重新設(shè)計(jì)編譯器來實(shí)現(xiàn),但從工程實(shí)踐的角度看是不可行的。
首先,Java語言最大的特點(diǎn)是跨平臺(tái)的可移植性,一次開發(fā),一次編譯,多平臺(tái)執(zhí)行。這個(gè)特性是通過JVM(Java虛擬機(jī))實(shí)現(xiàn)的。如果重寫編譯器直接編譯成C語言這樣的可執(zhí)行程序,它將失去跨平臺(tái)特性。
其次,Java語言在設(shè)計(jì)之初就被設(shè)計(jì)成嚴(yán)重依賴JRE(Java運(yùn)行時(shí)環(huán)境)的語言。一些語言設(shè)計(jì)缺陷必須依靠JVM來解決,比如GC(垃圾收集)。我們知道Java語言沒有內(nèi)存恢復(fù)能力,所以我們不得不依賴JVM。在工程實(shí)踐中,如果軟件不能進(jìn)行內(nèi)存恢復(fù),后果將是災(zāi)難性的。
第三,Java語言是面向?qū)ο蟮?,不同于同樣面向?qū)ο蟮腃語言,Java還具有動(dòng)態(tài)特性。
它允許程序動(dòng)態(tài)加載運(yùn)行過程中所需的類,這在面向?qū)ο缶幊讨惺荂語言無法實(shí)現(xiàn)的。在C語言編程過程中,每次向類中添加實(shí)例變量或成員函數(shù)時(shí),引用該類的所有子類都必須重新編譯,否則會(huì)導(dǎo)致程序崩潰。Java從以下幾個(gè)方面采取措施來解決這個(gè)問題。java編譯器沒有將對實(shí)例變量和成員函數(shù)的引用編譯成數(shù)值引用,而是將符號(hào)引用信息保存在字節(jié)碼中并傳遞給解釋器,解釋器在動(dòng)態(tài)連接類后將符號(hào)引用信息轉(zhuǎn)換成數(shù)值偏移量。這樣,在內(nèi)存中生成的對象不會(huì)在編譯期間確定,而是延遲到運(yùn)行時(shí)并由解釋器確定。這樣,更新類中的變量和方法不會(huì)影響現(xiàn)有代碼。在解釋和執(zhí)行字節(jié)碼時(shí),只有在出現(xiàn)新名稱時(shí)才執(zhí)行一次符號(hào)信息的搜索和轉(zhuǎn)換,然后才能全速執(zhí)行代碼。在運(yùn)行時(shí)確定引用的好處是可以使用更新的類,而不用擔(dān)心影響原始代碼。如果程序連接到網(wǎng)絡(luò)中另一個(gè)系統(tǒng)中的類,則該類的所有者可以自由更新該類,而不會(huì)使引用該類的任何程序崩潰。這完全取決于JRE。
以上幾點(diǎn)決定了Java不能像C語言那樣直接編譯成機(jī)器代碼。當(dāng)然,還有其他一些因素,但我認(rèn)為以上幾點(diǎn)是最重要的。
怎么啟動(dòng)JAVA里的JVM?
方法如下:
1。虛擬機(jī)的啟動(dòng)入口位于share/tools/launcher/Java的main中。C.
2。配置JVM裝載環(huán)境。
3. 解析虛擬機(jī)參數(shù)。
4. 設(shè)置線程堆棧大小。
5. 執(zhí)行Java main。
如何配置JVM加載環(huán)境:1。Java代碼執(zhí)行需要一個(gè)JVM環(huán)境。JVM環(huán)境的創(chuàng)建包括兩部分:第一部分是創(chuàng)建JVM環(huán)境,第二部分是創(chuàng)建JVM環(huán)境JVM.dll對于文件的搜索和加載,讓我們看看JRE搜索環(huán)境和系統(tǒng)版本的一部分jvm.cfg文件文件的代碼。
說明:1)getjrepath()查找當(dāng)前JRE環(huán)境的路徑。
2)Readknownvms()讀取JRE路徑libarch(CPU體系結(jié)構(gòu))JVM.cfg文件其中,arch(CPU架構(gòu))是通過getarch方法得到的。窗口中有三種情況:AMD64、IA64和i386。
3)Checkjvmtype確定當(dāng)前JVM類型。首先判斷是否由-J、-xxaltjvm=或-J-xxaltjvm=參數(shù)指定。如果沒有,請閱讀JVM.cfg文件文件中配置的第一種類型。
4)Getjvmpath查找相應(yīng)的JVM.dll文件。
java調(diào)用DLL動(dòng)態(tài)庫?
JNI是一個(gè)動(dòng)態(tài)鏈接庫(DLL),通過Java調(diào)用C/C。所以我想到了。類-->。H-->dll是不正確的,這也違背了JNI的初衷。DLL是由C/C生成的。以前的一個(gè)項(xiàng)目使用java調(diào)用C/cdll,所以我對此很熟悉。該DLL由C程序員編寫,可以在microsoftvisualc6.0編輯器中生成。然后Java程序員使用JNI調(diào)用DLL中實(shí)現(xiàn)的函數(shù)(方法)。