其他分享
首页 > 其他分享> > 斯坦福大学CS143编译原理课程笔记:4. Cool语言概述

斯坦福大学CS143编译原理课程笔记:4. Cool语言概述

作者:互联网

什么是Cool语言?

Cool是专门面向对象思想开发的编程语言,也是本系列课程所使用的编程语言,

Cool的全拼是Classroom Object Oriented Language,简称Cool。

Cool设计的目的是为了能够在较短的时间编写一款编译器,它主要用于教学上,同时它编写了成千上万个编译器,它是唯一一个编写的程序还没有它编写的编译器多的语言。

这个语言对于日常工作开发,编写一些小程序是非常不便的,因为它的初衷是用来设计编译器。

COOL具有如下特点:

1.抽象

2.静态类型

3.重载(继承)

4.自动化内存管理(和net托管管理一样)

MIPS指令集

本系列最终使用的汇编指令集是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文件

此课堂的环境环境需要在debian linux下运行。

建议ubnutu

下载地址:

下载完成之后解压到你的学习目录

tar -xvf work_coolc.tar.gz

cd coolc-compiler

在此目录下可以进行我们的着手开发。

目录介绍:

bin :存放编译器程序以及MIPS指令集模拟机和其它插件

etc :配置文件目录

lib  :编译器以及模拟机需要的库目录

这里介绍一下bin目录下的两个重要文件:

这里的coolc就是我们需要的coolc编译器,spim就是MIPS指令集模拟器

COOL项目的五个步骤

本系列项目分为五个任务:

1.使用COOL编写一个编译器

编译器具有如下四个功能:

2.词法分析

       3.语法分析

       4.语义分析

       5.代码与内存优化

这里没有优化功能,本系列不包含在其中,因为使用COOL编写编译器COOL本身自带优化功能。

同时在编写时要求实现时使用兼容可插拔性思想实现,意思就是每个阶段单独编写成一个组件模块,互相独立,同时相互可以引入各自组件,进行兼容测试,如语义分析里加入词法分析组件,来测试两个组件是否连同,这样出了问题我们可以逐个排查,同时一个组件出了问题不会导致其它组件一并出问题。

COOL编程语言基本教程

文件属性

cool程序后缀名是.cl

基本组成

class Main{

main(): Int {

};

};

1.cool以类把不同的作用域代码封装起来,以Main类为主类,类以“;”分号结尾。

2.在Main类中必须包含main函数,此函数作为入口函数,并且必须是无参的。

3.main后面的花括号代表方法体。

4.在COOL语言里所有的声明都必须使用分号作为结尾。

5.main():Int 代表了返回值。

如何运行

使用coolc编译器编译后会生成.s的MIPS指令集,在debian下可以使用spim模拟器来模拟运行

注意这个编译器本章还没有发课程文件,等后面几长

输入输出

COOL的IO操作使用IO类型属性来进行操作。

定义IO属性的变量

i : IO <- new IO;

i.out_string("hello word");

COOL语言的返回值

COOL与其它语言不太一样,它的返回值是直接写一个数,它不需要分号分割,因为到它的话就代表表达式语句的结束。

class Main{

main(): Int {

1

};

};

COOL语言的表达式块

COOL语言标准的表达式块就是一连串";"分号分割的语句组成的,表达式块最后的语句要求是返回值,也就是一个你定义的表达式返回类型的值。

class Main{

     i : IO <- new IO;;

main(): Int {

{

      i.out_string("hello word!");

1;

}

};

};

在表达式块里的返回值会作为整个方法的返回值而返回,如果使用了上面的写法,其实和C语言没有什么差别,最后的1就相当于return 1; 在表达式块里也可以不返回。

在表达式语句块里的代码必须加上“;”分号,可以看到上面的代码里1后面跟了分号,因为如果一个表达式块里的语句要加分号因为对于cool来说表达式块语句应该是由一大堆的以分号分割的语句组成。

当然如果方法体里啥也没有,可以不加分号直接写返回值,但是如果你想写很多代码必须要使用表达式块!

变量定义

定义变量的方法如我们刚刚看到的IO

i : IO <- new IO;

如果你定义成i : IO是不行的,因为cool语言里需要申请对象。

你光定义还需要new一个对象,否则指向的只是一个io类型的空对象。

对象的思想就是,你定义了只是抽象了,还需要实列化出来

所以就是<- new IO;

让我们来编译它

编译它很简单,我们需要到bin目录下使用coolc来编译

 ./coolc ../test/1.cl

编译完成后会在源文件目录下生成一个.s文件

然后我们使用bin目录下的spim运行:

 ./spim -trap_file ../lib/trap.handler -file ../test/1.s

结果:

可以看到打印了hello word

COOL语言换行符

和C语言别区别都是\n

COOL方法体续说

COOL里的每个方法体都看成一个整体,而一个整体的返回值以返回类型为准,并且最后一行的语句就代表返回值。

如:

Class Main{

i : IO <- new IO;

main():int {i.out_string("hello word\n")};

}

上面这行代码会报类型冲突,因为main要求返回是int,而我们的代码里只有一行i.out_string("hello word") 编译器会把这行看成返回值,而i是IO类型,所以返回是IO编译的话会报类型错误,我们可以把INT改成IO

Class Main{

i : IO <- new IO;

main():IO {i.out_string("hello word\n")};

}

这样就ok了。

值得一提的是,方法体里只能包含一条不带分号的语句,如果想包含多条以分号分割的语句就需要在方法体里在包含{}编译器会把它看成表达式语句。

COOL Object

cool里的object可以理解为所有层次结构的根,它可以用来表达许多对象,可以理解cool里的对象如IO都是object的子类。

可以利用它来完成一些类的写法:

Class Main{

i : IO <- new IO;

main():Object {i.out_string("hello word\n")};

};

这样是有效的,当使用自定义对象时这个方法会很好用。

COOL现实例化现用

cool还有这种写法:

Class Main{

main():Object {(new IO).out_string("hello word\n")};

};

相当于先实例化一个IO对象,然后调用方法,最后返回IO本身。

这样看其实和c++里的静态实例化一样

就是在c++类里声明一个函数,然后函数里定义一个静态类,然后return引用,这里返回引用是为了防止二次序列化时发生的拷贝构造函数的调用。

COOL继承

可以使用inherits来继承对象

class Main inherits IO{

main():Object {self.out_string("hello word\n")};

};

self代表自己,继承IO所有的方法以及属性。

同时也可以不加self也是可以的,因为默认如果不指定对象则使用this。

标签:main,斯坦福大学,cool,CS143,编译器,IO,MIPS,Cool,COOL
来源: https://blog.csdn.net/bjbz_cxy/article/details/113095289