乙個hello world的編譯原理

2021-07-12 00:17:14 字數 1214 閱讀 9687



乙個簡單的hello world 程式

#include

int mian ()

通過$gcc hlello.c $./a.out 可生產hello world

事實上,上述過程可以分解為4個步驟,分別是預處理(prepressing),編譯(compilation),彙編(assembly)和連線(linking),如下圖所示:

1.預編譯

源**檔案hello.c和相關的標頭檔案,例如stdio.h等被預編譯器cpp預編譯成乙個.i檔案。第一步預編譯的過程相當於如下命令(-e表示只進行預編譯)

$gcc -e hello.c -o hello.i

編譯過程主要處理那些源**檔案中的以「#」開始的預編譯指令,比如「#include」,「#define」等,主要處理規則如下:

經過預編譯後的.i檔案不包含任何巨集定義,因為所有的巨集已經被展開,並且包含的檔案也已經被插入到.i檔案中,所以當我們無法判斷巨集定義是否正確或標頭檔案包含是否正確時,可以檢視預編譯後的檔案來確定問題。

2.編譯

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

$gcc -s hello.i -o hello.s

實際上gcc這個命令只是這些後台程式的包裝,它會根據不同的引數要求去呼叫預編譯編譯程式cc1,彙編器as,聯結器ld。

3.彙編

彙編器是將彙編**轉換成機器可以執行的命令,每乙個彙編語句幾乎都對應一條機器指令。所以彙編器的彙編過程相對於編譯器來講比較簡單,它沒有複雜的語法,也沒有語義,也不需要做指令優化,只是根據彙編指令和機器指令的對照表一一翻譯就可以了,「彙編」這個名詞也**於此,上面的彙編過程可以呼叫彙編器as來完成:

$as hello.s -o hello.c 或 $gcc -c hello.c -o hello.o

4.連線

聯結器ld產生乙個正常執行的hello world程式如下所示:

乙個簡單的hello world交叉編譯實驗

交叉編譯,簡單地說,就是在乙個平台上生成另乙個平台上的可執行 下面就做乙個簡單的hello world實驗來完成這一過程。本實驗涉及兩台主機。a主機 安裝交叉編譯環境,並用來編譯原始檔。在本次實驗中使用的是虛擬機器ubuntu系統環境 b主機 arm架構平台開發板,用來執行a主機編譯好的可執行檔案,...

今日外掛程式的乙個HELLO WORLD

hinstance g inst hwnd g hwnd hwnd g testwnd lresult callback wndproc hwnd hwnd,uint uimessage,wparam wparam,lparam lparam bool apientry dllmain handle...

建立乙個Hello World模組

這篇文章描述了怎樣為orchard建立乙個非常小的模組,它只顯示乙個 hello world 頁面.另乙個模組 module 的簡單例子,你可以從這找到 quick start get module blueprint.orchard是建立在asp.net mvc上的.這意味著如果你了解這個框架,你...