Gudleifr: Блог

 

Gudleifr

опытный

<удалено по просьбе администрации>
 

Gudleifr

опытный

I.
... кораблики в моей игре описываются в списковой базе данных, примерно так:

(BAKU CVHG USSR КРУПНЫЙ АВИАНОСЕЦ 3" "A" "C" (ЖИВУЧЕСТЬ 9) (ЦЕНА 15) (AIR 1) (AIR-DEF 2))

А рисуются пока примерно так:
code text
  1. USSR CVHG BAKU
  2.  
  3.     3"AC + \\
  4. \++++++000000000/

Как из первого получить второе, сохранив, прозрачность кода?
(Размышляя над этой темой, я понял, что опять вернулся к вопросу рисования экранных интерфейсов. Ведь, если "оконный" ввод на FORTH осуществляется элементарно - переназначением входного потока - жмешь кнопку, получаешь слово для исполнения, то с "оконным" выводом все гораздо страшнее - формы, вложенные объекты, куча эвентов-пропертей... А, ведь, возвращаясь к корабликам - это просто перенос управляющей информации из внутренних структур в процедуру рисования, из произвольной формы в строго упорядоченный шаблон. Этакий "FORTRAN-формат наоборот").
Итак, на входе ПЕРЕНОСЧИК пары "символ-значение" (Здесь и далее "символом" обозначаю описанное ранее слово, выдающее адрес своего имени), а на выходе рисование соответствующей фигульки в соответствующем месте.
Не будем поминать всуе функциональное программирование - сделаем проще. Прошьем в код пустой шаблон процедуры рисования. Например, рисование пушек будет выглядеть (в прошивке) так:
code text
  1. ...
  2. LIT 3" LIT 5" LIТ 16" РИСОВАТЬ-ПУШКИ
  3. ...

где символы служат якорями/сигнатурами, куда ПЕРЕНОСЧИК будет втюхивать значения (понятно, ПЕРЕНОСЧИК уродует не сам шаблон, а его дубликат, нам же не один кораблик рисовать).
После обработки символа 3" имеем:
code text
  1. ...
  2. LIT 1 LIT 5" LIТ 16" РИСОВАТЬ-ПУШКИ
  3. ...

Что и должно символизировать что, будучи запущенной, РИСОВАТЬ-ПУШКИ напечатает 3".

Для удобства поиска/обработки сигнатур имеет смысл применять в шаблоне вместо LIT специальное слово LIT0 (как LIT, но на стек всегда кладется ноль), которое будет заменяться на LIT при подстановке значения.

Конечно, возможны коллизии значение/символ и ноль/отсутствие, но в каждом частном случае они вполне победимы. Более того, способ представления символов делает возможным упрощенную прошивку:
code text
  1. ...
  2. РИСОВАТЬ-ПУШКИ 3" 5" 16"
  3. ...

где умный "шитый оборот" РИСОВАТЬ-ПУШКИ сам выберет из кода нужные ему значения и проигнорирует символы.

Заполненную процедуру можно не только пустить на рисование, но и сохранить в новом слове - рисования отдельного кораблика.

Конечно, можно не трогать процедуру рисования, а применить специальную таблицу (даже, таблицу структур), откуда она будет черпать значения, но при этом пропадет прозрачность кода. В БД все ясно, т.к. там тупо символы-значения, в процедуре рисования - тоже (что, где и когда рисуем). А таблица - это новый уровень косвенности, который программисту нужно рассчитывать особо.

II.
Пример:

: СИМВОЛ HERE CREATE >NAME , DOES> @ ;

СИМВОЛ КОРАБЛЬ СИМВОЛ КЛАСС
СИМВОЛ BAKU СИМВОЛ CVHG
СИМВОЛ USSR СИМВОЛ US СИМВОЛ UK СИМВОЛ FRANCE СИМВОЛ JAPAN
СИМВОЛ КРУПНЫЙ СИМВОЛ ЛИНКОР СИМВОЛ АВИАНОСЕЦ СИМВОЛ ПОДЛОДКА
СИМВОЛ 3" СИМВОЛ 5" СИМВОЛ 16"
СИМВОЛ "A" СИМВОЛ "B" СИМВОЛ "C"
СИМВОЛ AIR СИМВОЛ AIR-DEF СИМВОЛ AIR-ASW
СИМВОЛ ЦЕНА СИМВОЛ ЖИВУЧЕСТЬ

: LIT0 R> CELL+ >R 0 ;

: НАЦИЯ. 5 0 DO DUP IF COUNT TYPE SPACE ELSE DROP THEN LOOP ;
: ИМЯ. DUP IF COUNT TYPE SPACE ELSE DROP THEN ;
: ПУШКИ. IF ." 3#" THEN IF ." 5#" THEN IF ." 16#" THEN ;
: РАКЕТЫ. IF ." A" THEN IF ." B" THEN IF ." C" THEN ;
: САМОЛЕТЫ. DUP IF 0 DO ." +" LOOP SPACE ELSE DROP THEN ;
: ПВО. DUP IF 0 DO ." \" LOOP SPACE ELSE DROP THEN ;
: ПЛО. DUP IF 0 DO ." /" LOOP SPACE ELSE DROP THEN ;
: КОРПУС. OVER - 0 DO ." +" LOOP 0 DO ." 0" LOOP ;

CREATE РИСОВАЛКА 0 , ]
LIT0 US LIT0 USSR LIT0 UK LIT0 FRANCE LIT0 JAPAN НАЦИЯ.
LIT0 КЛАСС ИМЯ. LIT0 КОРАБЛЬ ИМЯ. CR CR
3 SPACES
LIT0 16" LIT0 5" LIT0 3" ПУШКИ.
LIT0 "C" LIT0 "B" LIT0 "A" РАКЕТЫ.
SPACE LIT0 AIR САМОЛЕТЫ. LIT0 AIR-DEF ПВО. LIT0 AIR-ASW ПЛО.
CR ." \"
LIT0 ЖИВУЧЕСТЬ LIT0 ЦЕНА КОРПУС.
." /" CR ;
HERE РИСОВАЛКА !

: ПЕРЕНОСЧИК ( СИМВОЛ, ЗНАЧЕНИЕ -)
РИСОВАЛКА DUP @ SWAP CELL+ DO
I @ ['] LIT0 = IF
OVER I CELL+ @ EXECUTE = IF
['] LIT I ! DUP I CELL+ ! THEN
2 CELLS ELSE CELL THEN +LOOP 2DROP ;

\ В БОЕВЫХ УСЛОВИЯХ ПЕРЕНОСЧИК БУДЕТ ВЫЗЫВАТЬСЯ В ЦИКЛЕ ПЕРЕБОРА СПИСКА
КЛАСС CVHG ПЕРЕНОСЧИК
USSR USSR ПЕРЕНОСЧИК
КОРАБЛЬ BAKU ПЕРЕНОСЧИК
3" 1 ПЕРЕНОСЧИК
"A" 1 ПЕРЕНОСЧИК
"C" 1 ПЕРЕНОСЧИК
AIR 1 ПЕРЕНОСЧИК
AIR-DEF 2 ПЕРЕНОСЧИК
ЖИВУЧЕСТЬ 9 ПЕРЕНОСЧИК
ЦЕНА 15 ПЕРЕНОСЧИК

: EX1 РИСОВАЛКА CELL+ >R ;
CR CR EX1 CR

III.
Видно, что предложенная схема перевода "итератора в структуру" обладает, по крайней мере тремя недостатками:
1. Добавление в структуру каждого нового факта требует полного просмотра структуры на предмет соответствующих якорей. Этот недостаток неустраним, т.к. постулируются независимость итератора от структуры и отсутствие дополнительных таблиц их соответствия.
2. Невзирая на то, что все логические переменные вычисляются ПЕРЕНОСЧИКОМ, сами логические выражения вычисляются при исполнении структуры.
3. Т.к. шитый код структуры не является перемещаемым (содержит абсолютные адреса переходов), то в случае использования нескольких итераторов с одной структурой следует сложный оверлейный балет.
Недостатки (2) и (3) можно победить одним и тем же способом: хранением в структуре не готового шитого кода, но кода (или текста), генерирующего целевой шитый код.
 

Gudleifr

опытный

<удалено по просьбе администрации>
 

Gudleifr

опытный

Писал заметки по простым игровым алгоритмам и, для наглядности, ничтоже сумняшеся предложил простейший способ комфортного программирования - берешь бесплатный хостинг с Perl и просто пишешь. Кроме текстового редактора, браузера и ftp-клиента (а оно обычно в наличии) ничего не требуется...
А тут, как раз и хостинг моей странички накрылся (пока не знаю, прочихается ли вообще), так что, на всякий случай, пошел посмотреть халявный хостинг "с этим самым Perl" (ну еще, хочется ssh и gcc). А, нету! Нет, может, и есть, но как найти-выбрать? Т.е. чайник, которому я предлагал "HTML+Perl" замучается перебирать эти хостинги не в силах отличить "отсутствие Perl" от "ошибки в скрипте".

Это что тенденция по общему снижению возможностей простого HTML в пользу социалок и толстых [облачных] серверов? Или я ужасно отстал от жизни и просто не понимаю сленга нынешнего халявного хостинга?

P.S. Тут на украинском хостинге увидел ограничение на CGI-заппуски и SQL-запросы в секундах-в-сутки. Охренеть. Как я должен это считать?
 

Gudleifr

опытный

<удалено по просьбе администрации>
 

Gudleifr

опытный

В любой FORTH-системе можно выделить 4 вида данных:
1. ПОТОК - FORTH-данные в текстово-файловой форме, читаемые интерпретатором и переводимые им во внутреннее представление.
2. СЛОВАРЬ - долговременная память, хранилище смыслов слов.
3. СТЕК - кратковременная память - служебная память интерпретатора и память универсального вычислителя.
4. ЗНАЧЕНИЕ - единица информации, передаваемая между ПОТОКОМ и СЛОВАРЕМ, при передаче между ими и СТЕКОМ существует, скорее, в ограниченной форме.
Это не обсуждается...

Вопрос в следующем: должна ли существовать некая "единица информации", которая служит единым "атомом" для построения всех 4-х видов, или, наоборот, все четыре типа должны быть полностью ортогональны, и речь должна идти не о преобразовании информации из одного вида в другой, а об обмене некими сигналами, информационная интерпретация которых полностью определяется своеобразием этих видов?
 

Gudleifr

опытный

Итак, на входе - обычный FORTH, не имеющий на борту ничего, кроме того, что необходимо для его работы (саморазвития). Нам надо расширить его некоторыми свойствами операционной системы - взаимодействием с некими устройствами, многозадачностью и прочим...
Какое направление предпочесть?

1. Создавать лексиконы наподобие Си-библиотек?
Появляется новое устройство - пишем новый лексикон (особый словарь), и все. Например, определяем слова ввода-вывода в порты, опроса семафоров и т.д. Комбинируем их в высокоуровневые слова типа "вкл/выкл".
Плюс - можно подключить что угодно.
Минус - теряется преимущество FORTH-подхода, программа становится практически неотличимой от написанной на Си.

2. Прятать внутрь интерпретатора?
Закапываем всю машинерию вглубь интерпретатора. Пользователь даже не знает, что FORTH где-то что-то химичит.
Например, так обеспечивается работа с FORTH-консолью в графических ОС и реализуется классическая многопользовательность путем переключения пользовательских областей.
Плюс - FORTH-программы просты и стандартны.
Минус - теряется способность программиста получить легкий доступ к внутренностям системы.

3. Усложнять интерпретатор?
Расширяем классический интерпретатор не свойственными ему инструментами.
Дополнительные Циклы Управления, включение новых хранилищ данных, процедур их итерпретации...
Например, целевая компиляция, заменяющая стандартную интерпретацию реакцией на определенный ввод пользователя.
Плюс - идеально подходит для изготовления нужного проблемно-ориентированного языка.
Минус - FORTH перестает быть стандартным.

4. Использовать более одного интерпретатора?
Объединить несколько FORTH-систем вместе.
Например, у меня в FOBOS есть две форт-системы, объединенные общим словарем: одна заполняет словарь необходимыми для примера определениями, другая обрабатывает Win-сообщения примера.
Плюс - каждая из систем остается простой.
Минус - взаимопроникновение нескольких FORTH-систем совершенно не проработано.
 

Gudleifr

опытный

Veden12> Создал страничку.
Вот эта страничка. И там выкладывается перевод книги "Шитые интерпретативные языки" Р.Ж.Лёлигер.
В ней рассказывается, как в 1978 году автор, получив в свое распоряжение микрокомпьютер и узнав про FORTH начал писать свой TIL (шитый интерпретативный язык). Впрочем, у него получился тот же FORTH. Таким образом, история FORTH все более и более запутывается.

Что мы знаем?

1. В 1958 Чарльз Мур работает в обсерватории. Ему лень перекомпилировать свою программу каждый раз, когда незначительно меняются условия задачи и он задумывается о разработке развитого интерпретатора уровня языка управления заданиями для сборки программы из готовых кусков по требования пользователя. Официальное изложение этого момента.

2. В районе 1970 года Чарльз Мур предлагает язык FORTH, который уже не может работать на уровне управления заданиями, но позволяет описывать общепринятые на тот момент вычислительные конструкции в формате свободного ввода (слова, разделенные пробелами), записывать их в шитом коде и, понятно, исполнять.

3. Тогда же (июнь 1970) Чарльз Мур пишет статью PROGRAMMING A PROBLEM-ORIENTED-LANGUAGE, которую обнародует только в 2011 году. В статье описывается для чего (возможности единообразного написания прикладных задач) и как (на голом железе ЭВМ того времени) он создавал FORTH. В обоснование идеи упоминается дуализм язык-машина. Кроме того в статье упомянуты многие частные решения, некоторые из которых впоследствии (стараниями Броуди) представляются изюминкой FORTH (строковый редактор, числа с фиксированной точкой...).

4. В настоящее время считается, что Мур изначально создавал программу для управления конкретным железом. И главная FORTH-фича - изящное совмещение схемотехнических решений с более-менее полными реализациями FORTH-стандартов. Сам Мур этим вполне доволен и разрабатывает многоядерные FORTH-процессоры и пытается придать стандартному FORTH большую выразительность (например, раскрасив слова). На фоне этого публикация работы (3) выглядит как дань несбывшимся юношеским мечтам.

5. В 1962 году опубликована работа Е.W.Dijkstra. An attempt to unify the constituent concepts of serial program execution. Дейкстра рассуждает о свойствах дуализма языка-машины. Для удобства обсуждения предлагает "граничную модель" такого механизма, до неприличия напоминающую FORTH. Обосновывается применение понятия ячейки, двух стеков, обратной польской записи, шитого кода... О частных решениях Дейкстра принципиально(!) умалчивает. После прочтения становится очевидным, что FORTH Чарльза Мура лишь удачная (оптимизированная, ограниченная) техническая реализация модели Дейкстры. Возникает вопрос: что было между 62-м и 70-м годом?

6. В 1978 году Р.Ж.Лёлигер экспериментирует с TIL (почему-то тщательно избегая слова FORTH). Многие его идеи очень похожи на описанные Муром в (3), однако совершенно не развиты. Но, ведь, работа Мура была опубликована только в 2011? Значит, параллельно культуре "стандартного FORTH для управления железом" существовала "культура изобретения проблемно-ориентированных языков"? А параллельно развитию "синтаксической компиляции" размышляли о "машинах, определяемых языком, и языках, определяющих машину" (не путать с "конечными автоматами, допускающими язык").

20.11.14 Поправил ссылку
 

Gudleifr

опытный

Сколько раз программисты радостно открывали Forth... и с омерзением закрывали...
Давно назрела необходимость ответить на вопрос, почему это происходит.
Без всяких модных манифестов, соплей и слюней...
Чисто по понятиям.

1. Для чего Forth предназначен?
Изначально (автором) - для написания проблемно-ориентированных языков, на которых можно будет легко описать решение задачи (желательно, самим юзером).
Все эти обратные польские записи, стеки, словари и шитые коды - следствие простоты языка и его ориентированности не на вычисления, а на "языкотворчество".
Т.е. имеем A (язык машины), пишем на коленке за неделю F (Forth), затем на нем - P (проблемно-ориентированный язык), отдаем юзеру и тот решает на P свои задачи.
Очевидно: F должен быть максимально прост (если он сравним по сложности с P, то проще сразу P реализовать) и настолько универсален, что его можно создать для любого A. Что и имеем.
Итак - Forth предназначен для сложных задач.

2. Почему его не любят программисты?
А программисты вообще не любят сложных задач.
Они любят простые задачи, которые выглядят сложными для пользователя.
Слложные - тот же геморрой - ни самому посмотреть (взглядом не окинешь), ни другим показать (не поймут).

3. Куда нужно засунуть Forth-процессоры?
Что мы выиграем от того, что A=F? Практически ничего. Вот от A, ориентированного на конкретный P, мы выиграем много.
Часто, наоборот, подходящий F (для конкретного P) проще написать на обычном, а не на Forth-процессоре.
Почему же делают Forth-процессоры? Потому, что это легко. F прост, почему же не сделать-то?
Основная хитрость - Forth не существует в окончательной форме. Это не язык, а средство написания языков. И увековечивать его в железе - глупость.

Не верите? Посмотрите статьи Дейкстры (оказывается, идею Forth предложил он), Мура (автора Forth) и книги Броуди. Можно у меня на страничке (в разделе FOBOS).
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru