[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。