Board.KolibriOS.org

Official KolibriOS board
It is currently Thu Nov 21, 2019 6:05 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 112 posts ]  Go to page Previous 1 2 3 4 5 68 Next
Author Message
PostPosted: Tue Apr 03, 2018 12:24 am 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 142
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/oberonsystems/home/azyki-semejstva-oberon

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


Top
   
PostPosted: Wed Apr 04, 2018 10:51 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
akron1 wrote:
в 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?


Attachments:
Projects.7z [2.94 KiB]
Downloaded 104 times
Top
   
PostPosted: Wed Apr 04, 2018 10:52 pm 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 142
Пример "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:
  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 110 times
Top
   
PostPosted: Wed Apr 04, 2018 11:38 pm 
Offline
Designer
User avatar

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

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

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


Top
   
PostPosted: Wed Apr 04, 2018 11:44 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5066
Я давно подумываю вынести свои элементы в библиотеку...
У меня тоже есть меню, чекбокс, ноу-хау MoreLessBox и жемчужина коллекции Список :)


Attachments:
c--lib.png
c--lib.png [ 49.67 KiB | Viewed 2667 times ]

_________________
Через тернии к звездам
Top
   
PostPosted: Wed Apr 04, 2018 11:59 pm 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
kmenu нет по факту отсутствия исходников.

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


Top
   
PostPosted: Thu Apr 05, 2018 12:03 am 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 142
Leency wrote:
Для меня GUI всегда самое простое :) а вот логика куда сложнее.

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

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


Top
   
PostPosted: Thu Apr 05, 2018 6:36 pm 
Offline

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

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

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


Top
   
PostPosted: Fri Apr 06, 2018 12:00 am 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 142
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 вычисляется в каждой итерации, а не только перед первой.

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

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


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


Top
   
PostPosted: Sat Apr 07, 2018 2:32 pm 
Offline

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

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


Top
   
PostPosted: Sat Apr 07, 2018 7:44 pm 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 142
0CodErr wrote:
Понятно. Для KolibriOS вроде только нужна инициализация консоли
Code:
  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:
IF (BITS(x) * BITS(y)) = BITS(0) THEN
Надеюсь, правильно? Или можно было проще?

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


Top
   
PostPosted: Sat Apr 14, 2018 4:17 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
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
Quote:
HippoEDIT распространяется по принципу Shareware. Но для пользователей из стран бывшего СССР, для некоммерческого использования, программа бесплатна. Регистрация проходит автоматически если на компьютере установлена русская раскладка. Для коммерческого использования Вы должны купить лицензию.
Среди существующих пакетов синтаксической подсветки http://www.hippoedit.com/syntax_files.php?lang=ru нужного или хотя бы похожего не нашёл(Pascal разве что).
Ну, ничего :) тогда сам решил сделать этот пакет.

Выглядит в деле это вот так
Spoiler: Show
Attachment:
1.PNG
1.PNG [ 81.17 KiB | Viewed 2404 times ]
Можно настроить дополнительно, в меню есть пункт
Spoiler: Show
Attachment:
2.PNG
2.PNG [ 29.59 KiB | Viewed 2404 times ]

вызывающий диалог настройки
Spoiler: Show
Attachment:
3.PNG
3.PNG [ 26.02 KiB | Viewed 2404 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:
PROCEDURE (): ;
BEGIN
   
  RETURN
END ;
или, пишешь mod, нажимаешь Ctrl+Enter, вставляется:
Code:
MODULE ;

IMPORT ;

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

Так как делал первый раз подобное — мог что-то упустить.
Attachment:
Ob07_.7z [2.14 KiB]
Downloaded 97 times


Top
   
PostPosted: Sat Apr 14, 2018 9:27 pm 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 142
Не подсвечиваются шестнадцатиричные константы и вложенные комментарии. Конечное END считается ошибкой, если в процедуре нет BEGIN, а такое возможно:
Code:
PROCEDURE add (a, b: INTEGER): INTEGER;
    RETURN a + b
END add;

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


Top
   
PostPosted: Sat Apr 14, 2018 9:53 pm 
Offline

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


Top
   
PostPosted: Sat Apr 14, 2018 9:59 pm 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 142
Да, вот вспомнил, есть еще компилятор для Win64
https://github.com/congdm/Patchouli-Compiler
там есть файл для подсветки в notepad++

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

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 112 posts ]  Go to page Previous 1 2 3 4 5 68 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 6 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited