OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2024 04:40

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Что нужно вылизать в Блэкбоксе
СообщениеДобавлено: Суббота, 06 Февраль, 2010 13:44 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Александр Ильин писал(а):
нашёл три копии кода выгрузки модуля в пределах одной подсистемы BlackBox/Dev.
Спасибо, это ценно.

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

Развитие, в идеале, должно идти, так сказать, по схеме комбинаторного умотипа,
а упираешься в то, что выходит хреново, и поэтому хорошо бы сначала вернуться на шаг назад и разобраться с основами.
1) Та же выгрузка.
2) Или можно добавить и Stores с отсутствующим на данный момент механизмом рассылки сообщений по объединенным Сторам -- хотя их объединенность работает при вводе-выводе.

В общем, тут бы ветку новую завесть, что ли: "Что нужно вылизать в Блэкбоксе".
Начиная с предыдущего сообщения, которое Александра Сергеевича (может, и что-то другое).


Последний раз редактировалось Info21 Воскресенье, 07 Февраль, 2010 07:19, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заметки о .NET (черный пиар)
СообщениеДобавлено: Суббота, 06 Февраль, 2010 15:12 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
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*;
      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;
(В список импорта DevCompiler надо добавить DevDebug.)

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, но это, кажется, перебор (хотя, последнее решение подкупает эргономической очевидностью).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заметки о .NET (черный пиар)
СообщениеДобавлено: Суббота, 06 Февраль, 2010 15:22 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Решение с DevUnload мне кажется всё более привлекательным. Модуль легко добавить в подсистему, не трогая официальные. Он может работать независимо от того, поправлены ли официальные модули или нет. Никаких рантайм-инициализаций, все зависимости видны на этапе компиляции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заметки о .NET (черный пиар)
СообщениеДобавлено: Суббота, 06 Февраль, 2010 16:51 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Александр Ильин писал(а):
Решение с DevUnload мне кажется всё более привлекательным.
Идею выделения поддерживаю.

И более того.
По логике это, кажись, фундаментальная операция времени выполнения (как и загрузка модуля).
А Dev -- это всего лишь разработка (про которую что-то говорилось в аспекте нераспространения, т.е. она может и отсутствовать).

Вот туда и надо законопатить, где у нас фундаментальные операции.
Т.е., видимо, не DevUnload, а простое Load (мы же и загрузку туда запулить хотим).

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заметки о .NET (черный пиар)
СообщениеДобавлено: Суббота, 06 Февраль, 2010 18:15 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
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.


Последний раз редактировалось Александр Ильин Суббота, 06 Февраль, 2010 21:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заметки о .NET (черный пиар)
СообщениеДобавлено: Суббота, 06 Февраль, 2010 19:29 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Александр Ильин писал(а):
операция выгрузки реализована в Kernel: Kernel.UnloadMod.
Понял, спасибо за напоминание.

Александр Ильин писал(а):
(я дополнял подсистему i21edu возможностью сделать CompileAndReload для русскоязычных модулей)
И как? Изячно вышло? Для любых языков?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что нужно вылизать в Блэкбоксе
СообщениеДобавлено: Воскресенье, 07 Февраль, 2010 05:02 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Поскольку в очередной раз всплыла тема консольного компилятора, то:
1. Отучить модули компилятора от StdLog
2. Научить DevLinker формировать exe по указанному пути
3. Научить компилятор выводить сообщения об ошибках в консоль (это - по желанию. Для олимпиадного варианта не обязательно)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что нужно вылизать в Блэкбоксе
СообщениеДобавлено: Воскресенье, 07 Февраль, 2010 11:31 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Иван Горячев писал(а):
Поскольку в очередной раз всплыла тема консольного компилятора, то:
1. Отучить модули компилятора от StdLog
2. Научить DevLinker формировать exe по указанному пути
3. Научить компилятор выводить сообщения об ошибках в консоль (это - по желанию. Для олимпиадного варианта не обязательно)

1. В подсистеме CDev это сделано. Вывод - во "фронт-энде".
2. Осталось.
3. В подсистеме CDev это сделано.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB