Компилятор Oberon-07

High-level languages programming questions
  • akron1 wrote:в x86, x86-64, возможно ARM, AVR32
    Думаю, у проекта есть большие перспективы.

    Решил адаптировать к Oberon-7 некоторые из вон тех примеров(сейчас их 6) http://board.kolibrios.org/viewtopic.ph ... 280#p52371
    Пока это работает только под Windows, так как процедуры для KolibriOS In.Open и Out.Open ничего не делают, нужно самостоятельно вызывать ConsoleLib.open иначе не будет работать как надо.
    Пример "postfix" сейчас работает неправильно. Я чего-то не учёл? Но вообще там используется дважды вложенная процедура :)

    Интересует где можно взять обновления Editor-а? Если они есть, конечно.
    Да и вообще было бы удобно иметь возможность скачать последнюю версию компилятора, работающую под нужной ОС(Windows, Linux, KolibriOS) или даже подо все поддерживаемые сразу.
    На сайте https://sites.google.com/site/oberon07compiler/versii сейчас только версия от 2013 года.

    Кстати, насколько сложно может быть портирование Editor-а под KolibriOS? Там WinApi, я знаю, но ведь можно реализовать аналоги для KolibriOS?
    Attachments
    Projects.7z (2.94 KiB)
    Downloaded 286 times
  • Пример "postfix" не работает, потому что процедура In.Char выполняет ввод символа по нажатию enter. Т. е. вместо "a+b" ENTER, надо набрать:
    "a" ENTER "+" ENTER "b" ENTER ENTER
    вывод: ab+
    Да, и модуль RTL импортировать не надо, он автоматически добавляется к любой программе.
    Глубина вложения процедур не ограничена, но доступ к промежуточным переменным будет запрещен.

    Портировать Editor очень сложно, если бы было просто -- я бы давно уже сделал. Там ведь через WinApi сделано всё (и сделано далеко не лучшим образом, а лишь бы работало): меню (главное и всплывающее), вкладки, скроллбары, диалоговые окна; в общем, проще написать новый. Когда я его писал, я дальше Windows ничего не видел и возможность портирования на другую ОС меня не интересовала.
    Обновления редактора есть, просто я его больше не публикую, потому что антивирусы ругаются на GUI-приложения, но я всё же добавил его в архив, при этом скомпилировал как консольное приложение (к таким приложениям антивирусы относятся лучше). Также в архиве бинарники компилятора для всех трех ОС и библиотеки. Впрочем, как таковой библиотеки для Linux нет, потому что для этой ОС я ничего не пишу. В модуле /Lib/Linux32/API.ob07 есть привязки к некоторым системным функциям Linux.

    Code: Select all

      dlopen*         : PROCEDURE [cdecl] (filename, flag: INTEGER): INTEGER;
      dlsym*          : PROCEDURE [cdecl] (handle, symbol: INTEGER): INTEGER;
      _malloc*        : PROCEDURE [cdecl] (size: INTEGER): INTEGER;
      free*           : PROCEDURE [cdecl] (ptr: INTEGER);
      fopen*          : PROCEDURE [cdecl] (fname, fmode: INTEGER): INTEGER;
      fclose*, ftell* : PROCEDURE [cdecl] (file: INTEGER): INTEGER;
      fwrite*, fread* : PROCEDURE [cdecl] (buffer, bytes, blocks, file: INTEGER): INTEGER;
      fseek*          : PROCEDURE [cdecl] (file, offset, origin: INTEGER): INTEGER;
      exit*           : PROCEDURE [cdecl] (code: INTEGER);
      strncmp*        : PROCEDURE [cdecl] (str1, str2, n: INTEGER): INTEGER;
      strlen*         : PROCEDURE [cdecl] (str: INTEGER): INTEGER;
      clock_gettime*  : PROCEDURE [cdecl] (clock_id: INTEGER; VAR tp: TP): INTEGER;
    
    Используя dlopen и dlsym можно получить доступ и к другим функциям.
    Attachments
    oberon07.rar (274.84 KiB)
    Downloaded 313 times
  • > меню (главное и всплывающее), вкладки, скроллбары, диалоговые окна; в общем, проще написать новый.
    Для меня GUI всегда самое простое :) а вот логика куда сложнее.

    Вкладки можно выкинуть на первое время. Для меню есть kmenu и в принципе самописное меню - это просто. Вообще можно без меню - кнопками на тулбаре - короче вариантов много. Диалоговые окна - тут проблемы вообще не вижу...
    Из хаоса в космос
  • Я давно подумываю вынести свои элементы в библиотеку...
    У меня тоже есть меню, чекбокс, ноу-хау MoreLessBox и жемчужина коллекции Список :)
    Attachments
    c--lib.png
    c--lib.png (49.67 KiB)
    Viewed 9903 times
    Из хаоса в космос
  • kmenu нет по факту отсутствия исходников.

    переписывать все для каждого языка тоже нонсенс.
    нужно для Оберона какую то интеграцию.
  • Leency wrote:Для меня GUI всегда самое простое :) а вот логика куда сложнее.
    Вот если бы я тогда догадался четко разделить логику и GUI... Это в своих последних проектах я сразу выделяю все зависимости в отдельный модуль, а в то время у меня всё переплеталось.
    Leency wrote:Я давно подумываю вынести свои элементы в библиотеку...
    Ну, это было бы хорошо, конечно. А то иногда даже не хочется писать программу, если там надо GUI делать вручную.
  • В новой версии компилятора размер выходного приложения получается меньше, чем раньше.
    Я поправил пример "postfix", убрал импорт RTL изо всех примеров, также добавил ещё 3 примера(из Zonnon online collection и CRITICAL MASS MODULA-3 examples).
    Хотелось бы, чтобы примеры работали без переделки на всех поддерживаемых платформах. Они ведь кроссплатформенные.
    akron1 wrote:антивирусы ругаются на GUI-приложения, но я всё же добавил его в архив, при этом скомпилировал как консольное приложение (к таким приложениям антивирусы относятся лучше)
    Теперь окно консоли запускается вместе с GUI.

    А будущий компилятор будет понимать прежние исходники?
    Вообще хотелось бы иметь возможность подключать при компиляции сторонние модули. Планируется ли поддержка EXTERN?

    Заметил, что в EditorCtrl+U не работает, если выделять справа налево. А так можно пользоваться(подсветка, компиляция и запуск по хоткею). Ещё бы undo доработать.
    Projects.7z (4.41 KiB)
    если положить папку Projects в папку с компилятором, можно использовать bat-файлы build.all.bat и run.all.bat
    Downloaded 289 times
  • 0CodErr wrote: Хотелось бы, чтобы примеры работали без переделки на всех поддерживаемых платформах. Они ведь кроссплатформенные.
    Для этого надо делать кроссплатформенную библиотеку. Это у меня пока не приоритет.
    0CodErr wrote: Теперь окно консоли запускается вместе с GUI.
    Ну да, редактор только для моего личного пользования и я не обращаю внимания на окно консоли.
    0CodErr wrote: Заметил, что в EditorCtrl+U не работает, если выделять справа налево.
    Ctrl-U и Ctrl-L нужны для исправления ошибочного преобразования регистра. Выделять текст не надо, надо только поставить курсор после слова, в котором требуется изменить регистр.
    Логику работы редактора я списал со среды разработки Oberon-07 Astrobe для МК.
    0CodErr wrote: А будущий компилятор будет понимать прежние исходники?
    Новый компилятор сделан по ревизии 2016. Полной совместимости конечно нет, но отличия не такие уж большие. Программ написано мало и переделать их под новый компилятор будет несложно:

    - только один вещественный тип (REAL (double)), а не два (REAL (single), LONGREAL (double)). Одинарная точность всё равно применяется редко. Если будет надо, то можно написать процедуру преобразования single <=> double.

    - нет операций "<=" и ">=" для множеств, но они редко применяются и можно заменить: вместо "a<=b" написать "a*b=a", по смыслу это одно и то же.

    - если строка присваивается символьному массиву, то ее длина должна быть строго меньше длины массива (будет добавлен символ 0X), текущий компилятор допускает равенство длин.

    - так как вещественный тип только один, то не нужны и процедуры преобразования типов LONG и SHORT

    - исключена процедура ASSERT с двумя параметрами, осталась только с одним. Я этим вторым параметром не пользуюсь, но в принципе это несложно реализовать, здесь я еще подумаю.

    - исключена процедура COPY, она теперь не очень нужна, т. к. правила присваивания массивов изменились (но на старый код это не влияет).

    - промежуточные переменные больше недоступны. Это сложно, неэффективно и главное чревато ошибками: можно забыть объявить локальную переменную и случайно обратиться к одноименной и однотипной промежуточной. Конечно, можно точно так же случайно обратиться и к глобальной переменной, но при наличии промежуточных риск ошибки увеличивается. Польза от вложенных процедур при этом снижается, но всё равно частично сохраняется: глобальная область видимости не засоряется "лишними" именами; и т. к. опережающих описаний нет, вложение -- один из способов организации взаимной рекурсии.

    - несколько изменен цикл FOR
    FOR i := a TO b DO
    теперь выражение b вычисляется в каждой итерации, а не только перед первой.

    - изменился порядок размещения переменных и параметров в памяти, а также выравнивание данных.

    Остальные изменения на старый код не влияют.


    По поводу остальных вопросов -- пока трудно сказать, как оно будет.
  • akron1 wrote:Для этого надо делать кроссплатформенную библиотеку. Это у меня пока не приоритет.
    Понятно. Для KolibriOS вроде только нужна инициализация консоли

    Code: Select all

      ConsoleLib.open(-1, -1, -1, -1, "");
    akron1 wrote:надо только поставить курсор после слова, в котором требуется изменить регистр.
    Да, так работает. Но если поставить каретку посреди слова, то преобразуется только часть этого слова.
    О, кстати, просто пожелание насчёт добавления функциональности Editor-у:
    Code templates — вставка кода по шаблону(как Ctrl+j в Delphi)

    Теперь примеров стало больше, сейчас их 14.
    Чем можно заменить HALT? Оно используется в примере "hailst". Пока не придумал ничего лучше:

    Code: Select all

    PROCEDURE HALT(code: INTEGER);
    BEGIN
      In.Ln; API.ExitProcess(code);
    END HALT;
    В примере SierpinskiTriangle использовал такую конструкцию

    Code: Select all

    IF (BITS(x) * BITS(y)) = BITS(0) THEN
    Надеюсь, правильно? Или можно было проще?
    Projects.7z (6 KiB)
    Downloaded 291 times
  • 0CodErr wrote:Понятно. Для KolibriOS вроде только нужна инициализация консоли

    Code: Select all

      ConsoleLib.open(-1, -1, -1, -1, "");
    Есть еще ConsoleLib.exit( TRUE ), примеры должны работать и без этого, но окно консоли можно будет закрыть только мышью.
    0CodErr wrote:Да, так работает. Но если поставить каретку посреди слова, то преобразуется только часть этого слова.
    Преобразуются только буквы a..z и A..Z, стоЯщие слева от курсора до первой небуквы.
    Редактор автоматически преобразует нижний регистр в верхний: вводим "type", нажимаем пробел (или ";", "(", ...) -- получаем "TYPE". Если объявлена переменная с именем "type", то такое преобразование будет нежелательно. Если оно произошло, то надо исправить регистр, нажать ctrl-L. Ни для чего другого ctrl-L, ctrl-U не предназначены.
    Автокапс в редакторе это удобно, но лучше, я думаю, разрешить нижний регистр для ключевых слов, как сделано в некоторых диалектах оберона: если модуль начинается с "MODULE", то далее использован верхний регистр, если "module" -- нижний.
    0CodErr wrote:Чем можно заменить HALT? Оно используется в примере "hailst". Пока не придумал ничего лучше:
    Ничего лучше и нет, для завершения надо вызвать системную функцию.
    0CodErr wrote:В примере SierpinskiTriangle использовал такую конструкцию

    Code: Select all

    IF (BITS(x) * BITS(y)) = BITS(0) THEN
    Надеюсь, правильно? Или можно было проще?
    разве что, так:

    Code: Select all

    IF BITS(x) * BITS(y) = {} THEN
  • 0CodErr wrote:О, кстати, просто пожелание насчёт добавления функциональности Editor-у:
    Code templates — вставка кода по шаблону(как Ctrl+j в Delphi)
    Мне этого(и не только этого) очень не хватало, и я искал способ решить эту проблему.

    Сначала попытался создать пользовательское определение в Notepad++.
    К сожалению не получилось добиться нужного результата — некоторые нужные вещи работали не так как хотелось, а некоторые совсем не работали.
    Потом попробовал plugin для Notepad++.
    Oberon2Lexer v0.3.1 for Notepad++ by Alexander Iljin (Amadeus IT Solutions) у меня работать отказался(вроде бы потому что с более новой версией Scintilla изменился какой-то интерфейс).
    Тогда я решил попробовать ещё вариант HippoEDIT http://www.hippoedit.com
    HippoEDIT распространяется по принципу Shareware. Но для пользователей из стран бывшего СССР, для некоммерческого использования, программа бесплатна. Регистрация проходит автоматически если на компьютере установлена русская раскладка. Для коммерческого использования Вы должны купить лицензию.
    Среди существующих пакетов синтаксической подсветки http://www.hippoedit.com/syntax_files.php?lang=ru нужного или хотя бы похожего не нашёл(Pascal разве что).
    Ну, ничего :) тогда сам решил сделать этот пакет.

    Выглядит в деле это вот так
    Spoiler:
    1.PNG
    1.PNG (81.17 KiB)
    Viewed 9640 times
    Можно настроить дополнительно, в меню есть пункт
    Spoiler:
    2.PNG
    2.PNG (29.59 KiB)
    Viewed 9640 times
    вызывающий диалог настройки
    Spoiler:
    3.PNG
    3.PNG (26.02 KiB)
    Viewed 9640 times
    Чтобы использовать эти синтаксические настройки нужно скопировать два файла "ob07_spec.xml" и "ob07_user.xml" в
    папку с настройками "Application Data\HippoEDIT\data\syntax", она может находиться, например, в "C:\Documents and Settings\All Users".
    Чтобы узнать, можно выбрать меню->Help->About и посмотреть параметр "Settings folder".

    Вставка шаблонов кода Code templates по Ctrl+Enter.
    Например, пишешь, proc, нажимаешь Ctrl+Enter, вставляется:

    Code: Select all

    PROCEDURE (): ;
    BEGIN
        
      RETURN 
    END ;
    или, пишешь mod, нажимаешь Ctrl+Enter, вставляется:

    Code: Select all

    MODULE ;
    
    IMPORT ;
    
    BEGIN
        
    END .
    Можно также вставлять из меню->Format->Code templates

    Так как делал первый раз подобное — мог что-то упустить.
    Ob07_.7z (2.14 KiB)
    Downloaded 283 times
  • Не подсвечиваются шестнадцатиричные константы и вложенные комментарии. Конечное END считается ошибкой, если в процедуре нет BEGIN, а такое возможно:

    Code: Select all

    PROCEDURE add (a, b: INTEGER): INTEGER;
        RETURN a + b
    END add;
    
    А в остальном... не знаю, может и можно этим пользоваться. Для меня такие редакторы выглядят слишком перегруженными ненужными функциями, мне достаточно блокнот с подсветкой, но это кому как, конечно.
  • akron1 wrote:Не подсвечиваются шестнадцатиричные константы
    Надо в

    Code: Select all

    <SPECIFICATION>...</SPECIFICATION>
    добавить регулярку наподобие такой

    Code: Select all

    <Numbers>[0-9]+[0-9A-F]*H?</Numbers>
    akron1 wrote:Конечное END считается ошибкой, если в процедуре нет BEGIN, а такое возможно:
    А как проявляется эта ошибка?
    Вообще там сейчас

    Code: Select all

    <Scope open="BEGIN" close="END"/>
    но может можно и так сделать

    Code: Select all

    <Scope open="PROCEDURE" middle="BEGIN" close="END"/>
    Есть проблема, когда используется спецификатор [stdcall] или [winapi], но это надо править регулярку в этой строке

    Code: Select all

    <Label group="Subroutines" match="((PROCEDURE)\s+([\S.]+)\s*\([^)]*\)[^;]*;)" name="\3" descr="\1" scope="1" image="9"></Label>
    akron1 wrote:такие редакторы выглядят слишком перегруженными ненужными функциями
    Да, там чего только нет! Мне самому этого более чем достаточно. Сложно представить, какая у этого редактора архитектура — очень многое можно подкрутить и расширить и настроить под себя.
  • Да, вот вспомнил, есть еще компилятор для Win64
    https://github.com/congdm/Patchouli-Compiler
    там есть файл для подсветки в notepad++
    А как проявляется эта ошибка?
    Подсвечивает END красным.
  • Who is online

    Users browsing this forum: No registered users and 3 guests