分享
 
 
 

编译原理学习笔记——1.选一种合适的目标语言(MSIL)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

学习编译原理最关键的是动手去做,即使你可能没有精力或者没有毅力去实现一个完整的编译器,一些简单的分析和翻译还得试着完成一些,比如“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操作。其他的,自己写几段代码,看看他的汇编就一目了然了。(看明白了欢迎和我交流。fafey@tom.com qq:14749119)。

举个例子:

???string good="hello world";

???int j=5;

???for(int i=0;i

???{

?????? ?j++;

???}

编译后为:

? .locals init ([0] string good,

?????????? [1] int32 j,

?????????? [2] int32 i)

? IL_0000:? ldstr????? "hello world"

? IL_0005:? stloc.0

? IL_0006:? ldc.i4.5

? IL_0007:? stloc.1

? IL_0008:? ldc.i4.0

? IL_0009:? stloc.2

? IL_000a:? br.s?????? IL_0014

? IL_000c:? ldloc.1

? IL_000d:? ldc.i4.1

? IL_000e:? add

? IL_000f:? stloc.1

? IL_0010:? ldloc.2

? IL_0011:? ldc.i4.1

? IL_0012:? add

? IL_0013:? stloc.2

? IL_0014:? ldloc.2

? IL_0015:? ldloc.0

? IL_0016:? callvirt?? instance int32 [mscorlib]System.String::get_Length()

? IL_001b:? blt.s????? IL_000c

? IL_001d:? ret

看明什么没有?至少我明白了为什么《.net框架程序设计》要写成难看的

for(i=0,n=good.Length;i

呵呵。好了,enjoy!

?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有