本文学习自狄泰软件学院 唐佐林老师的 操作系统课程,另外本文PPT全部来源于唐佐林老师课程PPT,只用于个人笔记学习
目录:
- 1 GCC与gcc
- 2 交叉编译
- 3 C语言编译器
- 4 多语言混合开发方式
- 5 gcc关键编译选项
我们平时所说的编译器,其实包含了这几个部分,广义上的编译器包含了如上四个部分,其中的编译器部分是我们所说的狭义的编译器。我们要分清广义编译器和狭义编译器。
比如说:“这个代码,我们要考虑可移植性,如果把他移植到其他的编译器上面,是不是还能够正常运行”,这里所说的编译器 就是广义编译器。而如果这么说“我想开发一款编译器,这款编译器可将D语言翻译成C语言”,这里所说的编译器就是狭义的编译器了,狭义的编译只是做翻译的工作。
编译的过程:
第一步:是预处理,进行简单的文本替换,
第二步:狭义编译器,将C语言的代码 翻译成 汇编语言代码
第三步:汇编器,将汇编语言翻译成机器语言。
如何理解 “多语言混合开发” ?
多语言混合开发思维是一个架构师必备的思维,面对一个项目,该如何更高效的完成。这里说的高效分为两个部分,第一部分是,如何更高效的开发,第二部分是最终的产品执行效率的高效。对于第一部分,高效的开发,需要考虑很多问题,比如,这个项目是不是只用一种语言开发,只用一种语言,可能够是够,但是很低效,那么是不是把多种语言的优点结合起来,可以更高效的开发一个项目呢?这就是语言混合开发的本质了。
多语言混合开发方式一
将这三种语言所编写出来的程序进行编译,编译出来的是相同的目标平台的汇编程序,那这样就是
不同语言所编写的程序,在编译之后,得到的是相同的目标平台的汇编程序了,进而的 我们可以
目标平台的汇编器,再来汇编一下,可执行程序就出来了。
**问题:**这种开发方式有什么好处?
**答案:**节省人力成本。不同的语言的人力成本不一样,可以用便宜的语言人力,最后得到的都是目标
平台的汇编程序,效果一样。
多语言混合开发方式二
这种方式依赖于库,最终选择二进制层面的兼容。
问题: 两种方式有何异同?
答案: 方式一是 将多种语言翻译到目标平台的汇编语言,最后用汇编器汇编成可执行程序。方式1 的做法是从语言到语言。将不同的语言翻译成汇编语言,最后用汇编器汇编成可执行程序。方式二是利用二进制层面的兼容,比如第一种语言 已经编译得到了可执行程序了,是一个二进制程序,最后做的是链接就可以了。两种方式发差别是 第一种是从语言到语言,方法2是二进制代码层面的兼容。
如:QQ
依赖了一些库,二进制文件,最后链接。就是二进制层面的兼容。
gcc关键编译选项
gcc -E test.c -o test.i
gcc -S test.i -o test.s
gcc -C test.s -o test.o
实验1:
test.c
#include <stdio.h>
#include "func.h"
int g_global = 0;
int g_test = 1;
int main(int argc, char *argv[])
{
func();
printf("&g_global = %p\n", &g_global);
printf("&g_test = %p\n", &g_test);
printf("&func = %p\n", &func);
printf("&main = %p\n", &main);
return 0;
}
func.h
#include <stdio.h>
void func()
{
#ifdef TEST
printf("TEST = %s\n", TEST);
#endif
return;
}
在 ubuntu 中,一次执行指令:
将test.c行进预处理,生成预处理文件 test.i
gcc -E test.c -o test.i
将预处理文件test.i 进行汇编,翻译成汇编程序
gcc -S test.i -o test.s
将汇编程序汇编成机器语言
gcc -C test.s -o test.o
在映射文件中可以找到 变量以及函数的地址。