Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Базарная площадь
  
О разделе

Основная страница

Группы обсуждений


Тематический каталог обсуждений

Архив

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  09:51[Войти] | [Зарегистрироваться]
Обсуждение темы:
Component Pascal и среда разработки BlackBox

Здравствуйте!
Начал изучать новый язык программирования Component Pascal
http://www.oberon.ch/
http://www.inr.ac.ru/~info21/
http://www.uni-vologda.ac.ru/oberon/
Но нигде не нашел рускоязычного сайта, на котором был бы форум посвященный этому языку.
Наверняка среди посетителей этого сайта есть специалисты по языку Component Pascal и среде BlackBox.
А посему, перейду сразу к делу. У меня есть вопрос про сборщик мусора в BlackBox. Может быть кто-нибудь сможет объяснить что нужно сделать чтобы он заработал?
Я имею в виду следующую простейшую тестовую програмку:

MODULE  sgTest003;
IMPORT  StdLog;

PROCEDURE   Проверка*;
  TYPE A = POINTER TO ARRAY 10000000 OF INTEGER;
  VAR a: A;
BEGIN
  StdLog.String(" Создаю "); StdLog.Ln();
  NEW(a);    (* В этом месте я вижу через Windows Task Manager  как BlackBox забрал
память*)
  StdLog.String(" Выхожу из области видимости "); StdLog.Ln();
  a := NIL; (* Я думаю, что сборщик мусора должен активизироваться в этом месте *)
END Do;
(* В этом месте я ожидаю, что BlackBox отдаст память обратно в распоряжение Windows
XP*)

BEGIN
END  sgTest003.
Вызываю процедуру Проверка посредством кликания мышью на
(Коммандер)sgTest003.Проверка
и наблюдаю через Task Manager за памятью. BlackBox ее только забирает и назад не отдает.
Даже если я выгружу модуль Dev ---> Unload, все равно BlackBox не вернет память обратно в распоряжение Windows XP. Память возвращается только когда я выключаю сам BlackBox 1.4 Shareware Edition.
Кто-нибудь понимает в чем дело?

С уважением,

 Сергей Губанов

Количество сообщений на странице

Порядок сортировки сообщений
Новое сообщение вверху списка (сетевая хронология)
Первое сообщение вверху списка (обычная хронология)

Перейти на конкретную страницу по номеру


Всего в теме 117 сообщений

Добавить свое сообщение

Отслеживать это обсуждение

Обсуждение из раздела
Школа ОБЕРОНА

<<<... | 47—38 | 37—28 | 27—18 | ...>>>
Всего сообщений в теме: 117; страниц: 12; текущая страница: 9


№ 37   07-06-2006 03:14 Ответить на это сообщение Ответить на это сообщение с цитированием
Мне кажется, Оберон скорее характеризуется "раздельной загрузкой" (по аналогии с раздельной компиляцией :) ), чем динамической выгрузкой модулей.
Мне (пока) неизвестны гарантии того, что модуль можно выгрузить без ошибок.
Поэтому я не стал бы уподоблять выгрузку обероновского модуля завершению работы приложения в обычной ОС.
Приложение существует в отдельном адресном пространстве, поэтому его и можно выгрузить без особых проблем.
Про выгрузку обероновского модуля такого не скажешь.
Между прочим, какой-нибудь дополнительный механизм, наподобие сборки в .NET, мог бы решить эту проблему.
 AVC


№ 36   06-06-2006 12:30 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 31« (Андрей Хохлов)
___________________________

Ответ на »сообщение 28« (Илья Ермаков)
___________________________


Ответ - если модуль используется
(например, созданы объекты из этого модуля), ни о какой перезагрузке речи быть не может (предшестующую рекламу BB я понял так, что это возможно).
И да, и нет. Есть ограничения. Если мы используем типы данных без методов, а вызовы делаем без привязки к адресам - не через те же процедурные переменные, а символически - через имя процедуры, когда ее адрес берется "на один раз", то перезагрузка вполне возможна. Пример - если элементы управления на форме в ББ привязаны к процедурам/переменным некоторого модуля - модуль можно выгружать сколько угодно - все связи обновятся корректно. Если же мы выгружаем тот модуль, где реализованы сам тип элемента управления и его методы, то при обновлении документа будет ошибка, т.к. виртуальная таблица методов устареет. Придется переоткрывать документ. Или использовать некоторое отображение-обертку, реализация которого присутствует в памяти постоянно, а внутреннее отображение в нужный момент пересоздается. Подходов много...


