源程序編譯過程中裝配器
① 計算機正在運行的程序存放在
計算機正在運行的程序一般都會存放在RAM(內存中)里,但是如果運用虛擬存儲器技術可能會有一部分程序駐留在磁碟中。
RAM是與CPU進行數據交換等一些列操作的重要部件。計算機中程序的運行都離不開內存,因此內存的的好壞在一定程度上決定了計算機的好壞。
它用於暫時存放CPU中的運算數據,與硬碟等外部存儲器交換的數據。
(1)源程序編譯過程中裝配器擴展閱讀:
內存的技術指標一般包括奇偶校驗、引腳數、容量、速度等。引腳數可以歸為內存的介面類型。
程序在計算機中運行經過的步驟:
1、編譯:
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析、語法分析、語義檢查和中間代碼生成、代碼優化、目標代碼生成。
2、鏈接:
把所有編譯後得到的目標模塊連接裝配起來,再與函數庫相連接成一個整體。
3、裝載:
把程序裝入內存的操作系統程序
4、運行:
將可執行目標文件中的代碼和數據從磁碟復制到內存中,然後通過跳轉到程序的第一條指令或入口點來運行程序。
參考資料來源:網路-計算機
② Linux下如何編譯,運行C程序需要安裝編譯器嗎
首先一定要安裝 gcc (或者 cc )編譯器。然後在 Linux 系統下,首先使用 vi 全屏幕編輯程序編輯一個後綴名為 .c 的文件,然後使用 gcc 編譯器對你的 C 語言源程序進行編譯、連接。最後才能夠運行生成後的運行文件(如果你的源程序沒有任何編譯錯誤的話)。當然了,在 gcc 的編譯過程中,會有很多選擇項。這個就是靠編程經驗了。
舉例如下:
gcc test.c -o myrunfile ( -o 選項指定輸出的運行文件名為:myrunfile,如果不指定 -o 選項的話,預設的運行文件名為:a.out)
③ 用 C 語言編寫的源文件經過編譯,若沒有產生編譯錯誤,則系統將
本題正確答案應為B選項。
C選項為錯誤答案。
原因如下:
1、編譯程序僅僅是將源語言編寫的源程序轉換為目標程序。
2、編譯是把高級語言變成計算機可以識別的2進制語言。
3、編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優化;目標代碼生成。
顯然,編譯的過程中並沒有運行程序輸出結果的步驟茄戚,編譯的結果是生成目標文件(代碼)。
因此C選項為錯誤答案,B選項為正確答案。
編譯原理圖如下:
(3)源程序編譯過程中裝配器擴展閱讀:
目標代碼(目標文件)生成是編顫絕陵譯的最後一個階段。目標代碼生成器把語法分析後或優化後的中間代碼變換成目標代碼。目標代碼有三種形式:
1、 可以立即執行的機器語言代碼,所有地址都重定位;
2、待裝配的機器語言模塊,當需要執行時,由連接裝入程序把它們和某些運行程序連接起來,轉換成能執行的機器語言代碼;
3、匯編語言代碼,須經過匯編程序匯編後,成為可執行的機器語言代碼。
目標代碼生成階段應考慮直接影響到目標代碼速度的三個問題:一是如何生成較短的目標代碼;二是如何充分利用計算機中的寄存器,減少目標代碼訪問存儲單元的次數;三是如何充分利用計算機指令系統的特點,以提高目標代碼的質量。
參考資料:
編譯宏賣_網路
④ 簡述將源程序編譯成可執行程序的過程
一個源程序到一個可執行程序的過程:預編譯、編譯、匯編、鏈接。其中,編譯是主要部分,其中又分為六個部分:詞法分析、語法分析、語義分析、中間代碼生成、目標代碼生成和優化。
預編譯:主要處理源代碼文件中的以「#」開頭的預編譯指令。處理規則如下:
1、刪除所有的#define,展開所有的宏定義。
2、處理所有的條件預編譯指令,如「#if」、「#endif」、「#ifdef」、「#elif」和「#else」。
3、處理「#include」預編譯指令,將文件內容替換到它的位置,這個過程是遞歸進行的,文件中包含其他文件。
4、刪除所有的注釋,「//」和「/**/」。
5、保留所有的#pragma 編譯器指令,編譯器需要用到他們,如:#pragma once 是為了防止有文件被重復引用。
6、添加行號和文件標識,便於編譯時編譯器產生調試用的行號信息,和編譯時產生編譯錯誤或警告是能夠顯示行號。
(4)源程序編譯過程中裝配器擴展閱讀:
編譯過程中語法分析器只是完成了對表達式語法層面的分析,語義分析器則對表達式是否有意義進行判斷,其分析的語義是靜態語義——在編譯期能分期的語義,相對應的動態語義是在運行期才能確定的語義。
其中,靜態語義通常包括:聲明和類型的匹配,類型的轉換,那麼語義分析就會對這些方面進行檢查,例如將一個int型賦值給int*型時,語義分析程序會發現這個類型不匹配,編譯器就會報錯。
⑤ C#源代碼編譯成為本地代碼的編譯過程
很有興趣的話,可以去閱讀下JeffreyRitchie的《ClrviaC#》,目前出到第三版,英文好的話強烈推薦看英文版的,而且我有該電子書和實體書。
下面講下我的理解:大致上不會出什麼差錯的,細節部分你可以參照上面的書籍!
1.首先,c#源碼經過c#編譯器被編譯成託管模塊(IL中間代碼、元數據(Metadata))
2.然後,使用C#編譯器以及程序集鏈接器(AssemblyLinker----AL.exe)將上述託管模塊以及項目的資源文件Combine(整合)成一個程序集(Assembly)
上述程序集就是你所看到的exe文件或者dll文件等等,程序集中包含了manifest描述文件,是該程序集內容以及關系的一個清單,具體的內容你可以參見JR的書跟Java中的類似!
雙擊該exe運行的時候:
3.最後,運行時,CLR裝載對應的程序集,使用內部的三個即時編譯器(常用的為JIT),再去根據本機的環境去進行相應的優化(針對CPU優化等等),即時的翻譯成本地機器指令去執行。
還有一個本地化代碼生成工具,NGen.exe~~
這個最好能去看看那本JR的神作!細節不是我三言兩語能講清的~~