研究報告

學年 111
學期 2
出版(發表)日期 2023-02-25
作品名稱 打造編譯程式--技術與原理
作品名稱(其他語言)
著者 蔡憶佳
單位
描述
委託單位
摘要 一直以來編譯程式在大學資訊系中都是被賦予核心的角色,這是因為編譯程 式發展緊緊跟隨電腦硬體演進。建構編譯程式的技巧,除了本質上是演算法 實作外,需要整合各種程式語言和電腦架構的知識,計算理論與實際機器資 訊的結合,大多數對編譯程式相當熟稔的人同時也是發展演算法的軟體專 家。 早期有關編譯程式中的剖析原理與實作發展到現在並未有太大變革,然而隨 著硬體架構演變,加上在 2000 年左右開始的 LLVM 計畫,由原先要探討針 對動態編譯、鏈結最佳化而演變成為藉由共同中介語言對動態鏈結函式庫與 其他前端與後端成為各自獨立的模組,使得不同的編譯程式前端與後端系統 可以整合在一起。在後端除了傳統的靜態編譯方法外,也可以使用類似 Java 的即時編譯方式。這些在實質編譯器上的改變,目前大多未呈現在編譯程式 的教科書中。主要的原因是這些變化大多發生在編譯程式的後端部分。傳統 教科書對於編譯程式前端較有一致的看法,對於後端則大多著重在最佳化技 術,因為跟硬體架構息息相關。而最近程式語言發展趨勢逐漸朝向平行化與 同步執行方向發展,這點也可由暱稱紫孔龍版本的經典教科書在 2006 年中 特別增加平行最佳化章節看出。 過去這些教材提供了非常豐富的編譯程式材料, 最近的趨勢,簡易的程式語言或是直譯器, 可以用編譯程式編譯器幫忙建立可以應用的剖析器。 然而有愈來越多的程式語言,選擇使用手工打造。 其中也包括C\#, 這樣的決策來自幾點觀察: 一、可以自行調整剖析器,甚至加上逐步剖析,也就是說,當使用者在編輯一小段程式碼後, 重新編譯,可以重複使用之前已編譯過的抽象語法樹,以節約時間與記憶空間。 二、可產生更精準的錯誤偵測報告。 一般使用編譯程式編譯器所產生的剖析器都無法給出較精確的錯誤報告, 也是因為如此,包括Perl和C\# ,gcc,clang都採用遞迴下降法手工建立剖析器, 由上往下的剖析,因為有較多的原始碼訊息, 比較可以給出較精確的錯誤報告。 三、更強韌的剖析器。若是輸入到剖析器是一段不符合其文法的單詞序列, 剖析器依然可以產生部分語法樹,嘗試由錯誤中找到有用資訊。 使用自動化工具產生的剖析器往往只會回應語法錯誤, 而很難找到有用的錯誤資訊。 在課程教材方面,過去編譯程式的教材大多是以英文寫作為主, 中文教材除了翻譯外,少有直接以中文纂寫的著作。 這對於編譯程式相關的知識普及是一個小小的障礙。 本書除了提供編譯程式的經典說明外, 也使用實作上的範例,在書寫過程中, 也以手工建立一個實際剖析器說明在設計剖析器上的各種決策考量。 從設計程式語言的語法考慮,到結合目前硬體發展的趨勢。 這本形式上的教科書, 起心動念是給資訊工程專業的學生在編譯程式課程中補充上課時老師沒辦法說明完整之處。 以中文介紹編譯程式及其相關的觀念與源頭, 主要是方便中文的讀者對這個龐雜的課題可以較快擷取編譯程式的梗概, 並非專門針對編譯程式教學考試而寫, 更希望為當今有興趣於更深入探究電腦程式語言運作的志學者鋪路。 除了以範例解說之外, 希望可藉由觸及一些有關程式語言相關觀念的源頭, 來引發在上完必修課程後要持續學習的動機。 編譯程式一向給人對的印象是生硬而且充滿無法在一時之間說清楚的眾多題材。 例如有關單詞器的章節,對於著重實際纂寫程式的人而言, 設計編譯程式所使用到單詞分析只有幾種單詞而已,不用談太多自動機與正規敘述間的議題。 而講剖析器,也有些人認為太多剖析技術細節反而讓學習者眼花繚亂, 只要談如何使用工具就可以了。 因為一下子要講正規敘述,又要講自動機,接著談這些抽象概念的轉換與描述能力, 然而實際單詞器會使用到的正規敘述只有特別需要幾種類型,例如變數名稱與數字, 談太多理論與觀念,很容易讓學習者充滿問號。 尤其是在這個充滿資訊的時代,連知識都要講究恰好即時(just-in-time)的彙整, 要很久之後才用得到知識很可能就是沒有用的知識。 在這樣的思惟之下,很難啟發學習者對於一門學科的深刻瞭解。 因此,希望能藉由這本書給學習編譯程式的人一些推力, 減輕語言與統合各種領域知識的崎嶇不平路。 可能因為台灣資訊工程研究所考試沒有考編譯程式這科目, 因此在市面上的中文書籍及參考文獻中幾乎沒有編譯程式相關書籍。 這現象說明以考試引導專業中文書籍, 對於普及和加深資訊能力是阻力而非助力。 編譯程式的教材涵蓋相當廣泛,以作者個人的力量纂寫, 猶如蚍蜉妄想窺看山河大海,實難在短短篇幅中詳實論述。 惟願這是個起頭,後續有更多助力參與。
關鍵字 編譯程式
語言 zh_TW
相關連結

機構典藏連結 ( http://tkuir.lib.tku.edu.tw:8080/dspace/handle/987654321/123986 )