c語言程序源代碼_程序的編譯、鏈接和執行

3ce725d39c7d8fb1b475a7d77e60ecdb.png

同學們總是抱怨每次見到一道面試題都很難把它轉化為程序源代碼。然而不幸的是,即使是程序源代碼對于計算機來說也還是太高級了。要想讓計算機執行一段程序,我們必須把它翻譯成最底層的機器指令才行。這其中要經歷很多步驟。幸運的是有很多現成的工具可以幫助我們完成這個過程。今天我們就以 C 語言為例給大家做個簡單介紹。(Java 還要更復雜一些,涉及到字節碼和虛擬機,今天就不講了。)

預處理(Preprocessing)

翻譯一段 C 語言程序的第一步是預處理。這一步主要處理所有以“#”號開頭的行。比如當我們遇到 #include "header.h" 的時候,就直接把 header.h 文件里的所有內容插入到這兒。由此可見,一段 C 語言程序經過預處理之后還是一段 C 語言程序。

編譯(Compilation)

第二步是編譯,也就是將一段 C 語言程序翻譯為一段匯編語言程序。匯編語言比 C 語言要底層多了,基本上就是機器指令的文字版,每一行匯編語言對應著一條機器指令。往往 C 語言程序里的一行要被翻譯成好幾行匯編語言程序才行。不同的高級語言(如 C、Fortran、Pascal 等等)有不同的預處理器和編譯器,但它們在經過編譯之后都變成了同一種匯編語言,于是后面的步驟和工具大家都是通用的了。

匯編(Assembly)

第三步是匯編,即把文字版的匯編語言程序真正翻譯成由 0 和 1 組成的機器指令,并把它們打包輸出成一個 relocatable object program(下文簡稱目標文件)。如果說匯編語言程序人類還勉強能看懂,經過這一步之后得到的目標文件就真的是一堆二進制亂碼了。

鏈接(Linking)

第四步是鏈接,用來把多個目標文件合并成一個可執行文件。比如說我們寫了一個 hello world 程序,其中調用了 C 語言標準庫里的 printf() 函數來打印。我們的 hello world 的主函數和 printf() 函數存放在兩個不同的目標文件里,經過這一步之后它們就被合并到一起了。(這里講的是靜態鏈接。如果是動態鏈接的話,printf() 在這一步暫時不合并進來,而是在下一步程序運行的時候才被加載。)

加載(Loading)

上一步所生成的可執行文件終于可以被操作系統加載運行了。操作系統會將這個可執行文件中的代碼和數據從磁盤復制到內存中,并跳轉到該程序的第一條指令處(也叫做入口點,entry point)開始執行。

最后用一張圖給大家總結一下全過程:

4b0db7c8f1b6e85f6e4a2b7e0c631495.png

(本文在寫作過程中參考了 Randal E. Bryant 和 David R. O'Hallaron 所著的 Computer Systems: A Programmer's Perspective 第三版。)

更多北美CS求職信息請至:http://www.laioffer.com

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374345.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374345.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374345.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu下tftp服務器的搭建

參考博客:http://blog.chinaunix.net/uid-26495963-id-3206829.html1. 安裝$ apt-get install tftp-hpa tftpd-hpa2. 建立目錄$ mkdir /tftpboot # 這是建立tftp傳輸目錄。$ sudo chmod 777 /tftpboot$ sudo touch test.txt # test.txt文件最好輸入內容以便區分3. 配…

【程序員眼中的統計學(1)】信息圖形化:第一印象

信息圖形化:第一印象 作者 白寧超 2015年10月13日23:23:13 摘要:程序員眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機并沒有交集。誠然在傳統學科中,其…

JBoss AS 7.0.2“ Arc”發布–使用綁定選項

有關JBoss AS7方面的更多好消息。 JBoss AS 7.0.2.Final“ Arc”已經發布! 自AS 7.0.1發布以來已經過去了一個月。 在這短時間內,已修復了許多錯誤,并實現了更多功能和改進。 所有這些錯誤修復和功能已包含在此7.0.2版本中。 此新版本主要包…

C語言開發筆記(五)字符串常量

#include <stdio.h> #include <string.h>int main(void) {char *str "sting";strcpy(str, "hello");printf("%s\n", str);return 0; } 代碼為什么會運行錯誤&#xff0c;異常退出&#xff1f; 這段代碼是新手常見錯誤之一。 定義…

不屬于python標準庫的是_python標準庫和擴展庫

Tkinter ———— Python 默認的圖形界面接口。 Tkinter 是一個和 Tk 接口的模塊&#xff0c; Tkinter 庫提供 了對 Tk API 的接口&#xff0c;它屬于 Tcl/Tk 的 GUI 工具組。 Tcl/Tk 是由 John Ousterhout 發展的書寫和 圖形設備。 Tcl( 工具命令語言 ) 是個宏語言&#xff0c…

Android N 新特性 + APP開發注意事項

1. 多窗口MultiWindow 多窗口MultiWindow&#xff0c;這是Android N里對開發者影響比較大的特性&#xff0c;也是大家疑問比較多的地方。站在開發者的角度其實不必太擔心這個特性會導致我們需要修改很多代碼來適配系統。Google的工程師們也不希望這個特性導致很多應用出現問題&…