№ 35   06-06-2006 12:08 Ответить на это сообщение Ответить на это сообщение с цитированием
Написал письмо королеве с просьбой открыть новую тему "Функциональное Программирование".


№ 34   06-06-2006 11:43 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 30« (Q. Werty)
___________________________

>>>А все потому что сегодня 06.06.06. :)
Просто мысли должны быть об Обероне, а не об оппонентах :)


Согласен.
Правда, мысли приходят и уходят, но контролировать высказывания можно. :)
 AVC


№ 33   06-06-2006 11:32 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 31« (Андрей Хохлов)
___________________________


Мой вопрос имел цель понять, что есть компонентная среда в смысле BB. Ответ - если модуль используется
(например, созданы объекты из этого модуля), ни о какой перезагрузке речи быть не может (предшестующую рекламу BB я понял так, что это возможно).


Как мне кажется, все еще сложнее.
Даже если модуль не импортируется другими модулями, надо еще помнить об объектной структуре.
'Завязки' могут иметь место через указатели и процедурные переменные, а не только через списки импорта.
В таких случаях выгрузка модуля может привести к программной ошибке.
 AVC


№ 32   06-06-2006 11:16 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 27« (Q. Werty)
___________________________
А если редактирование касается только стиля, например, кнопочки местами поменять или надписи на них, то о какой-либо перекомпиляции вообще можно не думать.

Дельфи позволяет это делать. Была даже программа которая симулировала внешний вид дельфи (палитра компонент, свойства, двигать компоненты по форме.)

Кроме того есть компонента, которую бросаешь на форму и потом в runtime на этой форме можно все менять, двигать, размер менять, цвета надписи итд.


№ 31   06-06-2006 11:11 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 28« (Илья Ермаков)
___________________________

Спасибо.

Мой вопрос имел цель понять, что есть компонентная среда в смысле BB. Ответ - если модуль используется
(например, созданы объекты из этого модуля), ни о какой перезагрузке речи быть не может (предшестующую рекламу BB я понял так, что это возможно).

Если речь идет о клиентском приложении, все это может и не нужно (завершаем старое/меняем то что нужно/запускаем новое), если же речь о серверном приложении, то там перезагрузка на ходу смысл имеет (например, нужно ошибку в коде реализации исправить). Насколько я понимаю, Java этого не умеет.


№ 30   06-06-2006 10:34 Ответить на это сообщение Ответить на это сообщение с цитированием
>>>А все потому что сегодня 06.06.06. :)
Просто мысли должны быть об Обероне, а не об оппонентах :)


№ 29   06-06-2006 10:28 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 26« (Андрей Хохлов)
___________________________

Итак, "мысли" бесславно завершились...

А все потому что сегодня 06.06.06. :)
 AVC


№ 28   06-06-2006 10:14 Ответить на это сообщение Ответить на это сообщение с цитированием
Ответ на »сообщение 26« (Андрей Хохлов)
___________________________
Посему хотелось бы увидеть максимально короткий пример программы из двух модулей, первый из которых используется вторым и может быть перекомпилирован и перезагружен во время работы второго (внутри BlackBox, так что вопрос по теме).
1) Если модуль статически импортируется в IMPORT, то тут ни о какой "выгрузке во время работы" не может быть и речи - напротив, ран-тайм обязан контролировать и запрещать такие выгрузки. То, что нам требуется, делается через динамическую работу с модулями через метапрограммирование (или рефлексию, как принято говорить в .NET). Тогда модуль-клиент может динамически создать некоторый модуль, откомпилировать, загрузить, разобрать его содержимое, поработать и выгрузить.
2) Для динамической работы с модулями используется модуль Meta. Для компиляции, соответственно - DevCompiler (ранее не доступный для распространения со своими приложениями, но в рамках лицензии "около-GNU" теперь все позволено).
Вот мой пример, где процедура CallProc* (IN cmd: ARRAY OF CHAR; OUT res: INTEGER) выполняет вызов любой процедуры, создавая под него динамически модуль с командой, выполняя и выгружая его. (Замечу, что для вызова процедур с заранее известным списком параметров или элементарными параметрами таких ухищрений НЕ ТРЕБУЕТСЯ, достаточно просто вызова через Meta или вообще Dialog.Call. Просто мне нужно было обеспечить выполнение абсолютно произвольной команды.) Итак, пример:


