導航:首頁 > 源碼編譯 > 編譯器中的連接器

編譯器中的連接器

發布時間:2022-04-24 17:57:44

1. 編譯器是什麼

一個現代編譯器的主要工作流程如下:源代碼(sourcecode)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標代碼(objectcode)→連接器(Linker)→可執行程序(executables)編譯語言與解釋語言對比:許多人將高級程序語言分為兩類:編譯型語言和解釋型語言。然而,實際上,這些語言中的大多數既可用編譯型實現也可用解釋型實現,分類實際上反映的是那種語言常見的實現方式。(但是,某些解釋型語言,很難用編譯型實現。比如那些允許在線代碼更改的解釋型語言。)編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。把一個程序寫好,這時利用的環境是文本編輯器。這時我程序把程序稱為源程序。在此以後程序員可以運行相應的編譯器,通過指定需要編譯的文件的名稱就可以把相應的源文件(通過一個復雜的過程)轉化為機器碼了。

2. 什麼是編譯器

編譯器

編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。我們把一個程序寫好,這時我們利用的環境是文本編輯器。這時我程序把程序稱為源程序。在此以後程序員可以運行相應的編譯器,通過指定需要編譯的文件的名稱就可以把相應的源文件(通過一個復雜的過程)轉化為機器碼了。

[編輯]編譯器工作方法
首先編譯器進行語法分析,也就是要把那些字元串分離出來。然後進行語義分析,就是把各個由語法分析分析出的語法單元的意義搞清楚。最後生成的是目標文件,我們也稱為obj文件。再經過鏈接器的鏈接就可以生成最後的可執行代碼了。有些時候我們需要把多個文件產生的目標文件進行鏈接,產生最後的代碼。我們把一過程稱為交叉鏈接。

一個現代編譯器的主要工作流程如下:

* 源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables)

工作原理

編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。

典型的編譯器輸出是由包含入口點的名字和地址以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。

編譯器種類

編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高級語言作為輸入,輸出也是高級語言的編譯器。例如: 自動並行化編譯器經常採用一種高級語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。

預處理器(preprocessor)

作用是通過代入預定義等程序段將源程序補充完整。

編譯器前端(frontend)

前端主要負責解析(parse)輸入的源程序,由詞法分析器和語法分析器協同工作。詞法分析器負責把源程序中的『單詞』(Token)找出來,語法分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句 ,函數等等。 例如「a = b + c;」前端詞法分析器看到的是「a, =, b , +, c;」,語法分析器按定義的語法,先把他們組裝成表達式「b + c」,再組裝成「a = b + c」的語句。 前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變數是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstract syntax tree,或 AST),這樣後端可以在此基礎上進一步優化,處理。

編譯器後端(backend)

編譯器後端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。

一般說來所有的編譯器分析,優化,變型都可以分成兩大類: 函數內(intraproceral)還是函數之間(interproceral)進行。很明顯,函數間的分析,優化更准確,但需要更長的時間來完成。

編譯器分析(compiler analysis)的對象是前端生成並傳遞過來的中間代碼,現代的優化型編譯器(optimizing compiler)常常用好幾種層次的中間代碼來表示程序,高層的中間代碼(high level IR)接近輸入的源程序的格式,與輸入語言相關(language dependent),包含更多的全局性的信息,和源程序的結構;中層的中間代碼(middle level IR)與輸入語言無關,低層的中間代碼(Low level IR)與機器語言類似。 不同的分析,優化發生在最適合的那一層中間代碼上。

常見的編譯分析有函數調用樹(call tree),控制流程圖(Control flow graph),以及在此基礎上的變數定義-使用,使用-定義鏈(define-use/use-define or u-d/d-u chain),變數別名分析(alias analysis),指針分析(pointer analysis),數據依賴分析(data dependence analysis)等等。

上述的程序分析結果是編譯器優化(compiler optimization)和程序變形(compiler transformation)的前提條件。常見的優化和變新有:函數內嵌(inlining),無用代碼刪除(Dead code elimination),標准化循環結構(loop normalization),循環體展開(loop unrolling),循環體合並,分裂(loop fusion,loop fission),數組填充(array padding),等等。優化和變形的目的是減少代碼的長度,提高內存(memory),緩存(cache)的使用率,減少讀寫磁碟,訪問網路數據的頻率。更高級的優化甚至可以把序列化的代碼(serial code)變成並行運算,多線程的代碼(parallelized,multi-threaded code)。

機器代碼的生成是優化變型後的中間代碼轉換成機器指令的過程。現代編譯器主要採用生成匯編代碼(assembly code)的策略,而不直接生成二進制的目標代碼(binary object code)。即使在代碼生成階段,高級編譯器仍然要做很多分析,優化,變形的工作。例如如何分配寄存器(register allocatioin),如何選擇合適的機器指令(instruction selection),如何合並幾句代碼成一句等等。

3. 易語言連接器是什麼啊

所謂的靜態編譯不過是調用VC編譯器滴.,.連接器就是VC編譯器.

4. 源代碼到可執行 文件之間的轉換用到的 編譯器如gcc、匯編器、連接器等是怎麼集成到IDE環境中的

在VisualC 2005中,如何調用其它編譯器編譯cpp文件呢?換句話說,如何把其它編譯器集成到VC2005的IDE中呢?

象ICC這樣的編譯器安裝之後會自動集成進來,要集成其他編譯器那還得自己動手。下面介紹一種簡單、淺層的「集成」方法。

你也許注意到了,在VC2005的IDE中是不能編譯單個.cpp文件的,除非把它放在工程中。但是,我們可以通過調用外部工具實現編譯單文件。

下面以調用G 為例說明如何編譯單個.cpp文件。如果要編譯單個.c文件,使用GCC即可,方法同理。

也許你現在還不知道G 。G 是GCC中的一員。GCC的含義是GNU編譯器集合(GNUCompilerCollection),包括C、C 、Objective-C、Fortran、Java、Ada連同與這些語言相配的庫等。GCC被譽為「世界上最重要的軟體」。許多免費的編譯器都是GCC的移植版—MinGW(MinimalistGNUforWindows)中攜帶的編譯器就是如此。

以MinGW為例,我們可以下載DevC ,DevC 目前最新版為4.9.9.2。安裝DevC 的同時就安裝了MinGW,其中包含了G 3.4.2.

假設DevC 安裝在D:\Dev-Cpp目錄下。

下面我們在VC2005的菜單點擊「工具(Tools)->外部工具(ExternalTools)->添加(Add)」。

分別填入:

標題(Title):GNUC Compiler

命令(Command):D:\Dev-Cpp\bin\g .exe

參數(Arguments):-Wall-o$(ItemFileName)$(ItemFileName)$(ItemExt)-time

初始目錄(Initialdirectory):$(ItemDir)

再鉤選下面的"使用輸出窗口(UseOutputwindow)".

說明:如果你已經把D:\Dev-Cpp\bin\目錄添加到系統環境變數中,那麼Command指定為g .exe即可。Cygwin同理。

這些參數只是一個參考。你可以查閱VC編譯器的宏設置你需要的參數。

乾脆順帶補充一下DigitalMarsC 編譯器的參考參數設置:

標題(Title):DigitalMars

命令(Command):C:\dm\bin\dmc.exe

參數(Arguments):$(ItemFileName)$(ItemFileName)$(ItemExt)

初始目錄(Initialdirectory):$(ItemDir)

好,下面切換到main函數所在文件,點擊工具(Tools)菜單下的「GNUC Compiler」開始編譯。

注意g 此時編譯的指是純C 程序,對於包含int_tmain(intargc,_TCHAR*argv[])這類VC特有的C 程序自然是無法通過編譯的。

如果編譯沒有出錯,對於早期版本的g 而言,Outputwindow是沒有任何輸出的。

而對於較新版本的g ,將輸出類似以下的信息:

#cc1plus0.670.22
#as0.050.01
#collect20.360.19

