編譯器
編輯編譯器,是一種計算機程序,它將特定編程語言的源代碼翻譯成可以(更直接地)由計算機執行的形式。 這導致或多或少的直接可執行程序。 解釋器之間必須有所區別,例如 BASIC 的早期版本,它們不生成機器代碼。
翻譯器和編輯器這兩個術語有時會有所區別。 翻譯器將程序從正式源語言翻譯成正式目標語言的語義等價物。 編譯器是將程序代碼從面向問題的編程語言(所謂的高級語言)轉換為特定體系結構的可執行機器代碼或中間代碼(字節代碼、p 代碼或 .NET 代碼)的特殊翻譯器。 并非在所有情況下都將術語翻譯器和編輯器分開。
翻譯的過程也稱為編譯或轉換(或用相應的動詞)。 相反,即將機器語言反向翻譯成特定編程語言的源文本,稱為反編譯和相應的程序反編譯器。
術語
編輯翻譯器是一種程序,它將以源語言制定的程序作為輸入,并將其翻譯成目標語言的語義等價程序。 特別是,要求生成的程序交付與給定程序相同的結果。 源語言的匯編程序通常被視為一個例外——它的翻譯器(在機器代碼中)被稱為“匯編程序”并且是 i. A. 不稱為“編譯器”。 翻譯器的任務包括范圍廣泛的子任務,從語法分析到目標代碼生成。 另一個重要任務是檢測并報告源程序中的錯誤。
“編譯器”一詞來源于英文“to compile”,真正意義上的“收集器”。 在 20 世紀 50 年代,該術語在計算機世界中尚未牢固確立。 編譯器原指由個別子程序或公式求值編制成整體程序,以執行特殊任務的輔助程序。 (鏈接器今天完成了這項任務,但它也可以集成到編譯器中。)各個子程序仍然是用機器語言“手工”編寫的。 從 1954 年開始,術語“代數編譯器”出現了,它指的是一個獨立地將公式轉換為機器代碼的程序。 隨著時間的推移,“代數”消失了。
工作原理
編輯將源代碼翻譯成目標代碼的基本步驟如下:
語法檢查檢查源代碼是否表示有效程序,即是否符合源語言的語法。 記錄檢測到的錯誤。 結果是源代碼的中間表示。分析和優化分析和優化中間表示。 根據編譯器和用戶偏好,此步驟的范圍有很大差異。 它的范圍從簡單的效率優化到程序分析,代碼生成優化的中間表示被翻譯成目標語言中的相應命令。 此外,可以在此處進行特定于目標語言的優化。
注意:同時(大部分)現代編譯器不再進行自己的代碼生成。
- 啟用全局優化的 C++:代碼在鏈接時生成。
- C#:代碼生成是由 .NET 環境的 JIT 或 NGEN 編譯器在運行時從編譯時通用中間語言代碼完成的。
- 對于使用公共語言基礎結構的其他語言(如 F# 和 VB.NET)也是如此,請參閱 .NET 語言列表。
- Java:代碼生成由 Java JIT 編譯器在運行時從編譯時 Java 字節碼完成。
運行時代碼生成允許:
- 跨模塊優化,
- 對目標平臺的精確調整(指令集、對 CPU 功能的調整),
- 分析信息的使用。
編譯器的結構
編輯編譯器構造,即編譯器的編程,是計算機科學中的一門獨立學科。
現代編譯器分為不同的階段,每個階段承擔編譯器的不同子任務。 其中一些階段可以作為獨立程序實現(參見預編譯器、預處理器)。 它們是順序執行的。 本質上,可以區分兩個階段:前端(也是分析階段),分析源文本并從中創建屬性語法樹,以及后端(也是綜合階段),從源文本創建目標程序。
前端(也稱為“分析階段”)
在前端,代碼被分析、結構化并檢查錯誤。 它本身是分階段的,現代C++等語言由于語法上的歧義,不允許將解析分為詞法分析、句法分析和語義分析。 他們的編譯器相應地復雜。
詞法分析
詞法分析將讀取的源文本拆分為各種類型的詞法單元(標記),例如關鍵字、標識符、數字、字符串或運算符。 編譯器的這一部分稱為分詞器、掃描器或詞法分析器。
掃描器有時會使用單獨的篩選器來跳過空格(空格、制表符、換行符等)和注釋。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/366084/