編譯器和解釋器(Compiler and Interpreter)

原文地址: juejin.im/post/5cea0c…html

在計算機的世界中,一個Programmer多多少少有據說過編輯器,解釋器,機器碼,字節碼這些名詞, 如今咱們稍微深刻問一問:編程

  • 這些名詞分別表示的是什麼?
  • 編輯器和解釋器是如何運行?
  • 它們之間又有什麼聯繫呢?

本文的目的就是爲了理清這些問題.bootstrap

Type of code(代碼的類型)

計算機的代碼根據封裝程度的高低能夠分爲如下幾類(從低到高):架構

  • Microcode(微碼): 微碼是一種直接控制CPU的代碼, 經過將機器指令與相關的電路實現分離, 使得機器指令能夠更自由的進行設計與修改,而不用考慮到實際的電路架構.(傳統架構CPU的操做直接寫死在電路板上,須要物理改動才能修改).
    • 也被稱爲firmware(固件).
    • 一般存放在ROM上,不開放修改.
    • 僅適用於其設計的特定硬件.
    • 處於軟件層面的最底層.
  • Machine code(機器碼): 能夠由CPU直接執行的代碼.
    • 在CISC架構的電腦上會被轉化爲機器碼來執行.
    • 在RISC架構的電腦上直接執行.
  • Object code(目標代碼): 通常是機器碼,可是隻是一部分,須要經過Linker(連接器)來將多個目標代碼文件連接成一個完整的可執行程序.(如C語言中對標準庫的引用).
  • Bytecode(字節碼): 一般指的是已經通過編譯,須要解釋器翻譯後才能成爲機器碼的中間代碼. 如Java字節碼.
    • 是爲了解釋器的高效執行而設計.
    • 可跨平臺.

Level of Programming Language(編程語言的層級)

編程語言根據對機器語言的抽象(封裝)程度能夠分爲兩類:編程語言

  • Low-level programming language(低級編程語言): 不提供或jin僅提供不多的封裝,接近機器語言.
    • 通常指Machine language(機器語言)和Assembly language(彙編語言).
    • 代碼一般只能在特定平臺上執行.
    • 執行效率高.
    • 可閱讀性差.
    • 開發效率低.
  • High-level programming language(高級編程語言): 高度封裝了機器語言, 須要編譯器或解釋器轉化成機器碼才能執行. 如: C,C++,Java,Python等.
    • 執行效率較低.
    • 可讀性好.
    • 開發效率高.

彙編語言的代碼須要由彙編器(assembler)將代碼轉爲機器碼才能執行,也能夠認爲是高級語言.編輯器

以下圖:模塊化

image.png

圖片來自: Quora: What are the different types of programming languages?post

用高級語言編寫的程序要麼由某種解釋器直接執行,要麼由編譯器(以及彙編程序和連接程序)轉換成機器代碼, 而後由CPU執行.操作系統

下面來介紹編譯器和解釋器.翻譯

Compiler(編譯器)

編譯器是一個將一種編程語言的代碼翻譯(translate)爲另一種編程語言的代碼的計算機程序. 一般指將高級語言的代碼翻譯爲低級語言的代碼.

主要目的是將便於人編寫,閱讀,維護的高級語言的代碼翻譯爲計算機能解讀,運行的機器碼.

編譯器還有如下幾類:

  • cross-compiler(交叉編譯器): 翻譯輸出的代碼能夠運行於不一樣的平臺(不一樣的CPU或操做系統).
  • bootstrap compiler: 由要編譯的輸入語言編寫的編譯器,它初始核心版本由其餘語言生成(通常是彙編語言).
  • decompiler(逆編譯程序): 將低級語言的代碼翻譯爲高級語言的代碼.
  • source-to-source compiler(源碼到源碼編輯器): 將一種高級語言代碼翻譯成另一種高級語言的代碼.

編譯器的工做流程

一個編譯器的工做流程通常會包括如下幾個步驟(順序執行):

  • preprocessing
  • lexical analysis
  • parsing
  • semantic analysis (syntax-directed translation)
  • conversion of input programs to an intermediate representation
  • code optimization
  • code generation

以下圖:

image.png

圖片來自: The Thing from another World

Interpreter(解釋器)

解釋器是一種直接執行高級語言代碼的計算機程序, 而無需將代碼編譯成機器碼.

  • 優勢: 消除了編譯整個程序的負擔,程序能夠拆分紅多個部分來模塊化.
  • 缺點: 解釋器像是一位「中間人」,每次運行程序時都要先將代碼轉成另外一種語言的代碼,而後再做運行,所以解釋器的程序運行速度比較緩慢.

解釋器執行代碼的策略通常有如下三種:

  • 直接運行高級編程語言的代碼(如Shell內置的解釋器).
  • 先將代碼轉換成高效的中間碼(如:Bytecode),而後立刻執行(不輸出中間碼).
  • 由解釋器中內置的編譯器先將高級語言的代碼編譯成中間碼,而後再執行.(輸出中間碼,至關於兩個階段,如Java的執行)

與編譯器的執行方式的對好比下圖:

image.png

圖片來自: Compiler vs Interpreter: Complete Difference Between Compiler and Interpreter

參考

相關文章
相關標籤/搜索