1. 程式人生 > >看完這篇文章之後,終於明白了編譯到底怎麼回事。

看完這篇文章之後,終於明白了編譯到底怎麼回事。

看完這篇文章之後,終於明白了編譯到底怎麼回事。

1

對於同一個語句,有如下三種:高階語言、低階語言、機器語言的表示

  • C語言 
    a=b+1;

  • 組合語言 
    mov -0xc(%ebp),%eax
    add $0x1,%eax
    mov %eax,-0x8(%ebp)

  • 機器語言 
    8b 45 f4
    83 c0 01
    89 45 f8

我們都知道,機器是隻能做數字計算的,能夠讓機器去運算的、數字的語言就是機器語言,除此之外的所有計算機語言都是非機器語言。這樣的相對於機器語言的高階語言都需要一個轉換,從高階、機器不可理解,轉換為機器可理解的機器語言。這樣的一個轉換過程就叫做編譯(Compile)由編譯器(Compiler)

來完成。

由C轉換為組合語言這一過程是由彙編器(Assembler)來執行的。

C和組合語言轉換為機器語言都是由編譯器來完成的。

2

這裡面,C是可跨平臺的,也可以說是與平臺無關的。這裡的平臺有兩種說法,一種是指計算機的體系(Architecture),另一種是指作業系統(Operate System),也可以是指兩種的結合。不同的平臺,他們所需要的執行機器語言的指令集是不同的。C的跨平臺性是指,只需要編寫一份不需要修改的C程式程式碼,就可以在不同體系、不同作業系統的計算機上執行。這都要靠編譯器的功勞,編譯器將C程式翻譯為了適合當前計算機體系的機器語言。

下面說一下將C語言編譯為機器語言的整個過程:

首先,我們寫出一份C程式程式碼,命名該程式碼為hello.c,這個程式碼檔案,我們稱之為原始碼(Srouce Code)

然後我們執行編譯器,對該原始碼檔案進行編譯,在整個編譯的過程中,編譯器並不會執行該原始碼,只是生成一份新的機器語言程式碼檔案,如hello.out。這份新生成的程式碼檔案稱為目的碼(Object Code)可執行程式碼(Executable)

3

對於編譯過程,裡面還涉及到具體的一些可以說的細節步驟。

Linux下,使用gcc編譯器:

預編譯hello.c檔案:

gcc -E -o hello.i hello.c

執行成功後就會生成一個新的hello.i

的檔案,可以用編輯器(Vim)檢視它的內容,這個檔案就是經過預編譯後的內容。

預編譯又稱為預處理,是做些程式碼文字的替換工作。預編譯可以處理#開頭的指令,比如拷貝#include包含的檔案程式碼,#define的巨集定義的替換,條件編譯等。

純粹的進行編譯:

gcc -S -o hello.s hello.i

把.i檔案寫為hello.c也行,就是跳過手動預編譯,直接完成預編譯和編譯兩個過程。這時會得到一個hello.s檔案,開啟看一下,裡面是編譯好的使用於當前體系結構的彙編程式碼。

把彙編程式碼進行彙編可執行:

gcc -c -o hello.o hello.s

把.s檔案換成.c也行,就是自動完成預編譯、編譯和彙編三個過程。現在得到一個hello.o檔案,這是一個二進位制檔案,但不是最後的可執行二進位制檔案,因為它還缺少最後一步連線處理。

最後對.o檔案進行連線,我們這裡就一個.o檔案所以簡單,經常是需要有多個.o檔案需要連線。連線執行:

gcc -o hello hello.o

如果把最後的.o檔案寫成.c,那就和最開始我們用hello.c編譯時示範的那樣了。實際上那樣是完成了預編譯、編譯、彙編和連線一連串的過程。

想了解更多gcc的只是可以到GNU的網站上去看看。

BTW,gdb是常用的調式軟體。

相關推薦

文章之後終於明白編譯到底怎麼回事

