← SEARCHABLE ARCHIVE
Nand2Tetris · 2026-05-22

Nand2Tetris — 第 12 章

杰克操作系统

INTERACTIVE READING MODE →

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