学习较底层编程:动手写一个C语言编译器
2014-11-13 09:58
363 查看
动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法。
编译器通常被看作是十分复杂的工程。事实上,编写一个产品级的编译器也确实是一个庞大的任务。但是写一个小巧可用的编译器却不是这么困难。
秘诀就是首先去找到一个最小的可用工程,然后把你想要的特性添加进去。这个方法也是Abdulaziz Ghuloum在他那篇著名的论文“一种构造编译器的捷径”里所提到的办法。不过这个办法确实可行。你只需要按照这篇论文中的第一步来操作,就可以得到一个真正可用的编译器!当然,它只能编译程序语言中的非常小的子集,但是它确实是一个真实可用的编译器。你可以随意的扩展这个编译器,然后从中学到更多更深的知识。
受到这篇文章的鼓舞,我就写了一个C编译器。从某种意义上来说这比写一个scheme的编译器要困难一些(因为你必须去解析C那复杂的语法),但是在某些方面又很便利(你不需要去处理运行时类型)。要写这样一个编译器,你只需要从你那个可用的最小的编译器开始。
对于我写的编译器来说,我把它叫 babyc,我选了这段代码来作为我需要运行的第一个程序:
没有变量,没有函数调用,没有额外的依赖,甚至连if语句,循环语句都没有,一切看起来是那么简单。
我们首先需要解析这段代码。我们将使用 Flex 和 Bison 来做到这点。这里有怎么用的例子可以参考,幸好我们的语法是如此简单,下面就是词法分析器:
这里是语法分析器:
最终,我们需要生成一些汇编代码。我们将使用32位的X86汇编,因为它非常的通用而且可以很容易的运行在你的机器上。这里有X86汇编的相关网站。
下面就是我们需要生成的汇编代码:
然后加上上面的词法语法分析代码,把这段汇编代码写进一个文件里。恭喜你!你已经是一个编译器的编写者了!
Babyc 就是这样诞生的,你可以在这里看到它最开始的样子。
当然,如果汇编代码没办法运行也是枉然。让我们来用编译器生成我们所希望的真正的汇编代码。
非常棒!接着让我们来真正的运行一下编译之后代码来确保它能得到我们所想的结果。
我们踏出了第一步,接下去怎么做就全看你了。你可以按照那篇文章所指导的全部做一遍,然后制作一个更加复杂的编译器。你需要去写一个更加精巧的语法树来生成汇编代码。接下去的几步分别是:(1)允许返回任意的值(比如,return 3; 一些可执行代码);(2)添加对“非”的支持(比如,return ~1; 一些可执行代码)。每一个额外的特性都可以教你关于C语言的更多知识,编译器到底是怎么执行的,以及世界上其他编写编译器的人是如何想的。
这是构建 babyc 的方法。Babyc 现在已经拥有了if语句,循环,变量以及最基础的数据结构。欢迎你来check out它的代码,但是我希望看完我的文章你能够自己动手写一个。
不要害怕底层的一些事情。这是一个非常奇妙的世界。
转自:http://mp.weixin.qq.com/s?__biz=MjM5OTA1MDUyMA==&mid=201480994&idx=1&sn=ffa07f722cbad156d6040f2454f3927f&3rd=MzA3MDU4NTYzMw==&scene=6#rd
编译器通常被看作是十分复杂的工程。事实上,编写一个产品级的编译器也确实是一个庞大的任务。但是写一个小巧可用的编译器却不是这么困难。
秘诀就是首先去找到一个最小的可用工程,然后把你想要的特性添加进去。这个方法也是Abdulaziz Ghuloum在他那篇著名的论文“一种构造编译器的捷径”里所提到的办法。不过这个办法确实可行。你只需要按照这篇论文中的第一步来操作,就可以得到一个真正可用的编译器!当然,它只能编译程序语言中的非常小的子集,但是它确实是一个真实可用的编译器。你可以随意的扩展这个编译器,然后从中学到更多更深的知识。
受到这篇文章的鼓舞,我就写了一个C编译器。从某种意义上来说这比写一个scheme的编译器要困难一些(因为你必须去解析C那复杂的语法),但是在某些方面又很便利(你不需要去处理运行时类型)。要写这样一个编译器,你只需要从你那个可用的最小的编译器开始。
对于我写的编译器来说,我把它叫 babyc,我选了这段代码来作为我需要运行的第一个程序:
我们首先需要解析这段代码。我们将使用 Flex 和 Bison 来做到这点。这里有怎么用的例子可以参考,幸好我们的语法是如此简单,下面就是词法分析器:
下面就是我们需要生成的汇编代码:
Babyc 就是这样诞生的,你可以在这里看到它最开始的样子。
当然,如果汇编代码没办法运行也是枉然。让我们来用编译器生成我们所希望的真正的汇编代码。
这是构建 babyc 的方法。Babyc 现在已经拥有了if语句,循环,变量以及最基础的数据结构。欢迎你来check out它的代码,但是我希望看完我的文章你能够自己动手写一个。
不要害怕底层的一些事情。这是一个非常奇妙的世界。
转自:http://mp.weixin.qq.com/s?__biz=MjM5OTA1MDUyMA==&mid=201480994&idx=1&sn=ffa07f722cbad156d6040f2454f3927f&3rd=MzA3MDU4NTYzMw==&scene=6#rd
相关文章推荐
- 学习较底层编程:动手写一个C语言编译器
- 静态库与动态库及交叉编译总结及学习较底层编程:动手写一个C语言编译器
- 学习较底层编程:动手写一个C语言编译器
- 学习较底层编程:动手写一个C语言编译器
- 学习编程就不要做一个浮躁的人
- 发现httpsqs是一个学习unix下c编程的很好的范例
- (转)动手打造一个汇编学习环境
- 一个学习java图形化编程的好网站
- 根据网友建议,决定使用以前为初学者设计的一个编程目标和学习的顺序来书写JavaEE教程
- 介绍一个学习编程的好网站
- UNIX环境高级编程学习之第十三章守护进程 - 初始化一个守护进程
- 为学习APUE(Unix环境高级编程)偷懒,而写的脚本,基本上相当于一个简单的工程创建脚本了
- 一个物理学家学习Windows编程的感受
- 如何利用单台计算机(可能只有一个或没有串口)学习VC串口编程
- Prism4学习笔记4:动手完成一个MVVM实例
- WPF学习——制作一个简单的录入界面(2):用C#编程实现所有控件的功能
- 一个很好的编程学习网站(电子书,教程,经验分享等等):http://www.ccrun.com/index.asp
- 收集整理了一些开发技巧专题,并汇集成一个编程学习网站
- 学习编程的一个感受,今天又让我feel了一把。
- 一个学习编程技术的好网站-http://www.tutorialspoint.com/index.htm