1. 程式人生 > 其它 >解釋型語言和解釋型語言

解釋型語言和解釋型語言

參考:什麼是解釋型語言?

侵刪

筆記:

  1. 解釋和編譯都只是程式從原始碼到執行時的一種動作,跟語言本身無關。C語言,Java,Python等等這些程式語言本質上是一種抽象的定義,包括但不限於符號,語法,輸入,輸出的定義等等。編譯、解釋並不是語言的性質,而是執行時實現的性質。可以作這麼一個簡單的區分:編譯型,被實際執行的是你程式碼對應的機器碼;而解釋型,被實際執行的是直譯器自身的機器碼,由直譯器來執行你程式碼的某種中間表示(AST、位元組碼)。
  2. 解釋型語言(英語:Interpreted language),是一種程式語言。這種型別的程式語言,會將程式碼一句一句直接執行,不需要像編譯語言(Compiled language)一樣,在執行前
    經過編譯器先行編譯為機器碼,之後再執行。這種程式語言需要利用直譯器,在執行期,動態將程式碼逐句解釋(interpret)為機器碼,或是已經預先編譯為機器碼的的子程式,之後再執行。(wiki)
  3. 理論上,任何程式語言都可以是編譯式,或解釋型的。它們之間的區別,僅與程式的應用有關。許多程式語言同時採用編譯器與直譯器來實現,其中包括Lisp,Pascal,C,BASIC 與 Python。JAVA及C#採用混合方式,先將程式碼編譯(編譯形)為bytecode,在執行時再進行解釋(解釋型)。
  4. 編譯和解釋本質是等價的,給出一個語言的直譯器,可以幾乎不花力氣地自動得到一個高效能的編譯器。接4,PyPy(/ˈpaɪpaɪ/)是一種Python程式語言實現,可用於替代CPython(它是標準實現)。PyPy通常執行得比CPython更快,因為PyPy是一種即時編譯器,
    而CPython是一種直譯器。多數Python程式碼可以很好的執行在PyPy之上,除非程式碼依賴於CPython擴充套件,它們在運行於PyPy的時候,要麼不工作要麼招致一些開銷。(直譯器到編譯器的實現手段)PyPy在內部使用叫做元跟蹤的技術,它將直譯器變換成跟蹤即時編譯器。
    因為解釋通常比編譯器要容易寫,但執行得更慢,這種技術可以更容易的產生出程式語言的高效實現。PyPy的元跟蹤工具鏈叫做RPython。(wiki)

參考:編譯型語言

侵刪

筆記:

  1. 編譯型語言(compiled language)指通過編譯器(compiler)將原始碼編譯為機器碼(machine code)後執行的語言,例如C、C++;解釋型語言(interpreted language)指由直譯器(interpreter)直接執行,不需要編譯成機器語言,例如 PHP、JavaScript。
  2. Java 是編譯型語言還是解釋型語言:

    • 為了兼顧跨平臺和執行速度,Java 原始碼首先會被編譯為位元組碼檔案(.class),但並非是機器語言,而是需要在 JVM 上執行,而 .class 檔案在 JVM 上是解釋執行的。所以 Java 兼具編譯型語言和解釋型語言的特點。
    • 為了更高的效率,JVM 還引入了 JIT(just-in-time,即時編譯)編譯器,在 Java 程式執行時進一步編譯,轉換成高度優化的機器程式碼。
    • 現在的很多語言以及不能以編譯型語言和解釋型語言來區分了,因為很多語言都兼具編譯型語言和解釋型語言的特點。
  3. 待補充

參考:程式的編譯與解釋有什麼區別?

侵刪

筆記:

  1. 個人理解(1):在執行前,解釋型語言也要編譯,只不過編譯成中間碼(反正不是機器碼,所以計算機還看不懂中間碼),所以在執行時,由直譯器負責解釋中間碼(這樣計算機就看得懂被解釋後的中間碼了)(Java的話執行時還可以用JIT編譯器編譯成機器碼)。
  2. 個人理解(2):在執行前,編譯型語言直接被編譯成機器碼,這樣計算機就看懂了,所以在執行時,直接執行機器碼就行,因為計算機看得懂機器碼。
  3. 一個(編譯型)是翻譯成machine code,machine去解釋,一個(解釋型語言)是翻譯成bytecode,virtual machine去解釋
  4. 傳統意義上的所謂編譯與解釋,區別在於程式碼是在什麼時候被翻譯成目標CPU的指令。
  5. 對 C 語言或者其他編譯型語言來說,編譯生成了目標檔案,而這個目標檔案是針對特定的 CPU 體系的,為 ARM 生成的目標檔案,不能被用於 MIPS 的 CPU。這段程式碼在編譯過程中就已經被翻譯成了目標 CPU 指令,所以,如果這個程式需要在另外一種 CPU 上面執行,這個程式碼就必須重新編譯
  6. 對於各種非編譯型語言(例如python/java)來說,同樣也可能存在某種編譯過程,但他們編譯生成的通常是一種『平臺無關』的中間程式碼,這種程式碼一般不是針對特定的 CPU 平臺,他們是在執行過程中才被翻譯成目標 CPU 指令的,因而,在 ARM CPU 上能執行,換到 MIPS 也能執行,換到 X86 也能執行,不需要重新對原始碼進行編譯。
  7. 為什麼會有虛擬機器的存在?這個答案也很簡單了,因為那些非編譯型語言生成的並不是目標平臺的程式碼,而是某種中間程式碼。而能夠執行這種中間程式碼的機器並不廣泛存在,所以我們在每個不同的平臺中用軟體模擬出這個假想平臺的虛擬機器,這個虛擬機器執行這種中間程式碼,而虛擬機器負責把程式碼轉換成最終的目標平臺上的指令。
  8. 編譯型語言在編譯過程中生成目標平臺的指令,解釋型語言在執行過程中才生成目標平臺的指令。 虛擬機器的任務是在執行過程中將中間程式碼翻譯成目標平臺的指令。
  9. 對於Java語言,想讓一個 java 程式執行起來,執行引擎(Execution Engine) 的任務就是將位元組碼指令解釋/編譯為對應平臺上的本地機器指令才可以。簡單來說,JVM 中的執行引擎充當了將高階語言翻譯為機器語言的譯者。