Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自不同对象/原语的字节堆栈_Java - Fatal编程技术网

Java 来自不同对象/原语的字节堆栈

Java 来自不同对象/原语的字节堆栈,java,Java,对于我的实验任务,我们必须做一个简单的虚拟机来运行一些基本指令。任务文件建议并给出了在C。。。但是我想要Java 对于java,老师建议我使用JavaNioByteBuffer。然而,ByteBuffer并没有表现为堆栈 更复杂的是,我不知道如何将jmp虚拟指令的地址放入堆栈中。我正在考虑序列化Instr类的一个实例,并将这些字节添加到堆栈中,但我担心这可能会导致堆栈中的字节过多 表示虚拟指令的我的类: public class Instr { protected Instr(Opcode o

对于我的实验任务,我们必须做一个简单的虚拟机来运行一些基本指令。任务文件建议并给出了在C。。。但是我想要Java

对于java,老师建议我使用JavaNioByteBuffer。然而,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;
}
}
对于构建可以放置和弹出对象/原语的堆栈,有什么建议吗

这是我迄今为止的工作:

这是分配文件中的测试代码(C):

此VM的运行方式示例如下: 在帕吉纳,“MV”必须预先制作烤面包片,并将其制作成虚拟的意大利面。Felul in care se folosesc acestea va fi detaliat in 科杜鲁伊将军实验室。在acest实验室里,我们可以直接进行测试。联合国鳕鱼护理范例 实施Aza“v=3;当(v)时,不要{put_i(v);v=v-1;}”埃斯特:

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内置的序列化,它是早期平台和应用程序中的一种旧机制。你最好为这项作业编写自己的简单格式

您可以编写自己的
堆栈
类,该类由
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());
  }

}

最后我明白了。 我最感谢@Karol Dowbecki让我睁开眼睛。。。是的,地址只是一个数字。现在它有意义了

我将很快在这里推出完整的解决方案:

这也是我想到的。和in可以适当地处理int和double。但我也需要它来弹出并推送一个*地址。我不知道怎么在这里面加地址。如果我把一个指针放进堆栈中,C会很好。。。然而,我已经用java做了很多工作,地址只是一个数字。思考您的地址的最大大小,选择相应的原语,例如
int
,并使用相关方法,例如
ByteBuffer.putin()
getInt()
。不可能。。。我在最初的消息中加入了一些额外的解释。假设它是禁止使用的,您可以使用数组实现堆栈。您需要一个指向堆栈顶部的指针—只是一个递增/递减的数组索引—以及存储在数组中的项。请注意,无需从堆栈中实际删除项–只要“top”指针保持最新,就可以安全地在数组中保留旧项。下面是对使用数组实现堆栈的解释:我考虑使用jav.util.stack来实现这一点。我已经用它来帮助进行伪C代码的语法分析。问题是我需要在堆栈中放入整数,double和*address。整数和double是明确的,因为我只调用pop和push方法,直到原语的所有字节都被消耗。然而,地址是对另一个Instr对象的引用。。。如何将其放入堆栈中?Java中的引用是
Instr Instr
,因为Java总是按值传递。您需要使用
Stack Stack
并且在执行
Stack.add(new Instr())
时,存储的是对
Instr
对象的引用。