Пишем компилятор 15.06.2016 / 01:38 | | vl@volk  Пользователь
Сейчас: Offline
Имя: Владислав Откуда: Владивосток Регистрация: 26.12.2012
| cap51, ты нашел виртуальную машину, теперь напиши компилятор того же бейсика для нее. Только сам, как послушный мальчик!
__________________
 знает толк |
15.06.2016 / 07:25 | | vl@volk  Пользователь
Сейчас: Offline
Имя: Владислав Откуда: Владивосток Регистрация: 26.12.2012
| cap51, а зачем пробовать? Ты делай давай. Описание инструкций (комманд) виртуального зверя есть, ты давай разбирай файл на токены (лексемы), проверяй их порядок согласно семантике языка, упорядочивай так, как их будет разбирать вм и переводи в инструкции.
__________________
 знает толк |
15.06.2016 / 08:42 | | aRiGaTo  Пользователь
Сейчас: Offline
Имя: Snork Откуда: Somalia Регистрация: 03.02.2010
| Цитата vl@volk: разбирай файл на токены (лексемы), проверяй их порядок согласно семантике языкасинтаксису*
__________________
 don't tread on me |
16.06.2016 / 00:58 | | cap51  Пользователь
Сейчас: Offline
Имя: listing1 Регистрация: 30.04.2013
| Вот такой код. Файл "VM.java". public class VM{
public VM(){}
public static int[][] mm={};
public static int[] m=mem(1);
public static int count=0;
public static int[] n(){
return new int[0];
}
public static void setm(int i){
m=mem(i);
mm=new int[i][i];
mm[i-1]=m;
}
public static int[] getm(int i){
return mm[i];
}
public static int set(int x,int y,int z){
mm[x][y]=z;
return mm[x][y];
}
public static int[] mem(int x){
return new int[x];
}
public static int[] push(int x){
int[] stack=mem(m.length+1);
stack[0]=x;
int t=1;
for(int i:m){
stack[t]=i;
t++;
}
m=stack;
return stack;
}
public static int pop(){
int x=m[0];
int[] stack=mem(m.length-1);
int t=0;
for(int i=0;i<stack.length-1;i++){
stack[i]=m[i+1];
t++;
}
stack[t]=m[m.length-1];
m=stack;
return x;
}
public static String print(){
String s="";
for(int[] x:mm){
s+="[";
for(int i:x){
s+=i+",";
}
s=s.substring(0,s.length()-1);
s+="]\n";
}
System.out.print(s);
return s;
}
public static int[] range(int x){
int[] t=new int[x];
for(int i=0;i<x;i++){
t[i]=i;
}
return t;
}
}
И файл "Test.java". public class Test{
public static void main(String[] args){
VM vm=new VM();
int i=19;
vm.setm(i);
for(int x:vm.range(i)){
vm.set(x,i-x-1,1);
for(int y:vm.range(x)){
vm.set(x,x,1);
}
vm.set(x,x,1);
}
vm.print();
}
}
И вот, что он выдает: [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]
[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0]
[0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0]
[0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0]
[0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0]
[0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0]
[0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0]
[0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0]
[0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0]
[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0]
[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0]
[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
Во как! |
16.06.2016 / 07:53 | | vl@volk  Пользователь
Сейчас: Offline
Имя: Владислав Откуда: Владивосток Регистрация: 26.12.2012
| ты сделал? Почему то что должно леч на стек возвращается, а не убирается в стек машины?
__________________
 знает толк |
16.06.2016 / 14:37 | | cap51  Пользователь
Сейчас: Offline
Имя: listing1 Регистрация: 30.04.2013
| vl@volk, ага. Наверное нужно создать несколько регистров ?
|
16.06.2016 / 14:51 | | cap51  Пользователь
Сейчас: Offline
Имя: listing1 Регистрация: 30.04.2013
| vl@volk, а как это можно осуществить ? Хотя-бы в двух словах...
|
16.06.2016 / 16:57 | | vl@volk  Пользователь
Сейчас: Offline
Имя: Владислав Откуда: Владивосток Регистрация: 26.12.2012
| cap51, регистры быстро все заполнятся, лучше стек. А что именно реализовать? Стек? Воспользуйся классом java.util.Stack и в методе push ложи в стек значение, которое ты возвращал в своем коде. с pop разберешься думаю сам. Кстати, если у тебя написать в таком плане то pop вернет значение, которое ты ставил в setm __________________
 знает толк Изменено vl@volk (16.06 / 17:03) (всего 1 раз) |
16.06.2016 / 17:06 | | aRiGaTo  Пользователь
Сейчас: Offline
Имя: Snork Откуда: Somalia Регистрация: 03.02.2010
| Цитата vl@volk: cap51, регистры быстро все заполнятся, лучше стек.Нужно не тупо раскладывать значения во все регистры, а адекватно их распределять. Планировать инструкции, разбивать код на базовые блоки, анализировать время жизни переменных и т.д.
__________________
 don't tread on me |
16.06.2016 / 18:50 | | vl@volk  Пользователь
Сейчас: Offline
Имя: Владислав Откуда: Владивосток Регистрация: 26.12.2012
| cap51, инструкции push pop setm перекрывают друг друга. они используют массив m и замещают значения установленные предыдущей инструкцией.
__________________
 знает толк |
 Всего сообщений: 69 Фильтровать сообщения
Поиск по теме
Файлы топика (8)
|