原文地址: 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)將代碼轉爲機器碼才能執行,也能夠認爲是高級語言.編輯器
以下圖:模塊化
圖片來自: 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
以下圖:
圖片來自: The Thing from another World
Interpreter(解釋器)
解釋器是一種直接執行高級語言代碼的計算機程序, 而無需將代碼編譯成機器碼.
- 優勢: 消除了編譯整個程序的負擔,程序能夠拆分紅多個部分來模塊化.
- 缺點: 解釋器像是一位「中間人」,每次運行程序時都要先將代碼轉成另外一種語言的代碼,而後再做運行,所以解釋器的程序運行速度比較緩慢.
解釋器執行代碼的策略通常有如下三種:
- 直接運行高級編程語言的代碼(如Shell內置的解釋器).
- 先將代碼轉換成高效的中間碼(如:Bytecode),而後立刻執行(不輸出中間碼).
- 由解釋器中內置的編譯器先將高級語言的代碼編譯成中間碼,而後再執行.(輸出中間碼,至關於兩個階段,如Java的執行)
與編譯器的執行方式的對好比下圖:
圖片來自: Compiler vs Interpreter: Complete Difference Between Compiler and Interpreter
參考