写编译器

Technorati 标签: 编译器设计之大牛见解

转自: 沈崴的日志, http://eishn.blog.163.com/blog/static/652318200961325951918/

我曾经说过初学者之所以特别热衷于写编译器、写数据库、写搜索引擎、搞 XX 智能、搞 XX 引擎、写操作系统 (读 linux 源码) 之类的事情, 是因为他写不出编译器这些东西。玩不转就会觉得高深。人们都喜欢聊些看起来高深的东西, 因为这很牛逼。扯啊扯的就变成了初学者中的高手。高手们正则表达式这些基础都还不会就已经会整编译器啥了。初学者有个死了也要算法的嗜好, 最烦的就是正则, 缺乏算法感, 宁愿写一堆的 if 也不用, 从这点看我确实折服了。您真牛逼。其实对 unix 程序员来说, 这些看上去很算法的东西, 其实还都挺容易的, 开源项目四处都是, 都玩滥了, 我们无聊时常写着玩, 真没什么好到处招呼的。

前段时间看到有人推荐的编译器设计教程, 教程说写编译器也不难, 你只要照着一步一步如此如此写就可以了, 讲得挺好。编译器这玩艺, unix/linux 下随便哪个项目为了方便都可能随手做一个, 这是 unix 程序员的基本功。只有在初学者社区, 这种编程基础才会变成很牛逼的技术。可见社区基础之差、技术之烂。不过我今天在这里想说的是, 那个编译器教程看了还嫌复杂, 到了今天编译器还这么写就略显老土了。

编译器, 本质上是个文本转换器, 把文本代码转换成本地可执行的机器码。这其实是我们最早的做法, 编译成机器码看上去是件很牛逼的事情, 因为他很底层嘛。道理一样, 很多初学者是言必称底层的, 因为基础太差玩不转所谓的底层, 所以觉得底层啊汇编啊什么的帅死了。其实别看现在那么浮躁, 我们过去玩计算机的都得坐下来老老实实从计算机体系结构开始学, 我认识的一二十年的老程序员, 平时在项目里玩 python 玩得不亦乐乎, 其实这些人搞搞硬件、汇编啥的都是毛毛雨, 所谓底层真没什么好到处招呼的。正因为一路从原始社会过来, 用那些劳民伤财、底层低效的东西用烦了、弄怕了, 才真正觉出 python 的妙处。倒是新手还没被恶心到, 非得以底层为荣, 看不起高级的东西, 偏偏还是一种沾沾自喜高人一等的神气。您真牛逼。

会点汇编在过去还真没什么, 早些时候还流行过汇编机器码对译, 简单记下对译表, 直接用 01 编程了。我也记过, 早忘了, 有了 c 还用什么汇编和机器码啊。机器码、汇编、c 语言是逐行对应的, c 代码在你眼前就是汇编、机器码, 就是寄存器, 就是 ip 指针, 有 c 以后就没必要用更底层的东西了。有 python 以后呢, 同样道理, python 能做的就没必要用 c 了。写个文本转换工具, 处理文本啥的 perl、python 这些语言最方便, 关键是有正则可以用。可以想象在没有正则的黑暗年代, 黑客第一件事情不是把什么劳什子状态机理论搞出来, 而是把正则设计出来。先有光, 然后一切都好办。言必称算法的小朋友肯定又要觉得实现正则是件很牛逼的事情了, 事实上真要去写了也就上百行代码, 也没像初学者传得那么邪门。

所以起先编译器我们直接用 c 写, 后来是 yacc/lex 用正则来刷源码, 发明一个新语言这档子事儿, 就变得相当简单了。当然这还是原始社会, 新的工具, 比如 python 除了正则, 还拥有众多现代语法特性和强大的第三方工具。最近做了个 Mako 的克隆, 包含判断、循环等完备的流程控制语法, 解析到输出也才三百多行。即使从来没接触过这类程序, 三百多行代码打印到一张 A4 纸上, 看半天也明白了。这是技术发展到今天的惨痛后果, 还在那里很牛逼地言必称编译器, 基本上就是初学者了。

解析完源码一定要很酷地输出二进制可执行代码么? 当然不必了啦, 你可以输出 c 啊, 再把 c 编译成可执行代码。如果你能输出 c, 觉着不爽要换成输出直接可执行的二进制码, 无非是查个表, 他们是可逐行翻译的嘛。所以无所谓了。在传世的 pypy 项目中, 即是把 python 转换成 c、llvm、javas

cript、flex , 比神吹 java 还要跨平台。同样道理, 你甚至不用输出 c, 输出 rpython 就可以了嘛。比如说 Mako 这个编译型模板, 本来就是解析输出 python 的, 到 rpython 规范也就吃碗饭抽根烟的时间, 结果你得到了什么? 一个可以编译成本地二进制的极速模板, 一个可以在 javascript 甚至 flash 里面使用的编译型模板, 并且自带编译优化。

解释器就不说了, 有许多相通的地方, 只是要写一个解释型语言未必会比编译型语言更容易。

自己动手编译器和链接器对于计算机科学和软件工程领域的学习者来说是一项非常有挑战性和有益的任务。下面我将简要介绍如何在CSDN上找到相关的学习资源和教程。 首先,编译器和链接器是计算机软件开发中非常重要的工具,用于将高级语言的源代码转换成机器语言并执行。如果你想学习如何自己动手编编译器和链接器,你可以在CSDN网站上寻找相关教程和学习资料。 在CSDN上搜索关键词“编译器教程”或“链接器教程”,你会找到很多相关的文章和博客。这些文章会介绍编译器和链接器的基本原理和工作流程,以及如何使用不同的编程语言来实现它们。 此外,你还可以在CSDN的论坛或问答板块上提问,向其他开发者或专家请教关于编译器和链接器的问题。在这里,你可以得到其他人的经验分享和专业建议,加速你学习的进程。 另外,你还可以加入一些与编译器和链接器相关的技术讨论群,与其他学习者和专家进行交流和讨论。在这些群中,你可以分享自己的学习经验,向别人请教问题,获取更广泛的视角和深入的理解。 总的来说,自己动手编编译器和链接器是一项非常有挑战性和充实的任务。在CSDN上你可以找到很多相关的学习资源和教程,同时通过与其他学习者和专家交流可以加速你的学习进程。希望你能够充分利用这些资源,顺利掌握编译器和链接器的原理和实现方法。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值