計算機語言:編譯型/解釋型、動態語言/靜態語言、強類型語言/弱類型語言

1、編譯型和解釋型

編譯型

編譯

編譯型和匯編語言是一樣的:也是有一個負責翻譯的程序來對源代碼進行轉換,生成相對應的可執行代碼。
這個過程說得專業一點,就稱為編譯(Compile),而負責編譯的程序自然就稱為編譯器(Compiler)

鏈接

只有一個源文件的情況
如果程序代碼都包含在一個源文件中,那么通常編譯之后就會直接生成一個可執行文件,就可以直接運行了。

多個源文件
但對于一個比較復雜的項目,為了方便管理,通常代碼分散在各個源文件中,作為不同的模塊來組織。
這時編譯各個文件時就會生成目標文件(Object file)而不是前面說的可執行文件。一般一個源文件的編譯都會對應一個目標文件。
這些目標文件里的內容基本上已經是可執行代碼了,但由于只是整個項目的一部分,所以我們還不能直接運行。待所有的源文件的編譯完成我那個,就可以最后把這些半成品的目標文件“打包”成一個可執行文件了,此過程好像是把包含可執行代碼的目標文件連接裝配起來,所以又稱為鏈接(Link),而負責鏈接的程序叫鏈接程序(Linker)
鏈接程序除了鏈接目標文件外,可能還有各種資源,像圖標文件啊、聲音文件啊什么的,還要負責去除目標文件之間的冗余重復代碼,等等。鏈接完成之后就可以得到可執行文件了。

解釋型

“編譯”和“解釋”的確都有“翻譯”的意思,區別在于翻譯的時機安排不大一樣。
打個比方:假如你打算閱讀一本外文書,而你不知道這門外語,那么你可以找一名翻譯,給他足夠的時間讓他從頭到尾把整本書翻譯好,然后把書的母語版交給你閱讀;
或者,你也立刻讓這名翻譯輔助你閱讀,讓他一句一句給你翻譯,如果你想往回看某個章節,他也得重新給你翻譯。

兩種方式,前者就相當于我們剛才所說的編譯型:一次把所有的代碼轉換成機器語言,然后寫成可執行文件;
而后者就相當于我們要說的解釋型:在程序運行的前一刻,還只有源程序而沒有可執行程序;而程序每執行到源程序的某一條指令,則會有一個稱之為解釋程序的外殼程序將源代碼轉換成二進制代碼以供執行,總言之,就是不斷地解釋、執行、解釋、執行……所以,解釋型程序是離不開解釋程序的。

像早期的BASIC就是一門經典的解釋型語言,要執行BASIC程序,就得進入BASIC環境,然后才能加載程序源文件、運行。解釋型程序中,由于程序總是以源代碼的形式出現,因此只要有相應的解釋器,移植幾乎不成問題。

編譯型程序雖然源代碼也可以移植,但前提是必須針對不同的系統分別進行編譯,對于復雜的工程來說,的確是一件不小的時間消耗,況且很可能一些細節的地方還是要修改源代碼。

而且,解釋型程序省卻了編譯的步驟,修改調試也非常方便,編輯完畢之后即可立即運行,不必像編譯型程序一樣每次進行小小改動都要耐心等待漫長的Compiling…Linking…這樣的編譯鏈接過程。

不過凡事有利有弊,由于解釋型程序是將編譯的過程放到執行過程中,這就決定了解釋型程序注定要比編譯型慢上一大截,像幾百倍的速度差距也是不足為奇的。

編譯型與解釋型,兩者各有利弊

前者由于程序執行速度快,同等條件下對系統要求較低,因此像開發操作系統、大型應用程序、數據庫系統等時都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可視為編譯語言
而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不同系統平臺間的兼容性有一定要求的程序則通常使用解釋性語言,如Java、JavaScript、VBScript、Perl、Python等等。

新興的語言都有把兩者折衷起來的趨勢

Java語言雖然比較接近解釋型語言的特征,但在執行之前已經預先進行一次預編譯,生成的代碼是介于機器碼和Java源代碼之間的中介代碼,運行的時候則由JVM(Java的虛擬機平臺,可視為解釋器)解釋執行。它既保留了源代碼的高抽象、可移植的特點,又已經完成了對源代碼的大部分預編譯工作,所以執行起來比“純解釋型”程序要快許多。

VB6(或者以前版本)、C#這樣的語言,雖然表面上看生成的是.exe可執行程序文件,但VB6編譯之后實際生成的也是一種中介碼,只不過編譯器在前面安插了一段自動調用某個外部解釋器的代碼(該解釋程序獨立于用戶編寫的程序,存放于系統的某個DLL文件中,所有以VB6編譯生成的可執行程序都要用到它),以解釋執行實際的程序體。

C#(以及其它.net的語言編譯器)則是生成.net目標代碼,實際執行時則由.net解釋系統(就像JVM一樣,也是一個虛擬機平臺)進行執行。
當然.net目標代碼已經相當“低級”,比較接近機器語言了,所以仍將其視為編譯語言,而且其可移植程度也沒有Java號稱的這么強大,Java號稱是“一次編譯,到處執行”,而.net則是“一次編碼,到處編譯”。
隨著設計技術與硬件的不斷發展,編譯型與解釋型兩種方式的界限正在不斷變得模糊。

2、動態語言和靜態語言

通常所說的動態語言、靜態語言是指動態類型語言和靜態類型語言。

(1)動態類型語言

動態類型語言是指在運行期間才去做數據類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變量指定數據類型,該語言會在你第一次賦值給變量時,在內部將數據類型記錄下來。Python和Ruby就是一種典型的動態類型語言,其他的各種腳本語言如VBScript也多少屬于動態類型語言。

(2)靜態類型語言

靜態類型語言與動態類型語言剛好相反,它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明所有變量的數據類型,C/C++是靜態類型語言的典型代表,其他的靜態類型語言還有C#、JAVA等。

3、強類型定義語言和弱類型定義語言

(1)強類型定義語言

強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那么它就永遠是這個數據類型了。
舉個例子:如果你定義了一個整型變量a,那么程序根本不可能將a當作字符串類型處理。強類型定義語言是類型安全的語言。

(2)弱類型定義語言

數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變量可以賦不同數據類型的值。

強類型定義語言在速度上可能略遜色于弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容