Вот на летних каникулах нечем занятся. Решил я написать свой "маленький" компилятор для мобильного телефона.
Вот что получилось:
пример программы(поиск максимального элемента массива)
program MaxElement{
function getMaxElement(Integer array[]):Integer;
var{
Integer i,max;
}
{
if(length(array) == 0){
return 0;
}
max = array[0];
for(i = 1;i<length(array);inc(i)){
if(array[i] > max){
max = array[i];
}
}
return max;
}
function main():void;
label{
error;
}
var{
Integer[] array;
Integer n,i;
}
{
error:
read("Введите размер массива:",n);
if(n <= 0){
writeLn("Размер должен быть > 0");
goto error;
}
setLength(array,n);
for(i = 0;i<n;inc(i)){
read("n["+i+"] = ",array[i]);
}
writeLn("Наибольший элемент: "+getMaxElement(array));
}
}
ну и конечно же байт-код:
0: 3 1 3 0 3 1 3 1
9: lload 0
12: arraylength 3
14: iconst 0
19: if_icmpeq
20: ifne 31
25: iconst 0
30: return
31: lload 0
34: iconst 0
39: iaload
40: lstore 2
43: ipop
44: iconst 1
49: lstore 1
52: ipop
53: lload 1
56: lload 0
59: arraylength 3
61: if_icmplt
62: ifne 107
67: lload 0
70: lload 1
73: iaload
74: lload 2
77: if_icmpgt
78: ifne 94
83: lload 0
86: lload 1
89: iaload
90: lstore 2
93: ipop
94: lload 1
97: inc
98: lstore 1
101: ipop
102: goto 53
107: lload 2
110: return
111: 3 0 3 0 3 1 3 1 //ENTRY POINT
120: sconst "Введите размер массива:"
123: bconst 3
125: invokevirtual 3 2
128: lstore 1
131: ipop
132: lload 1
135: iconst 0
140: if_icmple
141: ifne 157
146: sconst "Размер должен быть > 0"
149: invokevirtual 3 0
152: goto 120
157: lload 0
160: lload 1
163: setarraylength 3 1 0
168: iconst 0
173: lstore 2
176: ipop
177: lload 2
180: lload 1
183: if_icmplt
184: ifne 227
189: sconst "n["
192: lload 2
195: i2s
196: sconcat
197: sconst "] = "
200: sconcat
201: bconst 3
203: invokevirtual 3 2
206: lload 0
209: lload 2
212: iastore
213: ipop
214: lload 2
217: inc
218: lstore 2
221: ipop
222: goto 177
227: sconst "Наибольший элемент: "
230: lload 0
233: invoke 0
238: i2s
239: sconcat
240: invokevirtual 3 0
243: return
log:
Введите размер массива:
-45
Размер должен быть > 0
Введите размер массива:
5
n[0] =
4
n[1] =
6
n[2] =
3
n[3] =
7
n[4] =
-5
Наибольший элемент: 7
Time: 10.875 second(s)
Integer value: empty, pointer: -1
Real value: empty, pointer: -1
String value: empty, pointer: -1
Object value: empty, pointer: -1
Вопрос:
стоит ли мне продолжать это дело(является ли оно актуальным) и как вообще идея?