OberonCore https://forum.oberoncore.ru/ |
|
Что нужно вылизать в Блэкбоксе https://forum.oberoncore.ru/viewtopic.php?f=23&t=2322 |
Страница 1 из 1 |
Автор: | Info21 [ Суббота, 06 Февраль, 2010 13:44 ] |
Заголовок сообщения: | Что нужно вылизать в Блэкбоксе |
Александр Ильин писал(а): нашёл три копии кода выгрузки модуля в пределах одной подсистемы BlackBox/Dev. Спасибо, это ценно.У меня давно впечатление о некоторой спешке при написании ББ. Недопродуманность некоторых вещей. Это, кстати, добавляет трудности при его освоении и развитии. Развитие, в идеале, должно идти, так сказать, по схеме комбинаторного умотипа, а упираешься в то, что выходит хреново, и поэтому хорошо бы сначала вернуться на шаг назад и разобраться с основами. 1) Та же выгрузка. 2) Или можно добавить и Stores с отсутствующим на данный момент механизмом рассылки сообщений по объединенным Сторам -- хотя их объединенность работает при вводе-выводе. В общем, тут бы ветку новую завесть, что ли: "Что нужно вылизать в Блэкбоксе". Начиная с предыдущего сообщения, которое Александра Сергеевича (может, и что-то другое). |
Автор: | Александр Ильин [ Суббота, 06 Февраль, 2010 15:12 ] |
Заголовок сообщения: | Re: Заметки о .NET (черный пиар) |
Info21 писал(а): Это, кстати, добавляет трудности при его освоении и развитии. В надежде на выделение ветки, продолжу в более конструктивном ключе.Модули, пользующиеся выгрузкой: DevCommanders (командер выгружает модули по Ctrl+Click), DevCompiler (CompileAndUnload) и DevDebug (процедура Unload выгружает модуль из текущего окна; кроме того, здесь же экспортированы UnloadModuleList и UnloadThis). Последние два модуля импортируют первый, что как бы намекает разместить общую процедуру в нём. Однако, логичнее всё же поместить её в DevDebug, так как там у нас концентрируется всё отладочное. Соответственно, предлагаю всего лишь опубликовать существующую процедуру DevDebug.UnloadMod в следующей редакции: Код: PROCEDURE UnloadMod* (name: ARRAY OF CHAR; VAR ok: BOOLEAN); Что изменено:VAR mod: Kernel.Module; str: Dialog.String; n: Kernel.Name; BEGIN n := SHORT(name$); mod := Kernel.ThisLoadedMod(n); IF mod # NIL THEN Dialog.ShowParamStatus("#Dev:Unloading", name, "", ""); Kernel.UnloadMod(mod); IF mod.refcnt < 0 THEN Dialog.MapParamString("#Dev:Unloaded", name, "", "", str); StdLog.String(str); StdLog.Ln; Controls.Relink ELSE Dialog.ShowParamMsg("#Dev:UnloadingFailed", name, "", ""); ok := FALSE END ELSE Dialog.ShowParamMsg("#Dev:NotFound", name, "", ""); ok := FALSE; END END UnloadMod; - добавлен маркер экспорта (*); - параметр name сделан универсальным ARRAY OF CHAR вместо TextMappers.String; - добавлен вызов Controls.Relink, присутствующий в двух других реализациях выгрузки модуля. Соответственно, DevCompiler.CompileAndUnload превращается в...: Код: PROCEDURE CompileAndUnload*; (В список импорта DevCompiler надо добавить DevDebug.)VAR t: TextModels.Model; error: BOOLEAN; BEGIN Open; t := TextViews.FocusText(); IF t # NIL THEN Do(t, StdLog.text, 0, defopt, error); IF error THEN DevMarkers.ShowFirstError(t, TextViews.focusOnly) ELSE DevDebug.UnloadMod(DevCPT.SelfName$, error) END ELSE Dialog.ShowMsg("#Dev:NoTextViewFound") END; Close END CompileAndUnload; DevCommanders не может циклически импортировать DevDebug, поэтому придётся ввести процедурную переменную (при желании - объектный разъём): Код: UnloadMod*: PROCEDURE (name: ARRAY OF CHAR; VAR ok: BOOLEAN); Инициализировать в DevDebug.BEGIN:Код: DevCommanders.UnloadMod := UnloadMod; DevCommanders.Unload принять в следующей редакции: Код: PROCEDURE Unload (cmd: Dialog.String); VAR modname: Kernel.Name; i: INTEGER; ch: CHAR; ok: BOOLEAN; BEGIN ASSERT(UnloadMod # NIL, 20); i := 0; ch := cmd[0]; WHILE (ch # 0X) & (ch # ".") DO modname[i] := SHORT(ch); INC(i); ch := cmd[i] END; modname[i] := 0X; UnloadMod(modname$, ok) END Unload; В данном решении добавляется только одна новая межмодульная зависимость: DevCompiler -> DevDebug. Если разместить общую процедуру выгрузки в модуле DevCommanders, то новых зависимостей не появится (и не нужен будет разъём), но это представляется нелогичным: кому придёт в голову её там искать? Ещё вариант - создать новый модуль DevUnload, но это, кажется, перебор (хотя, последнее решение подкупает эргономической очевидностью). |
Автор: | Александр Ильин [ Суббота, 06 Февраль, 2010 15:22 ] |
Заголовок сообщения: | Re: Заметки о .NET (черный пиар) |
Решение с DevUnload мне кажется всё более привлекательным. Модуль легко добавить в подсистему, не трогая официальные. Он может работать независимо от того, поправлены ли официальные модули или нет. Никаких рантайм-инициализаций, все зависимости видны на этапе компиляции. |
Автор: | Info21 [ Суббота, 06 Февраль, 2010 16:51 ] |
Заголовок сообщения: | Re: Заметки о .NET (черный пиар) |
Александр Ильин писал(а): Решение с DevUnload мне кажется всё более привлекательным. Идею выделения поддерживаю.И более того. По логике это, кажись, фундаментальная операция времени выполнения (как и загрузка модуля). А Dev -- это всего лишь разработка (про которую что-то говорилось в аспекте нераспространения, т.е. она может и отсутствовать). Вот туда и надо законопатить, где у нас фундаментальные операции. Т.е., видимо, не DevUnload, а простое Load (мы же и загрузку туда запулить хотим). В коды не смотрел, говорю из общих соображений, может, что упустил. |
Автор: | Александр Ильин [ Суббота, 06 Февраль, 2010 18:15 ] |
Заголовок сообщения: | Re: Заметки о .NET (черный пиар) |
Info21 писал(а): В коды не смотрел, говорю из общих соображений, может, что упустил. Для полноты картины, как смотревший в коды, скажу вот ещё что.По поводу фундаментальности замечание верное. Сама по себе фундаментальная операция выгрузки реализована в Kernel: Kernel.UnloadMod. В нашем случае речь идёт о более прикладной реализации, которая - [пункт добавлен поздней правкой] выгружает модуль не по ссылке (Kernel.Module), а по имени (ARRAY OF CHAR); - выводит в Log сообщения в случае ошибки. При этом используются текстовые ресурсы подсистемы Dev: Dialog.ShowParamStatus("#Dev:Unloading", name, "", ""); - вызывает Controls.Relink. Данная реализация, во-первых, активно используется в подсистеме Dev (в трёх местах) и только в ней, и, во-вторых, бывает нужна именно в таком виде извне (я дополнял подсистему i21edu возможностью сделать CompileAndReload для русскоязычных модулей). Всё указывает на то, что надо просто сделать одну опубликованную процедуру в пределах подсистемы Dev, которую бы все могли использовать. Понятное дело, что при особых потребностях (не нужен вывод в Log или вызов Relink) требуется собственная реализация. В этом случае её можно делать без подсистемы Dev, средствами Kernel. |
Автор: | Info21 [ Суббота, 06 Февраль, 2010 19:29 ] |
Заголовок сообщения: | Re: Заметки о .NET (черный пиар) |
Александр Ильин писал(а): операция выгрузки реализована в Kernel: Kernel.UnloadMod. Понял, спасибо за напоминание.Александр Ильин писал(а): (я дополнял подсистему i21edu возможностью сделать CompileAndReload для русскоязычных модулей) И как? Изячно вышло? Для любых языков?
|
Автор: | Иван Горячев [ Воскресенье, 07 Февраль, 2010 05:02 ] |
Заголовок сообщения: | Re: Что нужно вылизать в Блэкбоксе |
Поскольку в очередной раз всплыла тема консольного компилятора, то: 1. Отучить модули компилятора от StdLog 2. Научить DevLinker формировать exe по указанному пути 3. Научить компилятор выводить сообщения об ошибках в консоль (это - по желанию. Для олимпиадного варианта не обязательно) |
Автор: | Роман М. [ Воскресенье, 07 Февраль, 2010 11:31 ] |
Заголовок сообщения: | Re: Что нужно вылизать в Блэкбоксе |
Иван Горячев писал(а): Поскольку в очередной раз всплыла тема консольного компилятора, то: 1. Отучить модули компилятора от StdLog 2. Научить DevLinker формировать exe по указанному пути 3. Научить компилятор выводить сообщения об ошибках в консоль (это - по желанию. Для олимпиадного варианта не обязательно) 1. В подсистеме CDev это сделано. Вывод - во "фронт-энде". 2. Осталось. 3. В подсистеме CDev это сделано. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |