C語言編譯流程全面分析

2021-08-31 13:26:07 字數 3922 閱讀 7216

程式的編譯流程大概分為 預處理器 ->

編譯器-> 彙編器 -> 鏈結器,4個階段

。 編譯器又可以分為詞法分析 -> 語法分析 -> 語義分析 -> 中間**生成 -> **優化 ->生成目標**

等階段。

預處理器 

處理巨集定義,如#include表示引入其他原始檔的**,#define表示定義巨集,對**片進行乙個替換,#if系列命令可以控制預處理器的功能做到面向不同環境的**等等。

編譯器

編譯過程就是把預處理完的檔案進行一系列的詞法分析,語法分析,語義分析及優化後生成相應的彙編**

詞法分析

將高階語言**文字切割成詞彙,輸出單詞流,刪除注釋、空格、空行等

語法分析

根據單詞流生成語法樹

語義分析

構建帶型別和符號表的語法樹、檢查型別是否匹配、檢查等號左側是否為左值等

中間**生成

生成中間**

**優化

優化中間**

彙編器

彙編器是將彙編**轉變成機器可以執行的命令,每乙個彙編語句幾乎都對應一條機器指令。彙編相對於編譯過程比較簡單,根據彙編指令和機器指令的對照表一一翻譯即可

鏈結器將多個目標**庫鏈結成可執行檔案

詞法分析(lexical analysis或scanning)和詞法分析程式(lexical analyzer或scanner)

詞法分析階段是編譯過程的第乙個階段。這個階段的任務是從左到右乙個字元乙個字元地讀入源程式,即對構成源程式的字元流進行掃瞄然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程式實現這個任務。詞法分析程式可以使用lex等工具自動生成。

語法分析(syntax analysis或parsing)和語法分析程式(parser)

語法分析是編譯過程的乙個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如「程式」,「語句」,「表示式」等等.語法分析程式判斷源程式在結構上是否正確.源程式的結構由上下文無關文法描述.

語義分析(syntax analysis)

語義分析是編譯過程的乙個邏輯階段. 語義分析的任務是對結構上正確的源程式進行上下文有關性質的審查, 進行型別審查.例如乙個c程式片斷:

int arr[2],b;

b = arr * 10; 

源程式的結構是正確的. 

語義分析將審查型別並報告錯誤:不能在表示式中使用乙個陣列變數,賦值語句的右端和左端的型別不匹配.

lex

乙個詞法分析程式的自動生成工具。它輸入描述構詞規則的一系列正規式,然後構建有窮自動機和這個有窮自動機的乙個驅動程式,進而生成乙個詞法分析程式.

yacc

乙個語法分析程式的自動生成工具。它接受語言的文法,構造乙個lalr(1)分析程式.因為它採用語法制導翻譯的思想,還可以接受用c語言描述的語義動作,從而構造乙個編譯程式. yacc 是 yet another compiler compiler的縮寫.

源語言(source language)和源程式(source program)

被編譯程式翻譯的程式稱為源程式,書寫該程式的語言稱為源語言.

目標語言(object language or target language)和目標程式(object program or target program)

編譯程式翻譯源程式而得到的結果程式稱為目標程式, 書寫該程式的語言稱為目標語言.

中間語言(中間表示)(intermediate language(representation))

在進行了語法分析和語義分析階段的工作之後,有的編譯程式將源程式變成一種內部表示形式,這種內部表示形式叫做中間語言或中間表示或中間**。所謂「中間**」是一種結構簡單、含義明確的記號系統,這種記號系統複雜性介於源程式語言和機器語言之間,容易將它翻譯成目標**。另外,還可以在中間**一級進行與機器無關的優化。

文法(grammars)

文法是用於描述語言的語法結構的形式規則。文法g定義為四元組(,,,)。其中為非終結符號(或語法實體,或變數)集;為終結符號集;為產生式(也稱規則)的集合;產生式(規則)是形如或 a ::=b 的(a , b)有序對,其中(∪)且至少含有乙個非終結符,而(∪)。,和是非空有窮集。稱作識別符號或開始符號,它是乙個非終結符,至少要在一條規則中作為左部出現。 

乙個文法的例子: g=(=,= ,=,=a) 

文法分類(a hierarchy of grammars)

著名語言學家noam chomsky定義了四類文法和四種形式語言類,文法的四種型別分別是0型、1型、2型和3型。幾類文法的差別在於對產生式施加不同的限制,分別是: 

0型文法(短語結構文法)(phrase structure grammars): 

設g=(,,,),如果它的每個產生式是這樣一種結構: (∪)  且至少含有乙個非終結符,而(∪),則g是乙個0型文法。 

1型文法(上下文有關文法)(context-sensitive grammars): 

設g=(,,,)為一文法,若中的每乙個產生式均滿足|,僅僅  除外,則文法g是1型或上下文有關的。 

2型文法(上下文無關文法)(context-free grammars): 

設g=(,,,),若p中的每乙個產生式滿足:是一非終結符,(∪)  則此文法稱為2型的或上下文無關的。 

3型文法(正規文法)(regular grammars): 

設g=(,,,),若中的每乙個產生式的形式都是a→ab或a→a,其中a和b都是非終結,a是終結符,則g是3型文法或正規文法。 

0型文法產生的語言稱為0型語言。 

1型文法產生的語言稱為1型語言,也稱作上下文有關語言。 

2型文法產生的語言稱為2型語言,也稱作上下文無關語言。 

3型文法產生的語言稱為3型語言,也稱作正規語言。

源**優化 = 中間**生成 + **優化 。

優化舉個簡單的例子: int a = 2+6 , 優化後好比 int a = 8 

跨平台的編譯器可以針對不同的平台使用同乙個前端和針對不同機器平台的數個後端

前端部分: 從語法分析一直到源**優化 (編譯器)

後端部分: 目標**生成到目標**優化 (彙編器)

以上只是對編譯器大概的說明,想要深入的了解推薦看編譯原理的書,還是很深奧,對於開發人員來說可以不必要了解的很深入,除非你是專門做這一塊的。

C語言的編譯流程

通常我們編譯程式是這樣的 gcc c o test這樣這個可執行檔案test就可以直接執行了,編譯器幫我們做的東西太多了 我們需要了解一下這個過程 2 編譯 3 彙編 4 鏈結 把所有的巨集展開 如 define led p0 0 led 1 這一步就是將led替換成p0 0 巨集定義可以使得我們 ...

GCC編譯流程分析

1.預處理結點 gcc的選項 e 可以使編譯器在預處理結束時就停止編譯 gcc e o hello.i hello.c 字尾名 i 的檔案是經過預處理的c原始程式。2.編譯階段 gcc的選項 s 能使編譯器在進行完編譯之前就停止。3.彙編階段 彙編階段把編譯階段生成的 s 檔案生成目標檔案,在此使用...

GCC編譯流程分析

0.原始碼 include intmain gcc e demo.c o demo.i 1.預編譯 不做其他處理,輸出檔案為demo.i 2.編譯階段,只進行編譯,不做其他,生成乙個彙編檔案 gcc s demo.i o demo.s 學習組合語言的時候,可以對照c語言機器彙編 file demo....