看完這篇文章之後,終於明白了編譯到底怎麼回事。 1 對於同一個語句,有如下三種:高階語言、低階語言、機器語言的表示 C語言  a=b+1; 組合語言  mov -0xc(%ebp),%eax add $0x1,%eax mov %eax,-0x8(%ebp) 機

一定要進入人工智慧行業的理由文章你或許就懂

當今,全球科技界最炙手可熱的名詞莫過於“人工智慧”,全球科技巨頭諸如谷歌、微軟、蘋果、IBM、F

敏捷與安全不可兼得嗎?文章我想說:未必!

摘要:敏捷與安全似乎矛盾,但如何共存?本文將為你解讀從“應用敏捷”到“應用敏捷+安全”的實現路徑。 起初,企業以傳統的瀑布式研發模式把軟體開發過程劃分為需求、分析、設計、開發、測試等不同的流程。這些流程有著嚴格的先後次序之分,只有當前面的流程結束之後,下一個流程才能開始運轉。這種開發方式好似瀑布的下落,由此命

文章終於搞懂TVS瞬態抑制二極體

看完這篇文章,徹底搞懂TVS二極體 瞬態抑制TVS二極體,作為常用的電路保護元器件,廣泛應用於各行各業。在汽車電子、消費電子、電源驅動、工業配電、再生能源、電信、家電、計量儀器、醫療電子、工業控制、照明、安保系統、建築控制及自動化、音訊/視訊裝置、計算機及其周邊

認真文章JVM將不再是你的短板

前言   想起當年還是個菜鳥的時候,看了許多帖子,裡面的Java大神們都在說:JVM調優是JavaIT人進階所必備的知識。 於是就買了書和教程去看,但是發現對於調優這個話題看書效率奇低,有些內容反覆看了又看,回想起來腦子裡卻不剩什麼。 為了避免大家出現類似的情況,特地編輯了

零基礎學python文章你的python基礎就差不多!乾貨【2】

3. 運算子 3.1 算數運算子 是完成基本的算術運算使用的符號,用來處理四則運算,而“+”和“*”還可以用來處理字串。   3.2 比較(關係)運算子   Python 2.x 中判斷 不等於 還可以使用 <

零基礎學python文章你的python基礎就差不多!乾貨【1】

本文分為兩部分: Python基礎語法和麵向物件(下一篇分享面向物件)   Python基礎語法   1. 認識Python 1.1 Python 簡介 Python 的創始人為吉多·範羅蘇姆(Guido van Rossum)。

文章你已經入門Python

  簡介 Python 是一種高層次的結合瞭解釋性、編譯性、互動性和麵向物件的指令碼語言。Python 由 Guido van Rossum 於 1989 年底在荷蘭國家數學和電腦科學研究所發明,第一個公開發行版發行於 1991 年。 當然在學習Python的道路上肯定會

文章包你懂得如何用Python實現聚類演算法的層次演算法!

什麼是聚類 將物理或抽象物件的集合分成由類似的物件組成的多個類的過程被稱為聚類。由聚類所生成的簇是一組資料物件的集合,這些物件與同一個簇中的物件彼此相似,與其他簇中的物件相異。聚類分析又稱群分析,它是研究(樣品或指標)分類問題的一種統計分析方法。   聚類分析起源於分類學,但是聚

文章包你懂得如何用Python實現聚類算法的層次算法!

-c 中心 算法介紹 sets 物理 self. 計算方法 多維 起源 什麽是聚類 將物理或抽象對象的集合分成由類似的對象組成的多個類的過程被稱為聚類。由聚類所生成的簇是一組數據對象的集合,這些對象與同一個簇中的對象彼此相似,與其他簇中的對象相異。聚類分析又稱群分析,它是研

Java程式設計師想要高薪文章就夠

