編譯原理 入門總結

2021-10-17 11:10:03 字數 1033 閱讀 4019

入門教程在:手把手教你做乙個 c 語言編譯器

19年嘗試學了一下,中途看不懂放棄了。20年底從頭再看一遍,經過一年的知識積累,在仔細研讀之下,終於算是學懂了。此文中記錄了我在最初學習時遇到的問題,和最終的解決方法記錄下來,希望對讀者有所幫助。

虛擬機器涉及的知識是比較綜合性的,是乙個難點。虛擬機器的原理是,模擬實現cpu的指令集。cpu的指令功能無非就是操作儲存和呼叫運算資源,我們完全可以自己模擬實現。這樣我們就可以不生成直接執行在電腦上的機器碼,不用關心exe檔案格式,而是實現乙個簡單的虛擬機器來把原始碼當做指令碼來執行。如此,機器碼生成的任務可以大大減少,降低入門難度。

剛開始學的時候遇到的問題是,弄不懂bnf。bnf只有弄懂了,才會自己寫,才會用**實現。個人對bnf的理解見我的另一篇部落格:編譯原理—理解bnf。

在腦海中要有一張如下圖的邏輯流程圖:

其中,符號表特別重要,原始碼中的重要資訊都是儲存在符號表中的。

要特別說一下,比較容易糾結的問題是,為什麼按照上面的流程先解析token,再語法分析,就可以解析**了?知其然還要知其所以然。我的理解是,程式語言在設計的時候,就考慮到,一要能準確無誤的表達出乙個操作,沒有歧義;二是為了能使編譯器更易於實現。程式語言並不是一下子就設計好的,很可能是在設計編譯器的過程中不斷豐富完善的。舉乙個例子:為什麼識別符號不能以數字開頭?因為,如果識別符號以數字開頭,編譯過程中就需要更多的判斷來分辨到底是乙個識別符號還是乙個數字或者表示式,直接規定不允許以數字開頭,保證了不同型別的token起始符號不同,就可以很容易判斷token的型別了。

在原教程的基礎上,可以自己嘗試實現具有更強功能的c語言指令碼,如支援結構體解析,如在解析**的基礎上,實現編輯器上下文提示等等。

同時,在對編譯原理上下文無關文法的理解的基礎上,學習其他語言,應該更加容易。

同時,可以自己開發一些小工具用來對**進行自定義處理。

後續可以學習已有指令碼語言的實現原理,甚至可以嘗試自己開發一款指令碼語言,學無止境,再接再厲!

編譯原理入門(二) 編譯系統的結構

在下圖中,高階語言是輸入,而組合語言或者機器語言是輸出,編譯器的作用便是做乙個中間轉換的過程,我們來看看編譯器是怎麼把源語言翻譯成機器語言的,此部分我們需要借助生活中常見的英漢互譯來幫助我們更好的理解編譯器的整個結構和編譯過程。如下圖,學過英語的都知道一些英語的語法組成,簡單的英語結構可以分為主謂賓...

編譯原理入門(三) 詞法分析簡介

詞法分析的主要任務 1.對源程式的 進行從左到右的逐行掃瞄,識別出各個單詞,從而確定單詞的型別。2.將識別出的單詞轉換為統一的機內表示 詞法單元 token 形式,token 種別碼,屬性值 第二點看不懂沒事,先說說什麼是詞法單元形式,token是乙個鍵值對,key是種別碼,什麼是種別碼?請看下圖便...

Git原理入門解析

前言 自己第一次聽到git應該是一年前了,當時很懵,不知道它是幹啥的,在網上搜尋了很多文章,一直不是太明白 今天我來記錄一下自己對git的學習,如果對其他童鞋有所幫助,我榮幸之至!git是什麼?git是目前世界上最先進的分布式版本控制系統 沒有之一 最初由 linux torvalds linux ...