
什么是解釋器與編譯器
1、解釋器
解釋器是一種計算機程序,它將每個高級程序語句轉換成機器代碼。
2、編譯器
把高級語言編寫的程序轉換成機器碼,將人可讀的代碼轉換成計算機可讀的代碼(0和1)。
3、機器語言
一個機器語言程序是由一系列二進制模式組成的(例 110110) 它表示應該由計算機執行的簡單操作。機器語言程序是可執行的,所以它們可以直接運行
兩者都是將高級語言轉換成機器碼,解釋器在程序運行時將代碼轉換成機器碼,編譯器在程序運行之前將代碼轉換成機器碼
兩者的區別
| Interpreter(解釋器) | compare(編譯器) | |
| 程序步驟 | 1、創建代碼 2、沒有文件鏈接或機器代碼生成 3、源語句在執行過程中逐行執行 |
1、創建代碼 2、Compile將解析或分析所有語言語句的正確性。如果不正確,則拋出錯誤 3、如果沒有錯誤,編譯器將把源代碼轉換為機器碼 4、它將不同的代碼文件鏈接到一個可運行的程序(稱為exe) 5、運行程序 |
| Input(輸入) | 每次讀取一行 | 整個程序 |
| Output(輸出) | 不產生任何的中間代碼 | 生成中間目標代碼 |
| 工作機制 | 編譯和執行同時進行 | 編譯在執行之前完成 |
| 存儲 | 不保存任何機器代碼 | 存儲編譯后的機器代碼在機器上 |
| 執行 | 程序執行是解釋過程的一部分,因此是逐行執行的 | 程序執行與編譯是分開的,它只在整個輸出程序編譯后執行 |
| 生成程序 | 不生成輸出程序,所以他們在每次執行過程中都要評估源程序 | 生成可以獨立於原始程序運行的輸出程序(以exe的形式) |
| 修改 | 直接修改就可運行 | 如果需要修改代碼,則需要修改源代碼,重新編譯 |
| 運行速度 | 慢 | 快 |
| 內存 | 它需要較少的內存,因為它不創建中間對象代碼 | 內存需求更多的是由於目標代碼的創建 |
| 錯誤 | 解釋器讀取一條語句並顯示錯誤(如果有的話)。你必須糾正錯誤才能解釋下一行 | 編譯器在編譯時顯示所有錯誤和警告。因此,不修正錯誤就不能運行程序 |
| 錯誤監測 | 容易 | 難 |
| 編程語言 | PHP, Perl, Python, Ruby | C, C++, C#, Scala, Java |
編譯器
1、編譯器讀取源代碼,輸出可執行代碼
2、將用高級語言編寫的軟件翻譯成計算機可以理解的指令,它把程序員寫的文本轉換成CPU能理解的格式
3、編譯的過程比較復雜,它花了很多時間分析和處理程序
4、可執行結果是某種形式的特定於機器的二進制代碼
5、編譯器是一種程序,它讀取用高級語言編寫的程序,並將其轉換為機器語言或低級語言,並報告程序中出現的錯誤
編譯器的類型:前端編譯器、后端編譯器
1)編譯器的
分析階段也稱為前端,它將程序划分為基本的組成部分,檢查代碼的語法、語義和語法,然后生成中間代碼。分析階段包括詞法分析、語義分析和語法分析。
2)編譯器的
合成階段也稱為后端,優化中間代碼,生成目標代碼。合成階段包括代碼優化器和代碼生成器。
解釋器
1:解釋器在運行時逐行轉換源代碼
2、解釋完全將一個用高級語言編寫的程序翻譯成機器級語言
3、解釋器允許在程序執行時求值和修改程序
4、用於分析和處理程序的時間相對較少
5、與編譯器相比,程序執行相對緩慢
注:
Java既是編譯的又是解釋的,Java代碼本身被編譯成目標代碼。在運行時,JVM將目標代碼解釋為目標計算機的機器代碼。
主要區別
讓我們看看編譯器和解釋器之間的主要區別
1、編譯器將一個程序作為一個整體進行翻譯,而解釋器則一條一條地翻譯一個程序
2、在編譯器的情況下生成中間代碼或目標代碼。而解釋器不創建中間代碼
3、編譯器比解釋器要快得多,因為編譯器一次完成整個程序,而解釋器則是依次編譯每一行代碼
4、由於要生成目標代碼,編譯器比解釋器需要更多的內存
5、編譯器同時顯示所有錯誤,很難檢測錯誤,而解釋器則逐個顯示每條語句的錯誤,更容易檢測錯誤
6、在編譯器中,當程序中出現錯誤時,它會停止翻譯,並在刪除錯誤后重新翻譯整個程序。相反,當解釋器中發生錯誤時,它會阻止其翻譯,在刪除錯誤后,翻譯將繼續
7、在編譯器中,這個過程需要兩個步驟,首先將源代碼翻譯成目標程序,然后執行。而在解釋器中,這是一個一次性的過程,源代碼在編譯和執行的同時
8、編譯器用於編程語言,如C、c++、c#、Scala等。另一個解釋器用於PHP、Ruby、Python等語言。
總結
編譯器和解釋器的目的是做相同的工作,但在操作過程上不同,編譯器以聚合的方式獲取源代碼,而解釋器獲取源代碼的組成部分,即一條一條的語句。

相關鏈接
