- 论坛徽章:
- 2
|
这本书好想要,现在正缺的。。参与参与。。
1:你所理解的编译过程包括哪些?每个过程的作用是什么?
我所理解的程序的编译过程分为预处理、编译、汇编、链接等几个阶段。
预处理:预处理相当于根据预处理命令组装成新的C程序,不过常以i为扩展名。
编译: 将得到的i文件翻译成汇编代码。s文件。
汇编: 将汇编文件翻译成机器指令,并打包成可重定位目标程序的O文件。该文件是二进制文件,字节编码是机器指令。
链接: 将引用的其他O文件并入到我们程序所在的o文件中,处理得到最终的可执行文件。
2:你平时用到的编译选项是什么?说明其作用
-c 只是编译不链接,生成目标文件“.o”
-S 只是编译不汇编,生成汇编代码
-E 只进行预编译,不做其他处理
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件 输出到 文件
-ansi 关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性
-static 此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么
-share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3
译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 成所有警告信息。
-g 生成调试信息。GNU 调试器可利用该信息。
最常用:
gcc -Wall -g -ansi -o exe main.c 使用标准ANSC模式编译,并且生成警告信息和调试信息
3:如果让你自己做一个编译器,如何下手呢?
了解编译器的输入(程序源代码)和输出(机器码/某种中间代码),然后试着实现。
编译器的编写分为 3 个步骤:
词法分析器,用于将字符串转化成内部的表示结构。
语法分析器,将词法分析得到的标记流(token)生成一棵语法树。
目标代码的生成,将语法树转化成目标代码。
4:编译器和语言的关系是什么样的?
不管是什么语言,编译器的工作都是把他们翻译成机器能识别的机器语言,所以不管是c,c++,basic或者什么其他语言,他们编译链接出来的可执行文件都是差不多的(假设都是x86平台)。
程序语言可以用来写操作系统和编译器,操作系统用来编译器运行,编译器用来编译程序语言,编出来的东西可以是操作系统和编译器。 |
|