導航:首頁 > 源碼編譯 > 編譯鏈接過程發生在磁碟還是內存

編譯鏈接過程發生在磁碟還是內存

發布時間:2022-04-28 16:43:39

㈠ 計算機中的軟體在運行時,系統會將其先載入到哪裡

計算機正在運行的程序存放在RAM(內存)里。
RAM是與CPU進行溝通的橋梁。計算機中所有程序的運行都是在內存中進行的,因此內存的性能對計算機的影響非常大。只要計算機在運行中,CPU就會把需要運算的數據調到內存中進行運算,當運算完成後CPU再將結果傳送出來,內存的運行也決定了計算機的穩定運行。
它的組成是:內存是由內存晶元、電路板、金手指等部分組成的。

計算機運行程序:整個過程可以總結為編譯、鏈接、裝載、執行。
1、編譯:編譯過程又可以被分為兩個階段:編譯、匯編。編譯是指編譯器讀取字元流的源程序,對其進行詞法與語法的分析,將高級語言指令轉換為功能等效的匯編代碼。匯編器是將匯編代碼轉變成機器可以執行的命令,每一個匯編語句幾乎都對應一條機器指令。
2、鏈接:鏈接的主要內容是將各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確地銜接。
3、裝載:程序在經過鏈接後,得到了可執行文件,下一步就需要將可執行程序載入到內存中。由於現代操作系統均採用分頁的方式來管理內存,所以操作系統只需要讀取可執行文件的文件頭,之後建立起可執行文件到虛擬內存的映射關系,而不需要真正的將程序載入內存。
4、運行:載入器將可執行目標文件中的代碼和數據從磁碟復制到內存中,然後通過跳轉到程序的第一條指令或入口點來運行程序。

㈡ C語言中的內存四區,是在運行內存中,還是在硬碟中

取決於操作系統的
一般是在內存中
但如果佔用內存過多 有可能跑到硬碟中,比如windows的虛擬內存(pagefile), Linux的swap等等。

㈢ 編譯時分配內存和運行時分配內存

編譯其實只是一個掃描過程,進行詞法語法檢查,代碼優化而已,編譯程序越好,程序運行的時候越高效。
我想你說的「編譯時分配內存」是指「編譯時賦初值」,它只是形成一個文本,檢查無錯誤,並沒有分配內存空間。

當你運行時,系統才把程序導入內存。一個進程(即運行中的程序)在主要包括以下五個分區:
棧、堆、bss、data、code

代碼(編譯後的二進制代碼)放在code區,代碼中生成的各種變數、常量按不同類型分別存放在其它四個區。系統依照代碼順序執行,然後依照代碼方案改變或調用數據,這就是一個程序的運行過程。

㈣ c++ 編譯 鏈接是怎麼回事

compile和link是大多數語言從原代碼生成可執行程序的兩個步驟。

之所有有這兩個步驟因為幾乎任何一個程序都不是用一個原文件寫出來的。compile是先針對單獨原文件進行處理。link是把compile處理的結果組合成一個完整的可執行文件。

其實C/C++完全也可以一步成型,不需要compile和link兩個步驟,但是那樣的後果就是:一,每次生成可執行程序,必須翻譯全部源代碼;二,C語言的執行庫(printf, scanf這些)必須都以源代碼形式存在。這怎麼樣也說不過去吧。

另外頭文件不屬於compile和link過程,頭文件是預編譯過程的文件。

C/C++語言的完整編譯過程是

一、預編譯

處理#define #if #include這類#開頭的語句,這些稱為預編譯指令。這個過程中會把.h文件和.c/.cpp文件組合成最終交給compile過程的原文件。這個原文件是不包含任何#開頭的語句的。所有#define定義的宏也會被替換。

二、編譯
把上面那個原文件編譯成.o或者VC里是.obj文件。這個文件保存了機器碼化的函數、函數的描述、全局變數的描述、乃至段的描述等等。

三、連接
把可執行程序需要的所有的編譯過程產生的.o或者.obj文件組合到一起。(這里也包括.lib文件,.lib文件件本質上就是打包的.obj文件集合)。另外連接過程還會組合一些其他數據,比如資源、可執行文件頭等等。

㈤ 可執行程序為什麼在內存中運行,而不是在硬碟上

呃,可執行程序的運行也不在內存上啊,而是在CPU上運行,內存只是存儲器件而已。
一個程序會被保存在硬碟上,但硬碟的速度太慢了,如果CPU直接從硬碟調用程序,程序的響應速度會很差。所以在你調用某個程序時,該程序會將主進程載入入內存,以後CPU在對該程序進行操作時,就可以從內存中提取數據和指令,畢竟內存的速度遠快於硬碟,就可以大幅提高程序的響應速度。

㈥ 程序編譯後的機器碼是在內存,還是硬碟

程序編譯後,機器碼是存在硬碟。

在執行時,機器碼,被操作系統,讀入內存。

㈦ 計算機正在運行的程序存放在

計算機正在運行的程序一般都會存放在RAM(內存中)里,但是如果運用虛擬存儲器技術可能會有一部分程序駐留在磁碟中。

RAM是與CPU進行數據交換等一些列操作的重要部件。計算機中程序的運行都離不開內存,因此內存的的好壞在一定程度上決定了計算機的好壞。

它用於暫時存放CPU中的運算數據,與硬碟等外部存儲器交換的數據。

(7)編譯鏈接過程發生在磁碟還是內存擴展閱讀:

內存的技術指標一般包括奇偶校驗、引腳數、容量、速度等。引腳數可以歸為內存的介面類型。

程序在計算機中運行經過的步驟:

1、編譯:

編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析、語法分析、語義檢查和中間代碼生成、代碼優化、目標代碼生成。

