為什麼要有編譯系統:
計算機發展初期,程式設計師或從事電腦科學的人要讓計算機代替人去完成大量的計算工作,就得讓計算機知道我們要做什麼。剛開始使用機器將紙帶打孔然後讓計算機讀取獲取二進位制資料和指令完成計算,後來可以直接用二進位制編寫程式讓計算機執行,不過對於人類大腦來講二進位制程式不方便閱讀和理解,後面就發明了組合語言,一種用識別符號來代替二進位制指令的低階語言來編寫程式,然後在用匯編編譯系統編譯成二進位制資料讓計算機執行。但畢竟彙編是直接操作cpu指令的語言,也是不方便人類正確快速的表達演算法,後來就發明了c語言 c++ java等高階語言,越來越接近人類大腦的思維邏輯,大大提高了變成速度和降低了出錯率。隨著變成語言越來越接近人的思維模式,更方便更直接,程式語言卻裡機器越來越遠,人們給高階語言賦予了函式 過程 物件導向 作用域等概念,但計算機只知道從暫存器或記憶體獲取 資料然後計算並儲存,這就是計算機所能做的。所以編譯系統的工作就是將我們所熟悉使用的程式語言所表達的意圖轉換成計算機可以理解的二進位制程式,讓計算機理解並執行。
為什麼要學編譯原理:
從微觀上來看學習編譯原理才能明白程式在機器上的執行過程,為我們能夠寫出高效率的程式提供必要的知識背景,讓我們能夠返璞歸真的認識到程式語言。
從巨集觀上來看學習編譯原理能讓我們學習到很多解決問題的方法和思路,這和其他學科的意義是一樣的,從表面上去看本質。還有助於我們更好的瞭解電腦科學發展的歷程。
編譯系統簡述:
當我們用c java 或php 等一切高階程式語言寫的程式只是我們用這種語言來表達我們要實現的業務邏輯的源程式,編譯系統就是要將這些源程式編譯成計算機所認識的二進位制程式以執行。總共分以下幾個步驟。
詞法分析:就是將我們的源程式從左到右掃描,把其中的註釋以及空白無用的字元都去掉,將源程式中出現的運算子 識別符號 賦值 括號 之類的都識別出來,組成下一步可識別的字串,並將變數名註冊到一個符號表的資料結構中。
語法分析:語法分析器接收上一步詞法分析的結果,將這個結果中的字串組詞成句,輸出一個可以表達正確的計算順序的程式結構。這期間將變數的屬性結構以及所需要佔用的記憶體位元組數以及相應的偏移地址都更新到了符號表中。
中間程式碼生成:因為計算機不同的cpu有不同的指令集,所以為了提高程式的可移植性,先將語法分析器分析出來的程式執行結構轉換為中間程式碼,然後在程式碼生成階段根據具體的指令集轉換成適合當前計算機的可執行程式碼。
程式碼優化:這個階段將沒有用的程式碼刪除掉,將迴圈中不變的計算表示式提到外面以避免重複的計算 等一系列方式來優化中間程式碼。
目的碼(可執行程式碼)生成:這個階段根據中間程式碼以及符號表中的資料以及當前計算機的指令集來轉換成二進位制程式。生成目的碼這個階段也可以做程式碼優化,比如常用的元素就放到cpu暫存器中 選用更合適的cpu指令 比如自增 如果cpu支援inc自增指令 就會選inc 而不是mov add