Oberon space

General Category => Общий раздел => Тема начата: vangog512 от Февраль 12, 2014, 08:14:55 pm

Название: JAM - новый язык, компилятор
Отправлено: vangog512 от Февраль 12, 2014, 08:14:55 pm
Приветствую уважаемое сообщество, это мой первый топик здесь.
Хочу предложить вашему вниманию новый язык и компилятор. Точнее даже два родственных компилятора - один генерирует код для Java, другой для Си. Назначение и область применения - те же, что у Java и Си.

Ранее я имел некоторый опыт программирования на различных языках, в том числе смотрел Оберон. Решил попробовать и Java, скорее для самообразования. Но результат меня не впечатлил, и захотелось иметь что-то в духе языков семейства Паскаль, но прозрачно отображающееся в Java, Си, .. возможно в другие Си образные языки, как некий мост или промежуточный язык, сближающий разные семейства, примирить кажущиеся противоречия.

Язык Jam и компилятор более менее устоялись, в 2013 слегка поменялись опции компилятора и исправлено несколько ошибок.
Язык Si (текущее название пока такое) - более менее прорисовался, доработки ещё делаются, ошибки исправляются, документация ещё не в соответствии, выложил текущее состояние.
Хотелось бы довести (допилить) проекты.

Надеюсь на конструктивную критику и помощь сообщества.
Посмотреть, потрогать можно здесь: ishir.ru

Название: Re: JAM - новый язык, компилятор
Отправлено: valexey_u от Февраль 12, 2014, 09:27:02 pm
Быстрый вопрос - чем Jam отличается от java с паскалевским синтаксисом? То есть какие есть отличия в семантике языка?
Название: Re: JAM - новый язык, компилятор
Отправлено: vangog512 от Февраль 13, 2014, 01:46:50 pm
Да, это Java. Синтаксис похож на Паскалевский, исходно был как у Modula3.
Я старался покрыть достаточно полное подмножество Java7, см.док.4.5 - Ограничения. Если вы обнаружите другие - постараюсь их преодолеть или честно добавить в список при неудаче. В ранних версиях были искусственно введены некоторые ограничения, т.к. считаю что java излишне гибок.
Название: "Классика" на Jam или сортировка 5 за 7
Отправлено: vangog512 от Февраль 21, 2014, 05:52:10 pm
Понравилась задачка из топика за 05 июня 2012
http://oberspace.dyndns.org/index.php/topic,256.msg6209.html#msg6209
но что-то не нашёл рабочего решения.

Сортировка и тест на Jam (как оно мне представляется):

Название: Упс! Сортировка, не видны вложения, нужно войти!
Отправлено: vangog512 от Февраль 22, 2014, 05:54:17 am
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;
Название: Re: JAM - новый язык, компилятор
Отправлено: Geniepro от Февраль 22, 2014, 12:36:49 pm
А почему где-то FOR..ENDFOR, а где-то FOR..END?
Название: Re: JAM - новый язык, компилятор
Отправлено: Geniepro от Февраль 22, 2014, 12:47:30 pm
Аналогично, где-то ENDP, а где-то ENDPROC... Короче, странный синтаксис...
Название: Синтаксис? - есть алиасы!
Отправлено: vangog512 от Февраль 22, 2014, 04:08:27 pm
Для некоторых ключевых слов и модификаторов предусмотрены алиасы. Можно
писать так, как больше нравится. При наборе текста программы можно использовать более короткие варианты, а конечный вариант преобразовать к требуемому виду - для этого есть опции компилятора.
Тоже самое касательно регистра ключевых слов - предусмотрены 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, задаёт регистр ключевых слов

 
Название: В чём разница END и ENDx для блочных операторов ?
Отправлено: vangog512 от Февраль 22, 2014, 06:04:49 pm
А почему где-то 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 из-за более точного контроля блочной структуры.
Название: Re: В чём разница END и ENDx для блочных операторов? - есть ра
Отправлено: vangog512 от Февраль 22, 2014, 07:14:28 pm
Да простит меня Евгений, показательные фигуристов в Сочи перетягивают внимание,
конечно же:
IF expr THEN k = 1; END;    //компилируется в: if (expr) k = 1;  //а
IF expr THEN k = 1; ENDIF; //компилируется в: if (expr) {k = 1;}