OberonCore
https://forum.oberoncore.ru/

Oml - МультиОберон для LLVM
https://forum.oberoncore.ru/viewtopic.php?f=157&t=6426
Страница 1 из 2

Автор:  Дмитрий Дагаев [ Суббота, 17 Август, 2019 09:37 ]
Заголовок сообщения:  Oml - МультиОберон для LLVM

МультиОберон для LLVM содержит в себе полностью новый бэкенд LLVM версии 5.0.

Oml предназначен для работы:
- из командной строки,
- в среде BlackBox.

Oml работает как с '.odc' файлами, так и с текстовыми файлами '.mod' из среды BlackBox и только с текстовыми файлами '.mod' из командной строки.

Oml работает в качестве оболочки OmlSh.exe командной строки, что позволяет делать скрипты на Обероне.

В комплект входят модули системы выполнения (Kernel, ..), позволяющие запускаться как на 32-бит, так и на 64-бит.

Ссылка на МультиОберон на гитхабе здесь

Вложения:
QuickStartOml_ru.pdf [292.26 КБ]
Скачиваний: 75

Автор:  Дмитрий Дагаев [ Суббота, 17 Август, 2019 13:48 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Если совсем просто, то после установки можно запустить команду 32-битного приложения:
Код:
Blwe\OmlSh ex OmtestHelloWorld
Команда осуществляет компиляцию Omtest/Mod/HelloWorld.mod и выполнение Omtest/Clwe/HelloWorld.ocf как динамически загруженного модуля оболочкой OmlSh.exe.

Либо можно запустить команду 64-битного приложения:
Код:
Blwr\OmlSh ex OmtestHelloWorld
Команда осуществляет компиляцию Omtest/Mod/HelloWorld.mod и выполнение Omtest/Clwr/HelloWorld.ocf как динамически загруженного модуля оболочкой OmlSh.exe.

Автор:  Дмитрий Дагаев [ Суббота, 17 Август, 2019 19:40 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Если интересует, как сделан интерфейс к LLVM, то используется LLVM-C: C interface to LLVM. В коде это реализовано в модуле LlvmC, сгенеренного по хедерам LLVM версии 5.0.

Автор:  Дмитрий Дагаев [ Воскресенье, 18 Август, 2019 14:26 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

SovietPony писал(а):
Как у LLVM с поддержкой мета-информации?

Мета-информация та же самая, что и у остальных, одинаковы структуры (Kernel.Module, Kernel.Type и проч) и реализация близка к CPFront. Например, для модуля HostTimes заполнение поля Kernel.Module в случае Omf, файл HostTimes.c, будет таким
Код:
struct SYSTEM_MODDESC HostTimes__desc = {
   0, 13, 0, /* next, opts, refcnt */
   {2019, 5, 28, 8, 42, 20}, /* compTime */
   {0, 0, 0, 0, 0, 0}, /* loadTime */
   HostTimes__body,
   0,
   2, /* nofimps */
   0, /* nofptrs */
   0, 0, 0, 0, 0, 0, 0, 0, /* csize..varBase */
   HostTimes__names,
   HostTimes__ptrs,
   HostTimes__imp,
   (SYSTEM_DIRECTORY*)HostTimes__exp,
   "HostTimes"
};

а заполнение поля в случае Oml, файл HostTimes.ll, будем аналогичным
Код:
@HostTimes__desc = global %SYSTEM_MODDESC { %SYSTEM_MODDESC* null, i32 3, i32 0, [6 x i16] [i16 2019, i16 5, i16 30, i16 13, i16 19, i16 31], [6 x i16] zeroinitializer, void ()* @HostTimes__body, void ()* null, i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, [189 x i8]* @HostTimes__names, [1 x i32]* @HostTimes__ptrs, [3 x %SYSTEM_MODDESC*]* @HostTimes__imp, %SYSTEM_DIRECTORY* @HostTimes__exp, [256 x i8] c"HostTimes\00" }

Таким образом, получив указатель на Kernel.Module, мы будем иметь одинаковые структуры (с точностью до размерности указателя) с одинаковыми данными для всех 3 бэкендов.

Автор:  Дмитрий Дагаев [ Воскресенье, 18 Август, 2019 17:37 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Comdiv писал(а):
Интересно посмотреть на результат выполнения Div(-2147483647 - 1, -2) в МультиОбероне при использовании LLVM с разными настройками
Код:

Проверками работы оптимизации в LLVM для МультиОберона я не занимался пока еще. В принципе, кому интересно, может попробовать скомпилировать в '.ll', а потом запустить llc с опциями (например, -O=1, -O=2, -O=3) для получения объектника. Более поздняя версия llc описана здесь.

Автор:  Comdiv [ Воскресенье, 18 Август, 2019 19:53 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

До сборки с оптимизацией я не дошёл, но и без этого интересно
Код:
MODULE OmtestDiv;

  IMPORT Out := OLog;

  PROCEDURE Div(a, b: INTEGER): INTEGER;
  BEGIN
  RETURN
    (-a) DIV (-b)
  END Div;

  PROCEDURE Go;
  BEGIN
    Out.Int(Div(-2147483647 - 1, -2)); Out.Ln
  END Go;

BEGIN
  Go
END OmtestDiv.
Код:
$ wine Bbwe/OmbSh.exe execute OmtestDiv
 -1073741824

$ wine Blwe/OmlSh.exe execute OmtestDiv
 one error detected
*Div.mod:0 "    Out.Int(Div(-2147483647 - 1$, -2)); Out.Ln" - number too large, err= 203

Меняем Go
Код:
  PROCEDURE Go;
  VAR i: INTEGER;
  BEGIN
    i := -2147483647;
    Out.Int(Div(i - 1, -2)); Out.Ln
  END Go;
Код:
$ wine Blwe/OmlSh.exe execute OmtestDiv
 -536870912

Автор:  Comdiv [ Воскресенье, 18 Август, 2019 19:55 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

А вообще, планируется ли сделать все арифметические переполнения ошибками времени исполнения и компиляции?

Автор:  Дмитрий Дагаев [ Воскресенье, 18 Август, 2019 20:25 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Хороший вопрос ... Не уложилось пока, что с этим делать. Но Ваши примеры красноречивы.

Автор:  Дмитрий Дагаев [ Вторник, 19 Ноябрь, 2019 15:20 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Во время сборки и/или установки LLVMT.so на Linux сталкивался с проблемами старых glibc-ов. То, что меньше 2.15 (посмотреть ldd --version) вызывало проблемы. Сначала формат ABI поменялся (ELF file OS ABI invalid). Поменял формат с помощью brandelf - пошло требовать GLIBX_2.15 и прочая, и прочая. А также пришлось пакет tinfo доставлять и для 64, и для 32-битной поддержки.

Автор:  Comdiv [ Пятница, 27 Декабрь, 2019 20:13 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Про долгую загрузки bitcode - https://youtu.be/EQjS-6DtPls?t=1673
Если по каким-либо причинам всё же хочется использовать JIT вместо AOT, то можно попробовать Sulong из Graalvm. Не знаю, как в сравнении с MCJIT, но граалевский lli запускает в 100 раз быстрей, чем lli от llvm

Автор:  Дмитрий Дагаев [ Пятница, 27 Декабрь, 2019 21:03 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Цитата:
Sulong is a high-performance LLVM bitcode interpreter built on the GraalVM by Oracle Labs.

Sulong is written in Java and uses the Truffle language implementation framework and Graal as a dynamic compiler.

With Sulong you can execute C/C++, Fortran, and other programming languages that can be transformed to LLVM bitcode on GraalVM. To execute a program, you have to compile the program to LLVM bitcode by a LLVM front end such as clang.

Цитата:
Sulong is the romanization of the Chinese term "速龙" (Velocisaurus). The first character translates as fast, rapid or quick, while the second character means dragon. A literal translation of the name giving Chinese term is thus "fast dragon". The name relates to the LLVM logo which is a dragon (more specifically a wyvern), and is also in line with the LLVM Dragonegg project.

Comdiv писал(а):
граалевский lli запускает в 100 раз быстрей, чем lli от llvm

Действительно в 100 раз? Есть какие-то бенчмарки?

Автор:  Comdiv [ Пятница, 27 Декабрь, 2019 22:02 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

На бенчмарк это не тянет. Я просто собрал транслятор Восток в единый файл с биткодом размером ~1.5 Мб, и пробовал его запускать разными способами.
В режиме по умолчанию(-O2) LLVM lli запускал транслятор 20 секунд, с флагом -O0 - 8 сек, в режиме интерпретатора я не смог его запустить из-за ошибок поиска функций стандартной библиотеки Си. Через Sulong lli транслятор запустился за 0.08 сек, с флагом --jvm - за 0.8 сек.
Странность заключается в том, что сбор транслятора с помощью clang из Си занимает 3.5 секунды. Это заставило меня всё перепроверить - выяснилось, что в дело вмешалась устаревшая версия lii-5.0, собранная в отладочном режиме. Боевой lli-6.0 запустил программу за 1.8 сек. в режиме по умолчанию, и за 0.8 сек с опцией -O0, в режиме интерпретатора(--force-interpreter) - за 0.08 сек.
Итого, в режиме JIT разрыв всего лишь 10 кратный. Время работы самой прогаммы пока не удалось нормально замерить

Автор:  Comdiv [ Вторник, 31 Декабрь, 2019 14:59 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Дошли руки потестировать выполнение объёмного кода. С производительностью у Sulong из GraalVM Community Edition 19.3.0 всё плохо.
То, что заранее собранный через clang исполнимый файл делает за 0.1 сек, то Sulong lli делает за 13 сек, загружая при этом 2-а ядра. LLVM lli с опцией -force-interpreter делает то же самое за 39 сек., но загружая 1-о ядро. Это касается выполнения оптимизированного биткода.

Автор:  Comdiv [ Понедельник, 29 Июнь, 2020 17:45 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Код:
# Подготовка выполнения, что не отображена в документации
unzip Blue.zip && chmod +x Blue/omlsh

# используем sh напрямую, так как у помещённых в репозиторий сценариев не выставлен бит исполнимости
sh lue_tomake.sh
oml:compiling ./Omtest/Mod/HelloWorld.mod
  new symbol file >./Omtest/Clue/OmtestHelloWorld .ll=9562 .bc=3412
oml:compiling ./Omtest/Mod/Formats.mod
  new symbol file >./Omtest/Clue/OmtestFormats .ll=17076 .bc=5552
oml:compiling ./Omtest/Mod/DateTime.mod
  new symbol file >./Omtest/Clue/OmtestDateTime .ll=28524 .bc=7884
oml:compiling ./Omtest/Mod/MkTraps.mod   3 errors detected
*MkTraps.mod:0 "      IF ~Runner.StringOpt$("-trap", str) THEN" - undeclared identifier, err= 0
*MkTraps.mod:0 "      IF ~Runner.StringOpt("-trap", str$) THEN" - called object is not a procedure, err= 121
*MkTraps.mod:0 "         OLog.String("usage: "); OLog.SString(Runner.argV0$); " - undeclared identifier, err= 0

Автор:  Дмитрий Дагаев [ Понедельник, 29 Июнь, 2020 18:53 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

После разархивирования надо запускать скрипт инсталляции, который делает chmod и все прочее.
в QuickStart написано:
Цитата:
On Linux (this color – for Linux):
glibc 2.15 or STT_GNU_IFUNC support is needed, tinfo package required
Download and install https://blackbox.obertone.ru/download
tclsh lin_toinstall.tcl 17 <path-to-blackbox>

Например, я инсталлирую в /home/ddag/mobdev/Mob. А BlackBox уже установлен в /home/ddag/mobdev/bb. Мне нужно сделать:
Код:
unzip Mob.zip
cd Mob
tclsh lin_toinstall.tcl 17 /home/ddag/mobdev/bb

После этого должны установиться все chmod, правильные версии Runner, Kernel и т.д.

Автор:  Comdiv [ Понедельник, 29 Июнь, 2020 22:25 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Что означает путь к BlackBox в случае GNU/Linux? Вторичный каталог для пользовательских файлов?
Создав пустой каталог Mob-BlackBox, получаю такое
Код:
tclsh lin_toinstall.tcl 17 ../Mob-BlackBox
installing bb1.7 for linux
unzip -u Blue.zip ...  done
unzip -u Blur.zip ...  done
unzip -u Blue_llc.zip ...  done
unzip -u Blur_llc.zip ...  done
cp: не удалось выполнить stat для '../Mob-BlackBox/System/Clue/Kernel.ll': Нет такого файла или каталога
    while executing
"exec cp $blackBoxPath/System/Clue/Kernel.ll System/Clue/"
    (file "lin_toinstall.tcl" line 130)

Есть ли какая причина для того, чтобы не размещать файлы сразу с установленным атрибутом исполнимости?

Автор:  Дмитрий Дагаев [ Вторник, 30 Июнь, 2020 09:07 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Comdiv писал(а):
Что означает путь к BlackBox в случае GNU/Linux? Вторичный каталог для пользовательских файлов?
Создав пустой каталог Mob-BlackBox, получаю такое

Необходимым условием установки является предустановленный BlackBox.
Цитата:

От него используется Kernel, Files, и т.д.

Насчет того, чтобы сделать в будущем возможность установки без предустановки BlackBox можно подумать (это разумно) ...

Автор:  Comdiv [ Вторник, 30 Июнь, 2020 22:37 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Дмитрий Дагаев писал(а):
Необходимым условием установки является предустановленный BlackBox.
Цитата:

От него используется Kernel, Files, и т.д.
Вот меня и интересует, что означает предустановленный BlackBox в случае с GNU/Linux. Deb - пакет копирует файлы по предопределённому пути. Его и надо указывать?

Кажется, понял. Нужно использовать архив, а не репозиторий. Тогда это тоже нужно указать в описании. Но лучше для распространения в GNU/Linux сделать deb-пакет. Там можно прописать и завимость от установленного BlackBox

Автор:  Дмитрий Дагаев [ Среда, 01 Июль, 2020 08:56 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Comdiv писал(а):
Дмитрий Дагаев писал(а):
Необходимым условием установки является предустановленный BlackBox.
Цитата:

От него используется Kernel, Files, и т.д.
Вот меня и интересует, что означает предустановленный BlackBox в случае с GNU/Linux. Deb - пакет копирует файлы по предопределённому пути. Его и надо указывать?

Кажется, понял. Нужно использовать архив, а не репозиторий. Тогда это тоже нужно указать в описании. Но лучше для распространения в GNU/Linux сделать deb-пакет. Там можно прописать и завимость от установленного BlackBox

Нужно указать путь, где искать System и прочие подсистемы. Насчёт пакета - есть плюсы и минусы. Из минусов - необходимость каких-то прав для инсталляции. Инсталлятор в данной пре-версии пока временный, утрясаются окончательные варианты.

Автор:  Иван Денисов [ Пятница, 03 Июль, 2020 17:40 ]
Заголовок сообщения:  Re: Oml - МультиОберон для LLVM

Дмитрий Викторович, спасибо за ваш труд!

Важный момент! С сегодняшнего дня завершена регистрация домена obertone.ru.

Везде указывайте в документации, где это необходимо, домен: https://blackbox.oberon.org/download

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/