淺談編譯原理

什麼是編譯原理?程序員

編譯原理顧名思義,編譯就是將源語言(高級程序語言)翻譯成等價的目標語言(機器語言即計算機能夠識別的語言即0和1或彙編語言)的過程。原理就是研究這一過程的思想方法、理論和技術。從本質上來說編譯是一個算法問題,但因爲它的問題至關複雜,致使設計解決這個問題的算法也十分複雜。這裏的算法和咱們學習的數據結構和算法中的算法有些不一樣,後者講述的是基礎算法,是解決咱們生活中遇到的問題,而編譯中的算法則是在人與計算機交流時須要解決的「溝通」問題的算法,比較專一解決一種的算法。編譯的過程包括:源程序->詞法分析->語法分析->語義分析->中間代碼生成->代碼優化->目標代碼生成->目標程序算法

爲何咱們要編譯程序?
由於在計算機發展的初期,咱們要想操做計算機則須要學習如何與計算機溝通,當時溝通的方法只有0和1,只有熟練使用0和1來表示程序的科學家才能經過打孔卡或紙帶操控計算機,因爲直接使用二進制編程的門檻太高,使得除特定的科學家之外的人學習使用計算機較爲困難且週期較長,不利於計算機的發展,因此以後的計算機科學家就設計了不少的高級語言使得程序代碼更貼近天然語言,但仍是有其特定的結構,經過高級語言解決了對學習編程門檻高的問題,但這也照成了機器不能識別高級語言的問題,這是就須要一個翻譯程序(就像咱們用翻譯程序將英文翻譯爲中文)來使計算機「讀懂」程序員寫的高級語言。編譯程序油然而生。編程

學習編譯原理的做用?
一、學習編譯原理,瞭解高級語言是如何翻譯成機器語言的,這有助於提升咱們代碼編譯的效率,提升代碼的質量。
二、瞭解計算機的運做原理,能寫出更高效的代碼。
三、因爲編譯過程是將高級語言等價的翻譯成機器語言,這樣咱們就知道了它們之間是如何等價轉換的,這對於咱們學習其餘語言更加駕輕就熟,由於咱們學習了它們的核心思想。
四、對於計算機編程及計算機總體運做方式開始有更深一層次的理解。
五、可能能夠在天然語言語義分析方面會後一些瞭解。
六、得到分析、設計、實現和維護編譯系統的初步能力,理解運用編譯技術解決工程實踐中的變換和轉換問題的方法。
七、感覺到經典理論和先進技術之間的緊密聯繫。

不學習編譯原理,會使本身的計算機思惟停留在程序之上,雖然能夠用程序解決生活實際問題,但沒有真正走進計算機的0,1世界,你和它的交流始終隔着一個編譯器,不能自由、靈活的表達本身的意思,同時也受限於高級語言給你的思惟。

如何學習編譯原理?
我以爲在深刻學習編譯原理以前,須要先對其有一個感性的認識。
一、能夠先經過教材瞭解編譯的流程,以及各個步驟的做用、目的。
二、在經過Github或開源中國中找一些小實例聊看看,可能一開始是看不懂,但能夠經過對代碼各模塊功能的猜測和結合課本中理論的理解,應該會對編譯器的運做原理有些初步的認識。
三、在有了必定了解後,開始對課上所學的理論與以前的感性認識進行整理結合,加深對所學理論的理解。
四、到最後看是否能寫一個小型編譯器,來檢驗本身的學習成果,並鞏固理論基礎。
PS:由於學習編譯原理會涉及到離散數學、數據結構、彙編語言、高級語言、算法、計算機原理等,因此須要對這些課程有必定深度的理解,應該鞏固這些學科的知識。

部分概念:
一、編譯型語言:經過編譯程序直接將源程序編譯成機器語言。優勢:編譯效率比解釋性語言高,但因爲如今計算機的計算能力有了顯著的提升,編譯效率高的優勢漸漸不明顯了。(如C語言)
解釋性語言:經過一個解釋程序,將源程序翻譯成機器語言。優勢:能夠逐行編譯,這能夠完成一些特殊的任務,好比R語言和Python。
二、垃圾回收機制:用於以不定時的方式動態回收程序在內存中佔用空間但再也不使用的部分的一種措施。Java就有垃圾回收機制,其是由JVM提供的。數據結構

相關文章
相關標籤/搜索