這是-time報告的編譯過程中每個子過程所佔用的CPU時間。

當然,你還可以更改編譯參數,使輸出窗口輸出其他編譯信息。

我們還可以通過添加外部工具來實現運行g 生成的程序的功能。步驟如下:

在VC2005的菜單點擊「工具(Tools)->外部工具(ExternalTools)->添加(Add)」。

分別填入:

標題(Title):RunasC Application

命令(Command):%systemroot%\system32\cmd.exe

參數(Arguments):/c$(ItemFileName).exe

初始目錄(Initialdirectory):$(ItemDir)

不要鉤選下面的「使用輸出窗口」和「退出時關閉」。

注意:cpp文件必須放在工程中,g 生成的程序才能被運行!

用MinGW的g 編譯出的程序可以在沒有安裝MinGW的Windows系統上運行!

但是在Cygwin/gcc下編譯出來的程序,在windows執行必須依賴cygwin1.dll。

通過VC2005創建不帶預編譯頭的Win32控制台應用程序空環境,這樣編譯出來的可執行文件也不是放在哪台機子都能跑的。但是常規空環境可以做到。

下面講講如何設置快捷鍵。

點擊菜單中的"工具->自定義",

點擊右下角的"鍵盤",

點擊"按快捷鍵"下面的文本框,

按下Shift Ctrl F7,如果這個快捷鍵已經分配給了其他的命令,更換一個即可。

5. 在VS2010的VC++中如何編譯、鏈接、運行、調試程序

在vc2010中看不到像VC6.0顯式的編譯、連接按鈕了。只有工具欄(啟動調試)和菜單欄(測試)

這些功能包含編譯、鏈接、運行(調試)所有步驟,都一鍵完成。

實際上這些功能是編譯器使用以下工具實現的:

編譯器CL.EXE,將.c/.cpp源代碼編譯成目標代碼.obj,

連接器LINK.EXE,將目標代碼和庫連接生成最終文件;

資源編譯器RC.EXE(.rc)將資源編譯,最終通過連接器存入最終文件.

注意編譯准備:VCVARS32.bat拷貝到當前的workspace下在cmd下執行之後就可以

直接使用這些編譯工具在cmd下編譯.

-----------------------------------------------------------

例子:記事本編輯hello.c,在按照上面要求拷貝到當前目錄下,打開cmd

CL.EXE /c hello.c只編譯不連接

LINK.EXE hello.obj 用到的庫文件,生成可執行文件.如:

LINK.EXE hello.obj user32.lib

RC.EXE Hello.rc

-----------------------------------------

CL.EXE,LINK.EXE,vcvars32.bat所在目錄:假定VS2010使用默認安裝路徑

C:Program FilesMicrosoft Visual Studio 10.0VCin

rc.exe所在路徑:

C:Program FilesMicrosoft SDKsWindowsv7.1ABin

注意:

(1)這些EXE文件在vs2010下可能存在多個不同路徑,但都是一樣的,可以通用

(2)如果電腦上安裝了不同的VS版本,這些文件會不同,注意區分。使用同一VS版本下的文件。

6. VC6.0的編譯器、連接器在命令提示符中如何使用

你是想在命令行下編程吧?
這個第一,可以去看看win32匯編,羅雲斌的書
第二,你該看看什麼事nmake工具。
第三,我不知道你為什麼要在命令行下編譯呢?要是這樣的話你還不如去使用TC呢

回答完畢

7. Visual Unit 設定編譯器和連接器

預先安裝好VC,比如我安裝的是Microsoft visual studio 2005.

再來,Visual Unit 4.0 安裝,完成後,重新打開進入演示版。
在窗口的主界面,點擊菜單欄「工程」-》「打開示例工程」,選擇一個自己想打開的項目。
點擊菜單欄「工具」-》「設定」。裡面便有「編譯器」和「編輯器」。

