Shrimp - компилятор для телефона
Вот на летних каникулах нечем занятся. Решил я написать свой "маленький" компилятор для мобильного телефона.
Вот что получилось:
пример программы(поиск максимального элемента массива)
PHP код:
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)); } }
ну и конечно же байт-код:
PHP код:
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
Вопрос:
стоит ли мне продолжать это дело(является ли оно актуальным) и как вообще идея?
|