Nand2Tetris — 第 12 章
杰克操作系统
// Math.jack
//操作系统实现示例
//乘法通过重复加法实现乘法。
//除法通过重复减法实现除法。
class Math {
function void init() {
return;
}
function int multiply(int x, int y) {
var int result;
let result = 0;
while (y > 0) {
let result = result + x;
let y = y - 1;
}
return result;
}
function int divide(int x, int y) {
var int result;
let result = 0;
while (~(x < y)) {
let x = x - y;
let result = result + 1;
}
return result;
}
}
// String.jack
//String对象部分实现
//将字符存储在内部数组中并单独管理长度
class String {
field Array data;
field int length;
field int capacity;
constructor String new(int maxLength) {
let capacity = maxLength;
let length = 0;
let data = Array.new(maxLength);
return this;
}
method void dispose() {
do data.dispose();
do Memory.deAlloc(this);
return;
}
method int length() {
return length;
}
method String appendChar(char c) {
let data[length] = c;
let length = length + 1;
return this;
}
method char charAt(int index) {
return data[index];
}
}
// Array.jack
//Array.new 分配与堆中大小相等的内存。
//Jack数组实际上是一个带有基地址的内存块。
class Array {
function Array new(int size) {
return Memory.alloc(size);
}
method void dispose() {
do Memory.deAlloc(this);
return;
}
}