OberonCore
https://forum.oberoncore.ru/

Открытая консольная версия от Oberon Microsystems
https://forum.oberoncore.ru/viewtopic.php?f=133&t=1159
Страница 2 из 3

Автор:  Kubanych [ Среда, 25 Январь, 2012 04:33 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

попробовал пока простейший способ

добавил
Код:
MODULE LinLibc ["libc.so.6"];
   PROCEDURE [ccall] getchar* (): INTEGER;
   PROCEDURE [ccall] mbtowc* (OUT wc: wchar_t; s: PtrSTR;size: size_t): INTEGER;

MODULE TestinSample001;

   IMPORT Log, LinSimpleLog, LinLibc;
   
   PROCEDURE Init*;
   VAR res,i,j:INTEGER;
         ss: ARRAY 2 OF SHORTCHAR;
   BEGIN
      LinSimpleLog.Open;
      
      Log.String("Проверка ввода"); Log.Ln;

      i:=LinLibc.getchar();

      Log.String("введено"); Log.Ln;
      
      ss[0]:=SHORT(CHR(i));
      ss[1]:=0X;      
      res := LinLibc.mbtowc(j,ss, 1);

      Log.Char(CHR(j)); Log.Ln;
   END Init;

END TestinSample001.

DevElfLinker.LinkDll libBB.so := Kernel+ Kernel_so_init# Log Math Strings LinSimpleLog
TestinSample001#


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

Автор:  Евгений Темиргалеев [ Среда, 25 Январь, 2012 12:41 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

mb = multibyte
Нужно читать и передавать цепочку SHORTCHAR, а не один.

Посмотрите (вроде попроще в использовании): http://www.gnu.org/software/libc/manual ... Conversion
Или: http://www.gnu.org/software/libc/manual ... conversion

Автор:  Kubanych [ Среда, 01 Февраль, 2012 04:45 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Вот, пока колхозный вариант.
Работает с английскими и русскими буквами.

Вложения:
Sample004.odc [2.11 КБ]
Скачиваний: 940
KolkhozIn.odc [4.99 КБ]
Скачиваний: 935
Libc.odc [23.38 КБ]
Скачиваний: 927

Автор:  Alexander Shiryaev [ Вторник, 04 Сентябрь, 2012 02:10 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Сегодня запустил консольную версию под OpenBSD :wink:

  • Взял DevElfLinker16 из OpenBUGS, подсистему Lin (LinDl, LinLibc, LinKernel, LinHostFiles)
  • Переписал LinDl, LinLibc с учётом OpenBSD.
  • Исправил LinKernel.TrapHandler с учётом sigcontext в OpenBSD.
  • Исправил LinKernel.Time, т. к. в OpenBSD CLOCKS_PER_SEC = 100
  • Добавил вызов mprotect(mod.code, mod.csize, PROT_READ + PROT_WRITE + PROT_EXEC) перед вызовом body() в LinKernel.InitModule, т. к. в OpenBSD по умолчанию память не исполняемая.

В итоге заработала и динамическая загрузка модулей.

Ещё взял подсистему Lindev из OpenBUGS и на основе её и DevElfLinker16 сделал консольную версию компилятора.

Кстати выполнять SetKernelBaseStack почему-то не нужно, т.е. если делать, программа не завершается, а если не делать, то всё нормально. Попробую ещё потестировать сборщик мусора.

Связываю библиотеку .so с исполнямым файлом на этапе сборки (-lBB), а не чрез dlopen.

Автор:  Info21 [ Вторник, 04 Сентябрь, 2012 07:41 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Alexander Shiryaev писал(а):
Сегодня запустил консольную версию под OpenBSD :wink:
Здорово.

Автор:  Роман М. [ Вторник, 04 Сентябрь, 2012 09:12 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Александр, любопытно взглянуть на исходные коды. Я смог бы тогда адаптировать их для моей консольной реализации.

Отсутствие необходимости использования SetKernelBaseStack может объясняться статической сборкой исполняемого файла. Полагаю, для пускача использовался Си.

А какие параметры принимает на входе этот компилятор и что является выходом?

Автор:  Alexander Shiryaev [ Вторник, 04 Сентябрь, 2012 13:59 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Роман М. писал(а):
А какие параметры принимает на входе этот компилятор и что является выходом?

Реализовал в виде интерпретатора команд, без командной строки. Так удобно.
Пример скрипта:
Код:
#!/bin/sh

./run-dev <<DATA
compile Lin/Mod Obsd.Dl.txt
compile Lin/Mod Obsd.Libc.txt
compile Lin/Mod Obsd.KQueue.txt
compile Lin/Mod Obsd.linKernel.txt
compile System/Mod Files.txt
compile System/Mod Math.txt
compile System/Mod Strings.txt
compile Lin/Mod linHostFiles.txt
compile System/Mod Meta.txt
compile Std/Mod Loader.txt
compile System/Mod Console.txt
compile Lin/Mod Console.txt
compile Lin/Mod Kernel_so_init.txt
DATA

./run-dev <<DATA
compile Lindev/Mod CPM.txt
compile Lindev/Mod CPT.txt
compile Lindev/Mod CPS.txt
compile Lindev/Mod CPH.txt
compile Lindev/Mod CPB.txt
compile Lindev/Mod CPP.txt
compile Lindev/Mod CPE.txt
compile Lindev/Mod CPL486.txt
compile Lindev/Mod CPC486.txt
compile Lindev/Mod CPV486.txt
compile  LindevElfLinker16.txt
compile  LindevCompiler.odc
compile  Lindev.odc
DATA

./run-dev <<DATA
link libBBLindev.so := Kernel+ Kernel_so_init# Console Math Strings LinConsole Files HostFiles LindevCPM LindevCPT LindevCPS LindevCPH LindevCPB LindevCPP LindevCPE LindevCPL486 LindevCPC486 LindevCPV486 LindevCompiler LindevElfLinker Lindev#
DATA


Исходники выложу позже.

Автор:  Евгений Темиргалеев [ Вторник, 04 Сентябрь, 2012 21:44 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Alexander Shiryaev писал(а):
Кстати выполнять SetKernelBaseStack почему-то не нужно, т.е. если делать, программа не завершается, а если не делать, то всё нормально. Попробую ещё потестировать сборщик мусора.

Связываю библиотеку .so с исполнямым файлом на этапе сборки (-lBB), а не чрез dlopen.
Поэтому и не нужно.

Автор:  Евгений Темиргалеев [ Вторник, 04 Сентябрь, 2012 21:46 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Alexander Shiryaev писал(а):
Реализовал в виде интерпретатора команд, без командной строки.
Похоже, почти идеальный вариант. :) Ещё бы избавиться от самопального интерпретатора в пользу Dialog.Call...

Автор:  Alexander Shiryaev [ Среда, 05 Сентябрь, 2012 01:42 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Евгений Темиргалеев писал(а):
Alexander Shiryaev писал(а):
Реализовал в виде интерпретатора команд, без командной строки.
Похоже, почти идеальный вариант. :) Ещё бы избавиться от самопального интерпретатора в пользу Dialog.Call...

Хорошо. Сделал так:

Код:
MODULE Interp;

   (* (Std)Interpreter on (Lin)Console *)

   IMPORT Console, LinConsole (* required *), Strings, Dialog, StdInterpreter (* required (Dialog.SetCallHook) *);

   PROCEDURE WriteInt (x: INTEGER);
      VAR s: ARRAY 16 OF CHAR;
   BEGIN
      Strings.IntToString(x, s);
      Console.WriteStr(s)
   END WriteInt;

   PROCEDURE Call (VAR s: ARRAY OF CHAR): BOOLEAN;
      VAR i: INTEGER;
         res: BOOLEAN;
   BEGIN
      i := 0;
      WHILE (i < LEN(s)) & (s[i] # 0AX) & (s[i] # 0DX) & (s[i] # 0X) DO
         INC(i)
      END;
      IF (i < LEN(s)) & (s[i] # 0X) THEN
         IF (i > 0) & (s[0] # '#') THEN
            s[i] := 0X;
            Dialog.Call(s, "", i);
            IF i = 0 THEN
               res := TRUE
            ELSE
               WriteInt(i); Console.WriteLn;
               res := FALSE (* stop on Dialog.Call error *)
            END
         ELSE (* skip empty strings and comments *)
            res := TRUE
         END
      ELSE (* end of input *)
         res := FALSE
      END;
   RETURN res
   END Call;

   PROCEDURE Init*;
      VAR s: ARRAY 1024 OF CHAR;
   BEGIN
      Console.ReadLn(s);
      WHILE Call(s) DO
         Console.ReadLn(s)
      END
   END Init;

END Interp.


Код:
#!/bin/sh

./run-interp <<DATA
LindevCompiler.Compile('Lin/Mod', 'Obsd.Dl.txt')
LindevCompiler.Compile('Lin/Mod', 'Obsd.Libc.txt')
LindevCompiler.Compile('Lin/Mod', 'Obsd.KQueue.txt')
LindevCompiler.Compile('Lin/Mod', 'Obsd.linKernel.txt')
LindevCompiler.Compile('System/Mod', 'Files.txt')
LindevCompiler.Compile('System/Mod', 'Dialog.txt')
...
DATA


Наибольшая длина строки -- 256 (LEN(Dialog.String) = 256).

Автор:  Alexander Shiryaev [ Среда, 05 Сентябрь, 2012 16:27 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

https://github.com/aixp/BlackBox

Копилятор OpenBUGS Lindev старее, чем BlackBox 1.6-rc6.

Использование Lindev -- временное решение, надо сделать так, чтобы заработал оригинальный компилятор Dev.

Автор:  Евгений Темиргалеев [ Среда, 05 Сентябрь, 2012 17:28 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Alexander Shiryaev писал(а):
Использование Lindev -- временное решение, надо сделать так, чтобы заработал оригинальный компилятор Dev.
На мой взгляд, это как раз идеальное. :)

Если ещё вызов команд из каждой строки делать на подобие DevCommanders (выставлять DevCommanders.par, например на кусок текста от конца команды до перевода строки), то будет
Код:
DevCompiler.CompileThis ....
DevElfLinker.LinkDll ...
Поглядите ert0devCmdSeq...

Автор:  Роман М. [ Среда, 05 Сентябрь, 2012 17:48 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Alexander Shiryaev писал(а):
надо сделать так, чтобы заработал оригинальный компилятор Dev.
Для этого понадобится присоединить базовую часть каркаса ББ, включающую Text, а это весьма трудоёмко. Поэтому проще отделаться вызовом функций Console, как сейчас.
Компилятор ББ тесно связан со графической средой разработки: вывод на экран сообщений об ошибках, маркировка ошибок, трапы. На консоли это не сделаешь.

Автор:  Alexander Shiryaev [ Среда, 05 Сентябрь, 2012 18:17 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Может быть можно просто заменить модули TextModels, TextMappers, DevMarkers (их требует только DevCPM).

Автор:  Alexander Shiryaev [ Среда, 05 Сентябрь, 2012 20:07 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Обновил Lindev в соответствии с BlackBox 1.6-rc6

Автор:  Роман М. [ Среда, 05 Сентябрь, 2012 21:58 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Alexander Shiryaev писал(а):
Может быть можно просто заменить модули TextModels, TextMappers, DevMarkers (их требует только DevCPM).
Заменить чем?
Весь смысл использования каркаса ББ состоит в интеракции с пользователем через графический интерфейс. То что предлагает консоль, изначально является ущербной заменой возможностям, предоставляемых каркасом, как ни крути.
Имеет смысл переносить на разные платформы не компилятор ББ, а среду исполнения программ.
Компилятор же является вполне придаточным звеном. Он по определению заработает как только среда исполнения и каркас будут перенесены на новую ОС. Для компиляции для другой платформы (не x86-32) потребуется не только адаптация связки Kernel+Files+HostFiles, но и вмешательство в кодогенератор компилятора и компоновщик ББ, а это уже другая история.

Этими словами я признаю то, что мой выбор в пользу консольного компилятора (вернее, консольной оболочки для) ББ был поспешным. На то время мне слишком хотелось получить "привычный" компилятор.

Автор:  Alexander Shiryaev [ Среда, 05 Сентябрь, 2012 22:40 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Роман М. писал(а):
Имеет смысл переносить на разные платформы не компилятор ББ, а среду исполнения программ.

Да, а компилятор является её подмножеством. Но это не значит, что для работы компилятора должен быть необходим графический пользовательский интерфейс. Т.е. он может быть, а может его и не быть.

Для консольного компилятора можно реализовать подсистему Text (точнее, её подмножество) таким образом, чтобы она работала без графического пользовательского интерфейса, при этом ничего не меняя в реализации самого компилятора. Эта реализация должна использоваться только для сборки консольного компилятора и не должна заменять текущую реализацию Text, предназначенную для работы с графическим пользовательским интерфейсом.

Автор:  Alexander Shiryaev [ Среда, 05 Сентябрь, 2012 23:42 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Хотя может и не делать ничего, а оставить так, как есть (Lindev), т.к. процесс перевода Dev -> Lindev тривиальный.

Командную строку для компилятора делать не буду хотя бы по той причине, что многократный запуск программы работает медлнее, чем однократный. А удобства пользования компилятором командная строка не добавляет. Всё равно же сборка должна быть автоматизированной, скрипт сборки должен быть, не вручную же компилировать.

Автор:  Alexander Shiryaev [ Суббота, 08 Сентябрь, 2012 02:01 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

В общем сделал так, чтобы подсистема Dev заработала без графического пользовательского интерфейса, при этом ничего в ней не меняя. Потребовалось, чтобы заработала подсистема Texts. В ней тоже ничего не менял, а для того, чтобы она заработала, пришлось реализовать HostFonts, HostDialog и HostWindows. Для работы Dev ещё потребовалось реализовать HostDates и заменить реализацию StdLog.

Скоро подсистемы Lindev не будет, останутся только консольные интерфейсы к компилятору Dev и к DevElfLinker16. Только для работы оригинального DevElfLinker16 ещё надо будет дореализовать неоригинальный StdLog.

Сообщения компилятора об ошибках будут выводиться на консоль так:
Код:
        PROCEDURE LogMarks (r: TextModels.Reader);
                VAR v: Views.View;
        BEGIN
                r.SetPos(0);
                r.ReadView(v);
                WHILE ~r.eot DO
                        WITH v: DevMarkers.View DO
                                v.SetMode(DevMarkers.message);
                                LogStr("  pos = "); LogInt(r.Pos()); LogStr(', error = "'); LogStr(v.msg); LogStr('"'); LogLn;
                        ELSE
                        END;
                        r.ReadView(v)
                END
        END LogMarks;

Код:
        IF error THEN
                DevCPM.InsertMarks(source.Base());
                LogMarks(source)
        END

Автор:  Alexander Shiryaev [ Суббота, 08 Сентябрь, 2012 19:59 ]
Заголовок сообщения:  Re: Открытая консольная версия от Oberon Microsystems

Добился работоспособности DevCompiler и DevElfLinker из консоли, без Lindev:

Код:
#!/bin/sh

./run-BlackBox <<DATA
DevCompiler.CompileThis ObxHello0 ObxPi
ObxHello0.Do
ObxPi.WritePi(1000)

DevElfLinker.LinkDll libBB.so := Kernel+ Files HostFiles StdLoader
DATA


Код:
compiling
compiling "ObxHello0"   32   0
compiling "ObxPi"   444   0
ok
Hello World
31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989
compiling Obx/Mod Hello0.odc
   32   0
compiling Obx/Mod Pi.odc
   444   0
linking
$libc.so.66.0  libc.so.66.0
$libc.so.66.0  libc.so.66.0
Ok


Ещё написал интерфейс компилятора ConsCompiler, назначение которого -- вывод на экран ошибок DevMarkers и компиляция текстовых файлов без применения Converters import .txt (т.к. HostTexts не реализован).

Почему-то в Windows он работает, компилирует текстовые файлы, а в OpenBSD -- нет, пока не могу понять почему. Хотя LindevCompiler работает, и делает почти то же самое.
odc-файлы ConsCompiler компилирует нормально.

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