Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб ноя 17, 2018 8:04 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 102 сообщения ]  На страницу Пред. 1 2 3 4 5 6 7 След.
Автор Сообщение
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Вт апр 03, 2018 12:24 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 137
0CodErr писал(а):
Существует ли возможность получать на выходе простой объектник(COFF или OMF — не важно)?

Нет, можно получить только те форматы, которые указаны в справке. Компилятор просто не рассчитан на генерацию множества форматов, там и так всё очень запутано. Первоначально, я задумывал генерацию исполняемых файлов только для Windows. Для Колибри я не собирался делать, но формат файлов оказался уж очень простым. Конечно, опыта разработки компиляторов у меня не было, а читать специальную литературу я не хотел -- мне было интересно самостоятельно во всём разобраться. Но и не переусложнить задачу -- поэтому нет сборщика мусора (хотя оберон-07 это язык для микроконтроллеров и способ управления памятью -- на усмотрение разработчика), нет раздельной компиляции (хотя скорость компиляции довольно высокая), нет даже простейшего распределения регистров (стэк-машина). Сейчас, я сделал бы по-другому: я бы разделил компилятор и линкер -- пусть компилятор производит файлы специального формата, а линкер собирает из них исполняемый. Да и транслировать сразу в машинный код -- тоже плохое решение.

Собственно, я уже написал новый компилятор. Пока он компилирует только в байт-код виртуальной машины, но уже может компилировать сам себя. Теперь надо этот байт-код (он довольно простой) транслировать в x86, x86-64, возможно ARM, AVR32 (заодно научусь обращаться с микроконтроллерами) -- со временем сделаю.

0CodErr писал(а):
Есть вот ещё какой-то 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/oberonsystems/home/azyki-semejstva-oberon

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


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Ср апр 04, 2018 10:51 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
akron1 писал(а):
в x86, x86-64, возможно ARM, AVR32
Думаю, у проекта есть большие перспективы.

Решил адаптировать к Oberon-7 некоторые из вон тех примеров(сейчас их 6) viewtopic.php?f=33&t=2280#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?


Вложения:
Projects.7z [2.94 КБ]
39 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Ср апр 04, 2018 10:52 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 137
Пример "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.
Код:
  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 можно получить доступ и к другим функциям.


Вложения:
oberon07.rar [274.84 КБ]
44 скачивания
Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Ср апр 04, 2018 11:38 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4879
> меню (главное и всплывающее), вкладки, скроллбары, диалоговые окна; в общем, проще написать новый.
Для меня GUI всегда самое простое :) а вот логика куда сложнее.

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

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Ср апр 04, 2018 11:44 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4879
Я давно подумываю вынести свои элементы в библиотеку...
У меня тоже есть меню, чекбокс, ноу-хау MoreLessBox и жемчужина коллекции Список :)


Вложения:
c--lib.png
c--lib.png [ 49.67 КБ | 1160 просмотров ]

_________________
Через тернии к звездам
Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Ср апр 04, 2018 11:59 pm 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 413
kmenu нет по факту отсутствия исходников.

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


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Чт апр 05, 2018 12:03 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 137
Leency писал(а):
Для меня GUI всегда самое простое :) а вот логика куда сложнее.

Вот если бы я тогда догадался четко разделить логику и GUI... Это в своих последних проектах я сразу выделяю все зависимости в отдельный модуль, а в то время у меня всё переплеталось.
Leency писал(а):
Я давно подумываю вынести свои элементы в библиотеку...

Ну, это было бы хорошо, конечно. А то иногда даже не хочется писать программу, если там надо GUI делать вручную.


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Чт апр 05, 2018 6:36 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
В новой версии компилятора размер выходного приложения получается меньше, чем раньше.
Я поправил пример "postfix", убрал импорт RTL изо всех примеров, также добавил ещё 3 примера(из Zonnon online collection и CRITICAL MASS MODULA-3 examples).
Хотелось бы, чтобы примеры работали без переделки на всех поддерживаемых платформах. Они ведь кроссплатформенные.
akron1 писал(а):
антивирусы ругаются на GUI-приложения, но я всё же добавил его в архив, при этом скомпилировал как консольное приложение (к таким приложениям антивирусы относятся лучше)
Теперь окно консоли запускается вместе с GUI.

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

