【编译原理】入门总结
教程資源
入門教程在:手把手教你做一個 C 語言編譯器
學習過程
19年嘗試學了一下,中途看不懂放棄了。20年底從頭再看一遍,經過一年的知識積累,在仔細研讀之下,終于算是學懂了。此文中記錄了我在最初學習時遇到的問題,和最終的解決方法記錄下來,希望對讀者有所幫助。
虛擬機
虛擬機涉及的知識是比較綜合性的,是一個難點。虛擬機的原理是,模擬實現CPU的指令集。CPU的指令功能無非就是操作存儲和調用運算資源,我們完全可以自己模擬實現。這樣我們就可以不生成直接運行在電腦上的機器碼,不用關心exe文件格式,而是實現一個簡單的虛擬機來把源碼當做腳本來執行。如此,機器碼生成的任務可以大大減少,降低入門難度。
BNF
剛開始學的時候遇到的問題是,弄不懂BNF。BNF只有弄懂了,才會自己寫,才會用代碼實現。個人對BNF的理解見我的另一篇博客:編譯原理—理解BNF。
邏輯流程圖
在腦海中要有一張如下圖的邏輯流程圖:
其中,符號表特別重要,源碼中的重要信息都是保存在符號表中的。
要特別說一下,比較容易糾結的問題是,為什么按照上面的流程先解析Token,再語法分析,就可以解析代碼了?知其然還要知其所以然。我的理解是,編程語言在設計的時候,就考慮到,一要能準確無誤的表達出一個操作,沒有歧義;二是為了能使編譯器更易于實現。編程語言并不是一下子就設計好的,很可能是在設計編譯器的過程中不斷豐富完善的。舉一個例子:為什么標識符不能以數字開頭?因為,如果標識符以數字開頭,編譯過程中就需要更多的判斷來分辨到底是一個標識符還是一個數字或者表達式,直接規定不允許以數字開頭,保證了不同類型的Token起始符號不同,就可以很容易判斷Token的類型了。
動手實踐
在原教程的基礎上,可以自己嘗試實現具有更強功能的C語言腳本,如支持結構體解析,如在解析代碼的基礎上,實現編輯器上下文提示等等。
同時,在對編譯原理上下文無關文法的理解的基礎上,學習其他語言,應該更加容易。
同時,可以自己開發一些小工具用來對代碼進行自定義處理。
更加深入
后續可以學習已有腳本語言的實現原理,甚至可以嘗試自己開發一款腳本語言,學無止境,再接再厲!
總結
以上是生活随笔為你收集整理的【编译原理】入门总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四种信用卡额度 你知道哪几个?
- 下一篇: 债券到底是什么?债券和股票有什么不同?