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 | ||||
Вот, пока колхозный вариант. Работает с английскими и русскими буквами.
|
Автор: | Alexander Shiryaev [ Вторник, 04 Сентябрь, 2012 02:10 ] |
Заголовок сообщения: | Re: Открытая консольная версия от Oberon Microsystems |
Сегодня запустил консольную версию под OpenBSD
В итоге заработала и динамическая загрузка модулей. Ещё взял подсистему Lindev из OpenBUGS и на основе её и DevElfLinker16 сделал консольную версию компилятора. Кстати выполнять SetKernelBaseStack почему-то не нужно, т.е. если делать, программа не завершается, а если не делать, то всё нормально. Попробую ещё потестировать сборщик мусора. Связываю библиотеку .so с исполнямым файлом на этапе сборки (-lBB), а не чрез dlopen. |
Автор: | Info21 [ Вторник, 04 Сентябрь, 2012 07:41 ] |
Заголовок сообщения: | Re: Открытая консольная версия от Oberon Microsystems |
Alexander Shiryaev писал(а): Сегодня запустил консольную версию под OpenBSD Здорово.
|
Автор: | Роман М. [ Вторник, 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 .... Поглядите ert0devCmdSeq...
DevElfLinker.LinkDll ... |
Автор: | Роман М. [ Среда, 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/ |