##起源与目的 这个想法在我做论文的时候就已经诞生了,在知乎上也遇到了很多和我一样对编译器感兴趣的同学,加之我也想好好整理以及分享一下我在编译器方面的经验。但是由于之前却一直没有很好的空闲时间来做这件事,而在硕士论文上传完毕后,也终于可以来做这件事情了。

##针对人群 本系列讲述的内容将会是基础内容,所以主要是想完整设计出一个编译器,或者是对程序语言与编译原理,抑或是LLVM有兴趣的人群,也可以理解为初学者。如果你已经具有非常丰富的编译知识,我想这份教程不会让你提起多少兴趣,当然你可以来关注一下我偶尔的八卦调侃、吐槽(比如C++语言这么设计给编译器造成的复杂实现什么的)等。

##主要内容 本教程的主要内容为从零开始如何构建一个编译器,将会包括如词法分析、语法分析、中间代码、代码优化、代码生成等内容。

其中,每一部分都将会先叙述编译原理,然后再用程序实现原理对应的元素(不会利用任何工具来生成,如Lex与Yacc等),并将详细阐述为什么是这样的(几乎每一行代码都会阐述),我想做到原理与实际工程的尽量结合。而这里面产生的中间代码格式将会是LLVM IR,代码优化部分会是基本的优化,如消除死代码、常量合并、置换,消除公共表达式等,最后的代码生成会以生成x86为例,但是你可以轻易转移到LLVM能支持的其他平台上。

而这里的编译器针对语言,我准备以Pascal为原型,然后不做任何限制的扩充与削减。而扩充与削减的宗旨均为方便展示原理(可能会加入类似callc这样新的关键字,然后调用C库?我也不知道会不会干这样的事情,但是如果需要展示一个语言与另一个语言的互动的时候,可能就会这么干了)。这里可能有些同学担心没有学过Pascal不理解什么的,这个不用担心,因为博主也没有学过,但是不妨碍开发。因为只是以其为原型而已,而且Pascal的语法形式很方便做编译原理的阐释,这也是我选择这个为原型的理由之一。

##开发语言与平台工具 开发语言将会是C++,并且会使用C++11的新特性(如智能指针,auto等),所以你需要一个支持C++11的编译器。而选择C++的理由是因为C++的确比较适合开发编译器,并且LLVM API是C++的,自然与C++比较贴切。而加上C++11新特性是想展示一下现代C++的魅力与威力,如果不是LLVM API是原生指针,我完全可以做到不适用任何的原生指针。

开发平台没有任何限定,你可以使用你熟悉的Windows、Linux、Mac OS X等,因为我不会用任何与平台有关的东西,只是在最后生成机器码的部分,你可能需要调整一二,但都是比较小的问题。由于大部分都有Windows,所以我将会提供的是Windows平台的Visual Studio 2013的项目文件,Make文件的话不一定提供,所以你能使用Windows平台的Visual Studio自然是最好的。不过在Windows平台下,到最后生成机器码的时候,需要借助MinGW或者Cygwin的汇编器与链接器,所以到时候你可能需要去下载这二者之一。

##项目规模 这个项目不会很大,我会尽量控制在1W行左右的代码量。同时我会给阅读本教程的同学非常大的自由度,可以方便任意添加你想要添加的语言特性,改的面目全非都没有任何关系。当然你也可以fork,然后给我pull request,说我觉得这个加进来蛮好玩的什么的(如果你愿意为这么一个带一点儿“玩具”色彩的项目做贡献的话,虽然我觉得以Pascal为框架,没有什么好玩特性加了。虽说这本就是一个教程语言,你说我能为它加上lambda,然后进行lambda什么的,Ahh,我会说你很天才,然后我愿意为你的添加写一些赞美之词,然后为系列博客再添上浓烈的一笔,方便后来者)。

##下一篇的时间 待定(不会很久),可以点击右上角的RSS订阅来订阅该博客内容。
同时,欢迎一起交流,你可以通过给我微博私信,给我Email来信,或者留言板留言等多种途径,选择你喜欢的方式即可。

(转载本站文章请注明作者和出处,请勿用于任何商业用途)

Published

23 April 2014

Author

FrozenGene

Category

compiler

Tags