← SEARCHABLE ARCHIVE
Nand2Tetris · 2026-05-22

Nand2Tetris — 第12章

Jackオペレーティングシステム

INTERACTIVE READING MODE →

// 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;
    }
}