2、鏈接:

把所有編譯後得到的目標模塊連接裝配起來,再與函數庫相連接成一個整體。

3、裝載:

把程序裝入內存的操作系統程序

4、運行:

將可執行目標文件中的代碼和數據從磁碟復制到內存中,然後通過跳轉到程序的第一條指令或入口點來運行程序。

參考資料來源:網路-計算機

㈧ 計算機是怎樣運行程序的

為了使計算機程序得以運行,計算機需要載入代碼,同時也要載入數據,然後由處理器執行指令。整個過程可以總結為編譯、鏈接、裝載、執行。
1、編譯
編譯過程又可以被分為兩個階段:編譯、匯編。
編譯是指編譯器讀取字元流的源程序,對其進行詞法與語法的分析,將高級語言指令轉換為功能等效的匯編代碼。
匯編器是將匯編代碼轉變成機器可以執行的命令,每一個匯編語句幾乎都對應一條機器指令。匯編相對於編譯過程比較簡單,根據匯編指令和機器指令的對照表一一翻譯即可。
2、鏈接
鏈接的主要內容是將各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確地銜接。鏈接又分為靜態鏈接和動態鏈接:
靜態鏈接是指在編譯階段直接把靜態庫加入到可執行文件中去,這樣可執行文件會比較大;
動態鏈接則是指鏈接階段僅僅只加入一些描述信息,而程序執行時再從系統中把相應動態庫載入到內存中去。
3、裝載
程序在經過鏈接後,得到了可執行文件,下一步就需要將可執行程序載入到內存中。
由於現代操作系統均採用分頁的方式來管理內存,所以操作系統只需要讀取可執行文件的文件頭,之後建立起可執行文件到虛擬內存的映射關系,而不需要真正的將程序載入內存。
4、運行
載入器將可執行目標文件中的代碼和數據從磁碟復制到內存中,然後通過跳轉到程序的第一條指令或入口點來運行程序。
在程序的運行過程中,CPU發現有些內存頁在物理內存中並不存在並因此觸發缺頁異常,此時CPU將控制許可權轉交給操作系統的異常處理函數,操作系統負責將此內存頁的數據從磁碟上讀取到物理內存中。
數據讀取完畢之後,操作系統讓CPU
jmp到觸發了缺頁異常的那條指令處繼續執行,此時指令執行就不會再有缺頁異常了。
(8)編譯鏈接過程發生在磁碟還是內存擴展閱讀
為使計算機按預定要求工作,首先要編製程序,無論是最早的操作系統還是現代操作系統,程序的運行都是計算機工作的本質。
早期計算機是單任務執行,由程序員直接編寫操作系統可以識別的機器語言,到現在可以實現多道程序並行,並且程序的開發由更利於程序員理解的高級語言編寫,源程序在經過一系列翻譯過程,變成計算機理解的機器語言,再執行。
整個程序執行的過程,需要CPU、內存、程序代碼、設備等配合,才能實現程序要表達的功能。
參考資料來源:網路-計算機

㈨ 程序運行的基本步驟

一、編譯時與運行時的內存情況

1.編譯時不分配內存
編譯時是不分配內存的。此時只是根據聲明時的類型進行佔位,到以後程序執行時分配內存才會正確。所以聲明是給編譯器看的,聰明的編譯器能根據聲明幫你識別錯誤。
2.運行時必分配內存
運行時程序是必須調到「內存」的。因為CPU(其中有多個寄存器)只與內存打交道的。程序在進入實際內存之前要首先分配物理內存。
3.編譯過程
只能簡單說一下,因為如果要詳細的話,就是一本書了《編譯原理》。編譯器能夠識別語法,數據類型等等。然後逐行逐句檢查編譯成二進制數據的obj文件,然後再由鏈接程序將其鏈接成一個EXE文件。此時的程序是以EXE文件的形式存放在磁碟上。
4.運行過程
當執行這個EXE文件以後,此程序就被載入到內存中,成為進程。此時一開始程序會初始化一些全局對象,然後找到入口函數(main()或者WinMain()),就開始按程序的執行語句開始執行。此時需要的內存只能在程序的堆上進行動態增加/釋放了。

各區段功能說明:

1、程序代碼區:存放函數體的二進制代碼。

2、全局區(靜態區)(static):全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 程序結束後由系統釋放。
3、文字常量區 :常量字元串就是放在這里的。 程序結束後由系統釋放。
4、堆區(heap): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。

5、棧區(stack):由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。

㈩ C語言編譯原理是什麼

編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。

1、預處理階段:

主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)

2、匯編階段:

插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。

3、編譯階段:

將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。

4、鏈接階段:

在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。

閱讀全文

與編譯鏈接過程發生在磁碟還是內存相關的資料

熱點內容
雲南社保局app叫什麼 瀏覽:693
美女程序員吃大餐 瀏覽:208
項目二級文件夾建立規則 瀏覽:558
dns使用加密措施嗎 瀏覽:172
php獨立運行 瀏覽:530
手機sh執行命令 瀏覽:727
雲伺服器的角色 瀏覽:735
單片機頻率比例 瀏覽:842
我的世界伺服器如何關閉正版驗證 瀏覽:506
如何查roid伺服器上的 瀏覽:132
安卓手機主板如何撬晶元不掉電 瀏覽:251
php各個框架的優缺點 瀏覽:103
php1100生成數組 瀏覽:361
以後做平面設計好還是程序員好 瀏覽:554
雲伺服器應用管理 瀏覽:440
飢荒雲伺服器搭建過程 瀏覽:186
可編程式控制制器優點 瀏覽:101
壓縮垃圾車說明書 瀏覽:28
五輪書pdf 瀏覽:804
單片機定時流水中斷系統流水燈 瀏覽:701