Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 02:48

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Сб июн 07, 2014 21:43 
Win-программисты наверняка помнят о достаточно неудобном свойстве объектов-ресурсов. Если удается и открытие, и работу, и закрытие ресурса запихнуть в одну транзакцию, все просто замечательно.
Но, вот, когда открытие, работа и закрытие это отдельные операции, возникает следующая неприятность: объект создается один раз, но уничтожается минимум дважды: либо по закрытии ресурса, либо по уничтожению охватывающего визуального объекта (в т.ч. приложения).
Списки объектов, подлежащих уничтожению, проблемы не решают, как и вложенные деструкторы. Всегда есть вероятность, что одно закрытие будет отличаться от другого.

А если решать проблему FORTH-овски? Ввести слово "НЕ-ЗАБЫТЬ", связанное с сигналом "закончить работу", и докомпилировать туда/откомпилировать оттуда коды действий, которые необходимо совершить в этот момент...

Развивая мысль: иметь развитый аппарат, способный откладывать действия "на потом", перекомпилируя "на лету" слова, связанные с какими-либо сигналами/состояниями...

Кто-нибудь такое видел?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Сб июн 07, 2014 23:42 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
А можно как-то абстрактнее сформулировать проблему и конкретнее--решение?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Вс июн 08, 2014 00:54 
dynamic-wind писал(а):
...

Абстрактная проблема: невозможность отслеживания состояния сложных программных процессов путем анализа переменных.
Конкретное решение: возможность сохранения алгоритма будущих действий в виде шитого кода в ходе работы программы.

Пример эмуляции этого явления в простейшей форме:
Код:
DOER ПОДГОТОВИТЬ-КОНЕЦ
: НАЧАТЬ ВЫДЕЛИТЬ IF MAKE ПОДГОТОВИТЬ_КОНЕЦ ОСВОБОДИТЬ ;AND THEN ;
: ОТКАЗАТЬСЯ ОСВОБОДИТЬ UNDO ПОДГОТОВИТЬ_КОНЕЦ ; \ если ресурс больше не нужен
: ЗАКОНЧИТЬ ПОДГОТОВИТЬ-КОНЕЦ ; \ конец сеанса


Понятно, в сложном случае, ни число конкретных отложенных действий, ни точный момент вызова (класс событий) могут быть неизвестны.

Что-то вроде:

Код:
КОГДА-БУДЕТ-НЕЧЕГО-ДЕЛАТЬ СОБЕРИ-МУСОР
...
КОГДА-БУДЕТ-НЕЧЕГО-ДЕЛАТЬ ПРОГОНИ-ТЕСТ
...
МУСОР-СОБРАН
...
\ когда будет нечего делать, пойдет тест


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Вс июн 08, 2014 11:16 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Флаг о том, что объект используется.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Вс июн 08, 2014 11:27 
VoidVolker писал(а):
Флаг о том, что объект используется.

См. выше:
gudleifr писал(а):
Абстрактная проблема: невозможность отслеживания состояния сложных программных процессов путем анализа переменных.


Почему? Потому, что
1) проверка флагов в более, чем одном месте, приводит к различным результатам работы.
2) добавление новых флагов (да еще не в одном месте) - еще та проблема.
3) управляемые флагами ресурсы могут быть взаимосвязаны.
Уж лучше деструкторы...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Вс июн 08, 2014 20:11 
P.S. Чтобы немного пояснить проблему: http://www.gudleifr.h1.ru/g9/masm32-2.txt.
Первый же пример - #13. (Хоть он и маленький, но сюда, явно, втюхивать не стоит.
Табуляции, думаю, расставить сами сможете).

Обратите внимание: оба использования функции-закрывателя там хоть и очевидны, но никакой логической связи между ними нет.
А флагов там на этот несчастный ресурс аж целых три, но это лишь добавляет путаницы.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Вс июн 08, 2014 22:31 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
gudleifr писал(а):
Пример эмуляции этого явления в простейшей форме:
Код:
DOER ПОДГОТОВИТЬ-КОНЕЦ
: НАЧАТЬ ВЫДЕЛИТЬ IF MAKE ПОДГОТОВИТЬ_КОНЕЦ ОСВОБОДИТЬ ;AND THEN ;
: ОТКАЗАТЬСЯ ОСВОБОДИТЬ UNDO ПОДГОТОВИТЬ_КОНЕЦ ; \ если ресурс больше не нужен
: ЗАКОНЧИТЬ ПОДГОТОВИТЬ-КОНЕЦ ; \ конец сеанса

