สร้างระบบคอมพิวเตอร์ด้วย JS หรือไม่ [ปิด]


10

ฉันเพิ่งเสร็จสิ้นหนังสือเล่มนี้ชื่อว่า The Elements of Computing Systems ซึ่งคุณสร้างระบบคอมพิวเตอร์ที่ใช้งานได้ตั้งแต่เริ่มต้นตั้งแต่ประตูตรรกะพื้นฐานไปจนถึงการสร้างรหัสเครื่องและภาษาแอสเซมบลีของคุณเองจนถึงรหัสกลาง ภาษาการเขียนโปรแกรมที่รวบรวมลงในรหัส VM ฉันสนุกกับมันมากและฉันต้องการสร้างสิ่งที่คล้ายกันใน JavaScript แต่มีคุณสมบัติเพิ่มเติม ฉันได้เขียนโปรแกรมจำลองสำหรับเครื่องแฮ็คใน JS:

  // Creates a new CPU object that is responsible for processing instructions
  var CPU = function() {

var D = 0;    // D Register    
var A = 0;    // A Register
var PC = 0;   // Program counter


// Returns whether an instruction is valid or not
var isValidInstruction = function(instruction) {
    if (instruction.length != 32)
        return false;

    instruction = instruction.split(""); 

    for (var c = 0; c < instruction.length; c++)
    {
        if (instruction[c] != "0" && instruction[c] != "1")
            return false;
    }

    return true;
};  


// Given an X and Y input and 6 control bits, returns the ALU output
var computeALU = function(x, y, c) {

    if (c.length != 6)
        throw new Error("There may only be 6 ALU control bits");

    switch (c.join(""))
    {
        case "000000": return 0; 
        case "000001": return 1; 
        case "000010": return -1; 
        case "000011": return x; 
        case "000100": return y; 
        case "000101": return ~x;
        case "000110": return ~y;
        case "000111": return -x; 
        case "001000": return -y; 
        case "001001": return x+1; 
        case "001010": return y+1;
        case "001011": return x-1;
        case "001100": return y-1;
        case "001101": return x+y;
        case "001110": return x-y;
        case "001111": return y-x;
        case "010000": return x*y;
        case "010001": return x/y;
        case "010010": return y/x;
        case "010011": return x%y;
        case "010100": return y%x;
        case "010101": return x&y;
        case "010110": return x|y;
        case "010111": return x^y;
        case "011000": return x>>y;
        case "011001": return y>>x;
        case "011010": return x<<y;
        case "011011": return y<<x;

        default: throw new Error("ALU command " + c.join("") + " not recognized"); 
    }
}; 


// Given an instruction and value of Memory[A], return the result
var processInstruction = function(instruction, M) {

    if (!isValidInstruction(instruction))
        throw new Error("Instruction " + instruction + " is not valid");

    // If this is an A instruction, set value of A register to last 31 bits
    if (instruction[0] == "0")
    {
        A = parseInt(instruction.substring(1, instruction.length), 2);

        PC++; 

        return {
            outM: null,
            addressM: A,
            writeM: false,
            pc: PC
        }; 
    }

    // Otherwise, this could be a variety of instructions
    else
    {
        var instructionType = instruction.substr(0, 3);
        var instructionBody = instruction.substr(3);

        var outputWrite = false; 

        // C Instruction - 100 c1, c2, c3, c4, c5, c6 d1, d2, d3 j1, j2, j3 (000..000 x16)
        if (instructionType == "100")
        {
            var parts = [ "a", "c1", "c2", "c3", "c4", "c5", "c6", "d1", "d2", "d3", "j1", "j2", "j3" ];
            var flags = {}; 

            for (var c = 0; c < parts.length; c++)
                flags[parts[c]] = instructionBody[c]; 

            // Compute the ALU output
            var x = D;
            var y = (flags["a"] == "1") ? M : A; 
            var output = computeALU(x, y, [flags["c1"], flags["c2"], flags["c3"], flags["c4"], flags["c5"], flags["c6"]]); 

            // Store the result
            if (flags["d1"] == "1") A = output; 
            if (flags["d2"] == "1") D = output;
            if (flags["d3"] == "1") outputWrite = true; 

            // Jump if necessary
            if ((flags["j1"] == "1" && output < 0) || (flags["j2"] == "1" && output == 0) || (flags["j3"] == "1" && output > 0)) 
                PC = A;
            else
                PC++; 

            // Return output
            return {
                outM: output,
                addressM: A,
                writeM: outputWrite,
                pc: PC
            }; 
        }

        else throw new Error("Instruction type signature " + instructionType + " not recognized");
    }
}; 


// Reset the CPU by setting all registers back to zero
this.reset = function() {
    D = 0;
    A = 0;
    PC = 0;
}; 


// Set the D register to a specified value
this.setD = function(value) {
    D = value;
}; 


// Set the A register to a specified value
this.setA = function(value) {
    A = value;
}; 


// Set PC to a specified value
this.setPC = function(value) {
    PC = value;
};


// Processes an instruction and returns the result
this.process = function(instruction, M) {
    return processInstruction(instruction, M); 
}; 
}; 

ฉันกำลังคิดที่จะเพิ่มสิ่งต่าง ๆ เช่นระบบไฟล์เสียงการเชื่อมต่ออินเทอร์เน็ตและเอาท์พุทหน้าจอ RGBA (ปัจจุบันเป็นเพียงขาวดำ) แต่สิ่งนี้จะเป็นไปได้จริงเหรอ?

เพราะสิ่งที่ฉันคิดเกี่ยวกับการทำคือเริ่มต้นอย่างสมบูรณ์ตั้งแต่เริ่มต้น และสิ่งที่ฉันหมายถึงคือสร้างรหัสเครื่องของตัวเองจากนั้นทำงานไปจนถึงภาษาที่เหมือน C และสร้างโปรแกรมและสิ่งต่าง ๆ ที่ใช้งานได้จริง


11
เป็นไปได้ทั้งหมด bellard.org/jslinux
วิศวกรโลก

4
เพียงไปเพื่อดูว่าคุณได้รับ แม้ว่าคุณจะล้มเหลวในเป้าหมายสูงสุดของฉันฉันแน่ใจว่าคุณจะได้เรียนรู้ตันและดูเหมือนว่าเป็นแรงจูงใจหลักของคุณ
James

2
อย่าใช้สตริง, จาวาสคริปต์รองรับจำนวนเต็ม 32 บิตและการดำเนินการระดับบิตกับพวกเขา
Esailija

หมายเลขเป็น IMO ส่วน "ไม่ดี" จริงเท่านั้น
Erik Reppen

นอกจากนี้ยังทำให้ฉันอยากถาม มีการตีความภาษาแบบไดนามิกใด ๆ ที่ไม่เคยมีเลเยอร์ระหว่างมันและภาษาเครื่อง?
Erik Reppen

คำตอบ:


2

คุณสามารถทำได้อย่างแน่นอน คุณจะต้องใช้ส่วนประกอบบางอย่างของระบบปฏิบัติการเช่นบูตโหลดเดอร์และขัดจังหวะด้วยภาษาระดับต่ำกว่า

ดูวิธีการที่ใช้โดยระบบปฏิบัติการเอกฐานโดย Microsoft เกี่ยวกับวิธีการพัฒนาระบบปฏิบัติการที่ทำงานบน Managed Code

แน่นอนว่าไม่มีข้อกำหนดที่คุณต้องใช้ในการจัดการหน่วยความจำจาวาสคริปต์คุณสามารถเพิ่ม API สำหรับการจัดการหน่วยความจำจาวาสคริปต์ คุณสามารถเลือกเขียนคอมไพเลอร์สำหรับ JavaScript หรือเขียนเครื่องเสมือน

ภาวะเอกฐานมีซอร์สโค้ดพร้อมใช้งานเพื่อให้คุณได้รับข้อมูลเชิงลึกที่มีค่าจากการพิจารณาการตัดสินใจการออกแบบที่ Microsoft ทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.