top of page

Глава 9. Часть 1. Forth - Дзен, или Искусство Шахерезады

Простота - движущая сила и философия Forth'а. Энтузиасты Forth'а (которые в чём-то напоминают сектантов) сравнивают этот язык с дзеном. Дзен - синоним простоты, чистоты, лёгкости, мудрости и просветления. Таков и Forth в понимании его последователей. Удаётся ли им достичь просветления в процессе программирования на Forth'е нам не известно, но то, что язык этот чист и прост - сомнений не вызывает.

Чак Мур (Chuck Moore), создатель языка Forth, всю жизнь руководствовался принципом, который он назвал "Основным Принципом" –

Keep it simple![1] –

и относился к нему почти с религиозным трепетом.

Вот как он сам объясняет свой подход к программированию:

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

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

Do not speculate!

Он объясняет его так:

"Никогда не вносите в свою программу код, который может быть использован. Не оставляйте крючков, на которые можно будет навесить расширения. Возможности, которые вы хотели бы внести в программу бесконечны; а это значит, что вероятность их реализации равна нулю. Если вам понадобится внести новую возможность позже - вы сделаете это позже и, возможно, лучше, чем сейчас. А если кто-то другой будет вносить эту возможность - воспользуется ли он тем крючком, который вы для этого приготовили ?"

А теперь сравните принцип Мура с тем, что говорит Тед Нельсон - известный компьютерный учёный и эксцентрик:

"Я - шовинист дизайна. Я верю в то, что хороший дизайн обладает магическими свойствами и не терпит неумелого обращения. Разница между совершенным и убогим дизайном заключается в том, удаётся ли тысяче мелких деталей слаженно работать вместе или нет, и в силе интеллекта, который заставил их работать вместе или, по крайней мере, попытался. Поэтому программирование - или приобретение программного обеспечения - на основе "списка свойств" - features - это заранее обречённая на провал попытка. Дополнительные свойста могут быть свалены вместе в кучу, как в мусорном ведре, или тщательно подобраны и искусно сплетены в одном изящном ансамбле, как в языке APL, или Forth, или в шахматной игре".

Мур сформулировал ещё одно, достаточно противоречивое следствие Основного Принципа, которое звучит так:

Do it yourself!

Мур призывает программистов не полагаться на стандартные, готовые процедуры и рецепты, а создавать их самим. Достаточно спорное заявление, но если мы вспомним примеры Дональда Кнута в случае с Tex'ом, Линуса Торвальдса с Linux'ом, Ричарда Столлмена с проектом GNU - покажется ли нам оно таким уж неправомерным ?

Интересно, что Мур и в самом деле не отступил он Второго Следствия Основного Принципа. В течение 10 лет - с 1970 по 1980 год - он в одиночку реализовал Forth на 18 компьютерах различных систем - от Honeywell H316 и IBM 370/30 до Intel 8086.

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

***

Сердцем и мотором Forth'а является стек. Как и список, стек - одно из важнейших понятий в программировании, и так же, как и список, устройство стека чрезвычайно просто. Без стека нет Forth'а, поэтому прежде, чем продолжить разговор об этом языке, нам необходимо подробно познакомиться со стеком.

Проще всего представить себе стек как стопку книг - одна на другой. Для простоты предположим, что вы всегда кладёте новую книгу на самый верх стопки, а затем, чтобы почитать какую-то из них, снимаете книги одну за другой сверху, пока не найдёте нужной вам книги. Получается, что книга, положенная на стопку последней (самая верхняя) будет снята с неё первой. Этот принцип в программировании называется LIFO - Last In First Out, то есть - "последним вошёл, первым вышел".

Можно привести и более интересную аналогию. Вспомните "Тысячу и одну ночь". Во многих сказках там популярны вложенные сюжеты. Например, Шахерезада рассказывает сказку о рыбаке, который начинает рассказывать свою собственную сказку о греческом царе, который, в свою очередь, начинает рассказ о наказанном визире[2]. Каждая из сказок, как бы кладётся на стек, таким образом, что последняя из рассказанных сказок всегда занимает самую верхнюю позицию. Когда сказка о наказанном визире заканчивается, она "снимается со стека" и продолжается сказка о греческом царе, которая теперь занимает верхнюю позицию. После снятия с вершины стека и этой сказки, должна быть продолжена сказка о рыбаке, потому что именно она теперь занимает верхнюю позицию. Закончив сказку о рыбаке и "сняв её со стека", Шахерезада заканчивает очередную ночь сказок.

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

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

Кроме того, над стеком часто производят такие операции как "подсмотреть" верхний элемент не снимая его (top), узнать, не пуст ли стек (empty или is_empty), и узнать число элементов стека (size).

В языке Forth эти действия носят другие имена, отличные от общепринятых, и в следующей части мы познакомимся с ними и с ещё несколькоми функциями, с помощью которых Forth работает со стеком.

 

[1] В программировании этот принцип носит название KISS и чуть-чуть расширяет принцип Мура: "Keep It Simple, Stupid!". Впрочем, существует более политически корректная формулировка - "Keep It Stupid Simple".

[2] Автор не ручается за точность последовательности, но нас в данном случае интересует общий принцип.

Related Posts

bottom of page