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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

解釋型語言和編譯型語言的區(qū)別

2019-11-09 16:13:50
字體:
供稿:網(wǎng)友
http://blog.csdn.net/zhu_xun/article/details/16921413解釋型語言和編譯型語言的區(qū)別首先,我們編程都是用的高級語言(寫匯編和機器語言的大牛們除外),計算機不能直接理解高級語言,只能理解和運行機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能運行高級語言所編寫的程序。     說到翻譯,其實翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。     用編譯型語言寫的程序執(zhí)行之前,需要一個專門的編譯過程,通過編譯系統(tǒng)(不僅僅只是通過編譯器,編譯器只是編譯系統(tǒng)的一部分)把高級語言翻譯成機器語言(具體翻譯過程可以參看下圖),把源高級程序編譯成為機器語言文件,比如windows下的exe文件。以后就可以直接運行而不需要編譯了,因為翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執(zhí)行效率高,但也不能一概而論,部分解釋型語言的解釋器通過在運行時動態(tài)優(yōu)化代碼,甚至能夠使解釋型語言的性能超過編譯型語言。       一個完整的編譯系統(tǒng)與 一個用C編寫的程序hello.c的編譯過程       解釋則不同,解釋型語言編寫的程序不需要編譯。解釋型語言在運行的時候才翻譯,比如VB語言,在執(zhí)行的時候,專門有一個解釋器能夠?qū)B語言翻譯成機器語言,每個語句都是執(zhí)行的時候才翻譯。這樣解釋型語言每執(zhí)行一次就要翻譯一次,效率比較低。     編譯型與解釋型,兩者各有利弊。前者由于程序執(zhí)行速度快,同等條件下對系統(tǒng)要求較低,因此像開發(fā)操作系統(tǒng)、大型應(yīng)用程序、數(shù)據(jù)庫系統(tǒng)等時都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是編譯語言,而一些網(wǎng)頁腳本、服務(wù)器腳本及輔助開發(fā)接口這樣的對速度要求不高、對不同系統(tǒng)平臺間的兼容性有一定要求的程序則通常使用解釋性語言,如javaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。     但隨著硬件的升級和設(shè)計思想的變革,編譯型和解釋型語言越來越笼統(tǒng),主要體現(xiàn)在一些新興的高級語言上,而解釋型語言的自身特點也使得編譯器廠商愿意花費更多成本來優(yōu)化解釋器,解釋型語言性能超過編譯型語言也是必然的。      說到這里,我們有必要說一下java與C#。解釋型語言和編譯型語言的區(qū)別      JAVA語言是一種編譯型-解釋型語言,同時具備編譯特性和解釋特性(其實,確切的說java就是解釋型語言,其所謂的編譯過程只是將.java文件編程成平臺無關(guān)的字節(jié)碼.class文件,并不是向C一樣編譯成可執(zhí)行的機器語言,在此請讀者注意Java中所謂的“編譯”和傳統(tǒng)的“編譯”的區(qū)別)。作為編譯型語言,JAVA程序要被統(tǒng)一編譯成字節(jié)碼文件——文件后綴是class。此種文件在java中又稱為類文件。java類文件不能再計算機上直接執(zhí)行,它需要被java虛擬機翻譯成本地的機器碼后才能執(zhí)行,而java虛擬機的翻譯過程則是解釋性的。java字節(jié)碼文件首先被加載到計算機內(nèi)存中,然后讀出一條指令,翻譯一條指令,執(zhí)行一條指令,該過程被稱為java語言的解釋執(zhí)行,是由java虛擬機完成的。而在現(xiàn)實中,java開發(fā)工具JDK提供了兩個很重要的命令來完成上面的編譯和解釋(翻譯)過程。兩個命令分別是javac.exe和java.exe,前者加載java類文件,并逐步對字節(jié)碼文件進行編譯,而另一個命令則對應(yīng)了java語言的解釋(javac.exe)過程。在次序上,java語言是要先進行編譯的過程,接著解釋執(zhí)行。   C#語言是編譯型語言,但其“編譯”過程比較特殊,具體說明如下:   C#程序在第一次運行的時候,會依賴其.NET Frameworker平臺,編譯成IL中間碼),然后由JIT compiler翻譯成本地的機器碼執(zhí)行。從第二次在運行相同的程序,則不需要再執(zhí)行以上編譯和翻譯過程,而是直接運行第一次翻譯成的機器碼。所以對于C#來說,通常第一次運行時間會很長,但從第二次開始,程序的執(zhí)行時間會快很多。   那么,C#為什么要進行兩次“編譯”呢?其實,微軟想通過動態(tài)編譯(由JIT compiler工具實現(xiàn))來實現(xiàn)其程序運行的最優(yōu)化。如果代碼在運行前進行動態(tài)編譯運行,那么JIT compiler可以很智能的根據(jù)你本地機器的硬件條件來進行優(yōu)化,比如使用更好的register,機器指令等等,而不是像原來那樣,build一份程序針對所有硬件的機器跑,沒有充分利用各個機器的條件。   另外,還有我們經(jīng)常用到的腳本語言,比如Javascript、Shell等語言都是腳本語言,本質(zhì)上來說,腳本語言就是解釋型語言。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 方正县| 安吉县| 齐齐哈尔市| 泗阳县| 安徽省| 四子王旗| 延吉市| 贵南县| 宁远县| 桐乡市| 盐边县| 兰考县| 社会| 珲春市| 郯城县| 库尔勒市| 黎川县| 保靖县| 淮安市| 永昌县| 孝感市| 宁津县| 余姚市| 紫阳县| 麻江县| 会同县| 元朗区| 济南市| 江津市| 南宫市| 江津市| 永寿县| 五河县| 万宁市| 枣强县| 长春市| 平和县| 开鲁县| 山丹县| 梅州市| 上犹县|