編譯原理分幾個階段
1. 編譯過程分為哪幾個階段各階段的遵循的原則、識別機構、使用的文法編譯原理
編譯原理中的遍概念
編譯階段也常常劃分為兩大步驟,分析步驟和綜合步驟 分析步驟和綜合步驟 分析步驟是指對源程序的分析 -線性分析(詞法分析或掃描) -層次分析(語法分析) -語義分析 綜合步驟是指後端的工作,為目標程序的生成而進行的綜合
你分析過嗎?若按照這種組合方式實現編譯程序,可以設想,某一編譯程序的前端加上相應不同的後 端則可以為不同的機器構成同一個源語言的編譯程序。也可以設想,不同語言編譯的前端生成同一種中間 語言,再使用一個共同的後端,則可為同一機器生成幾個語言的編譯程序。
一個編譯過程可由一遍、兩遍或多遍完成。所謂"遍",也稱作"趟",是對源程序或其等價的中間語言程 序從頭到尾掃視並完成規定任務的過程。每一遍掃視可完成上述一個階段或多個階段的工作。例如一遍可 以只完成詞法分析工作;一遍完成詞法分析和語法分析工作;甚至一遍完成整個編譯工作。對於多遍的編 譯程序,第一遍的輸入是用戶書寫的源程序,最後一遍的輸出是目標語言程序,其餘是上一遍的輸出為下 一遍的輸入。
在實際的編譯系統的設計中,編譯的幾個階段的工作究竟應該怎樣組合,即編譯程序究竟分成幾遍, 參考的因素主要是源語言和機器(目標機)的特徵。比如源語言的結構直接影響編譯的遍的劃分;像 PL/1 或 ALGOL 68 那樣的語言,允許名字的說明出現在名字的使用之後,那麼在看到名字之前是不便為包含該名 字的表達式生成代碼的,這種語言的編譯程序至少分成兩遍才容易生成代碼。另外機器的情況,即編譯程 序工作的環境也影響編譯程序的遍數的劃分。遍數多一點,整個編譯程序的邏輯結構可能清晰些,但遍數 多即意味著增加讀寫中間文件的次數,勢必消耗較多時間,一般會比一遍的編譯要慢。
2. 從源文件到可執行文件得過程是什麼
從源文件到可執行文件,主要經歷四個關鍵步驟:預處理、編譯、匯編、鏈接。源文件,如 C 語言程序,經過預處理,替換包含命令和宏定義,轉換生成新的程序文本,然後進行編譯,此階段會涉及到詞法分析、語法分析、語義分析及優化,最終輸出匯編代碼。匯編器將匯編指令轉換成目標機器可執行的機器指令,生成目標文件。最後,鏈接器將目標文件與可能需要的庫文件鏈接,解決符號引用,生成可執行文件。
編譯過程主要分為以下五部分:
1. **詞法分析**(Lexical Analysis):將源代碼分解為有意義的詞素(Lexeme)。
2. **語法分析**(Syntax Analysis):構建樹型的中間表示形式,通常是語法樹。
3. **語義分析**(Semantic Analysis):檢測源程序是否符合語法規則,並收集類型信息。
4. **中間代碼生成和優化**:生成類機器語言的中間代碼,然後優化此代碼。
5. **代碼生成**:將中間代碼映射到目標機器語言。
在實際使用編譯器 GCC 進行編譯時,可針對不同階段執行特殊操作。預處理階段通過命令 `-E` 單獨執行。編譯階段則通過 `-S` 選項控制。匯編過程通常在編譯階段內部處理,用戶無需顯式命令。鏈接階段通過 `-c` 或 `-S` 選項進行,根據目標文件的來源自動生成鏈接操作。鏈接中可選擇靜態或動態鏈接,使用 `-static` 指令指定靜態鏈接。
理解從源代碼到可執行文件的這一流程,有助於深入掌握編程語言的編譯原理和實際應用過程,對嵌入式物聯網開發等技術領域大有裨益。以上過程強調了程序從高級語言轉換到可運行機器語言的關鍵步驟,為開發者提供了一個堅實的基礎。
3. 編譯原理
編譯原理):利用編譯程序從源語言編寫的源程序產生目標程序的過程; 用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成
(3)編譯原理分幾個階段擴展閱讀:
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。
編譯程序的語法規則可用上下文無關文法來刻畫。語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。
而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。
4. C語言編譯原理
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
5. 用 C 語言編寫的源文件經過編譯,若沒有產生編譯錯誤,則系統將
B,先生成目標文件。之後的工作不再由編譯器完成,而是交給linker執行link操作,最後才能生成可執行文件。