斯坦福大学CS143编译原理课程笔记:4. Cool语言概述
作者:互联网
Cool是专门面向对象思想开发的编程语言,也是本系列课程所使用的编程语言,
Cool的全拼是Classroom Object Oriented Language,简称Cool。
Cool设计的目的是为了能够在较短的时间编写一款编译器,它主要用于教学上,同时它编写了成千上万个编译器,它是唯一一个编写的程序还没有它编写的编译器多的语言。
这个语言对于日常工作开发,编写一些小程序是非常不便的,因为它的初衷是用来设计编译器。
本系列最终使用的汇编指令集是MIPS指令集,它是针对1980年代设计的机器,后续会使用MIPS CPU模拟器来模拟运行使用COLL翻译成MIPS指令集的程序。
同时MIPS也有另外一个意思:MIPS(Million Instructions Per Second):单字长定点指令平均执行速度 Million Instructions Per Second的缩写
就是CPU的性能指标,如你问别人这个CPU的MIPS是多少,CPU的设计者会告诉你3百万到5百万左右,意思就是每秒可以执行三百万到五百万的指令。
cool是课程老师自己编写的,下面的步骤只是在教大家对cool语言一个基本认知。
在开始前我们需要课程文件也就是cool编译器,这里的课程文件是我从github上别的同学那边移植过来的,并且对它进行了修改,只保留了coolc编译器,和基本lib文件
这里的coolc就是我们需要的coolc编译器,spim就是MIPS指令集模拟器
这里没有优化功能,本系列不包含在其中,因为使用COOL编写编译器COOL本身自带优化功能。
同时在编写时要求实现时使用兼容可插拔性思想实现,意思就是每个阶段单独编写成一个组件模块,互相独立,同时相互可以引入各自组件,进行兼容测试,如语义分析里加入词法分析组件,来测试两个组件是否连同,这样出了问题我们可以逐个排查,同时一个组件出了问题不会导致其它组件一并出问题。
1.cool以类把不同的作用域代码封装起来,以Main类为主类,类以“;”分号结尾。
2.在Main类中必须包含main函数,此函数作为入口函数,并且必须是无参的。
使用coolc编译器编译后会生成.s的MIPS指令集,在debian下可以使用spim模拟器来模拟运行
COOL与其它语言不太一样,它的返回值是直接写一个数,它不需要分号分割,因为到它的话就代表表达式语句的结束。
COOL语言标准的表达式块就是一连串";"分号分割的语句组成的,表达式块最后的语句要求是返回值,也就是一个你定义的表达式返回类型的值。
在表达式块里的返回值会作为整个方法的返回值而返回,如果使用了上面的写法,其实和C语言没有什么差别,最后的1就相当于return 1; 在表达式块里也可以不返回。
在表达式语句块里的代码必须加上“;”分号,可以看到上面的代码里1后面跟了分号,因为如果一个表达式块里的语句要加分号因为对于cool来说表达式块语句应该是由一大堆的以分号分割的语句组成。
当然如果方法体里啥也没有,可以不加分号直接写返回值,但是如果你想写很多代码必须要使用表达式块!
如果你定义成i : IO是不行的,因为cool语言里需要申请对象。
你光定义还需要new一个对象,否则指向的只是一个io类型的空对象。
./spim -trap_file ../lib/trap.handler -file ../test/1.s
COOL里的每个方法体都看成一个整体,而一个整体的返回值以返回类型为准,并且最后一行的语句就代表返回值。
main():int {i.out_string("hello word\n")};
上面这行代码会报类型冲突,因为main要求返回是int,而我们的代码里只有一行i.out_string("hello word") 编译器会把这行看成返回值,而i是IO类型,所以返回是IO编译的话会报类型错误,我们可以把INT改成IO
main():IO {i.out_string("hello word\n")};
值得一提的是,方法体里只能包含一条不带分号的语句,如果想包含多条以分号分割的语句就需要在方法体里在包含{}编译器会把它看成表达式语句。
cool里的object可以理解为所有层次结构的根,它可以用来表达许多对象,可以理解cool里的对象如IO都是object的子类。
main():Object {i.out_string("hello word\n")};
main():Object {(new IO).out_string("hello word\n")};
相当于先实例化一个IO对象,然后调用方法,最后返回IO本身。
就是在c++类里声明一个函数,然后函数里定义一个静态类,然后return引用,这里返回引用是为了防止二次序列化时发生的拷贝构造函数的调用。
main():Object {self.out_string("hello word\n")};
同时也可以不加self也是可以的,因为默认如果不指定对象则使用this。
标签:main,斯坦福大学,cool,CS143,编译器,IO,MIPS,Cool,COOL 来源: https://blog.csdn.net/bjbz_cxy/article/details/113095289