MAKE...;AND выполняется за непостоянное время?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Вс июн 08, 2014 23:35 
dynamic-wind писал(а):
MAKE...;AND выполняется за непостоянное время?
Нет, см. Броуди ([url]http://www.gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20THINKING%20FORTH\07.RABOTA%20S%20DANNYMI:%20STEKI%20I%20SOSTOANIA[/url]). Здесь я попытался проиллюстрировать идею, что я не могу заранее знать, что будет делать слово ЗАКОНЧИТЬ. Это будет зависеть от хода программы.

Например я пишу программу блуждания по лабиринту. Сохраняя пройденные позиции в стеке, я всегда смогу вернуться. Немного усложнив "стек", для удобства удаления петель, я смогу вернуться быстрее. Усложнив "лабиринт" путем ввода некоторого разнообразия видов переходов из локации в локацию, я приду к идее записи "обратного пути" в виде алгоритма. А алгоритм в Forth естественно записывается в виде шитого кода...
Как-то так...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Пн июн 09, 2014 11:24 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
А если вызывать вектор ОЧИСТКА и в нем его переопределять на EXIT ? Тогда при повторной очистке будет просто возврат.
Или если управление точно проходит через точку возврата, можно поместить перед этим возвратом в стеке возвратов адрес ОЧИСТКА . Но тут надо смотреть, чтоб точно через эту точку пройти.
Или ОЧИСТКА сделать как всегда выполняемую часть SEH.

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Пн июн 09, 2014 11:34 
in4 писал(а):
А если вызывать вектор ОЧИСТКА
Я к тому, что само содержание слова ОЧИСТКА на момент написания программы неизвестно. А у привязать к чему - найдется.
По сути: "то место к которому привязываем" и будет "именем слова", т.к. создавать слово с каким-то текстовым именем в процессе работы программы - лишь частный случай (этакая напоминалка пользователю что-то сделать)...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Ср июн 11, 2014 11:25 
P.P.S. Оказывается, я об этом уже писал (только с другого боку):
[url]http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../WWW/g9.txt&IS=\1.INTERPRETATOR\1.ZIKL%20UPRAWLENIA\1.POLUTENIE%20SLOWA\4.DRUGIE%20ISTOTNIKI[/url].


Последний раз редактировалось gudleifr Чт июн 11, 2015 13:34, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Чт июн 12, 2014 00:48 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
gudleifr писал(а):
Я к тому, что само содержание слова ОЧИСТКА на момент написания программы неизвестно.
Тоже не страшно. Пусть вектор указывает на цепочку (список или стек) слов, которые делают нужные части очистки. Тогда можно будет даже вклиниваться в разрушение структур данных, а в конце отработки каждого слова убирать отработанные из цепочки до самого EXIT !

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Чт июн 12, 2014 01:07 
in4 писал(а):
Пусть вектор указывает на цепочку слов...
А простейшее представление цепочки слов и есть шитый код...

Т.о.:
1. Словоподобные структуры удобны для представления некоторой информации о действиях программы
2. Создание подобных структур программой вполне допустимо

Из (1) и (2) следует: FORTH-программа вполне может сама программировать на FORTH!


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Чт июн 12, 2014 10:12 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
gudleifr писал(а):
А простейшее представление цепочки слов и есть шитый код...
А еще массив. Или стек.

gudleifr писал(а):
1. Словоподобные структуры удобны для представления некоторой информации о действиях программы
2. Создание подобных структур программой вполне допустимо

Из (1) и (2) следует: FORTH-программа вполне может сама программировать на FORTH!
Потенциально. А на деле не хватает нескольких механизмов. ;)

По теме есть еще один взгляд. Для простых задач не обязательно компиляция, можно использовать очереди и стеки. Хотя при усложнении задач она, возможно, все-таки потребуется.
Но - зачем нужна компиляция именно в рантайм? Ее надо бы делать пораньше. В фазе кодогенерации или даже во время редактирования. Разве что алгоритм работы существенно зависит от обрабатываемых данных.

