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