[Powered by Google Translate] ROB BOWDEN:讓我們談談編譯器。 直到此時,你剛剛打完了你的源代碼 一些文件,送他們通過這個大黑盒子, 鐺,和你的可執行文件,它出來 正是你寫在你的源代碼。 神奇的,我們要仔細 看看實際上發生了什麼 當我們編譯的文件。 所以,這是什麼意思編譯的東西嗎? 那麼,在最一般的意義上說,它只是意味著 轉換代碼寫在一 編程語言到另一個。 但是,通常當人們說他們編譯的東西,他們 意思是,他們把它從一個高級編程 語言來編程語言的一個較低的水平。 這些可能看起來很主觀的。 例如,您可能沒有想到C為高 高級編程語言,但你編譯它。 但是,它是相對的。 正如我們將要看到的,彙編代碼,並最終機 ,我們編譯的代碼無疑是一個較低的水平 比C 雖然我們將使用鏘在今天的演示, 很多的想法在這裡進行其他的編譯器。 鐺,有四個主要步驟的整體 編譯。 這些,預處理,通過預處理器; 2, 編譯,由編譯器完成;三,組裝 由彙編程序完成;和四個 連接的連接器。 這可能會造成混淆的整體的一個的子步驟 鏘編譯器被稱為編譯器,但 我們會得到。 我們的例子中,我們將使用一個簡單的Hello World程序 此視頻。 讓我們一起來看看。 第一個步驟是預處理。 預處理器做什麼? 在幾乎每一個你曾經讀或寫C程序, 你已經開始用哈希的代碼行。 我把它叫做哈希,但您也可以撥打磅,數 簽署,或尖銳。 任何這樣的行預處理器指令。 #define和#include之前,你可能已經看到,但有 有幾個預處理器能夠識別。 讓我們添加一個#define我們的Hello World的例子。 現在讓我們運行預處理程序,這個文件。 你通過clage-E標誌,指示它運行 只是預處理器。 讓我們看看會發生什麼。 它看起來像鏘剛剛吐出來的一切 在命令行中。 為了保存這個輸出到一個新文件 hello2.c,我們將追加> hello2.c對我們的命令。 現在,讓我們來看看在我們的預處理文件。 哇,那發生在我們短暫的小程序? 如果我們去這個文件的底部,我們可以看到 一些我們寫的代碼。 請注意,在#define消失了,所有實例的名稱 正是我們所指定的已被取代 #define行。 那麼,什麼是所有這些類型定義和函數聲明 在上面的文件嗎? 請注意的#define是不是唯一的預處理 指令,我們指定。 我們還包括stdio.h中。 因此,所有的瘋狂線實際上只是stdio.h中複製 並粘貼到該文件的頂部。 這就是為什麼頭文件非常有用的功能 聲明。 而不需要複製和粘貼的功能 聲明您打算使用在文件的開頭, 預處理器將其複製並粘貼的標頭 文件為您。 現在,我們已經完成了預處理,我們移動到 編譯。 我們所說的這一步編譯的原因是因為這是 鐺的步驟實際上是從C編譯 彙編代碼。 為了鐺編譯文件集會,但 繼續沒有進一步的,通過-S標誌 在命令行中。 讓我們來看看在大會上 文件輸出。 它看起來像一個完全不同的語言。 彙編代碼是非常特定的處理器。 在這種情況下,由於CS50的設備上運行的 虛擬x86處理器,這是x86彙編代碼。 很少有人直接寫在彙編代碼,這些天, 但你寫的每一個C程序被轉化 成彙編。 同樣,我們稱這個步驟的C編譯成彙編 從一個更高的水平,因為我們要到一個較低的水平 編程語言。 是什麼使裝配較低的水平比C? 那麼,組裝,我們都非常有限,我們能做些什麼。 有沒有如果,是,是,或任何形式的循環。 但是你可以完成同樣的事情,這些控制 結構提供了利用有限的操作, 裝配提供。 但要看到確實是低層次的裝配是如何,讓我們去 在我們編譯了一步,組裝。 這是彙編器的工作轉換的彙編代碼 成目標代碼或機器代碼。 請記住,彙編程序不輸出組件; 更確切地說,它需要在組件和輸出機器代碼。 機器代碼是1和0的實際,CPU可以 明白了,雖然我們仍然有一點點離開工作 之前,我們可以運行我們的程序。 讓我們來組裝我們的彙編代碼通過 。鏗鏘-C標誌。 現在,讓我們來看看什麼在組裝的文件。 嗯,這不幫助我們非常感謝。 請記住,機器代碼的和零 您的計算機可以理解的。 這並不意味著它容易讓我們理解。 那麼究竟如何低電平組裝? 這是幾乎相同的目標代碼。 從組裝到目標代碼是更是一個 翻譯不是轉型,這就是為什麼 人們可能不考慮彙編 做任何實際編譯。 事實上,這是很容易的手動翻譯 組裝成機器代碼。 在裝配的主要功能,即第一行 恰好對應為十六進制的0x55的。 在二進制中,這是1010101。 第二行恰好對應十六進制的0x895。 而接下來,0X56。 給定一個相對簡單的表格,你可以翻譯 的代碼組裝成機器可以理解太。 因此,有一個剩餘的步驟 編譯,鏈接。 一堆鏈接結合成一個大文件的目標文件 實際上,你可以執行。 鏈接是非常依賴於系統。 所以最簡單的方式來獲得鐺只是鏈接對象 文件在一起是調用的鐺上所有的文件 你想連接到一起。 如果您指定的o文件,然後將需要重新處理, 編譯和裝配所有的源代碼。 讓我們把一個數學函數到我們的文件,所以我們必須 東西進行連接。 現在讓我們來編譯它回落到目標代碼和 叫鐺就可以了。 哎呀。 由於我們的數學函數,我們需要鏈接 數學庫使用-lm。 如果我們想聯繫到一起一堆。o文件,我們 寫我們自己的,我們只是指定所有這些在 命令行。 該限制是,只有一個,這些文件 指定一個主函數,否則, 生成的可執行文件,不知道從哪裡開始 運行你的代碼。 指定的文件鏈接之間的區別是什麼 與-l,只是直接指定一個文件? 什麼也沒有。 這是剛剛發生,鐺確切地知道什麼文件 類似LM發生來稱呼。 如果你知道自己該文件,你可以指定它 明確。 請記住,所有的-l標誌來結束時 你的客戶需求。 而這一切就是這麼簡單。 當你剛剛運行鐺上的一些文件,這是它的 其實這樣做。 我的名字是羅布·波頓,這是CS50。