Java-创建编译器帮助
因此,对于我的编程类,我们有一个项目来创建一个虚拟机,包括内存单元、cpu、输入、输出、指令寄存器、程序计数器、MAR、MDR等等。现在,我们需要使用Java代码创建一个编译器,该编译器将使用一些txt编辑器编写的.exe文件,将其转换为Java字节码并运行代码。我们将在.exe文件中写入的代码是机器代码,大致如下:Java-创建编译器帮助,java,Java,因此,对于我的编程类,我们有一个项目来创建一个虚拟机,包括内存单元、cpu、输入、输出、指令寄存器、程序计数器、MAR、MDR等等。现在,我们需要使用Java代码创建一个编译器,该编译器将使用一些txt编辑器编写的.exe文件,将其转换为Java字节码并运行代码。我们将在.exe文件中写入的代码是机器代码,大致如下: IN X IN Y ADD X STO Y OUT Y STOP DC X 0 DC Y 0 我只是一个初学者,只有2天的时间来写这篇文章,我非常迷茫,不知道从哪里开始…任何帮助
IN X
IN Y
ADD X
STO Y
OUT Y
STOP
DC X 0
DC Y 0
我只是一个初学者,只有2天的时间来写这篇文章,我非常迷茫,不知道从哪里开始…任何帮助都将不胜感激。谢谢
好吧,看到没有人真正理解我,我会澄清……我在上一年的编程课程,我的老师让我们做了一个虚拟机,我已经做了,我会发布CPU和计算机课程的代码,但是我的老师非常杂乱无章,我们已经没有时间做最后一个项目了,那就是编译器……上面的代码是只是一个将转换为字节码的代码示例…这是我的虚拟机包中CPU和计算机的代码
class Cpu{
private MemEl acc;
private InstReg ir;
private ProgCount pc;
private Input in;
private OutPut out;
private MemEl mdr;
private MemEl mar;
public Cpu()
{
pc = new ProgCount();
ir = new InstReg();
acc = new MemEl();
}
public Boolean stop()
{
return ir.getOpcode() == 0;
}
public int getMAR()
{
return ir.getOpcode();
}
public int getMDR()
{
return mdr.read();
}
public void setMDR(int n)
{
mdr.write(n);
}
public boolean OutFlag()
{
return ir.getOpcode() == 8;
}
public boolean InFlag()
{
return ir.getOpcode() == 7;
}
public boolean StoreFlag()
{
return ir.getOpcode() == 2;
}
public void fetch()
{
mar.write(pc.getValue());
pc.plus();
}
public void reset()
{
mar.write(0);
pc.write(0);
pc.write(1);
}
public void fetch2()
{
ir.write(mdr.read());
}
public void decode()
{
mar.write(ir.getOperand());
mdr.write(acc.read());
}
public void execute()
{
switch(ir.getOpcode()){
case 0:
System.out.println("Complete");
break;
case 1:
acc.write(mdr.read());
break;
case 2:
acc.write(ir.getOperand());
break;
case 3:
acc.write(acc.read() + mdr.read());
break;
case 4:
acc.write(acc.read() - mdr.read());
break;
case 5:
acc.write(acc.read() * mdr.read());
break;
case 6:
acc.write(acc.read() / mdr.read());
break;
case 7:
mar.write(ir.getOperand());
break;
case 8:
System.out.println(getMDR());
break;
case 9:
pc.write(getMDR());
break;
case 10:
if(0 == acc.read())
pc.write(getMDR());
else
fetch();
break;
case 11:
if(0 < acc.read())
pc.write(getMDR());
else
fetch();
break;
}
}
Load方法只是一个临时方法,只是为了看看机器是否工作……它将加载的是编译器形成的字节码 如果需要将某些内容转换为Java字节码,则必须执行以下操作(至少!)
“就这些”——但听起来你的项目可能需要更多的时间,除非你在这个主题上非常有经验……如果你需要将某些东西转换成Java字节码,你必须做以下事情(至少!)
“就这么多”-但听起来你的项目可能需要多一点时间,除非你在这方面非常有经验…如果我正确理解了你,你应该:
- 创建词法分析器。对于给定的文本,它产生一系列词汇
- 创建语法分析器。它将生成语法树
- 创建解释器,该解释器遍历树并生成代码
- 创建运行此生成代码的VM
- 创建词法分析器。对于给定的文本,它产生一系列词汇
- 创建语法分析器。它将生成语法树
- 创建解释器,该解释器遍历树并生成代码
- 创建运行此生成代码的VM
- 读每一行
- 查看第一个“单词”(指令或运算符),并将其等同于Java字节码李>
- 计算应该为运算符读入多少个参数(操作数)
- 确保行的其余部分包含适当数量的操作数
- 根据Java规范以适当的顺序写出字节码
- 将字节码加载到VM中并运行它
- 读每一行
- 查看第一个“单词”(指令或运算符),并将其等同于Java字节码李>
- 计算应该为运算符读入多少个参数(操作数)
- 确保行的其余部分包含适当数量的操作数
- 根据Java规范以适当的顺序写出字节码
- 将字节码加载到VM中并运行它
- 如果我正确理解了你,你应该:
- 您是初学者,有两天时间编写编译器
哇。希望你的姓是“克努斯”
你当然应该读一读。它的一个链接是
您需要知道“机器代码”文件指令如何映射到该指令。“DC”等同于“双重比较”吗?如果是,它是dcmpg(十六进制98)还是dcmpl(十六进制98)?等等
说真的?祝你好运。你是个初学者,你有两天的时间来编写编译器 哇。希望你的姓是“克努斯” 你当然应该读一读。它的一个链接是 您需要知道“机器代码”文件指令如何映射到该指令。“DC”等同于“双重比较”吗?如果是,它是dcmpg(十六进制98)还是dcmpl(十六进制98)?等等
说真的?祝你好运。基于你的问题和你必须做的时间,这看起来很有野心,但我会努力让你走上正轨。显然,因为这是家庭作业,没有人会给你答案;) 您的示例中的代码更准确地称为“汇编代码”。这样看,;你必须:
示例中的汇编代码看起来有一些讲师可能给您的明确规则。例如,“添加X”意味着将位置X的内容添加到--什么?“IN”是指“输入”还是“增量”?“STOY”是指将某物存储到位置Y——什么?似乎有一个隐含的寄存器保存结果。这也应该是讲师规范的一部分。祝你好运开始黑客攻击 从你的问题和你必须做的时间来看,这似乎很有野心,但我会尽力让你走上正轨。显然,因为这是家庭作业,没有人会给你答案;) 您的示例中的代码更准确地称为“汇编代码”。这样看,;你必须:
import java.io.*;
class Computer{
private Cpu cpu;
private Input in;
private OutPut out;
private Memory mem;
public Computer() throws IOException
{
Memory mem = new Memory(100);
Input in = new Input();
OutPut out = new OutPut();
Cpu cpu = new Cpu();
System.out.println(in.getInt());
}
public void run() throws IOException
{
cpu.reset();
cpu.setMDR(mem.read(cpu.getMAR()));
cpu.fetch2();
while (!cpu.stop())
{
cpu.decode();
if (cpu.OutFlag())
OutPut.display(mem.read(cpu.getMAR()));
if (cpu.InFlag())
mem.write(cpu.getMDR(),in.getInt());
if (cpu.StoreFlag())
{
mem.write(cpu.getMAR(),in.getInt());
cpu.getMDR();
}
else
{
cpu.setMDR(mem.read(cpu.getMAR()));
cpu.execute();
cpu.fetch();
cpu.setMDR(mem.read(cpu.getMAR()));
cpu.fetch2();
}
}
}
public void load()
{
mem.write(0,799);
mem.write(1,199);
mem.write(2,1009);
mem.write(3,398);
mem.write(4,298);
mem.write(5,199);
mem.write(6,497);
mem.write(7,299);
mem.write(8,902);
mem.write(9,898);
mem.write(97,0);
mem.write(98,0);
mem.write(99,1);
}
}
initialize Map of instruction names (keys) to instruction op codes (ByteCodeInfo);
initialize empty bytecode-operations list;
open input text file;
while (more to read)
{
read next line;
split line by spaces;
lookup ByteCodeInfo in the Map;
if (num actual operands != num expected operands - from ByteCodeInfo)
throw exception(parse failed on line ####);
add new operation to list of operations (each element in the list is an address)
if there is a variable reference (e.g. "X") add this to a symbol Map;
if this is a variable declaration (DC...) update the symbol object with the address;
}
close input text file;
open output binary file (the byte-code file);
for each element in operation list
{
write address, byte-code, operands (if any);
}
close byte-code file;