Oberon space
General Category => Общий раздел => Тема начата: vangog512 от Февраль 12, 2014, 08:14:55 pm
-
Приветствую уважаемое сообщество, это мой первый топик здесь.
Хочу предложить вашему вниманию новый язык и компилятор. Точнее даже два родственных компилятора - один генерирует код для Java, другой для Си. Назначение и область применения - те же, что у Java и Си.
Ранее я имел некоторый опыт программирования на различных языках, в том числе смотрел Оберон. Решил попробовать и Java, скорее для самообразования. Но результат меня не впечатлил, и захотелось иметь что-то в духе языков семейства Паскаль, но прозрачно отображающееся в Java, Си, .. возможно в другие Си образные языки, как некий мост или промежуточный язык, сближающий разные семейства, примирить кажущиеся противоречия.
Язык Jam и компилятор более менее устоялись, в 2013 слегка поменялись опции компилятора и исправлено несколько ошибок.
Язык Si (текущее название пока такое) - более менее прорисовался, доработки ещё делаются, ошибки исправляются, документация ещё не в соответствии, выложил текущее состояние.
Хотелось бы довести (допилить) проекты.
Надеюсь на конструктивную критику и помощь сообщества.
Посмотреть, потрогать можно здесь: ishir.ru
-
Быстрый вопрос - чем Jam отличается от java с паскалевским синтаксисом? То есть какие есть отличия в семантике языка?
-
Да, это Java. Синтаксис похож на Паскалевский, исходно был как у Modula3.
Я старался покрыть достаточно полное подмножество Java7, см.док.4.5 - Ограничения. Если вы обнаружите другие - постараюсь их преодолеть или честно добавить в список при неудаче. В ранних версиях были искусственно введены некоторые ограничения, т.к. считаю что java излишне гибок.
-
Понравилась задачка из топика за 05 июня 2012
http://oberspace.dyndns.org/index.php/topic,256.msg6209.html#msg6209
но что-то не нашёл рабочего решения.
Сортировка и тест на Jam (как оно мне представляется):
-
PRAGMA static;
VAR a:int[],
err, cmp_count, test_count = 0;
PROC swap (m,n :int) IS
VAR e:int;
IF m == n THEN RETURN; END;
e = a[m]; a[m] = a[n]; a[n] = e;
ENDP;
FUNC lt (m,n :int):boolean IS
INC cmp_count;
RETURN a[m] < a[n];
ENDF;
PROC sort5() IS
cmp_count = 0; //0 1 2 3 4
IF lt(0,4) THEN swap(0,4); END; //a1 >= a2
IF lt(1,3) THEN swap(1,3); END; // b1 >= b2
IF lt(0,1) THEN swap(0,1); swap(3,4); END; //a1>=b1 x b2 a2
IF lt(1,2) THEN swap(1,2);
IF lt(0,1) THEN swap(0,1); END;
ELSE
IF lt(2,3) THEN swap(2,3); END; //a1 >= b1 >= x >= b2, a2
END; //0 1 2 3 4
IF lt(2,4) THEN swap(3,4); swap(2,3); //a1 >= b1 ? a2 >= x >= b2
IF lt(1,2) THEN swap(1,2); END; //a1 >= a2 >= b1 >= x >= b2
ELSE
IF lt(3,4) THEN swap(3,4); END;
END;
ENDP sort5;
PROC test (a0, a1, a2, a3, a4 :int) IS
VAR ok = true;
a[0] = a0; a[1] = a1; a[2] = a2; a[3] = a3; a[4] = a4;
sort5();
FOR i IN [4] DO
IF a < a[i+1] THEN ok = false; END;
ENDFOR;
IF NOT ok OR cmp_count > 7 THEN
PUTF "-- src: %d, %d, %d, %d, %d\n", a0, a1, a2, a3, a4;
PUT "result: "; FOR i IN [5] DO PUTF "%d, ", a; END;
PUTN "";
PUTF "cmp_count= %d \n\n", cmp_count;
INC err;
END;
INC test_count;
ENDPROC;
PROC main() IS
a = NEW int[5];
FOR i IN [5] DO
FOR j IN [5] DO
FOR k IN [5] DO
FOR m IN [5] DO
FOR n IN [5] DO
test(i, j, k, m, n);
END; END; END; END; END;
PUTF "---- test_count= %d, error_count= %d\n", test_count, err;
ENDP main;
-
А почему где-то FOR..ENDFOR, а где-то FOR..END?
-
Аналогично, где-то ENDP, а где-то ENDPROC... Короче, странный синтаксис...
-
Для некоторых ключевых слов и модификаторов предусмотрены алиасы. Можно
писать так, как больше нравится. При наборе текста программы можно использовать более короткие варианты, а конечный вариант преобразовать к требуемому виду - для этого есть опции компилятора.
Тоже самое касательно регистра ключевых слов - предусмотрены 3 варианта.
Вопрос привычки, кому как больше нравится. В качестве канонического выбран вариант с короткими ключевыми словами и верхним регистром.
Примеры алиасов:
PROC / PROCEDURE, FUNC / FUNCTION, INTER / INTERFACE...
ENDP / ENDPROC, ENDF / ENDFUNC, ENDI / ENDINTER ...
JAM: Key words Table_key_3.txt
-------------------------------------------------------------------
CLASS ENDC* ASSERT/assert BEGIN NOT
INTER* ENDI* IMPORT/import THEN INSTOF/instanceof
ENUM ENDE* BREAK ELSIF AND
STRUC ENDS* CONTINUE ELSE OR
CALL IN XOR
MAKER ENDM* EVAL BY SHL
FUNC ENDF* CONST BACK SHR
PROC ENDP* VAR DO USHR
LET TILL global /public
BLOCK ENDB* PRAGMA UNTIL tochild /protected
SYNC ENDSYNC RAISE EXCEPT limited /inpacked
IF ENDIF RETURN FINALLY local /private
CASE ENDCASE EPUT OF abstract
TRY ENDTRY EPUTN OTHERS static /nostatic
LOOP ENDLOOP EPUTF WHEN final
WHILE ENDWHILE PUT EXTENDS native
REPEAT ENDREP PUTN IMPLEMENTS transient
FOR ENDFOR PUTF RAISES volatile
JAVACODE ENDJAVA EXIT IS synchronized
END INC IIF strictfp
MODULE** DEC NEW/new gen / nogen / genr
-------------------------------------------------------------------
* имеет алиас, например INTER/INTERFACE, ENDC/ENDCLASS, ...
** может быть MODULE/module/Module, задаёт регистр ключевых слов
-
А почему где-то FOR..ENDFOR, а где-то FOR..END?
Для блочных операторов от SYNC до JAVACODE возможно завершение как END, так и соответствующим завершающим оператором ENDx.
Отличие в обрамляющих фигурных скобках на выходе, если в блоке 1 оператор. Например:
IF expr THEN k = 1; END; //компилируется в: if (expr) k = 1; //а
IF expr THEN k = 1; END; //компилируется в: if (expr) {k = 1;}
Кроме того для полных ENDx контроль на соответствие IF <-> ENDIF,
что полезно в случае вложенных блоков и лучше смотрится.
Если же в блоке более чем 1 оператор, то обрамляющие скобки будут как в полной так и краткой форме, но лучше использовать полную форму ENDx из-за более точного контроля блочной структуры.
-
Да простит меня Евгений, показательные фигуристов в Сочи перетягивают внимание,
конечно же:
IF expr THEN k = 1; END; //компилируется в: if (expr) k = 1; //а
IF expr THEN k = 1; ENDIF; //компилируется в: if (expr) {k = 1;}