Заметил, что в EditorCtrl+U не работает, если выделять справа налево. А так можно пользоваться(подсветка, компиляция и запуск по хоткею). Ещё бы undo доработать.
Вложение:
Комментарий к файлу: если положить папку Projects в папку с компилятором, можно использовать bat-файлы build.all.bat и run.all.bat
Projects.7z [4.41 КБ]
42 скачивания


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Пт апр 06, 2018 12:00 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 137
0CodErr писал(а):
Хотелось бы, чтобы примеры работали без переделки на всех поддерживаемых платформах. Они ведь кроссплатформенные.

Для этого надо делать кроссплатформенную библиотеку. Это у меня пока не приоритет.
0CodErr писал(а):
Теперь окно консоли запускается вместе с GUI.

Ну да, редактор только для моего личного пользования и я не обращаю внимания на окно консоли.
0CodErr писал(а):
Заметил, что в EditorCtrl+U не работает, если выделять справа налево.

Ctrl-U и Ctrl-L нужны для исправления ошибочного преобразования регистра. Выделять текст не надо, надо только поставить курсор после слова, в котором требуется изменить регистр.
Логику работы редактора я списал со среды разработки Oberon-07 Astrobe для МК.
0CodErr писал(а):
А будущий компилятор будет понимать прежние исходники?

Новый компилятор сделан по ревизии 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
СообщениеДобавлено: Сб апр 07, 2018 2:32 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
akron1 писал(а):
Для этого надо делать кроссплатформенную библиотеку. Это у меня пока не приоритет.
Понятно. Для KolibriOS вроде только нужна инициализация консоли
Код:
  ConsoleLib.open(-1, -1, -1, -1, "");
akron1 писал(а):
надо только поставить курсор после слова, в котором требуется изменить регистр.
Да, так работает. Но если поставить каретку посреди слова, то преобразуется только часть этого слова.
О, кстати, просто пожелание насчёт добавления функциональности Editor-у:
Code templates — вставка кода по шаблону(как Ctrl+j в Delphi)

Теперь примеров стало больше, сейчас их 14.
Чем можно заменить HALT? Оно используется в примере "hailst". Пока не придумал ничего лучше:
Код:
PROCEDURE HALT(code: INTEGER);
BEGIN
  In.Ln; API.ExitProcess(code);
END HALT;
В примере SierpinskiTriangle использовал такую конструкцию
Код:
IF (BITS(x) * BITS(y)) = BITS(0) THEN
Надеюсь, правильно? Или можно было проще?
Вложение:
Projects.7z [6 КБ]
40 скачиваний


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Сб апр 07, 2018 7:44 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 137
0CodErr писал(а):
Понятно. Для KolibriOS вроде только нужна инициализация консоли
Код:
  ConsoleLib.open(-1, -1, -1, -1, "");

Есть еще ConsoleLib.exit( TRUE ), примеры должны работать и без этого, но окно консоли можно будет закрыть только мышью.

0CodErr писал(а):
Да, так работает. Но если поставить каретку посреди слова, то преобразуется только часть этого слова.

Преобразуются только буквы a..z и A..Z, стоЯщие слева от курсора до первой небуквы.
Редактор автоматически преобразует нижний регистр в верхний: вводим "type", нажимаем пробел (или ";", "(", ...) -- получаем "TYPE". Если объявлена переменная с именем "type", то такое преобразование будет нежелательно. Если оно произошло, то надо исправить регистр, нажать ctrl-L. Ни для чего другого ctrl-L, ctrl-U не предназначены.
Автокапс в редакторе это удобно, но лучше, я думаю, разрешить нижний регистр для ключевых слов, как сделано в некоторых диалектах оберона: если модуль начинается с "MODULE", то далее использован верхний регистр, если "module" -- нижний.

