Зарание прошу прощения, у меня получился очень длиннопост. Прошу понять и простить - кроме всего прочего, это попытка осмыслить и структурировать сведенья о технологии форт, и найти её место в моей программной практике.
Первое что хочу отметить, что "FORTH 2k-32" скорее всего сильно бы отличался от того, классического форта, о котором писал Мур в своих "*ing forth".
Дальнейший текст сугубо субъективен, и основан на моём личном виденьи форт-подхода и форт-системы, которое, в свою очередь, сформировалось при прочтении книжки Баранова и Ноздрунова "Язык Форт и его реализации" и непродолжительного лурка по этому форому и некоторым смежным ресурсам. С другой стороны - я был бы рад выслушать мнение бывалых фортеров на счёт этого мнения.
Defining Forth Что же такое форт?
1. Это подход к проектированию приложений, который заключается в организации систем как совокупности довольно независимых компонентов взаимодействующих через простую и достаточно мощную структуру данных. Это обстоятельство роднит его с другим семейством языков - лиспом.
Можно сравнить мелькающее на этом форуме мнение "что-то строили, строили, оп: форт получился" с крылатым среди лиспером десятым правилом Гриспена: "Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp." (К которой частенько добавляют строчку вроде "В том числе и каждая реализация Common Lisp".
2. Это подход к реализации систем, как к постепенному расширению инструментального средства до достижения полного обхвата задачи. Это свойство в какой то мере присуще многим (если не всем) прочим языкам программирования, но я затрудняюсь сразу назвать язык, сравнимый с фортом по возможностям.
Фактически разработку програамы на форте можно рассматривать и как индуктивный процесс (переход од частного - деталей системы к общему - целой системе), и как дедуктивный (Переход от общего (форт-система в общем) к частному (решению конкретных задач).
Кроме того, форт, своей диалоговостью позволяет очень просто отлаживать, тестировать и профилировать только что написанные подсистемы как в контексте всей системы, так и отдельно от неё.
3. Открытая реализация. Если уж писать стандарт на форт, то первая его строка должна гласить: "каждая реализация языка форт должна сопровождаться предельно чёткой документацией описывающей все детали реализации системы". Свобода изменения системы под конкретную задачу, причём на лету: это невозможно назвать иначе, нежели Killer feature.
4. Форт - это живое воплощение принципа Кисс, или бритвы Окама, если хотите. Минимум телодвижений, направленные на максисмум достижения результата.
Treading Forth
Шитый код это не Форт. Шитый код существует и вне форта. В то же время форт системе ничто не мешает собираться прямо в нативных инструкциях процессора (в том числе и регистрового) или в какой-либо байт-код произвольной виртуальной машины. Шитый код - это средство реализации, удобное, часто пременяемое, но только лишь средство реализации.
Causing Forth
Мур писал программы для 16битных систем. Ну небыло у него даже самого завалящего атома, не говоря уже о каких нибудь кор-ай-семь. Мур писл программы, которые должны работать без операционной системы. Ну не нужна была ему ось: его программы не делили жизненное пространство с другими. Мур писал, придерживаясь простоты кода. Писал, писал, и... получился форт. И от того, древнего, Муровского форта система наследует кучку детских болезней.
1. Нечитаемые слова. Да, я понимаю, что команды вроде '@', ',', '!', '/mod' и прочие 2dup легко вводить, и, если словить систему, их в принципе можно запомнить, но... есть способ понять отличие roll от rot при чтении исходного кода, не заглядывая в справочники? А как же преславутая самодокументируемость кода?
2. Хитрые трюки. Да мне тоже нравиться форт за открытость и простоту реализации. Да, я ненавижу, когда кто-то решает за меня, что мне делать с компьютером. В конце концов - программирование, эт интимный процесс. Да, я тоже считаю, что язык, программами на котором не возможно наглухо повесить систему двумя десятками разных способов - недостаточно мощный. Но, блин, форт - это же просто рассадник хитрых трюков. Если в других языках понимание глубинных принципов реализации и способность к хитрым хакам - это показатель нетривиального уровня программиста, то для фортера - это воздух и, часто, единственная возможность наростить функционал
3. Отсутствие локальных переменных из коробки. С нормальными локальными словариками. Нуф саид.
4. Странная-странная область видимости относитально словарика. Пока слово есть в словаре, изменение этого слова должно затрагивать все его вхождения.
5. Ориентированность на статическое распределение памяти. Да, когда то это было нормой. в отличае от динамической памяти. Но сейчас с реализацией 'HERE','ALLOT' и ',' могут возникнуть проблемы.
Styling Forth
Что у нас в сухом остатке?
1. "FORTH 2k-32" должен быть в первую очередь методическим пособием по программированию масштабируемых и относительно переносимых систем. Книжечкой, вроде упомянутой выше Баранова и Ноздрунова. И уже во вторую - програмным обеспечением.
2. Система "FORTH 2k-32" должа быть модульной в плане реализации - при необходимости допускающей изменение реализации любых компанент - словоря, стеков, интерпретатора. (По крайней мере стремиться к этому)
3. Ядро системы - компилятор-интерпретатор, словарь, стек должны быть в тревиальной реализации предельно простыми и допускающими реализацию на целевой системе за считанные дни. При этом должны быть достаточны, для расширения до полноценной системы за счёт кода на языке форт. Как бонус - реализация такой форт-системы на произвольном языке программирования фактичкски сразу сделает возможность наращивание мощности форт-системы средствами этого языка.
Т.е. сборка форт системы имея в наличие только книжку и ассемблер целевой платформы должна быть доступна в четыре этапа:
а. Создание на ассемблере целевой системы ядра форт-системы. б. Расширение созданной системы форт-текстом из книжки в. Написание оптимизирующей системы сборки форта для целевой платформы г. Пересборка форт-системы средствами форт.
4. Интерфейсы памяти внутри форт-системы должны скрывать механизм реализации соответствующих модулей (статическое выделение или динамическое распределение памяти). Сдесь кроеться самая большая засада для меня. Опишу её наверное в сноске. *
5. Словарная статья должна иметь представление о типе хранимых в ней данных. При этом хранение адреса собственного интерпретатора строго говоря не обязательно.
6. Словарная система вообще должна быть заметно переработана. Механизм текущий словарь/контекстный словарь должен быть ликвидирован как неочевидный. Должна быть реализована система глобальный словарь/стек локальных словарей/оверлейные словари-пространства имён. Словарные записи должны иметь произвольный доступ, а не стековый (forget не должен забывать одну запись а не всё, определенное после)
7. Все словарные статьи для исполняемых слов форта (мы помним, что новый словарь может хранить константы и переменные, а не только исполняемые слова) должны быть векторизованы. И должна быть возможность (не связанная с гениальнымструктурным хаком системы) строить цепочки обработчиков. Например - выделить часть функционала интерпретатора (обработка/вырезание комментариев, построение документации по типу Doxygen, удаление переносов сторк) в препроцессор. Не знаю как у вас, а я с момента первого прочтения о работе слова '(' мечтаю о комментариях, которым не нужен пробел после скобки.
Вот, что то вроде того.
*. В общем, я могу представить реализацию словарей и стеков с одинаковым интерфейсом как для динамической так и для статической модели памяти.
Однако, подходящий интерфейс для получения блоков памяти на замену 'here'-'allot'-',' я пока, к сожалению, представить не могу. Использование динамического интерфейса типа alloc-free (или, если хотите new-delete) фактически обяжет реализовать heap для любой системы, кроме того - возникают проблемы с компиляцией тел слов программ, ведь в начале компиляции неизвестно, сколько памяти займёт результирующий код. Применение классического, стекоподобного интерфеса наоборот - сложно в реализации через хип.
_________________ Also, liebe Kolleginnen und Kollegen, Es werde Hölle...
|