Если известно, что при создании ресурса нужно будет его удалить, то удаление можно отложить в стек. И, кажется, можно так организовать алгоритм, что это удаление будет отложено - в стек будут помещены действия, которые нужно будет сделать раньше в процессе окончания работы программы.

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

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: От удаления объектов - к ран-тайм компиляции
СообщениеДобавлено: Чт июн 12, 2014 10:30 
in4 писал(а):
Потенциально. А на деле не хватает нескольких механизмов.
Каких?
in4 писал(а):
Разве что алгоритм работы существенно зависит от обрабатываемых данных.
Пусть зависит, иначе не интересно.
in4 писал(а):
а нужно ли ее именно компилировать или использовать структуры данных для хранения этой последовательности - можно решить при оптимизации алгоритма.
А есть ли смысл разделять "компиляцию кода" и "создание структуры данных"?
***

Еще один гипотетический случай самопрограммирования.
Попробуем реализацию машины "из коробков" Д.Мичи (воспетую Гарднером и Саберхагеном).

Машина, предназначенная для игры в простые игры - шашки 4*4, крестики-нолики, Баше, лабиринт - состоит из коробков с разноцветными бусинами. Каждый коробок соответствует некой игровой ситуации. Цвет бусины соответствует варианту поведения (ходу) машины. Сеанс игры соответствует в случайном выборе бусин. Если машина выигрывает - в сыгравшие коробки добавляются бусины, того цвета, который был выбран. Если проигрывает - сыгравшие бусины удаляются (добавляются бусины других цветов).
Через несколько партий машина научается играть.

FORTH-реализация вполне может состоять в создании слов-коробков.
КОРОБОК создается автоматически при появлении в игре новой комбинации.

При создании в каждый коробок прошивается столько слов-БУСИН, сколько возможно вариантов:
Код:
СТАРТ LIT e1 LIT k1 БУСИНА LIT e2 LIT k2 БУСИНА ... LIT eN LIT kN БУСИНА ФИНИШ EXIT

где
Код:
: СТАРТ IP>ИГРОСТЕК 0 0 ;
: БУСИНА  ( e k eI kI -- e' k+kI)
   ROT OVER + ВЫПАЛО? IF ROT ELSE SWAP THEN DROP ;
: ФИНИШ DROP DUP >ИГРОСТЕК EXECUTE ;

ИГРОСТЕК используется для запоминания сыгравших вариантов.
IP>ИГРОСТЕК - запоминает в в ИГРОСТЕКЕ адрес первого LIT в КОРОБКЕ.
kI - число бусин.
eI - адрес процедуры хода.
ВЫПАЛО? ( k1, k2 -- k2, f) выдает TRUE c вероятностью k1/k2 (в случае k2 == 0 - TRUE).
Обучение состоит в прохождении ИГРОСТЕКА, заполненного парами КОРОБОК-e1, и соответствующем измененении kI.

Можно, конечно, хранить КОРОБКИ в честных списках, вынеся за пределы шитого кода.
Получится гораздо короче (LIT-ы и БУСИНЫ уйдут, останутся только пары eI-kI).
По сути, это просто выбор между прямым и косвенным шитым кодом.
Ведь список пар eI-kI - именно косвенный шитый код.

Может, кто-то придумает более удачные примеры самопрограммирования?

P.S. Внезапно. А ведь слово "!" - компилирующее. Оно пишет не "код", а "данные"? А FORTH-у не пофиг?!

P.P.S. Обобщенная FORTH-машина из коробков:

ПОТОК команд игрока;
СЛОВАРЬ содержит набор КОРОБКОВ;
ЗНАЧЕНИЕ описывает позицию на момент хода машины и ее нормализации;
СТЕК содержит набор сыгравших КОРОБКОВ и выбранных ходов;

ОК - выдача позиции игроку;
СИМВОЛ - распознание/нормализация позиции;
ВЫПОЛНИТЬ - если необходимо, создание нового КОРОБКА и выбор хода;
КОМПИЛИРОВАТЬ - в конце игры провести обучение КОРОБКОВ, сохраненных в стеке;
СЛЕДУЮЩИЙ - зависит от реализации.


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB