学习编译原理最关键的是动手去做,即使你可能没有精力或者没有毅力去实现一个完整的编译器,一些简单的分析和翻译还得试着完成一些,比如“Compilers: Principles,Techniques and Tools”(以后我就简称CPTT了,顺便插一句,我不喜欢这本书流行的中文译名——编译原理,书中明明还讲了技术与工具的,这可能就是目前国内编译原理教育的现状,我们的教材就是纯粹的编译原理,关于yacc,lex之类的只字未提)一书里很多习题涉及到对一些Pascal语法的语言片段进行翻译。现在问题就来了,你想把他们翻译成什么?
传统的选择有两个,一是翻译成x86指令序列,也就是我们通常说的汇编语言,优点自然是一步到位,直接可以运行(其实想运行起来是很难的),但是这种语言实在太难掌握了,必须先熟悉x86内部的地址模式,寄存器分配,还有繁琐的输入输出。虽然最终我们要有写汇编语言的能力,但在学习编译原理的初期就得照顾这些实在太分散注意力了。另一种方案是选择一种抽象的中间语言,CPTT里就引入了一种基于堆栈的Abstract Machine,和一种针对它的汇编语言,它解决了上面那些问题,但也有些缺点,主要是不实用,编译后的代码只能靠眼睛和脑袋运行。
好在这些都是“传统”的选择,现在不一样了,我们可以选择一种新型的中间语言——MSIL。它的语法比较简单,是一个完善的基于堆栈的语言,需要考虑的细节比较少,学习起来也比较容易;真正可以运行,只要你有一个ILASM,可能你会觉得那些元数据、类定义什么的太繁琐,那就跳过这些,把你生成的代码嵌入到一个现成的il代码的函数体里:)还有一点最重要的,你可以看到别人是怎么编译的,最现成的就是c#,写一段c#代码,编译,在用ildasm反汇编,你就可以看到大师对这段代码是怎么处理的,别忘了,c#的设计师可是Anders Hejlsberg,他在编译界绝对是个强硬的实战派人物。如果你有兴趣还可以下载一些其他语言的的.net版,看看这些语言是怎么翻译成il的,自己揣摩一下他们的编译器是怎么写的(顺便说一句,c#的编译器居然只有48k,不能不佩服一下啦!)而且,这么样一学期下来,你对.net框架的理解也可以上一个档次了。
好啦,如果你真的心动了,想试一试,那就着手准备吧。首先你得安装.net框架,去微软可以下到。安装后你可以找到c#编译器csc.exe,vb编译器vbc.exe,一个汇编软件ilasm.exe,和一个反汇编工具ildasm.exe。这些就足够了。如果你讨厌命令行操作(很不应该啊!尽快改)还可以安装一个IDE,vstudio自然是一个传统选择,但是得花钱。我装了一个开源项目叫sharp develop,功能十分完善,界面也很漂亮(完全模仿vs),甚至还集成了反汇编功能,有空去开源网站上看看吧。至于il的语法,我就简单提示一下,数据一律以堆栈为核心,所有以ld开头的命令都是push操作,比如ldc.i4.5就是把常整数入栈,以st开头的是pop操作。其他的,自己写几段代码,看看他的汇编就一目了然了。(看明白了欢迎和我交流。[email protected] qq:14749119)。
举个例子:
???string good="hello world";
???int j=5;
???for(int i=0;i
本文地址:http://com.8s8s.com/it/it28506.htm