解釋型語言和解釋型語言


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

侵刪

筆記:

  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)
  5.  

 

 

參考:編譯型語言

侵刪

筆記:

  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 中的執行引擎充當了將高級語言翻譯為機器語言的譯者。
  10.  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM