看完这篇文章以后,终于明白了编译到底怎么回事。数据库
1
对于同一个语句,有以下三种:高级语言、低级语言、机器语言的表示编程
C语言:windows
a=b+1;网络
汇编语言:数据结构
mov -0xc(%ebp),%eax编辑器
add $0x1,%eax学习
mov %eax,-0x8(%ebp)spa
机器语言:操作系统
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编译时示范的那样了。实际上那样是完成了预编译、编译、汇编和链接一连串的过程。
-o选项给输出的文件从新命名而不使用gcc默认的文件名。
想了解更多gcc的姿式能够到GNU上去看看。
最后,无论你是转行也好,初学也罢,进阶也可,若是你想学编程~
涉及:C语言、C++、windows编程、网络编程、QT图形界面开发、Linux编程、游戏编程、数据结构与算以及数据库......