国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C/C++屬于靜態鏈接,JAVA屬于運行時動態鏈接

2019-11-10 21:18:31
字體:
來源:轉載
供稿:網友
 java和C/C++的區別有很多,你知道Java程序需要鏈接嗎?

Java 語言與C/C++ 在語法上很相似,但是由于它是伴隨著互連網絡成長起來的,為了迎合異構主機構架以及支持安全的軟件分發,逐步發展成為一個語言平臺。

我們知道如果用C/C++寫程序,從源代碼到可執行程序需要經歷編譯,鏈接兩個步驟。但是用Java語言寫程序則不同,你只需要將你的源代碼編譯成字節碼 就可以了,字節代碼通過Java虛機來運行。要概括上面兩種語言的這一不同之處,我們可以說Java是通過Java解釋來執行的,C/C++是通過編譯來 執行的。

如果你用C/C++來寫一個通訊程序完成Intel/Windows 到Sparcs/Solarise兩臺計算機之間的通訊功能,你需要經歷痛苦編譯和鏈接。也許你會使用標準C編譯器,使用其提供的最基本的C語言API, 再加上若干的#if...#define 寫出一個在上面兩個計算機都可以編譯鏈接成功的源程序,這意味著所有標準C語言API之上的工作都要由你一個人來完成。也許你會在標準的C語言API上使 用C++來封裝一個精巧的類庫,或者使用別人的類庫來屏蔽底層OS API的不同,并在這樣類庫之上寫出一個漂亮的源程序。

可見使用C/C++要完成上面的工作可不容易,你除了要為你寫的源文件和不同的編譯器的語法規則做斗爭,將我們的源程序編譯成為中間件文件;同時還需要為 你所使用第三方的類庫文件與鏈接程序做斗爭如果你源程序和第三方庫不是采用一個編譯器編譯出來的,哪你還得找到第三方類庫的源代碼,或者是換一個編譯器來 編譯你的源程序。基本上要經歷好幾輪的修改、編譯、鏈接,才能讓的源程序進入運行狀態。

如果你采用Java來寫這個程序則輕松了很多。你可以使用JDK所提供的API,也可以使用第三方的Java類庫。你的源程序可以很輕松的編譯成為字節 碼,這些只是一個一個的程序塊,如果想讓程序運行起來,需要Java虛機在運行時動態加載(RunTime Link)其所需要的資源,使之成為一個可以運行的程序。Java語言這樣做的好處顯而易見,首先源程序只需要編譯一次,成為獨立與具體機器指令的中間文 件,然后這些字節碼就可以在任意的標準的Java虛機上運行。

說了這些眾所周知的C/C++與Java語言在編譯運行的不同,對我們有什么啟發呢?筆者先后做過C/C++和Java的開發,開始并沒有領會其中的真 諦,直到前幾個月深入接觸到了class loader才真正體會到Java這一RunTime Link 的神奇魅力,可以讓我們完成很多靜態鏈接所無法完成的任務。

如果我們拿到了一個C/C++編譯完成的可執行程序,如果這個時候你想為這個可執行程序添加一些可以擴展的功能,如果你這時沒有源代碼,那你等待你的可能 是處理復雜的匯編指令,或者采用鉤子函數去替換可執行程序調用的API。如果你拿到的是JAVA程序,你可以像修改C/C++可執行程序一樣修改Java 的目標文件字節碼的方式來實現,但是我們可以通過一種更優美的方式來修改或者擴這Java程序的運行時的特性。

因為Java是解釋執行的,其目標文件字節碼是一個非常小的,并且是很容易理解的指令集合。Java虛機為了能夠讓這些短小的指令集合能夠運行起來,這就 是我們前面提到的C/C++程序鏈接(Link)所做的事情(鏈接就是要把程序運行所需要API以及相關的資源文件,都重新進行組織生成可以單獨運行的程 序)。由于Java程序是運行在Java虛機之上的,自然的Java程序在運行過程中所需要加載的類文件或其他的資源文件都需要Java虛機來負責加載, 并提供管理和調用。寫過Java程序的朋友也許經常會遇到這樣一個問題吧,就是Exception in thread "main" java.lang.NoClassDefFoundError:XXX,一般遇到這個問題的時候,基本上都是因為你的CLASSPATH沒有設置正確, 設置正確的CLASSPATH,就可以解決這個問題,但是有多少人會去深究其中的奧秘呢?

首先我們來究其原因,我們知道Java虛機在運行的過程中是通過class loader動態讀取Class文件,并將加載后Class的字節碼交付給Java虛機執行。這個很容易理解,Java虛機不可能預先知道任意一個 Java程序需要的Class文件,所以Java虛機需要通過某種手段來實現Class文件的正常讀寫,上面的Exception就是Java虛機在加載 Class文件出現的。

知道這一原理之后,我們如果想在不修改源程序的基礎上擴展Java第三方程序庫的功能,或者說我們想改變某個Class文件的指令結構。這樣我們就很容易 得實現讓第三方程序實現一個特定的接口,或者是暴露給我一個原來只能內部調用的方法。我們可以通過調用一些第三方的程序庫(BCEL,ASM等)來實現對 應字節碼的修改,通過class loader實現將修改后的字節碼提交給JVM,然后鏈接執行。

總結:C/C++屬于靜態鏈接,JAVA屬于運行時動態鏈接。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 凌云县| 滨海县| 榆社县| 尉氏县| 独山县| 五原县| 阿坝| 明溪县| 安陆市| 长乐市| 普兰县| 福鼎市| 深圳市| 措勤县| 阿拉尔市| 宁海县| 广德县| 绍兴县| 龙门县| 阳高县| 海兴县| 西安市| 当阳市| 长春市| 永德县| 梁山县| 巴林左旗| 康乐县| 五常市| 台山市| 板桥市| 涟水县| 三门县| 太湖县| 长子县| 宝丰县| 湾仔区| 阆中市| 呼玛县| 五指山市| 密云县|