Nand2Tetris — 第12章
Jackオペレーティングシステム
// Math.jack
//OS実装例
//multiplyは反復加算で乗算を実装します
//divideは反復減算で除算を実装します
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
//文字列オブジェクトの一部の実装
//内部配列に文字を保存し、長さを別々に管理する
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はHeapからsizeだけメモリを割り当てます
//Jack配列は事実上ベースアドレスを持つメモリブロックです
class Array {
function Array new(int size) {
return Memory.alloc(size);
}
method void dispose() {
do Memory.deAlloc(this);
return;
}
}