解釋編譯 動靜態 強弱型語言

1.解釋編譯 :

計算機程序設計語言通常分爲機器語言、彙編語言和高級語言三類。高級語言需要翻譯成機器語言才能執行,而翻譯的方式分爲兩種,一種是編譯,另一種是解釋。下面會總結編譯和解釋的區別。

編譯的過程和解釋的過程

編譯(Compile)的過程是把整個源程序代碼翻譯成另外一種代碼,翻譯後的代碼等待被執行或者被優化等等,發生在運行之前,產物是另一份代碼。

解釋(Interpret)的過程是把源程序代碼一行一行的讀懂,然後一行一行的執行,發生在運行時,產物是運行結果。

所以,編譯和解釋的輸入都是源程序代碼(有可能是源碼,字節碼等等),但是輸出是不同的。有一張圖可以比較形象的解釋他們的區別:

 

編譯器和解釋器

編譯器(Compiler)是一種計算機程序,它會將某種編程語言編寫的源代碼(原始語言)轉換成另一種編程語言(目標語言),其實就是完成上文中所說的編譯的過程。主要目的是將便於人編寫、閱讀維護的高級計算機語言所編寫的源代碼程序,翻譯爲計算機能運行的機器語言程序。

解釋器(interpreter),是一種計算機程序,能夠把解釋型語言解釋執行。其實就是執行解釋的過程。

編譯器和解釋器都是計算機程序,只不過他們運行不同過程。

編譯型語言和解釋型語言

語言一般只會定義其抽象語義,而不會強制性要求採用某種實現方式。理論上,任何編程語言都可以是編譯型或解釋型的。但是,會根據其主流實現方式來把語言分爲“編譯型語言”和“解釋型語言”。

C/C++/C#等都是編譯型語言。以C語言爲例,源代碼被編譯之後生成中間文件(.o和.obj),然後用鏈接器和彙編器生成機器碼,也就是一系列基本操作的序列,機器碼最後被執行生成最終動作。

Lisp/R/Python等都是解釋型語言。

其實許多編程語言同時採用編譯器與解釋器來實現,這就包括Python,Java等,先將代碼編譯爲字節碼,在運行時再進行解釋。所謂“解釋型語言”並不是不用編譯,而只是不需要用戶顯式去使用編譯器得到可執行代碼而已 。

總結

編譯和解釋的過程上的區別:編譯是將源程序翻譯成可執行的目標代碼,翻譯與執行是分開的;而解釋是對源程序的翻譯與執行一次性完成,不生成可存儲的目標代碼。

編譯和解釋結果上的區別:編譯的話會把輸入的源程序翻譯生成爲目標代碼,並存下來(無論是存在內存中還是磁盤上),後續執行可以複用;解釋的話則是把源程序中的指令逐條解釋,不生成也不存下目標代碼,後續執行沒有多少可複用的信息。

 

2.動靜態    強弱型語言

概念:

動態語言:是運行時才確定數據類型的語言,變量在使用之前無需申明類型,通常變量的值是被賦值的那個值的類型。比如Php、Asp、JavaScript、Python、Perl等等。

var s ="hello";
var i = 0;
var b = true;

靜態語言:是編譯時變量的數據類型就可以確定的語言,大多數靜態語言要求在使用變量之前必須聲明數據類型。比如Java、C、C++、C#等。

String s="hello"; //String 類型的變量
boolean b=true; //boolean 類型的變量
int i=0; //int 類型的變量

弱類型語言是數據類型可以被忽略的語言。一個變量可以賦不同數據類型的值。一個變量的類型是由其上下文決定的,效率更高。
強類型語言是必須強制確定數據類型的語言,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那麼它就永遠是這種數據類型,不允許隱式的類型轉換。一個變量的類型是申明的時候就已經確定的,更安全。

區別:

靜態語言由於強制聲明數據類型,讓開發工具(IDE)對代碼有很強的判斷能力,在實現複雜的業務邏輯和開發大型商業系統、以及那些聲明週期很長的應用中,開發者可以依託強大的IDE來更高效、更安全地開發。
動態語言思維不受約束,可以任意發揮,把更多的精力放在產品本身上;集中思考業務邏輯實現,思考過程就是實現過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章