0CodErr писал(а):
Чем можно заменить HALT? Оно используется в примере "hailst". Пока не придумал ничего лучше:

Ничего лучше и нет, для завершения надо вызвать системную функцию.

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

разве что, так:
Код:
IF BITS(x) * BITS(y) = {} THEN


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Сб апр 14, 2018 4:17 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
0CodErr писал(а):
О, кстати, просто пожелание насчёт добавления функциональности 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 разве что).
Ну, ничего :) тогда сам решил сделать этот пакет.

Выглядит в деле это вот так
Спойлер: Показать
Вложение:
1.PNG
1.PNG [ 81.17 КБ | 897 просмотров ]
Можно настроить дополнительно, в меню есть пункт
Спойлер: Показать
Вложение:
2.PNG
2.PNG [ 29.59 КБ | 897 просмотров ]

вызывающий диалог настройки
Спойлер: Показать
Вложение:
3.PNG
3.PNG [ 26.02 КБ | 897 просмотров ]

Чтобы использовать эти синтаксические настройки нужно скопировать два файла "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, вставляется:
Код:
PROCEDURE (): ;
BEGIN
   
  RETURN
END ;
или, пишешь mod, нажимаешь Ctrl+Enter, вставляется:
Код:
MODULE ;

IMPORT ;

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

Так как делал первый раз подобное — мог что-то упустить.
Вложение:
Ob07_.7z [2.14 КБ]
37 скачиваний


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Сб апр 14, 2018 9:27 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 137
Не подсвечиваются шестнадцатиричные константы и вложенные комментарии. Конечное END считается ошибкой, если в процедуре нет BEGIN, а такое возможно:
Код:
PROCEDURE add (a, b: INTEGER): INTEGER;
    RETURN a + b
END add;

А в остальном... не знаю, может и можно этим пользоваться. Для меня такие редакторы выглядят слишком перегруженными ненужными функциями, мне достаточно блокнот с подсветкой, но это кому как, конечно.


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Сб апр 14, 2018 9:53 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1503
akron1 писал(а):
Не подсвечиваются шестнадцатиричные константы
Надо в
Код:
<SPECIFICATION>...</SPECIFICATION>
добавить регулярку наподобие такой
Код:
<Numbers>[0-9]+[0-9A-F]*H?</Numbers>
akron1 писал(а):
Конечное END считается ошибкой, если в процедуре нет BEGIN, а такое возможно:
А как проявляется эта ошибка?
Вообще там сейчас
Код:
<Scope open="BEGIN" close="END"/>
но может можно и так сделать
Код:
<Scope open="PROCEDURE" middle="BEGIN" close="END"/>
Есть проблема, когда используется спецификатор [stdcall] или [winapi], но это надо править регулярку в этой строке
Код:
<Label group="Subroutines" match="((PROCEDURE)\s+([\S.]+)\s*\([^)]*\)[^;]*;)" name="\3" descr="\1" scope="1" image="9"></Label>
akron1 писал(а):
такие редакторы выглядят слишком перегруженными ненужными функциями
Да, там чего только нет! Мне самому этого более чем достаточно. Сложно представить, какая у этого редактора архитектура — очень многое можно подкрутить и расширить и настроить под себя.


Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Сб апр 14, 2018 9:59 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 137
Да, вот вспомнил, есть еще компилятор для Win64
https://github.com/congdm/Patchouli-Compiler
там есть файл для подсветки в notepad++

Цитата:
А как проявляется эта ошибка?

Подсвечивает END красным.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 102 сообщения ]  На страницу Пред. 1 2 3 4 5 6 7 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB