Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[3]

образует исходную программу в машинный язык, исполняющуюся так же, как программа, написанная непосредственно на машинном языке. Текст программы, написанный на языке близком к обычному английскому, называется исходным кодом, инструкции на машинном язьже - скомпилированным кодом. Часто текст программы называют просто кодом, будь то язык машины, ассемблера или язык высокого уровня. Компилирующие языки появились первыми, самыми старыми среди них являются Фортран, Алгол и Кобол, которые еще и сейчас применяются преимущественно на больших ЭВМ. Особенно это относится к Фортрану - для этого языка написано огромное количество расчетных программ, поэтому он до сих пор очень активно используется в научных расчетах.

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

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

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

Из всего сказанного может показаться, что у нас есть только два выбора среди языков программирования: либо быстрые, но громоздкие компиляторы, либо медленные, но зато общительные интерпретаторы. К счастью, Форт является еще одной альтернативой. Программы, написанные на языке Форт, по быстродействию не уступают, а то и превосходят программы, написанные на компилирующих языках10.

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

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

11встраиваемые системы, или embedded

версия 26 октября 2005 г.ФОРТ


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

Если вы компилируете слово SQUARE, вводя

: SQUARE DUP * ; <ВК>

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

: CUBE DUP SQUARE * :

не вводит нового машинного кода. Аналогично и слово P0WER4, которое вы определили в одном из упражнений.

Компиляция состоит как бы в протаскивании одной нити через различные определения с исполнением встречающихся по пути примитивов и машинных команд. Когда исполняется слово P0WER4, "нить" проходит так, как показано на рис.1.3. Все необходимые действия, кроме ввода в память, были выполнены с помощью двух примитивов DUP и *, входящих в ядро и определенных в машинном коде. Если вы знакомы с компиляцией в других языках программирования, то заметите, что Форт осуществляет ее совершенно по-другому. В гл.14 и 15 мы подробно рассмотрим, как работает компилятор шитого кода. В книге Лулигера (1981) рассматриваются некоторые теоретические вопросы разработки интерпретирующих языков, использующих шитый код.

рис. 1.3

Теперь мы можем понять причину многих достоинств языка Форт: программирование в диалоговом режиме, гибкость, большая скорость, минимальные потребности памяти и такое же полное управление оборудованием компьютера, какое доступно ассемблеру или машинному языку. Вы уже убедились в больших возможностях общения с языком на примерах и упражнениях этой главы. Большое преимущество в скорости работы перед другими интерактивными языками объясняется тем, что последние, как правило, чисто интерпретирующие.

2.2.1 Подпрограммный шитый код

Следует особенно выделить одну особенность языка Форт - его реализации используют несколько типов кода, в который компилируется тексты программ.

Прежде всего это настоящий машинный код компьютера - для создания нити шитого кода используются настоящий машинные команды типа CALL и RET, так что слово SQUARE будет скомпилировано в машинный код, аналогичный следующему тексту на ассемблере:

SQUARE header:

SUQARE code:

db

call DUP code call mul code ret

; каждое слово в Форте имеет специальный ; заголовок, в котором хранится имя слова ; и служебная информация форт-системы

; вызов машинного кода форт-слова DUP

; вызов машинного кода слова *

; машинный код, компилируемый словом ;


Некоторые форт-системы вместо компиляции вызова примитива типа DUP и * скомпилируют непосредственно машинный код этих слов12, что даст экономию на времени работы команд CALL и RET и при этом сильно увеличит размер машинного кода.

2.2.2Косвенный шитый код

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

SQUARE header:db ...

SQUARE code:

call address interpreter

SQUARE packed:

dw DUP dw * dw NEXT

При запуске этого слова будет вызван адресный интерпретатор, который возьмет с аппаратного стека адрес SQUARE packet и последовательно пробежится по списку адресов, выполняя команду CALL для них. Вызов NEXT приведет к завершению работы текущего слова.

2.2.3Байт-код (свернутый шитый код)

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

Более надежным является использование свернутого шитого кода, или байт-кода: байт-код это машинный код виртуального компьютера, работа которого имитируется программно - аналогично работают Java, Perl и множество других языков.

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

Чаще всего интерпретатор байт-кода пишется на C++ или даже ассемблере, но если вы готовы пожертвовать скоростью работы ваших программ, интерпретатор может быть написан на любом языке программирования, способном прочитать двоичный файл в массив.

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

Кроме того учитывая появление в последнее время множества типов мобильных устройств, которые на самом деле представляют из себя полноценные компьютеры, дополненные различными специализированными модулями типа модулей GSM в мобильных телефонах, использование очень простого интерпретатора байт-кода позволяет решить основную

12 inline компиляция

версия 26 октября 2005 г.ФОРТ



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15]