看完這篇文章之後,終於明白了編譯到底怎麼回事。
對於同乙個語句,有如下三種:高階語言、低階語言、機器語言的表示
我們都知道,機器是只能做數字計算的,能夠讓機器去運算的、數字的語言就是機器語言,除此之外的所有計算機語言都是非機器語言。這樣的相對於機器語言的高階語言都需要乙個轉換,從高階、機器不可理解,轉換為機器可理解的機器語言。這樣的乙個轉換過程就叫做編譯(compile)
,由編譯器(compiler)
來完成。
由c轉換為組合語言這一過程是由彙編器(assembler)
來執行的。
c和組合語言轉換為機器語言都是由編譯器來完成的。
這裡面,c是可跨平台的,也可以說是與平台無關的。這裡的平台有兩種說法,一種是指計算機的體系(architecture)
,另一種是指作業系統(operate system)
,也可以是指兩種的結合。不同的平台,他們所需要的執行機器語言的指令集是不同的。c的跨平台性是指,只需要編寫乙份不需要修改的c程式**,就可以在不同體系、不同作業系統的計算機上執行。這都要靠編譯器的功勞,編譯器將c程式翻譯為了適合當前計算機體系的機器語言。
下面說一下將c語言編譯為機器語言的整個過程:
首先,我們寫出乙份c程式**,命名該**為hello.c
,這個**檔案,我們稱之為源**(srouce code)
。
然後我們執行編譯器,對該源**檔案進行編譯,在整個編譯的過程中,編譯器並不會執行該源**,只是生成乙份新的機器語言**檔案,如hello.out
。這份新生成的**檔案稱為目標**(object code)
或可執行**(executable)
。
對於編譯過程,裡面還涉及到具體的一些可以說的細節步驟。
在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編譯時示範的那樣了。實際上那樣是完成了預編譯、編譯、彙編和連線一連串的過程。
btw,gdb是常用的調式軟體。
看完這篇文章之後,終於明白了編譯到底怎麼回事。
看完這篇文章之後,終於明白了編譯到底怎麼回事。對於同乙個語句,有如下三種 高階語言 低階語言 機器語言的表示 我們都知道,機器是只能做數字計算的,能夠讓機器去運算的 數字的語言就是機器語言,除此之外的所有計算機語言都是非機器語言。這樣的相對於機器語言的高階語言都需要乙個轉換,從高階 機器不可理解,轉...
看完這篇文章你就能完全明白web專案中的路徑問題了
今天做網上購物系統 web專案 中個人資訊模組的頭像上傳,一直出現路徑問題,仔細看一下,是自己完全沒有弄明白路徑。經過一番學習,也算是有所收穫,下面我們就來談一下絕對路徑和相對路徑的區別問題。我們都知道,在我們平時使用計算機時要找到需要的檔案就必須知道檔案的位置,而表示檔案的位置的方式就是路徑,例如...
簡訊介面怎麼對接?看完這篇文章你就知道了!
現如今,簡訊被很多商家和企業用來為自己的產品和服務進行宣傳,多用於使用者註冊 登入 支付 重要資訊的下發通知 宣傳推廣與營銷活動等場景,大大提高了企業跟使用者之間的粘性以及獲客效率。那麼,簡訊介面怎麼對接才能做的更好呢?接下來就一起來了解一下吧!首先,在講解簡訊介面怎麼對接之前,我們要先來了解簡訊服...