Язык программирования Форт


Что такое Форт ?


Из всего сказанного может показаться, что у нас есть только два выбора среди языков программирования: либо быстрые, но громоздкие компиляторы, либо медленные, но зато общительные интерпретаторы. К счастью, Форт является еще одной альтернативой. Программы, написанные на языке Форт, по быстродействию не уступают, а то и превосходят программы, написанные на компилирующих языках. Форт-программы очень легко изменяются и отлаживаются. Еще одним их достоинством является то, что они обычно занимают в памяти меньше места, чем программы на других, как компилирующих, так и интерпретирующих языках. Дополнительное преимущество языка заключается в том, что он дает возможность программисту определить некоторые слова на языке ассемблера, когда требуется максимальное быстродействие, т.е. в нем совмещаются преимущества языка высокого уровня и языка ассемблера. Чем объясняются все эти достоинства языка Форт ? Тем, что он является интерпретирующим языком с шитым кодом. Чтобы разобраться, что это значит, нужно рассмотреть, что происходит при определении Форт-слова. В поставляемом потребителям виде базовая Форт-система содержит множество слов, которые были определены не с помощью других слов, а непосредственно на машинном языке (они составляют часть, называемую ядром языка). Эти слова используются для описания других слов, и их называют примитивами. Примерами примитивов являются слова *, +, DUP, SWAP и т.д. Если вы компилируете слово SQUARE, вводя

: SQUARE DUP * ;

в компьютер не вводится никакого нового машинного кода, вы только предлагаете ему соединить вместе коды слова DUP и * под именем SQUARE. Точно также и CUBE:

: CUBE DUP SQUARE * :

не вводит нового машинного кода. Аналогично и слово POWER4, которое вы определили в одном из упражнений. Компиляция состоит как бы в протаскивании одной нити через различные определения с исполнением встречающихся по пути примитивов и машинных команд. Когда исполняется слово POWER4, "нить" проходит так, как показано на . Все необходимые действия, кроме ввода в память, были выполнены с помощью двух примитивов DUP и *, входящих в ядро и определенных на машинном коде.
Если вы знакомы с компиляцией в других языках программирования, то заметите, что форт осуществляет ее совершенно по-другому. В и мы подробно рассмотрим, как работает компилятор шитого кода. В книге Лулигера (1981) рассматриваются некоторые теоретические вопросы разработки интерпретирующих языков, использующих шитый код. Теперь мы можем понять причину многих достоинств языка Форт: программирование в диалоговом режиме, гибкость, большая скорость, минимальные потребности памяти и такое же полное управление оборудованием компьютера, какое доступно ассемблеру или машинному языку. Вы уже убедились в больших возможностях общения с языком на примерах и упражнениях этой главы. Большое преимущество в скорости работы перед другими интерактивными языками объясняется тем, что последние, как правило, интерпретирующие.


рис. 1.3

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

Очень малая потребность в памяти, присущая Форту, вызывается применением шитого кода.


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

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


Содержание раздела