Page 4 of 9

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

Posted: Tue Apr 03, 2018 12:24 am
by akron1
0CodErr wrote:Существует ли возможность получать на выходе простой объектник(COFF или OMF — не важно)?
Нет, можно получить только те форматы, которые указаны в справке. Компилятор просто не рассчитан на генерацию множества форматов, там и так всё очень запутано. Первоначально, я задумывал генерацию исполняемых файлов только для Windows. Для Колибри я не собирался делать, но формат файлов оказался уж очень простым. Конечно, опыта разработки компиляторов у меня не было, а читать специальную литературу я не хотел -- мне было интересно самостоятельно во всём разобраться. Но и не переусложнить задачу -- поэтому нет сборщика мусора (хотя оберон-07 это язык для микроконтроллеров и способ управления памятью -- на усмотрение разработчика), нет раздельной компиляции (хотя скорость компиляции довольно высокая), нет даже простейшего распределения регистров (стэк-машина). Сейчас, я сделал бы по-другому: я бы разделил компилятор и линкер -- пусть компилятор производит файлы специального формата, а линкер собирает из них исполняемый. Да и транслировать сразу в машинный код -- тоже плохое решение.

Собственно, я уже написал новый компилятор. Пока он компилирует только в байт-код виртуальной машины, но уже может компилировать сам себя. Теперь надо этот байт-код (он довольно простой) транслировать в x86, x86-64, возможно ARM, AVR32 (заодно научусь обращаться с микроконтроллерами) -- со временем сделаю.
0CodErr wrote:Есть вот ещё какой-то Oberon-07 http://exaprog.com/eng/index.html http://exaprog.com/rus/index.html но он вроде другой, да?
Да, этот компилятор с закрытым кодом, только для Windows (и только exe) и он уже давно не развивается. В нём есть однопоточный сборщик мусора, раздельная компиляция, язык расширен динамическими массивами и специальным синтаксисом для импорта функций из внешних библиотек. При этом, там нет некоторых встроенных процедур: INC, DEC... Не реализован доступ к переменным промежуточного уровня (хотя я сомневаюсь, что это так уж важно). Качество кодогенерации еще хуже, чем у моего компилятора -- код на 10-20% медленнее и в 2-3 раза больше. Очень низкая скорость компиляции. Он реализует ревизию языка 2008. Мой компилятор -- 2011. Список ревизий:
https://sites.google.com/site/oberonsys ... tva-oberon

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

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

Posted: Wed Apr 04, 2018 10:51 am
by 0CodErr
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?

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

Posted: Wed Apr 04, 2018 10:52 pm
by akron1
Пример "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 можно получить доступ и к другим функциям.

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

Posted: Wed Apr 04, 2018 11:38 pm
by Leency
> меню (главное и всплывающее), вкладки, скроллбары, диалоговые окна; в общем, проще написать новый.
Для меня GUI всегда самое простое :) а вот логика куда сложнее.

Вкладки можно выкинуть на первое время. Для меню есть kmenu и в принципе самописное меню - это просто. Вообще можно без меню - кнопками на тулбаре - короче вариантов много. Диалоговые окна - тут проблемы вообще не вижу...

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

Posted: Wed Apr 04, 2018 11:44 pm
by Leency
Я давно подумываю вынести свои элементы в библиотеку...
У меня тоже есть меню, чекбокс, ноу-хау MoreLessBox и жемчужина коллекции Список :)

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

Posted: Wed Apr 04, 2018 11:59 pm
by Siemargl
kmenu нет по факту отсутствия исходников.

переписывать все для каждого языка тоже нонсенс.
нужно для Оберона какую то интеграцию.

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

Posted: Thu Apr 05, 2018 12:03 am
by akron1
Leency wrote:Для меня GUI всегда самое простое :) а вот логика куда сложнее.
Вот если бы я тогда догадался четко разделить логику и GUI... Это в своих последних проектах я сразу выделяю все зависимости в отдельный модуль, а в то время у меня всё переплеталось.
Leency wrote:Я давно подумываю вынести свои элементы в библиотеку...
Ну, это было бы хорошо, конечно. А то иногда даже не хочется писать программу, если там надо GUI делать вручную.

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

Posted: Thu Apr 05, 2018 6:36 pm
by 0CodErr
В новой версии компилятора размер выходного приложения получается меньше, чем раньше.
Я поправил пример "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 292 times

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

Posted: Fri Apr 06, 2018 12:00 am
by akron1
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 вычисляется в каждой итерации, а не только перед первой.

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

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


По поводу остальных вопросов -- пока трудно сказать, как оно будет.

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

Posted: Sat Apr 07, 2018 2:32 pm
by 0CodErr
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 295 times

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

Posted: Sat Apr 07, 2018 7:44 pm
by akron1
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

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

Posted: Sat Apr 14, 2018 4:17 pm
by 0CodErr
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 9824 times
Можно настроить дополнительно, в меню есть пункт
Spoiler:
2.PNG
2.PNG (29.59 KiB)
Viewed 9824 times
вызывающий диалог настройки
Spoiler:
3.PNG
3.PNG (26.02 KiB)
Viewed 9824 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 289 times

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

Posted: Sat Apr 14, 2018 9:27 pm
by akron1
Не подсвечиваются шестнадцатиричные константы и вложенные комментарии. Конечное END считается ошибкой, если в процедуре нет BEGIN, а такое возможно:

Code: Select all

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

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

Posted: Sat Apr 14, 2018 9:53 pm
by 0CodErr
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:такие редакторы выглядят слишком перегруженными ненужными функциями
Да, там чего только нет! Мне самому этого более чем достаточно. Сложно представить, какая у этого редактора архитектура — очень многое можно подкрутить и расширить и настроить под себя.

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

Posted: Sat Apr 14, 2018 9:59 pm
by akron1
Да, вот вспомнил, есть еще компилятор для Win64
https://github.com/congdm/Patchouli-Compiler
там есть файл для подсветки в notepad++
А как проявляется эта ошибка?
Подсвечивает END красным.