白話編譯原理

      爲何要有編譯系統:php

      計算機發展初期,程序員或從事計算機科學的人要讓計算機代替人去完成大量的計算工做,就得讓計算機知道咱們要作什麼。剛開始使用機器將紙帶打孔而後讓計算機讀取獲取二進制數據和指令完成計算,後來能夠直接用二進制編寫程序讓計算機執行,不過對於人類大腦來說二進制程序不方便閱讀和理解,後面就發明了彙編語言,一種用標識符來代替二進制指令的低級語言來編寫程序,而後在用匯編編譯系統編譯成二進制數據讓計算機執行。但畢竟彙編是直接操做cpu指令的語言,也是不方便人類正確快速的表達算法,後來就發明了c語言 c++ java等高級語言,愈來愈接近人類大腦的思惟邏輯,大大提升了變成速度和下降了出錯率。隨着變成語言愈來愈接近人的思惟模式,更方便更直接,編程語言卻裏機器愈來愈遠,人們給高級語言賦予了函數 過程 面向對象 做用域等概念,但計算機只知道從寄存器或內存獲取 數據而後計算並存儲,這就是計算機所能作的。因此編譯系統的工做就是將咱們所熟悉使用的編程語言所表達的意圖轉換成計算機能夠理解的二進制程序,讓計算機理解並執行。java

 

     爲何要學編譯原理:c++

     從微觀上來看學習編譯原理才能明白程序在機器上的執行過程,爲咱們可以寫出高效率的程序提供必要的知識背景,讓咱們可以返璞歸真的認識到編程語言。程序員

     從宏觀上來看學習編譯原理能讓咱們學習到不少解決問題的方法和思路,這和其餘學科的意義是同樣的,從表面上去看本質。還有助於咱們更好的瞭解計算機科學發展的歷程。算法

 

     編譯系統簡述:編程

      當咱們用c java 或php 等一切高級編程語言寫的程序只是咱們用這種語言來表達咱們要實現的業務邏輯的源程序,編譯系統就是要將這些源程序編譯成計算機所認識的二進制程序以執行。總共分如下幾個步驟。數據結構

      詞法分析:就是將咱們的源程序從左到右掃描,把其中的註釋以及空白無用的字符都去掉,將源程序中出現的運算符 標識符 賦值  括號 之類的都識別出來,組成下一步可識別的字符串,並將變量名註冊到一個符號表的數據結構中。編程語言

      語法分析:語法分析器接收上一步詞法分析的結果,將這個結果中的字符串組詞成句,輸出一個能夠表達正確的計算順序的程序結構。這期間將變量的屬性結構以及所須要佔用的內存字節數以及相應的偏移地址都更新到了符號表中。函數

      中間代碼生成:由於計算機不一樣的cpu有不一樣的指令集,因此爲了提升程序的可移植性,先將語法分析器分析出來的程序執行結構轉換爲中間代碼,而後在代碼生成階段根據具體的指令集轉換成適合當前計算機的可執行代碼。學習

      代碼優化:這個階段將沒有用的代碼刪除掉,將循環中不變的計算表達式提到外面以免重複的計算 等一系列方式來優化中間代碼。

     目標代碼(可執行代碼)生成:這個階段根據中間代碼以及符號表中的數據以及當前計算機的指令集來轉換成二進制程序。生成目標代碼這個階段也能夠作代碼優化,好比經常使用的元素就放到cpu寄存器中 選用更合適的cpu指令 好比自增 若是cpu支持inc自增指令 就會選inc 而不是mov add

相關文章
相關標籤/搜索