java - 来自不同对象/基元的字节堆栈
问题描述
对于我的实验任务,我们必须做一个简单的虚拟机来运行一些基本指令。作业文档推荐并给出了 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 内置序列化,它是平台早期的旧机制并且容易出错。你最好为这个作业编写自己的简单格式。
您可以编写自己的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());
}
}
推荐阅读
- python - 安装 socail-auth-app 后 Django 中的 ModuleNotFoundError
- c++ - 我们可以在 C++ 中使用数组作为priority_queue 元素吗?
- javascript - 如何在 Gatsby 中将来自第三方 api 的数据设置为 siteMetaData?
- feathersjs - 你如何在feathersjs框架中实现基于mongodb的事务?
- php - 当我链接到其他页面时如何隐藏某些?
- python-3.x - http.client.ResponseNotReady:空闲
- python - 代码只读取 CSV 文件的第一行
- java - 加入 int 数组以创建大数组
- mongodb - MacOS 上的 Mongodb 连接失败
- java - 如何降低圈复杂度?