• 从头学习compiler系列3——COOL语言实践


    1,安装、运行

        根据课程的说明,我们首先下载Oracle VirtualBox(https://www.virtualbox.org/wiki/Downloads)。然后下载课程特地准备的linux环境的镜像文件(https://www.virtualbox.org/wiki/Downloads)。此linux环境包含了compiler课程的各个部分。
        运行VirtualBox,新建,选择linux ubuntu,打开镜像文件Compilers.vdi。设置好后,启动虚拟机。
        默认进入界面版本,有点类似windows。这里示范用命令行的操作。
        打开命令行终端,输入: (引号内)“cd cool/examples/“回车。此目录下全是Cool文件(后缀为cl),我们运行一个最简单的。输入:“coolc hello_world.cl"回车。此时生成MIPS处理器的汇编文件hello_world.s,需要用spim来模拟运行汇编(以后到代码生成阶段会详细讲解)。输入:”spim hello_word.s“回车。运行结果如下:
        
        其中Hello, World.就是运行结果。同理,example/文件夹下的所有cl文件都可以成功执行。

    2,简单实践

        2.1 简单加法

            目的:建立两个变量,并输出。
            建立局部变量用let表达式,输出用out_int函数。因为输出函数是IO类里的,所以Main必须继承或者建立一个IO类。
            代码如下:
            class Main inherits IO {
                main() : SELF_TYPE {
                {
                    let x:Int <- 1, y:Int in
                    {
                        y <- 2;
                        out_int(x+y);
                    };
                    out_string("\n");
                }
                };
            };
            let建立了x、y两个局部变量,只在let内有效。x初始值为1,设置y值为2,输出x+y的值。{}内可以有多个表达式,用分号";"隔开。

        2.2 简单函数

            目的:写函数并调用
            注意函数的格式和返回值。代码如下:
            class Main inherits IO {
                main() : SELF_TYPE {
                {
                    out_string("The factorial of 4 is ");
                    out_int(func(4));
                    out_string("\n");
                }
                };
     
                func(n:Int) : Int {
                {
                    let sum:Int <- 1 in
                    {
                        while 0 < n loop
                        {
                            sum <- sum * n;
                            n <- n - 1;
                        }
                        pool;
                        sum;
                    };
                }
                };
            };
            func函数返回参数n的阶乘。用while循环不断的累乘,func的返回值是最后一个语句let的返回值,let的返回值是let内部的最后一个语句,所以sum就是返回值。关于表达式的返回值,在以后句法一章的时候会讲到。



  • 相关阅读:
    linux常用命令整理
    pg_sql常用查询语句整理
    python 爬取媒体文件(使用chrome代理,启动客户端,有防火墙)
    python 爬取媒体文件(无防火墙)
    python读写符号的含义
    python数据分析开发中的常用整理
    wget: 无法解析主机地址
    ## nginx 使用
    iptables防火墙
    【redis】Could not connect to Redis at 127.0.0.1:6379: Connection refused
  • 原文地址:https://www.cnblogs.com/pinkman/p/3078812.html
Copyright © 2020-2023  润新知