點擊「編譯器」,「名稱」項,選擇你安裝VC對應的Visual C++ 版本,比如"Visual C++ 2005". 編譯器和鏈接器,同樣道理,選擇之前你安裝VC的根目錄下,對應的編譯器和鏈接器。比如:
「D:\Program files\Microsoft Visual Studio 2005\VC\bin\cl.exe」
「D:\Program files\Microsoft Visual Studio 2005\VC\bin\link.exe」。
這樣便可以了。

如果項目執行測試,還是有類似編譯器或者鏈接器的問題,請繼續看以下注意事項,檢查下工程屬性是否一致:

待工程打開載入後,再次點擊菜單欄「工程」-》「工程屬性」,
在「常規」界面,選擇你需要的測試代碼編譯器,比如我裝的VC2005,那麼我就選擇Visual C++ 2005.

點擊第五個tab "鏈接"。點擊「環境變數」。在變數名下拉列表中,點擊您安裝VC的版本對應的dir,比如「vc2005_dir」. 在下面的「值」一欄,點擊「瀏覽」找到VC對應的根目錄。比如「D:/Program files/Microsoft Visual Studio 2005」。「OK」確認。再點擊當前小窗口的「保存」。關閉小窗口。
退回到「工程屬性」窗口,檢查「庫文件搜索目錄」,是否是自己設定的vc2005_dir為頭的目錄,比如:「$(vc2005_dir)/vc/lib」.

其它地方比如「頭文件」里的目錄設置,亦是如此。不過只要你設置了一處的環境變數,其它地方也就會自動調用你設置的路徑下的編譯器了。

希望對你有幫助。:)

8. ccs中c編譯器生成的段有哪些

out文件與ojp文件。
依次點擊project--new,在新建一個工程的時候,在彈出的對話框里有一個選項是選擇編譯輸出文件,有out文件和lib文件可選,選擇lib,則工程編譯通過後是生成庫文件。
簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。一個現代編譯器的主要工作流程:源代碼(sourcecode)→預處理(preprocessor)→編譯器(compiler)→目標代碼(objectcode)→連接器(Linker)→可執行程序(executables)。

9. 編譯器由什麼組成

編譯器:翻譯工具,把高級語言源程序翻譯為匯編語言源程序,再把匯編源序翻譯成目標代碼供連接程序使用。
語言:一個規則。例如:C語言,它規定程序入口為main(),和其它規定。並把這些 <規定的集合> 命名為C語言。
TC:一個開發工具,它包括文本編輯器,編譯器,連接程序,調試環境等等。TC中的編譯器是TCC.EXE文件。

關於匯編:
匯編語言是一個規則,
匯編程序是一個翻譯工具
匯編源程序是一個 符合(匯編語言)規則的程序代碼
匯編是一個過程,這個過程是匯編程序 把匯編源程序 翻譯 為目標代碼的過程
對於高級語言:翻譯的過程叫做編譯,翻譯工具叫做編譯程序或編譯器。

閱讀全文

與編譯器中的連接器相關的資料

熱點內容
cad命令大全圖表下載 瀏覽:389
程序員去印度工作 瀏覽:422
蘋果app活動怎麼導出 瀏覽:3
pdf轉高清圖片 瀏覽:33
人人玩棋牌源碼 瀏覽:345
如何獲取美團伺服器時間 瀏覽:342
php簡單加密演算法 瀏覽:791
什麼是開伺服器 瀏覽:607
cd4017單片機怎麼用 瀏覽:263
鳥哥pdf 瀏覽:242
忘記加密的密碼了怎麼辦 瀏覽:558
好友信息提示音在哪個文件夾 瀏覽:276
怎麼讓雲伺服器轉發本地埠 瀏覽:46
python數組剔除元素 瀏覽:15
推薦一款解壓的手機游戲 瀏覽:47
jsphp時間戳轉換日期 瀏覽:420
明日之後如何刪掉賬號伺服器 瀏覽:76
syjsks是什麼伺服器 瀏覽:606
中控軟體加密狗授權後變空白的 瀏覽:675
androidphp登陸 瀏覽:192