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