编译原理的各个阶段及其功能 && clang产生背景

http://topic.csdn.net/u/20090911/11/af6252d7-961e-4e19-bb3d-4d4d686ce2f7.html
http://blog.csdn.net/shycoffee/article/details/4095810
http://blog.163.com/guyot/blog/static/120574021200911494028692/
http://blog.csdn.net/rangf/article/details/6977873
http://baike.baidu.com/view/1393751.htm
http://blog.csdn.net/xietao1233/article/details/6644807
http://zhidao.baidu.com/question/19910786.html
http://baike.baidu.com/view/945740.htm
http://baike.baidu.com/view/226876.htm#4
http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/
http://www.cnblogs.com/feisky/archive/2010/03/09/1681996.html          !!!
http://wenku.baidu.com/view/a059f5e49b89680203d825c6.html
http://www.vbgood.com/thread-98646-1-1.html






http://blog.csdn.net/shycoffee/article/details/4095810
编辑器-预处理器-编译器-汇编器-链接器
预处理器会处理相关的预处理指令,一般是以"#"开头的指令。如:#include "xx.h" #define等;
编译器把对应的*.cpp翻译成*.s文件(汇编语言)。 汇编器则处理*.s生成对应的*.o文件(obj目标文件);
最后链接器把所有的*.o文件链接成一个可执行文件(*.exe)。


http://topic.csdn.net/u/20090911/11/af6252d7-961e-4e19-bb3d-4d4d686ce2f7.html
编辑:在IDE里写程序
预处理:加载头文件、带#符号的宏替换
编译:将.c或.cpp源文件转化为.s汇编文件再通过汇编器转化为.o(.obj)目标文件(二进制)
链接:将多个.o文件及一些库文件链接在一起形成可执行文件(.exe),链接分为三种:静态链接、装入时动态链


接、运行时动态链接。参见:http://wenku.baidu.com/view/0a8cbf5177232f60ddcca1e0.html
运行:装入内存、获取CPU控制权、执行局部变量是在程序运行时在栈中给分配的存储空间。比如:我的一个aa.mysql配置文件中存储了数据库账号、密码等信息。程序中取出这些信息保存在局部变量中。编译好之后,运行。当我把数据库密码改了,只需改一下配置文件即可(不用重新编译,就可以直接运行)。不是说头文件是在预处理时就加载进去了,现在配置文件改了,预处理之后才是编译,那为何不用重新编译就能正确运行程序(采用改之后的数据库密码)呢?我的简单理解是配置文件和头文件是不同的:头文件在编译之前就已经确定了其里面的内容,即使修改了头文件,如果不重新编译,仍然不会生效。但是配置文件呢,是在执行时动态加载的,所以说更改了配置文件无须重新编译就可以生效的。
补充一点:连接有两种,静态连接和动态连接; 静态连接是在连接的时候装入内存的,动态连接是在程序执行的时候(即调用该函数的时候)装入内存的,所以可以说动态连接能节省内存的开销。

http://blog.csdn.net/xietao1233/article/details/6644807
用汇编实现"判断字符串是否为回文"(nasm版)

llvm/clang将把FreeBSD带向何方?

参见:http://www.linuxsir.org/bbs/showthread.php?t=353921

http://qikee.blogbus.com/logs/113687683.html
llvm/clang是一个编译器,llvm是类似虚拟机的东西(www.llvm.org ),这个虚拟机不是类似java或者说python的VM,llvm的目的不是运行而是编译生成代码。也就是说这个llvm是编译器的后端。clang呢,(clang.llvm.org)简单来说就是llvm一个C语言家族的前端,它的责任就是把C家族语言翻译成llvm认识的中间代码,然后再由llvm后端生成具体架构的汇编代码,最后由系统中的汇编器、连接器生成某一个架构下的可执行文件。任何编译器不都是这个套路吗?分前端后端,代码生成,也许还有代码优化, llvm到底有什么不同?最主要的是llvm提供的是函数库,一组较好定义的接口,使得编译器前端的设计相当的傻瓜。我们可以为Perl写一个llvm的前端,它就可以把perl脚本编译成本地二进制代码运行;给python写个前端,它一样可以编译。不要以为这个前端有多么的复杂,通过llvm比较合理 的接口,这个工作不是很难。所以总得来说llvm/clang的架构要优于GCC的架构(其实写个GCC的语言前端也不是什么大事,但是 你必须了解GCC内部的机制和细节,并不能像llvm那样调用几个库函数就把事情给搞定。),就因为这个优势,FreeBSD准备迁移到 llvm/clang上面。怎么可能? 不要太天真了。一个庞大的操作系统要迁移到另外一个还在开发之中的编译器上,不是一件容易的事情。这么做的原因其实是GNU把后续开发的GCC变成 GPLv3了,BSD的人本来就对GPL不感冒,这个V3影响到了使用FreeBSD做商业运作的公司的核心利益。


如果想要在近年内完全脱离GNU编译器族,那也不太可能。 llvm/clang就是个C/C++编译器,最后还要使用系统中的汇编器和连接器来生成可执行文件的,在FreeBSD中这些as和ld可都是GNU 的。虽然BSD的binutils早就在开发了,除了有个ar,nm之类的东西开发完成,as,ld估计是八字没有一瞥呢。当然,我也理解啊,有的用就先 用着,何必为了licence去重造轮子呢?对于assembler估计llvm项目自己会出一个,好像叫“mc”(也是听人家在mailling list上吹的),至于linker嘛,虽说不是什么复杂的软件,估计要等GNU把它的ld变成GPLv3才有希望看到BSD的linker了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值