2010-04-02 6 views
0

Итак, для моего класса программирования у нас был проект создания виртуальной машины, включая блок памяти, процессор, вход, выход, регистр команд, счетчик программ, MAR, MDR и т. Д. Теперь нам нужно создать компилятор с использованием Java-кода, который возьмет файл .exe, написанный в каком-то редакторе txt, и преобразует его в java-байтовый код и запускает код. Код, который мы будем писать в EXE-файле машинный код по линиям:Java - Создание справки компилятора

IN X 
IN Y 
ADD X 
STO Y 
OUT Y 
STOP 
DC X 0 
DC Y 0 

Я просто новичок и только 2 дня, чтобы написать это, и я очень потерянным и не имеют ни малейшего представления, с чего начать ....Любая помощь будет высоко ценится. Спасибо

Хорошо, увидев, что никто действительно не понимает, я уточню ...... Я нахожусь в своем первом курсе программирования, и мой учитель заставил нас создать виртуальную машину, которую я сделал, и я отправлю код для процессора и компьютерные классы, но мой учитель очень неорганизован, и у нас закончилось время для последнего проекта, который является компилятором ..... Код выше - это всего лишь пример кода, который будет превращен в байтовый код ... здесь код для процессора и компьютера в моей виртуальной машине пакет ...

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; 
     } 

    } 

Вот мой компьютерный класс

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); 
    } 

} 

Метод Load - это всего лишь временный метод, просто чтобы убедиться, что машина работает ... то, что она будет загружать, - это байт-код, сформированный компилятором.

+5

'.exe' является * слегка * запутанным расширением для такого файла. – Thomas

+0

Вы уверены, что находитесь в правильном классе программирования? Вы действительно занимались проектом виртуальной машины или, по крайней мере, серьезно участвовали в нем, если это был групповой проект?Это назначение, которое вы не поняли в любом случае, выглядит намного проще, чем виртуальная машина. Я бы предположил, что вы только пытаетесь взять и пройти курсы, когда сможете учиться и применять материал. –

+0

Не понимаю. Как файл '.exe' должен быть написан в текстовом редакторе? Или вы имеете в виду, что инструкции будут записаны в файле с расширением '.exe'? Не лучший выбор! –

ответ

3

Это кажется довольно амбициозным в зависимости от вашего вопроса и времени, которое вы должны сделать, но я постараюсь поставить вас на правильный путь. Очевидно, поскольку это домашняя работа, никто не даст вам ответ;)

Код в вашем примере более точно будет обозначаться как «код сборки». Посмотрите на это с другой стороны; Вы должны:

  • Читайте в каждой строке
  • Посмотрите на первый «слово» (инструкция или оператор) и приравнять, что байт-код Java. Look here.
  • Укажите, сколько аргументов (операндов) должно быть прочитано для оператора.
  • Убедитесь, что остальная часть строки содержит соответствующее количество операндов.
  • Запишите байт-код в правильном порядке в соответствии со спецификацией Java.
  • Загрузите байткод в VM и запустите его

код сборки в вашем примере выглядит она имеет некоторые явные правила, что инструктор, вероятно, дал вам. Например, «ADD X» означает добавление содержимого местоположения X в - что? «IN» означает «ввод» или «увеличение»? «STO Y» означает хранить что-то в местоположении Y - что? Похоже, возможно, есть неявный регистр, который содержит результаты. Это тоже должно быть частью спецификации инструктора. Удачи! Получите взломать!

0

Если вам нужно преобразовать что-то в Java байт-код, вы должны сделать следующее (по крайней мере!)

  1. Выучите стандарт Java-байт-коды! (Если это макет Java байткод изобретенный для класса?)
  2. Разбирает вход «.exe» (не хорошее имя расширения IMHO) с использованием StringTokenizer или аналогичным класс
  3. Также можно использовать лексический анализатор для определения того, что писать для код.
  4. Формат вывода, используя то, что вы узнали от чтения о Java байт-код стандартный

И „вот об этом“, - но это звучит как ваш проект может использовать немного больше времени, если вы не очень опытный в эта тема ...

+0

Фактически, я бы сказал, что любой, кто мог бы сделать предыдущий проект или внес значительный вклад в это, мог выполнить назначение, как описано в часах. симулятор - проект большого класса, и реальный ассемблер был бы неразумным, чтобы писать это быстро, но не это. –

+0

Да, но я хочу быть вежливым об этом. –

0

Если я правильно understoond, вы должны:

  • создать лексический анализатор. Для данного текста он создает последовательность лексем.
  • создать синтаксический анализатор. Он будет генерировать дерево синтаксиса.
  • Создайте интерпретатор, который проходит через дерево и генерирует код.
  • создать виртуальную машину, которая запускает этот сгенерированный код.
1

Вы новичок и у вас есть два дня, чтобы написать компилятор?

Ничего себе. Надеюсь, что твоя фамилия «Кнут».

Обязательно прочитайте this. Одна из его ссылок - a list of Java bytecode instructions.

Вам нужно знать, как к нему относятся инструкции файла «машинный код». Применяется ли «DC» к «двойному сравнению»? Если да, то это dcmpg (hex 98) или dcmpl (hex 98)? И так далее.

И серьезно? Удачи.

1

Я не думаю, что это байт-код Java, который вы пытаетесь создать, не так ли? Это фактически байт-код для вашего конкретного процессора. Это значительно упрощает ваш проект. Это также похоже на архитектуру стека, поэтому у вас есть только один операнд.

Поскольку ваш ввод - это текст и только язык ассемблера, определенный для вашего пользовательского ЦП, вы должны легко читать и анализировать текст и записывать двоичный файл. Вот какой код, который должен помочь.

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; 

Вам придется следить за ваши адреса хранения и инструкция адреса

Это не является невыполнимой задачей, так мужайтесь и можно сделать это в день или около того, если у вас есть опыт с созданием тех других классов, которые вы показываете.

EDIT: Добавлен ByteCodeInfo класс, который представляет информацию о ваших байт-кодов, таких как идентификатор, количество операндов, ожидаемых типов операндов и т.д. Этот класс также может быть использован для испускают байт-код, основанный на анализируемая строка. Это обеспечит лучшую абстракцию, а затем просто сохранит опкод int в Map, как я предложил оригинал.

Смежные вопросы