Java作為一門程式語言,在各類程式語言中作為弄潮兒始終排在前三的位置,這充分肯定了java語言的魅力,在實際專案應用中,我們已經無法脫離java,它的高效能,穩定性,擴充套件性已經深入到每一個java程式設計工程師的骨髓裡。 然而要想成為一名合格的java工程師並不容易。因為作為一名Ja

文章你還不知道解軟體測試你找我!

測試行業小故事 我曾今不止一次見過:對軟體測試行業不甚瞭解的新人與已經在測試行業摸爬滾打幾年的前輩之間的互相指責和爭執。 新人因為不瞭解測試行業,也不瞭解提問的藝術,所以問的都是自己比較關注的問題和一些基礎問題。前輩因為對測試行業有一定的瞭解,掌握一定的知識技術,早就

文章再決定要不要當資料科學家?

如今,手把手教你當資料科學家的文章不在少數。 確實,當你下定決心從事資料科學領域工作,這些都需要考慮。不過在這之前,你們應該問自己一個問題,並且這個問題是每個有抱負的資料科學家需要認真想一想的:“我要不要當資料科學家?” 這個問題更關注你選擇這一職業的原因,而非從事這一職業的方法。那麼

文章你就瞭解Android Handler的一切

Message More ...next() { // Return here if the message loop has already quit and been disposed. // This can happen if the appl

你還在靠“喂喂喂”來測語音通話質量嗎文章你就能掌握正確姿勢

語音通話開發,對於一般開發者來說比較神祕,很多朋友不太清楚如何全面的評估第三方的音訊引擎,如何科學的選擇一家靠譜的語音通話服務供應商。 很多朋友還停留在這樣的初級階段:把demo調通,找幾個人喂喂喂……憑自己優異的聽覺感受一下。整個測試過程就完成了,廠商也就這麼“愉快”

WEB前端開發的思考與感悟文章你再考慮是否入坑!

擁有 適配 多人 理解 公司 鍛煉 適合 web前端開發 一段 最近幾年對於web前端的傳聞很多,比如人才稀缺,簡單易學,待遇豐厚,整體勢頭發展良好等等。遇到過一個不太熟搞後臺開發的同事跑來問我學習前端需要掌握哪些內容,也聽說過一個搞IOS開發準備自學前端半個月然後要去找前

iOS 花五分鐘文章學會跳轉指定App的設定頁面(相容iOS10)

iOS對於App的許可權管理有了很大的進步,但是當自己的App被禁止通知或者禁止聯網使用藍芽等情況發生時,怎麼引導使用者去設定頁面開啟這些許可權,是很多產品需要的功能。 這邊文章都是以跳轉設定推送頁面

TCP/IP 和 HTTP不瞭解?文章網路知識就全懂

本文來自作者宋璐 在 GitChat 上分享「如何快速入門網路基礎知識(TCP/IP 和 HTTP)」,「閱讀原文」檢視交流實錄 「文末高能」 編輯 | 洛肯 前言 在寫之前,先給這篇文章做一個明確定位,讀完這篇文章後,希望你能夠: 對於計算機網路有初步的認識和了解,瞭解一些經典專業術語,如

PDF怎麽拆分成多個PDF文章你就明白

c89 pro 很好 有著 效果圖 分享 內容 拖拽 雙擊 PDF文件對於每一個經常在職場上工作的人來說,是特別常見的一個文檔格式,PDF格式深受人們的喜愛,因為是特別好用的,但同時也是比較難進行編輯和修改的,特別是遇到PDF文檔過長,為了方便瀏覽和及時查找對我們有用的內容

文章我奶奶都懂https的原理

本文在個人技術部落格同步釋出,詳情可猛戳 Http存在的問題   上過網的朋友都知道,網路是非常不安全的。尤其是公共場所很多免費的wifi,或許只是攻擊者的一個誘餌。還有大家平時喜歡用的萬能鑰匙,等等。那我們平時上網可能會存在哪些風險呢?   1. 洩密,個人隱私、賬戶密碼等資訊可能會被盜取。   2.