C語言開發筆記(六)實參和形參

舉例說明 #include <stdio.h>void swap(int x, int y) {int temp 0;temp x;x y;y temp; }int main(void) {int a 1, b 2;swap(a, b);printf("a%d, b%d\n", a, b);return 0; }結果為 在函數調用時&#xff0c;a的值傳給x&#xff0c;b的值傳給y。執行完…

Spring Singleton,請求,會話Bean和線程安全

由眾多有用框架組成的Spring框架生態系統已成為許多Java EE應用程序的基礎。 但是在所有Spring產品的核心中&#xff0c;我們仍然擁有Spring DI / IOC框架&#xff0c;該框架將Spring推向了新的高度。 隨著越來越多的人將Spring MVC或JSF-Spring集成用于他們的應用程序&#xf…

some fragments

1.fullpage 2.one page.js 3.scrollReveal.js 4.wow.js 5.瀏覽器前綴&#xff1a; -webkit- &#xff1a; Safari&#xff0c;Chrome -o- &#xff1a; Opera -moz- &#xff1a; Firefox -ms- &#xff1a; IE   6.css3過渡動畫&#xff1a;transitio…

面試之ajax原理(轉載)

總結1 總結2 AJAX全稱為“Asynchronous JavaScript and XML”&#xff08;異步JavaScript和XML&#xff09;&#xff0c;是一種創建交互式網頁應用的網頁開發技術&#xff0c; 是幾種原有技術的結合體。它由下列技術組合而成。 1.使用CSS和XHTML來表示。 2. 使用DOM模型來交互和…

優化方案電子版_關于小區分支道路整修設計方案的討論稿(No.2020121)

各位業主&#xff0c;大家好&#xff01; 關于綠洲比華利花園主干道翻新和次干道整修前期勘查和設計方案&#xff0c;經業委會及小區專家小組、設計單位申都設計公司工程設計人員結合本小區的實際情況進行了深入討論&#xff0c;優化設計&#xff0c;形成如下三個獨立方案&…

OSGI和Spring動態模塊–簡單的Hello World

在此姿勢中&#xff0c;我們將采用使用OSGi進行的第一個實現&#xff0c;并使用Spring Dynamic Modules改進應用程序。 Spring動態模塊&#xff08;Spring Dm&#xff09;使基于OSGi的應用程序的開發更加容易。 這樣&#xff0c;服務的部署就容易得多。 您可以像其他任何Spring…

C語言代碼規范(五)函數參數個數

一個函數的參數的數目過多&#xff08;尤其是超過8個&#xff09;顯然是一種不可取的編程風格。參數的數目直接影響調用函數的速度&#xff0c;參數越多&#xff0c;調用函數越慢。 參數的數目少&#xff0c;程序就顯得精練、簡潔&#xff0c;這有助于檢查和發現程序中的錯誤。…

vijos P1740 聰明的質檢員

題目鏈接:傳送門 題目大意:給你n個物品&#xff0c;每件物品有重量 W 和價值 V&#xff0c;給m個區間&#xff0c;和一個標準值。(n,m最大200000) 要求找到一個值x&#xff0c;使得m個所有區間的權值和與標準值的差的絕對值最小。單個區間權值計算公式(數目num0&#xff0c;價值…

為什么有的開關電源需要加自舉電容?

一、什么是自舉電路&#xff1f; 1.1 自舉的概念 首先&#xff0c;自舉電路也叫升壓電路&#xff0c;是利用自舉升壓二極管&#xff0c;自舉升壓電容等電子元件&#xff0c;使電容放電電壓和電源電壓疊加&#xff0c;從而使電壓升高。有的電路升高的電壓能達到數倍電源電壓。…

VS2010報錯 error:LINK1123:轉換到COF期間失敗,文件無限或損壞

右鍵工程-配置屬性-清單工具-輸入和輸出&#xff0c;嵌入清單一項重新選擇為否&#xff0c;如下圖 修改后重新生成和運行&#xff0c;發現程序正常運行了。

springboot 整合mybatis_SpringBoot整合Mybatis、MybatisPuls

文末視頻講解SpringBoot的版本是2.2.0一、整合Mybatis1-1、引入pom文件<dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>8.0.19version> dependency> <dependency> &l…

iOS 開發中遇到的問題

1. 關于糾結很久的KVO崩潰問題&#xff0c;其真正原因是&#xff0c;在刪除roomItem的KVO之前,將這個對象已經賦值為nil,所以實際上并沒有刪除他的observer&#xff0c;因此而崩潰&#xff1b;長時間糾結的原因是受.cxx_destruct影響了思路 2.拷貝block 因為block變量默認是聲明…

為舊版代碼創建存根–測試技術6

任何閱讀此博客的人都可能已經意識到&#xff0c;目前我正在開發一個包含大量舊代碼的項目&#xff0c;這些舊代碼龐大&#xff0c;擴展且編寫時從未進行過任何測試。 在使用此遺留代碼時&#xff0c;有一個行為異常的類非常普遍&#xff0c;整個團隊都一次又一次地犯錯。 為了…

C學習雜記(一)常見誤會

一、sizeof是關鍵字&#xff0c;不是函數。 二、strlen是函數。