什么是編譯原理?
編譯原理顧名思義,編譯就是將源語言(高級程序語言)翻譯成等價的目標語言(機器語言即計算機可以識別的語言即0和1或匯編語言)的過程。原理就是研究這一過程的思想方法、理論和技術。從本質上來講編譯是一個算法問題,但由於它的問題相當復雜,導致設計解決這個問題的算法也十分復雜。這里的算法和我們學習的數據結構和算法中的算法有些不同,后者講述的是基礎算法,是解決我們生活中遇到的問題,而編譯中的算法則是在人與計算機交流時需要解決的“溝通”問題的算法,比較專注解決一種的算法。編譯的過程包括:源程序->詞法分析->語法分析->語義分析->中間代碼生成->代碼優化->目標代碼生成->目標程序
為什么我們要編譯程序?
因為在計算機發展的初期,我們要想操作計算機則需要學習如何與計算機溝通,當時溝通的方法只有0和1,只有熟練使用0和1來表示程序的科學家才能通過打孔卡或紙帶操控計算機,由於直接使用二進制編程的門檻過高,使得除特定的科學家以外的人學習使用計算機較為困難且周期較長,不利於計算機的發展,所以之后的計算機科學家就設計了很多的高級語言使得程序代碼更貼近自然語言,但還是有其特定的結構,通過高級語言解決了對學習編程門檻高的問題,但這也照成了機器不能識別高級語言的問題,這是就需要一個翻譯程序(就像我們用翻譯程序將英文翻譯為中文)來使計算機“讀懂”程序員寫的高級語言。編譯程序油然而生。
學習編譯原理的作用?
1、學習編譯原理,了解高級語言是如何翻譯成機器語言的,這有助於提高我們代碼編譯的效率,提高代碼的質量。
2、了解計算機的運作原理,能寫出更高效的代碼。
3、由於編譯過程是將高級語言等價的翻譯成機器語言,這樣我們就知道了它們之間是如何等價轉換的,這對於我們學習其他語言更加得心應手,因為我們學習了它們的核心思想。
4、對於計算機編程及計算機整體運作方式開始有更深一層次的理解。
5、可能可以在自然語言語義分析方面會后一些了解。
6、獲得分析、設計、實現和維護編譯系統的初步能力,理解運用編譯技術解決工程實踐中的變換和轉換問題的方法。
7、感受到經典理論和先進技術之間的緊密聯系。
不學習編譯原理,會使自己的計算機思維停留在程序之上,雖然可以用程序解決生活實際問題,但沒有真正走進計算機的0,1世界,你和它的交流始終隔着一個編譯器,不能自由、靈活的表達自己的意思,同時也受限於高級語言給你的思維。
如何學習編譯原理?
我覺得在深入學習編譯原理之前,需要先對其有一個感性的認識。
1、可以先通過教材了解編譯的流程,以及各個步驟的作用、目的。
2、在通過Github或開源中國中找一些小實例聊看看,可能一開始是看不懂,但可以通過對代碼各模塊功能的猜想和結合課本中理論的理解,應該會對編譯器的運作原理有些初步的認識。
3、在有了一定了解后,開始對課上所學的理論與之前的感性認識進行整理結合,加深對所學理論的理解。
4、到最后看是否能寫一個小型編譯器,來檢驗自己的學習成果,並鞏固理論基礎。
PS:因為學習編譯原理會涉及到離散數學、數據結構、匯編語言、高級語言、算法、計算機原理等,所以需要對這些課程有一定深度的理解,應該鞏固這些學科的知識。
部分概念:
1、編譯型語言:通過編譯程序直接將源程序編譯成機器語言。優點:編譯效率比解釋性語言高,但由於現在計算機的計算能力有了顯著的提高,編譯效率高的優點漸漸不明顯了。(如C語言)
解釋性語言:通過一個解釋程序,將源程序翻譯成機器語言。優點:可以逐行編譯,這可以完成一些特殊的任務,比如R語言和Python。
2、垃圾回收機制:用於以不定時的方式動態回收程序在內存中占用空間但不再使用的部分的一種措施。Java就有垃圾回收機制,其是由JVM提供的。