MODULE MtDev;

IMPORT TextModels, TextMappers, DevCompiler, Dialog, MtUtils, Meta;

CONST
wrongSyntax* = -1;

PROCEDURE ExtractModName (IN str: ARRAY OF CHAR; OUT mod: ARRAY OF CHAR);
VAR i: INTEGER;
BEGIN
i := 0;
WHILE (str[i] # 0X) & (str[i] # '.') DO
mod[i] := str[i];
INC(i)
END;
mod[i] := 0X
END ExtractModName;

(* Формирование исходного кода временного модуля *)
PROCEDURE MakeMod (IN name, impList, body: ARRAY OF CHAR): TextModels.Model;
VAR txt: TextModels.Model;
wr: TextMappers.Formatter;
BEGIN
txt := TextModels.dir.New();
wr.ConnectTo(txt);
wr.WriteString("MODULE " + name + ";"); wr.WriteLn; wr.WriteLn;
wr.WriteString("IMPORT " + impList + ";"); wr.WriteLn; wr.WriteLn;
wr.WriteString(body); wr.WriteLn; wr.WriteLn;
wr.WriteString("END " + name + ".");
RETURN txt
END MakeMod;

(* Вызов любой процедуры без возвращаемого значения *)
PROCEDURE CallProc* (IN cmd: ARRAY OF CHAR; OUT res: INTEGER);
VAR mod: ARRAY 256 OF CHAR;
body: ARRAY 2048 OF CHAR;
code: TextModels.Model;
error: BOOLEAN;
BEGIN
ExtractModName(cmd, mod);
body := "PROCEDURE Call* ; BEGIN " + cmd + " END Call;";
code := MakeMod("MtDevTemp", mod, body);
DevCompiler.CompileText(code, 0, error);
IF ~error THEN
Dialog.Call("MtDevTemp.Call", "", res);
MtUtils.UnloadMod("MtDevTemp")
ELSE
res := wrongSyntax
END
END CallProc;

(* Вызов процедуры, возвращающей целое *)
PROCEDURE CallIntProc* (IN cmd: ARRAY OF CHAR; OUT res: INTEGER): LONGINT;
VAR mod: ARRAY 256 OF CHAR;
body: ARRAY 2048 OF CHAR;
code: TextModels.Model;
error: BOOLEAN;
item: Meta.Item;
x: LONGINT;
BEGIN
ExtractModName(cmd, mod);
body := "VAR x*: LONGINT; " +
"PROCEDURE Call* ; BEGIN x := " + cmd + " END Call;";
code := MakeMod("MtDevTemp", mod, body);
DevCompiler.CompileText(code, 0, error);
IF ~error THEN
Dialog.Call("MtDevTemp.Call", "", res);
Meta.LookupPath("MtDevTemp.x", item);
ASSERT(item.Valid(), 100);
x := item.LongVal();
MtUtils.UnloadMod("MtDevTemp");
RETURN x
ELSE
res := wrongSyntax;
RETURN 0
END
END CallIntProc;

END MtDev.



Единственная нестандартная процедура, которая здесь используется - это MtUnload из библиотеки Mt (http://sources.metasystems.ru/mt). Просто в ББ нет высокоуровневой процедуры выгрузки модуля, и чтоб не импортировать напрямую Kernel (Kernel.UnloadMod), я написал библиотечную процедуру.

Предупреждая критику "интерпретаторщиков", что это изврат - компилировать модуль под каждое выполнение команды, скажу, что коли наш инструментарий позволяет компилировать мгновенно, то почему бы и нет? Тем паче, что любая RAD (та же Delphi) для обеспечения intelligence точно так же постоянно предкомпилирует набираемые исходники...


<<<... | 47—38 | 37—28 | 27—18 | ...>>>
Всего сообщений в теме: 117; страниц: 12; текущая страница: 9


Добавить свое сообщение

Отслеживать это обсуждение

Дополнительная навигация:
Количество сообщений на странице

Порядок сортировки сообщений
Новое сообщение вверху списка (сетевая хронология)
Первое сообщение вверху списка (обычная хронология)

Перейти на конкретную страницу по номеру
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования