首页 > 解决方案 > 来自不同对象/基元的字节堆栈

问题描述

对于我的实验任务,我们必须做一个简单的虚拟机来运行一些基本指令。作业文档推荐并给出了 C 中的部分实现......但我想要在 Java 中。

对于java,老师推荐我使用Java Nio ByteBuffer。然而 ByteBuffer 的行为不像堆栈。

更复杂的是,我不知道如何将 jmp 虚拟指令的地址放入堆栈。我正在考虑序列化 Instr 类的实例并将这些字节添加到堆栈中,但我担心堆栈的字节数可能很多。

我的代表虚拟指令的类:

public class Instr {

protected Instr(Opcode opcode2) {
    opcode = opcode2;
}

public enum Opcode {
    ADD_C, ADD_I, ADD_D, AND_A, AND_C, AND_I, AND_D, CALL, CALLEXT, CAST_C_D, CAST_C_I, CAST_D_C, CAST_D_I,
    CAST_I_C, CAST_I_D, DIC_C, DIC_I, DIV_D, DROP, ENTER, EQ_A, EQ_C, EQ_I, EQ_D, GREATER_C, GREATER_I, GREATER_D,
    GREATEREQ_C, GREATEREQ_I, GREATEREQ_D, HALT, INSERT, JF_A, JF_C, JF_I, JF_D, LESS_C, LESS_I, LESS_D, LESSEQ_C,
    LESSEQ_I, LESSEQ_D, LOAD, MUL_C, MUL_I, MUL_D, NEG_C, NEG_I, NEG_D, NOP, NOT_A, NOT_C, NOT_I, NOT_D, NOTEQ_A,
    NOTEQ_C, NOTEQ_I, NOTEQ_D, OFFSET, OR_A, OR_C, OR_I, OR_D, PUSHFPADDR, PUSHCT_A, PUSHCT_C, PUSHCT_I, PUSHCT_D,
    RET, STORE, SUB_C, SUB_I, SUB_D
}

public Opcode opcode;
public Register val1;
public Register val2;

private class Register {
    int i;
    double d;
    public Instr addr;
}
}

对于构建可以放置和弹出对象/基元的堆栈有什么建议吗?

这是我迄今为止的工作: https ://github.com/EmanuelSadu/AtomC

这是作业文档中的测试代码(C 语言):

此 VM 必须运行的示例:在 pagina „MV” 中,sunt prezentate toate instructiunile masinii virtuale。Felul in care se folosesc acestea va fi detaliat in labatorul dedicat Generarii codului。在 acest 实验室 vom testa MV pe un cod scris 直接。Un exemplu de cod care implementeaza „v=3;do{put_i(v);v=v-1;}while(v);” 埃斯特:

void mvTest()
{
Instr *L1;
int *v=allocGlobal(sizeof(long int));
addInstrA(O_PUSHCT_A,v);
addInstrI(O_PUSHCT_I,3);
addInstrI(O_STORE,sizeof(long int));
L1=addInstrA(O_PUSHCT_A,v);
addInstrI(O_LOAD,sizeof(long int));
addInstrA(O_CALLEXT,requireSymbol(&symbols,"put_i")->addr);
addInstrA(O_PUSHCT_A,v);
addInstrA(O_PUSHCT_A,v);
addInstrI(O_LOAD,sizeof(long int));
addInstrI(O_PUSHCT_I,1);
addInstr(O_SUB_I);
addInstrI(O_STORE,sizeof(long int));
addInstrA(O_PUSHCT_A,v);
addInstrI(O_LOAD,sizeof(long int));
addInstrA(O_JT_I,L1);
addInstr(O_HALT);
}

标签: java

解决方案


远离 Java 内置序列化,它是平台早期的旧机制并且容易出错。你最好为这个作业编写自己的简单格式。

您可以编写自己的Stack由 a 支持的类ByteBuffer,例如:

public class Stack {
  private final ByteBuffer buf;

  public Stack(int capacity) {
    buf = ByteBuffer.allocate(capacity);
  }

  public void push(byte b) {
    buf.put(b);
  }

  public byte pop() {
    if (buf.position() == 0) {
      throw new NoSuchElementException();
    }
    buf.position(buf.position() - 1);
    return buf.get(buf.position());
  }

}

推荐阅读