从0到1构建计算机(8/12)--高级语言:Jack

Posted by guosai on February 24, 2020

本篇我们将设计一门高级语言:Jack。Jack是一门基于面向的对象的语言,具备现代高级语言的基本特性和风格,但是语法相对简单,且不支持继承等高级属性(其实Jack非常寒酸,只是支持了“对象”的功能)。本篇的内容非常简单,主要是介绍Jack的语法。

Hello, World

众所周知,学习一门新语言的第一步,是写一个 Hello, World。

1
2
3
4
5
6
7
class Main {
    function void main() {  // Jack程序要包含一个Main类,且包含main方法,这是程序的入口函数。
       do Output.printString("Hello, World");
       do Output.println(); //换行
       return;
    }
}

精通Jack

学习完 Hello, World,下面让我们再花5分钟时间来精通Jack。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class 类名 {
	---------变量声明区-----------
	可以声明2种变量:
	1.成员变量:field
	2.静态变量:static

	变量类型有4种:
	1.基本类型:int, bool, char
	2.对象类型:自己定义的类
	-----------------------------

	--------方法声明区-------------
	可以声明3种类型的方法:
	1.构造函数:constructor
	2.类方法:function
	3.实例方式:method

	constructor 对象类型 new(入参列表) {
		......
		return this;	//constructor最后一定是return this,this是指向实例的指针
	}
	 
	function/method 返回类型(可以是void)方法名(入参列表) {
		var 类型 变量名  	//用var声明局部变量
		do xxx.xxx();  	//do语句:方法调用
		let a = b;	//let语句:赋值语句
		if else
		while
		return
	 }
	-----------------------------
}

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/** 一个链表类,一个节点存储一个整数. */
class List { 	// 声明类
    field int data; // field语句:声明成员变量
    field List next;

    /* 构造函数 */
    constructor List new(int car, List cdr) { // 参数列表
        let data = car;       // let语句:语句类型是赋值语句
        let next = cdr;       
        return this; // return语句
    }

    /** getter. */
    method int getData() { return data; }
    method int getNext() { return next; }

    /** 打印链表 */
    method void print() { //method语句:类的实例方法
        var List current;    // var语句:声明局部变量
        let current = this;  // this关键字:指向当前对象本身
        while (~(current = null)) {  //while语句
            do Output.printInt(current.getData()); // do语句:后面接一个方法调用
            do Output.printChar(32);
            let current = current.getNext();
        }
        return;
    }

    /** 销毁链表 */
    method void dispose() { 
        if (~(next = null)) { // if语句
            do next.dispose();
        }
        do Memory.deAlloc(this); // 回收内存,调用操作系统方法
        return;
    }

}

class Main {
   function void main() { // fuction语句:声明类方法
      var List v;
      let v = List.new(5,null);
      let v = List.new(2,List.new(3,v));
      do v.print();      
      do v.dispose();
      return;
   }
}

OK,掌握了Jack后我们下一步的工作是实现Jack的编译器。