要入门的话不如选 scheme作为目标语言,可以很容易的完成自举。 这个网上的实
现比较多。c语言感觉比较丑陋,丑陋的意思是说有很多例外的情况可能要考虑
--- 当然这是我的想法,我没写过c语言编译器,只写过scheme的,而且也没有
实现宏和continuation.
agentzh <agentzh@gmail.com> writes:
> 2009/1/7 allen <allenogz@gmail.com>
>
>> 近几天在看编译原理,了解一些编译器怎么工作的,然后就想自己写个最简单的编译器
>> 比如: 对C代码的分析
>>
>
> 昨天比较匆忙,今天忍不住多说几句,哈哈:
>
> 严重支持你自己用 Perl 实现一个比较完整的 ANSI C 解析器,甚至一个比较完整的 ANSI C 编译器. 目标代码可以选择 Perl
> 当然也可以选择某种汇编甚至 x86 机器指令,呵呵. 性能和实用性倒在其次, 倒是这个过程中可以演练各种有趣的编译技术,同时加深对 C 语言的理解.
> 其实我自己从前上学的时候也一直很想做这个来着,哈哈。这里练得不仅是解析技术,还是 AST 变换,代码优化,代码生成等许多有意思的方面 :)
>
> Perl 5 虽然算不上编写编译器的理想语言,但用来快速建模和构建学习性的项目,还是非常合适的。(在我看来,比较理想的构建编译器的语言就是 Perl 6
> 和 Haskell 了,呵呵。)
>
> 不过,如果想从最简单的编译器着手,可以选择 C 语言的一个比较核心的子集,就像"编译原理及编程"一书中以 TinyC 作为示例一样.
>
> 上大学的时候,我曾经做过一种类 Pascal 语法的小语言编译器。该语言叫做 Kid:
>
> http://svn.berlios.de/svnroot/repos/unisimu/Methodology/Kid/
>
> 当时的主要目的是为了辅助我的"程序设计方法学"课程中有关编程语言形式语义和正确性证明方面的理论学习。该编译器虽然实现了 Perl
> 代码生成器后端,但它最主要的后端是生成基于 Maple 的数学模型,并用于程序的数学变换和语义归约。记得当时把我们当时用的教材(
> http://product.dangdang.com/product.aspx?product_id=7421392
> )中的例题都证明出来了。当然,这本教材本身写得错误百出,所以真正看明白书中的那些原理需要查阅资料和大量的巧克力(提神用)。
>
> 但值得注意的是,Kid 中虽然实现了变量,赋值,代数运算符,函数定义和调用,完整的 if/else
> 语句,逻辑运算符等众多语言结构,却有意没有实现循环和递归。因为这些结构在自动化语义归约中需要引入"循环不变式",而"循环不变式"的自动推导我还没找到也没想到比较通用的办法。
>
> Kid 编译器使用 Parse::RecDescent 模块构造出词法和语法分析器(文法定义在
> http://svn.berlios.de/svnroot/repos/unisimu/Methodology/Kid/grammar/kid.grammar
> ),并在解析过程中构造出
> AST。随后有许多复杂的 AST 变换过程(比如函数调用时的内联展开),则利用了 Luke Palmer
> 的属性文法引擎 Language::AttributeGrammar 模块完成。这些模块的性能都不算好,但非常好用,呵呵。
>
> 其实,实现 Perl 5
> 的一个核心子集也是挺好玩的,而且这样也有机会实现"自举"(self-hosting)。自举应当是编译理论中最优美的东西之一了,以至于 Pugs team
> 从前在 #perl6 中讨论最多的就是这个问题,许多开发工作也是围绕 Perl 6 的自举问题展开的(一种观点就是 bootstrap early,
> bootstrap often)。
>
> 从这个意义上说, Pugs::Compiler::Rule 自身的 parser 也是实现了自举的(很高兴我去年最终替 fglock++
> 完成了这项工作)。一个有趣的副产品是一个 Perl 6 正则的图形化 tracer:
>
> http://pugs.blogs.com/pugs/2007/10/a-graphical-tra.html
>
> 这也是一个借用 web 界面实现 GUI 应用的一个例子,虽然限于当时的 web 开发水平,做得丑了一点 :P
>
> 我还曾经自己实现过一个简化了的 Parse::RecDescent 模块,并让之实现了 parser grammar 部分的自举:
>
> http://svn.berlios.de/svnroot/repos/unisimu/Compilers/ru-RecDescent/
>
> 实现了自举的编译器就不仅仅是"写程序的程序"了,而且还是"写自己的程序".在"脱靴"(bootstrapping)的过程中,我借用了
> Parse::RecDescent,但一旦完成自举之后,便不再依赖于它了。
>
> Larry 这两年开发的疯狂的针对最终的 Perl 6 正则引擎的 STD parser generator 最初也是依赖一个名叫 TRE 的 C 库:
>
> http://www.laurikari.net/tre/
>
> 在几个月前 STD parser 也不再依赖 TRE 了,详情见(
> http://use.perl.org/~chromatic/journal/37875)呵呵。
>
> 欢迎大家讨论基于 Perl 的编译器/解释器构造技术,并批评指正我的不妥之处 :P
>
> Thanks!
> -agentzh
>
> P.S. 感觉又可以以"漫谈基于 Perl 的编译器构造技术"为题发到我自己的 blog 上去了,呵呵
>
> >
--
Thanks & Regards
Changying Li
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina 论坛"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---
没有评论:
发表评论