Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт дек 13, 2018 4:46 pm

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




Начать новую тему  Ответить на тему  [ 109 сообщений ]  На страницу Пред. 14 5 6 7 8 След.
Автор Сообщение
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Чт окт 18, 2018 7:55 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 140
Кроссплатформенные примеры скоро будут.
А чем ".obj" не устраивает? MS COFF, вроде бы... Чтобы было понятно о чём речь и как это сделать, нужен пример такого файла на FASM.


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

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1499
Как следует из документации:
Цитата:
Параметры:
..............
3) тип приложения и платформа
..............
"obj" - KolibriOS DLL
Цитата:
Разрешается экспортировать только процедуры.
..............
KolibriOS DLL всегда экспортируют идентификаторы "version"
(версия программы) и "lib_init" - адрес процедуры инициализации DLL:

PROCEDURE [stdcall] lib_init (): INTEGER

Эта процедура должна быть вызвана перед использованием DLL.
Если видел примеры для XDS Modula-2/Oberon-2 compiler viewtopic.php?f=33&t=2280 то там сначала получается объектный файл, затем он линкуется с другими модулями примерно так:
Код:
          xc %name%.mod -objfmt=coff
          ld -o              %Name%.kex ^
             -T            ../LScript.x ^
                             %Name%.obj ^
                  ../../Modules/DLL.obj ^
                  ../../Modules/X2C.obj ^
                ../../Modules/InOut.obj
Сейчас нет возможности использовать сторонние модули при статической линковке.
akron1 писал(а):
- Добавлен специальный синтаксис для импорта функций из динамических библиотек.
Теперь подсветка в HippoEDIT "поехала".


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

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 140
Я пока плохо представляю, как работает статическая линковка. Если будет время и желание, то может быть сделаю раздельную компиляцию с последующей линковкой. Но видимо нескоро. Сейчас мне это кажется довольно сложным.

0CodErr писал(а):
Теперь подсветка в HippoEDIT "поехала".

Если есть какие-либо идеи, то можешь предложить свой вариант синтаксиса импорта, более удобный для подсветки.


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

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1499
akron1 писал(а):
Если будет время и желание, то может быть сделаю раздельную компиляцию с последующей линковкой. Но видимо нескоро.
Ну ничего страшного, торопиться и не надо :)
Если будет что — с удовольствием потестирую.
akron1 писал(а):
предложить свой вариант синтаксиса импорта, более удобный для подсветки
Казалось бы, банальное добавление END; решает проблему
Код:
PROCEDURE [winapi, "kernel32.dll", "GetTickCount"]
    _GetTickCount* (): INTEGER; END;

PROCEDURE [winapi, "kernel32.dll", "GetStdHandle"]
    GetStdHandle (nStdHandle: INTEGER): INTEGER; END;

PROCEDURE [winapi, "kernel32.dll", "GetCommandLineA"]
    GetCommandLine (): INTEGER; END;

PROCEDURE [winapi, "kernel32.dll", "ReadFile"]
    ReadFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER; END;

PROCEDURE [winapi, "kernel32.dll", "WriteFile"]
    WriteFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER; END;

PROCEDURE [winapi, "kernel32.dll", "CloseHandle"]
    CloseHandle (hObject: INTEGER): INTEGER; END;

PROCEDURE [winapi, "kernel32.dll", "CreateFileA"]
    CreateFile (
        lpFileName, dwDesiredAccess, dwShareMode: INTEGER;
        lpSecurityAttributes: PSecurityAttributes;
        dwCreationDisposition, dwFlagsAndAttributes,
        hTemplateFile: INTEGER): INTEGER; END;

PROCEDURE [winapi, "kernel32.dll", "OpenFile"]
    OpenFile (lpFileName: INTEGER; lpReOpenBuff: OFSTRUCT; uStyle: INTEGER): INTEGER; END;

PROCEDURE [winapi, "kernel32.dll", "ExitProcess"]
    ExitProcess* (code: INTEGER); END;

PROCEDURE [winapi, "shell32.dll", "ShellExecuteA"]
    ShellExecute* (hWnd, Operation, FileName, Parameters, Directory, ShowCmd: INTEGER): INTEGER; END;
Не знаю, уж насколько логично это выглядит.
akron1 писал(а):
Кроссплатформенные примеры скоро будут.
Будет ли возможность собрать те примеры(Projects.7z ) viewtopic.php?f=33&t=2443&start=45#p70389 ?


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

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 140
END, конечно, не очень красиво. Хотя, можно сделать (опционально):
Код:
PROCEDURE [winapi, "kernel32.dll", "CloseHandle"]
    CloseHandle* (hObject: INTEGER): INTEGER;
END CloseHandle;

Цитата:
Будет ли возможность собрать те примеры(Projects.7z )

Да, я поставлю заглушки для Windows Console.open, Console.exit. Вроде бы ничего лучше пока нельзя сделать. Еще надо будет сделать поддержку относительных путей, чтобы компилировать из командного файла.


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

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 417
akron1 писал(а):
Я пока плохо представляю, как работает статическая линковка. Если будет время и желание, то может быть сделаю раздельную компиляцию с последующей линковкой. Но видимо нескоро. Сейчас мне это кажется довольно сложным.

Это проще чем звучит. Функции выкладываются по очереди в сегмент кода, их адреса запоминаются.
На втором проходе по местам релоков прописываются полученные адреса.

Вот как сделано в tcc, всего 300 строк

Меня наоборот, пугает динамическая =)


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

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 140
akron1 писал(а):
END, конечно, не очень красиво. Хотя, можно сделать (опционально):
Код:
PROCEDURE [winapi, "kernel32.dll", "CloseHandle"]
    CloseHandle* (hObject: INTEGER): INTEGER;
END CloseHandle;
Сделано.

akron1 писал(а):
Цитата:
Будет ли возможность собрать те примеры(Projects.7z )

Да, я поставлю заглушки для Windows Console.open, Console.exit. Вроде бы ничего лучше пока нельзя сделать.
Сделано.

akron1 писал(а):
Еще надо будет сделать поддержку относительных путей
Сделано.

Примеры прикрепил.


Вложения:
Projects.zip [13.3 КБ]
15 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: Компилятор Oberon-07
СообщениеДобавлено: Вт окт 23, 2018 5:45 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1499
akron1 писал(а):
заглушки для Windows Console.open, Console.exit. Вроде бы ничего лучше пока нельзя сделать.
Разве нельзя было инициализировать консоль внутри In.Open и Out.Open?
Раньше ещё поддерживался Linux, теперь он поддерживаться не будет?


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

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 140
Ну а финализацию куда всунуть? Я так думаю, что инициализация и финализация консоли должны быть в одном модуле. Я выбрал модуль Console. Другое дело, что Console.open фактически не нужно вызывать в Windows, а In.Open и Out.Open не нужны в KolibriOS (In.Open, правда, инициализирует переменную Done, но этот код можно перенести в секцию инициализации модуля In). Я тут думаю, что может быть лучше In.Open и Out.Open вызывать из Console.open.

Тогда "кроссплатформенный" код главного модуля будет выглядеть так:
Код:
MODULE program;

IMPORT C := Console, In, Out;

BEGIN
    C.open;

    C.exit(TRUE)
END program.

вместо
Код:
MODULE program;

IMPORT C := Console, In, Out;

BEGIN
    C.open;
    In.Open;
    Out.Open;

    C.exit(TRUE)
END program.

Поддержку Linux хотелось бы сделать, но пока до этого руки не доходят.


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

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1499
akron1 писал(а):
Тогда "кроссплатформенный" код главного модуля будет выглядеть так:
Код:
MODULE program;

IMPORT C := Console, In, Out;

BEGIN
    C.open;

    C.exit(TRUE)
END program.
Это вполне хороший вариант.
Я просто думал, как бы так сделать, чтобы поменьше вызывать лишнего.
akron1 писал(а):
Ну а финализацию куда всунуть?
Если только неявно после выполнения основного кода
Код:
      IF Console.Initialized THEN
        Console.exit
      END;

Например, у XDS(Oberon-2) есть такой код, где вызывается In.Open, но без Out.Open
Спойлер: Показать
Код:
<*+ MAIN *> 
MODULE ackermann;

IMPORT Out, In;

VAR p1, p2, count: LONGINT;

PROCEDURE ack (m, n: LONGINT): LONGINT;
BEGIN
  INC (count);
  IF m=0 THEN RETURN n+1 END;
  IF n=0 THEN RETURN ack (m-1, 1) END;
  RETURN ack (m-1, ack (m, n-1));
END ack;

BEGIN
  In.Open;
  count := 0;
  Out.String ("Ackermann Function Calculation"); Out.Ln;
  Out.String ("------------------------------"); Out.Ln;
  Out.Ln;
  Out.String ("Enter first  parameter (1..4): "); In.LongInt(p1);
  Out.String ("Enter second parameter (1..7): "); In.LongInt(p2);
  Out.Ln;
  Out.String ("Ackermann ("); Out.Int (p1, 0);
  Out.String (", "); Out.Int(p2, 0);
  Out.String ("): ");
  Out.Int (ack (p1, p2), 0);
  Out.String (" ("); Out.Int (count, 0);
  Out.String (" recursive calls)");
  Out.Ln;
END ackermann.
А есть вообще безо всяких Open
Спойлер: Показать
Код:
<* MAIN+ *>
MODULE GCreport;

IMPORT SYSTEM, oberonRTS, Out;

TYPE Object = POINTER TO ObjDesc;
     ObjDesc = RECORD
     END;

VAR
  global: Object;
  count: INTEGER;

PROCEDURE Finalize(a: SYSTEM.PTR);
BEGIN
  INC(count);
  Out.String("Garbage Collector: "); Out.Int(count,0); Out.Ln;
  global:=SYSTEM.VAL(Object,a);
  oberonRTS.InstallFinalizer(Finalize,global);
END Finalize;

PROCEDURE Init;
  VAR o: Object;
BEGIN
  count:=0;
  NEW(o);
  oberonRTS.InstallFinalizer(Finalize,o);
  NEW(o);
  oberonRTS.InstallFinalizer(Finalize,o);
  global:=o;
END Init;

BEGIN
  Init;
  oberonRTS.Collect;
  oberonRTS.Collect;
  oberonRTS.Collect;
  oberonRTS.Collect;
END GCreport.
Значит, всё же это можно как-то организовать неявно.
Ну при завершении программы как минимум.


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

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 140
0CodErr писал(а):
akron1 писал(а):
Тогда "кроссплатформенный" код главного модуля будет выглядеть так:
Код:
MODULE program;

IMPORT C := Console, In, Out;

BEGIN
    C.open;

    C.exit(TRUE)
END program.
Это вполне хороший вариант.
Я просто думал, как бы так сделать, чтобы поменьше вызывать лишнего.

Пока сделал так. Теперь можно не вызывать In.Open и Out.Open.


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

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 140
Я перестроил компилятор на генерацию машинного кода с формированием исполняемых файлов (PE и MENUET01). FASM больше не нужен. Генерация obj-библиотек пока не поддерживается. Размер машинного кода стал на 15% больше (сжатый на 5%), потому что компилятор пока генерирует длинные команды переходов там, где возможны короткие.

20.11.2018
Поддержка obj-библиотек восстановлена. Также сделал генерацию позиционно-независимого кода. Для KolibriOS это не нужно, но может быть для чего-нибудь пригодится.

25.11.2018
Короткие команды переходов, отключаемый рантайм контроль типов, индексов и указателей.


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

Зарегистрирован: Вс фев 04, 2007 2:07 pm
Сообщения: 178
akron1
Что думаешь об этом:
Цитата:
Why does CASE not have an ELSE or OTHERWISE clause?
To quote Prof. Wirth, "...the ELSE clause should be reserved for exceptional cases, i.e. those that are neither numerous among the possible cases nor do occur frequently during program execution."

This makes sense where CASE is normally implemented with a jump table. A common objection to not having an ELSE clause is related to it being an error if the case label does not match. Oberon-07 does not require it to be an error: a non-match will continue processing the next statement after CASE, as if there were a blank ELSE. (Potentially, a specialized implementation might decide on having a non-match be an error or trap.)

ELSE has issues with maintainence and readability. It potentially obfuscates the thinking of the programmer. Is something passed to CASE that falls to ELSE that was unintended? What did the author intend to fall to ELSE? It is possible this will be overlooked in a future refactoring.

The Oberon philosophy is to focus on essentials and keep it as simple as possible, but no simpler. As Wirth once wrote, be "engaged crusaders against home-made complexity".

Взято отсюда http://oberon07.com/FAQ.xhtml
Как я понял объясняется почему Вирт не добавил ELSE к ключевой конструкции CASE.


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

Зарегистрирован: Вс авг 09, 2015 3:41 pm
Сообщения: 107
Чтобы профессор там не писал else нужен, чтобы не стрелять лишний раз себе в ногу.
В PL/SQL конструкция else никому жить не мешает.


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

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 140
Когда я впервые прочитал описание O7, я удивился отсутствию операторов прерывания циклов и возврата из процедуры. Я даже перечитал описание, думая, что может быть я это пропустил или не так понял. Мне казалось, что на таком языке совершенно невозможно программировать. И потребовалось написать десятки тысяч строк кода, чтобы привыкнуть к такому положению. Сейчас мне всё это кажется вполне естественным и не вызывает никаких трудностей. Единственный RETURN даже помогает при отладке. Разве что, такое устройство языка приводит к некоторому увеличению размера кода и снижению эффективности, но это не так уж важно -- компиляторы Оберонов, как правило, неоптимизирующие и такая особенность языка лишь незначительно замедляет работу программ. Гораздо больше тактов расходуется на постоянные загрузки и сохранения переменных.

Отсутствие ELSE в CASE мне тоже показалось странным и неудобным. Еще в первой реализации я решил устранить этот "дефект". В новом компиляторе ELSE тоже присутствует, но больше для совместимости со старым кодом. Еще совсем недавно я был уверен в том, что CASE без ELSE практически бесполезен. Однако, в коде нового компилятора CASE с ELSE используется всего 2 раза (без ELSE -- 58 раз). И то, в одном случае, можно заменить на IF (там системный вызов Windows и я просто не уверен, что Windows не передаст в параметр что-то необычное), а в другом, обработка всех вариантов просто не доделана, поэтому пока там поставлен ELSE. Аварийная остановка программы, в случае непредусмотренного значения выражения в CASE, часто сигнализирует о серьезной ошибке и оказывает немалую помощь при разработке программы в блокноте, в условиях отсутствия отладчика. Пока у меня еще остаются сомнения в правильности такого решения Вирта. Всё же, бывают ситуации, когда все возможные значения трудно предусмотреть. Особенно в процессе разработки, когда реализована обработка только части вариантов из нескольких десятков или сотен и надо проверить работоспособность того, что уже сделано, тогда приходится ставить ELSE на пока еще не обработанные варианты.

Кстати, в одной очень старой статье (сегодня уже совершенно не актуальной), кажется начало 80-х, что-то вроде "Почему паскаль не является моим любимым языком", автор критикует старую версию паскаля в том числе и за отсутствие else в case.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 109 сообщений ]  На страницу Пред. 14 5 6 7 8 След.

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


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

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


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

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