跳轉到內容

編譯器構造/關於本書

來自華夏公益教科書

本書旨在為編寫編譯器提供實用的建議,並提供一些編譯器和直譯器的實際示例,以打破構建編譯器和直譯器是不可能的任務的觀念。

有關該主題的基本資訊,請檢視本書的參考文獻外部連結部分,以及詞彙表中相關的維基百科文章。

理論不可避免,但已將其減至最少。如果您在網上搜索“編譯器構造”,您會發現大量的資訊和許多不同的方法。本書所能做的就是演示構建編譯器的許多可能方法中的幾種。閱讀完本書後,您應該能夠更好地評估其他方法。

這是一個維基。讀者,請貢獻:糾正拼寫錯誤,改寫句子,擴充套件段落,新增部分,編寫完整的章節。

本書的編寫符合幾個目標。本書必須是

  • 有用且實用 - 我們有幾本優秀的編譯器書籍,尤其是龍書。然而,雖然掃描器或語法分析器的技術已經得到很好的發展和了解,但我們認為需要一本涵蓋指令碼語言或使用位元組碼進行復雜的動態編譯的書籍。
  • 非平凡 - 這與第一個目標有關。
  • 提供對面向物件語言的良好覆蓋 -
  • 有大量的參考資料 -
  • 更新 - 線上教科書的一個優勢是它可以更新以涵蓋新的語言或實現技術。

我們希望這本書能幫助您建立一個編譯器或任何使用編譯器技術的工具。

如果您不熟悉編譯器中的術語或基本概念,您應該閱讀介紹章節,因為本書的其餘部分將假設其作為背景資訊。

適當的背景

要充分利用本書,您的背景/經驗/能力應包括以下大多數內容

  • 熟悉基本的計算機體系結構、元件和執行模型。
  • 在一兩種(最好是多種)高階程式語言中擁有多年的經驗。
  • 能夠處理包含數千行原始碼的程式。
  • 您不需要任何特定的數學背景,儘管對簡單代數有所瞭解可能會有所幫助。
  • 程式設計需要能夠精確地關注細節的邏輯思維。
  • 準備好學習各種計算機科學概念。特別是,您應該能夠理解本章第 6 節中描述的 EBNF。其他概念將在需要時介紹,例如堆疊、遞迴。
  • 準備好學習簡單的組合語言以及計算機體系結構定址模式的各個方面。

即使您沒有上述背景,您仍然應該能夠透過閱讀文字獲得一些想法。

您可能能夠實現本書中提供的一些或所有程式。如果您具有一些高階程式設計經驗,您還應該能夠擴充套件直譯器功能。

實現軟體

由於這是一本免費提供的書籍,因此使用一些免費提供的實現語言似乎很合適。

我選擇使用 C++ 的一個子集,並結合 GNU GCC 編譯器。該子集大致對應於將 C++ 作為更好的 C 來使用,包括使用標準 C++ 庫,但不涉及 C++ 的面向物件方面。如果您使用 GNU/Linux,那麼此編譯器將/應該已經可供您使用。否則,您需要在全球資訊網上搜索適用於您系統的免費版本。

如果您使用 Microsoft Windows,那麼您可能想考慮 Code::Blocks,這是一個免費的 IDE(整合開發環境),帶有 MinGW 編譯器(GCC 的移植版本),可從 www.codeblocks.org 獲得。

簡化源語言

為了降低本書的複雜性,我們將對我們為其編寫編譯器的源語言做出一些簡化假設

  1. 源語言不允許巢狀子例程宣告。
  2. 所有識別符號必須在使用前宣告。
  3. 源語言的語法分析可以在一次傳遞中完成。
  4. 在語法分析期間,我們只需要檢視下一個原始碼標記來決定下一步該怎麼做。

在後面的章節中,我們將更多地考慮放寬這些假設的影響。

在實踐中,這些假設意味著源語言很容易使用簡單技術進行翻譯,並且消除了一些執行時複雜性。

  • 第一個假設排除了 Algol 60 和 Pascal。
  • 第二個假設允許單遍編譯。
  • 第三個假設排除了 Algol 68;根據 Hunter 的說法,語法分析可能需要多達 4 個遍。
  • 第二個和第四個假設排除了 Fortran;以下都是有效的 Fortran 語句,但您甚至無法在檢視語句的末尾或附近之前確定每種語句的型別(在 Fortran 中,空格不重要,變數不需要宣告,並且沒有保留關鍵字)。
Fortran 原始碼 語義
IF (expression) GO TO 567 條件跳轉
IF (expression) GO TO = 2.71 條件賦值
IF (expression) 123,234 雙向分支:假,真
IF (expression) 123,234,345 三向分支:<0, =0, >0
IF (expression) THEN 這實際上啟動了一個多行 IF
IF (expression) THEN = 3.14 條件賦值
IF (expression) = 36 對陣列元素賦值
DO 10 I = 1,5 啟動一個迴圈
DO 10 I = 1.5 對變數 DO10I 賦值
需要處理整個語句的語言結構

最後兩行之間的區別據報道導致了一顆價值數百萬美元的太空探測器丟失。

下一個 - 介紹編譯器和直譯器

[編輯 | 編輯原始碼]
此頁面應包含在編譯器構造書籍的任何副本中。
任何包含的原始碼,如果未帶有不同的宣告,應被視為公有領域。
所使用的圖片具有自己的版權狀態,具體說明在各自的儲存庫(en.wikibooks.org 或 commons.wikimedia.org)中。
特別貢獻
  • Murray Langton 對明顯被廢棄的書籍進行了完整的重組。
  • TakuyaMurata;我偶爾會新增一些內容。我相信,雖然完成這本書可能需要數年時間,但我們仍然可以製作出對那些對編譯器感興趣的人有用的作品。
  • psanand 只要有時間,就喜歡為它貢獻一些東西
華夏公益教科書