Автор Тема: JAM - новый язык, компилятор  (Прочитано 3024 раз)

vangog512

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

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

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

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


valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: JAM - новый язык, компилятор
« Ответ #1 : Февраль 12, 2014, 09:27:02 pm »
Быстрый вопрос - чем Jam отличается от java с паскалевским синтаксисом? То есть какие есть отличия в семантике языка?
Y = λf.(λx.f (x x)) (λx.f (x x))

vangog512

  • Newbie
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: JAM - новый язык, компилятор
« Ответ #2 : Февраль 13, 2014, 01:46:50 pm »
Да, это Java. Синтаксис похож на Паскалевский, исходно был как у Modula3.
Я старался покрыть достаточно полное подмножество Java7, см.док.4.5 - Ограничения. Если вы обнаружите другие - постараюсь их преодолеть или честно добавить в список при неудаче. В ранних версиях были искусственно введены некоторые ограничения, т.к. считаю что java излишне гибок.

vangog512

  • Newbie
  • *
  • Сообщений: 7
    • Просмотр профиля
"Классика" на Jam или сортировка 5 за 7
« Ответ #3 : Февраль 21, 2014, 05:52:10 pm »
Понравилась задачка из топика за 05 июня 2012
http://oberspace.dyndns.org/index.php/topic,256.msg6209.html#msg6209
но что-то не нашёл рабочего решения.

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


vangog512

  • Newbie
  • *
  • Сообщений: 7
    • Просмотр профиля
Упс! Сортировка, не видны вложения, нужно войти!
« Ответ #4 : Февраль 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;

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: JAM - новый язык, компилятор
« Ответ #5 : Февраль 22, 2014, 12:36:49 pm »
А почему где-то FOR..ENDFOR, а где-то FOR..END?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: JAM - новый язык, компилятор
« Ответ #6 : Февраль 22, 2014, 12:47:30 pm »
Аналогично, где-то ENDP, а где-то ENDPROC... Короче, странный синтаксис...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

vangog512

  • Newbie
  • *
  • Сообщений: 7
    • Просмотр профиля
Синтаксис? - есть алиасы!
« Ответ #7 : Февраль 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, задаёт регистр ключевых слов

 

vangog512

  • Newbie
  • *
  • Сообщений: 7
    • Просмотр профиля
В чём разница END и ENDx для блочных операторов ?
« Ответ #8 : Февраль 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 из-за более точного контроля блочной структуры.

vangog512

  • Newbie
  • *
  • Сообщений: 7
    • Просмотр профиля
Да простит меня Евгений, показательные фигуристов в Сочи перетягивают внимание,
конечно же:
IF expr THEN k = 1; END;    //компилируется в: if (expr) k = 1;  //а
IF expr THEN k = 1; ENDIF; //компилируется в: if (expr) {k = 1;}