BLAST
ВСТУПЛЕНИЕ
BLAST —
это первый полностью совместимый оптимизирующий компилятор Бейсика для
Синклер-компьютеров. Его цель — обеспечение максимально возможной скорости
вычислений без создания больших объектные программ. BLAST
может увеличить скорость счета в 40 раз.
С компилятором чрезвычайно легко работать. Он имеет лишь
несколько новых команд. Уровень совместимости с интерпретатором Бейсика
настолько высок, что даже бейсик-программы, имеющие вставки в машинных кодах,
компилируются успешно.
Пользователи, пишущие программы
специально под BLAST, могут воспользоваться
дополнительными расширяющими возможностями, встроенными в него, в том числе
довольно мощным инструментарием TOOLKIT, прилагаемым к BLAST.
BLAST был
разработан той же компанией, которая выпустила бейсик-компилятор PESTPEED для COMMODOR-64 и ряд других
компиляторов. В дополнение к BLAST фирма также выпускает OXFORD-PASCAL, наиболее полное приложение языка паскаль к
микро-эвм, в том числе и к Spectrum'y.
1.
ТЕРМИНОЛОГИЯ
Время компиляции — время, в течение которого BLAST компилирует программу.
Рабочее время — время, в течение которого идут
вычисления в откомпилированной программе.
Исходный файл — файл, который подлежит вводу в компилятор.
В нашем случае это текст на Бейсике.
Объектный файл — результат компиляции. В нашем случае
это аналог текста на Бейсике, записанный в машинных кодах. Часто называется
машинным кодом.
Машинный код — внутренний код машины, который
понимается процессором.
Пи-код — промежуточное представление программы, находится
где-то между Бейсиком и машинным кодом. В отличие от машинного кода занимает
много меньше места, но работает медленнее, чем машинный код, хотя и много
быстрее, чем интерпретируемый Бейсик. BLAST может
компилировать программу в машинный код или в пи-код или в их комбинацию.
Директива — сообщение компилятору, которое
добавляется к тексту исходной программы и влияет на работу компилятора. BLAST имеет ряд полезных директив компилятора, которые
вставляются в текст в форме специальных конструкций REM.
2.
НАЧАЛО РАБОТЫ
Рассмотрим простейший режим работы BLAST'a. Бейсик-программа в компьютер уже загружена и мы
компилируем ее в память RAM (т.е.в ОЗУ) без
задействования магнитофона или микродрайва. Этот режим называется компиляцией RAM-RAM. В этом случае могут быть откомпилированы программы
ограниченной длины, ибо и компилятор, и исходная программа, и объектный код —
все должны находиться в памяти в одно и то же время.
BLAST
загружается так:
LOAD "BLAST"
BLAST
самостартует и на экране появляется надпись:
BLAST OCSS 1985
ХХХХХ BYTES FREE,
где ХХХХХ — объем свободной
памяти.
В этом месте
BLAST делает проверку на то, имеете ли Вы право пользоваться этой
программой:
ENTER THE COLOR IN
SQUARE X-XX (W,Y,G,R)?
(Введите
цвет квадрата с координатами
X-XX)
Для тех, кто пользуется
оригинальной версией программы с неудаленной защитой, в приложении имеется
таблица, на которой расписаны цвета контрольных квадратов. W
— белый, Y — желтый, G —
зеленый, R — красный. Введите соответствующую букву и
нажмите ENTER. Чтобы пройти проверку, надо четыре раза
правильно ответить на вопрос.
С этого момента
BLAST готов к работе, и до тех пор, пока вы не выключите питание или не
дадите команду NEW, он сможет выполнять команды расширенного
набора. Команды BLAST'a
начинаются со звездочки
"*", чтобы отличить их от команд Бейсика.
Теперь загрузите бейсик-программу,
не превышающую ЗК, и наберите *С, чтобы выполнить компиляцию. В этом месте компилятор
может решить, что ему необходима экранная область памяти в качестве
дополнительного рабочего пространства. Не беспокойтесь, если что-либо
непонятное появится на экране. Если компиляция пройдет нормально, то через
одну-две минуты управление компьютером будет восстановлено и на экране появится
сообщение:
(0) WARNINGS
(0) ERRORS
(О
предупреждений
О
ошибок)
Чтобы запустить откомпилированную
программу, наберите *R.
Если во время компиляции BLAST'y не хватит памяти, он попросит у вас разрешения
убрать исходный файл. Если вы этого не хотите, просто нажмите
"N" и вернитесь к интерпретатору. Иначе нажмите "Y",
и компиляция будет продолжена. BLAST никогда не
уничтожит программу без вашего разрешения.
Когда BLAST
находится в памяти, вы можете редактировать исходный модуль, запускать его под
управлением интерпретатора или компилировать и запускать в откомпилированном
виде столько раз, сколько пожелаете. Работая с blast'om, вы, может быть, захотите стереть и
исходный и объектный файлы, не трогая BLAST'a. Чтобы
это сделать, дайте вместо NEW (она сотрет все вместе с
бластом), команду *N.
Примечание. Хотя BLAST и может справляться с написанными вами блоками в
машинных кодах, которые вызываются из главной программы, он не может этого
делать в режиме компиляции RAM-RAM.
3. ЗАПИСЬ
ОТКОМПИЛИРОВАННЫХ ПРОГРАММ
Для записи вашего объектного кода
просто наберите *S. BLAST спросит, записывать на ленту
или микродрайв, и затем спросит имя, под которым откомпилированная программа
будет выгружена. Вы, конечно, можете использовать любое разрешенное имя, но
есть соглашение, по которому откомпилированной версии присваивается имя
исходной программы с добавлением буквы "О" на конце.
Выгруженный файл будет также содержать объектный код
вашей программы с добавленной к нему системой обеспечения начального запуска
программы.
Чтобы убедиться, что запись прошла
успешно, наберите NEW, затем загрузите объектный код
точно так же, как вы загружаете обычные бейсик-программы. Для исполнения дайте
RUN. BLAST всегда выгружает объектный код так, что он
загружается в память в область, предназначенную для текста, записанного в
Бейсике.
4. КОМПИЛИРОВАНИЕ БОЛЬШИХ
ПРОГРАММ
Итак, компилирование RAM-RAM возможно только для коротких программ. Чтобы обойти
это неудобство, BLAST имеет возможность читать исходный
файл с ленты или микродрайва и записывать объектный код на любое из этих
устройств.
5. ВЫБОР ВХОДНОГО И
ВЫХОДНОГО УСТРОЙСТВ
Чтобы выбрать устройство, с
которого BLAST будет читать исходный файл, нажмите *1 и
ответьте на появившийся вопрос клавишей R, Т или М.
R — память RAM, Т — магнитофон (лента), М — микродрайв,
Чтобы задать выходное устройство,
нажмите *0 и дайте аналогичный ответ.
После того, как вы дадите команду
на компиляцию *С, компьютер сам запросит у вас информацию по устройствам
ввода-вывода. Так, например, если был выбран микродрайв, то запросит номер и
имя файла, а если магнитофон — только имя файла.
Различные комбинации устройств
ввода-вывода дают различные объемы свободной памяти, доступной во время
компиляции. Если компилируемая программа превышает 5К, то лучше, чтобы
•вод был с ленты или микродрайва,
а если 8К, то и ввод и вывод должны идти через эти устройства.
Если в качестве выходного
устройства принята лента или микродрайв, компиляция будет закончена, когда
объектный код будет записан на эти устройства. Естественно, чтобы загрузить
программу в объектном коде, его надо будет загрузить. Имейте в виду, что сам BLAST занимает солидную часть памяти Spectrum'a.
Это не должно мешать вам компилировать большие программы, но
BLAST должен быть удален из памяти перед загрузкой больших программ.
Это делается командой *Q.
6. РАБОТА С МИКРОДРАЙВОМ
Это наилучший способ компиляции
больших программ. Если же у вас много больших программ и нет
микродрайва, то мы настойчиво советуем вам его приобрести.
7. РАБОТА С ЛЕНТОЙ
Вследствие ограниченной
возможности ввода-вывода при работе с лентой программа, подлежащая компиляции,
должна быть сначала переписана на ленту в специальном формате. Средства для
этого находятся в прилагаемой к BLAST'y программе TOOLKIT (см. соответствующий раздел).
После того, как исходная программа
будет записана на ленту в нужном формате, BLAST может
быть перезагружен и программа откомпилирована. Процесс достаточно простой,
если программа такова, что объектный код умещается в памяти. Если же программа
длиннее 8К, то это не получится и придется использовать магнитофон и для ввода,
и для вывода. Хотя BLAST и дает такую возможность, но
сам процесс утомителен.
8. КОМПИЛИРОВАНИЕ С ЛЕНТЫ
НА ЛЕНТУ
В этом режиме используются две
ленты. Одна — с исходным файлом, другая — с объектным. Исходный файл должен
быть записан в специальном формате (см. выше).
Когда вы нажмете *С для
компиляции, BLAST попросит вставить кассету с исходным
файлом и включить магнитофон. Через некоторое время прозвучит сигнал, и вам
будет предложено поменять ленту. Необходимо остановить ленту с исходным файлом
в течение 5 секунд после звукового сигнала. Если вы этого не сделаете, то есть
вероятность, что какие-либо данные будут потеряны.
Через некоторое время компьютер
опять попросит поменять кассету. Здесь, когда меняется кассета с объектным
кодом на кассету с исходным файлом, время не критично. Однако не рекомендуем
оставлять процесс без надзора.
Во время компиляции вам будет
предложено несколько раз поменять кассеты местами, в зависимости от длины бейсик-программы.
Хотя при такой компиляции объектный код получается в несколько
нестандартной форме, видимых отличий в работе программа иметь не будет.
9. ПИ-КОД И МАШИННЫЙ КОД
BLAST
может компилировать Бейсик как прямо в машинный код, так и в псевдомашинный
код, иначе называемый пи-кодом. За и против этих методов могут быть выражены
так:
— скорость счета максимальная в
машинных кодах, а в пи-кодах — больше, чем в Бейсике;
— размер программы в машинных
кодах обычно больше, чем в Бейсике, и всегда больше, чем в пи-кодах, а в
пи-кодах — минимальный.
Карта памяти
BLAST'a приведена в приложении 1. Из нее видно, что кроме объектного
кода и данных программа содержит также блок кодов, называемый
RTS (рабочие процедуры). Это, в частности, процедуры, которыми пользуется
объектный код при выполнении умножения, деления и работы со стрингами. RTS
всегда включаются в откомпилированную программу и добавляют к ней 5К. Из-за
них откомпилированная программа не может быть короче 5К.
Рекомендуется применять машинный
код для тех частей программы, для которых критичным является время счета, а
для остальных — пи-код. Очень часто компиляция малого блока в машинный код дает
почти такой же выигрыш во времени, что и компиляция всей программы в машинный
код.
Тип кода, который должен быть
сформирован, задается с помощью директив:
REM! P-CODE
— генерирует пи-коды;
REM! MASHINE-CODE
— генерирует машинные коды.
По умолнанию генерируются пи-коды.
10. ОБРАБОТКА МАШИННОГО
КОДА
Компилирование программ, имеющих
обращение к машинному коду, обычно проблем не представляет.
1. Откомпилированная программа
может резервировать пространство для блока в машинных кодах путем понижения RAMTOP обычным путем.
2. Переменные Бейсика хранятся в BLAST'e таким же образом, что и в Бейсике, поэтому блок в
машинных кодах, имеющий к ним обращение, будет работать и в
BLAST'e.
3. Процедуры в машинных кодах,
расширяющие Бейсик перехватом процедур обработки ошибок (или какими-либо
другими методами) по прежнему будут работать.
Выполняется это следующим образом.
Если во время компиляции BLAST встречает выражение,
которое выглядит синтаксически неверным, компилятор компилирует его в
объектный файл и код. Когда во время работы программы процедуры RTS встречают
этот выходной код, они вызывают Бейсик-интерпретатор для его обработки. Если
выражение содержит синтаксическую ошибку, интерпретатор сообщает об этом и
выходит из нее обычным путем. Если же это не ошибка, а предусмотренное расширение
Бейсика, интерпретатор ведет себя так, будто текст и не компилирован.
Расширение Бейсика,
предусмотренное blast'om, так же, как и директивы
компилятора, вводятся в виде специальных инструкций REM,
которые распознаются blast'om во
время компиляции.
Не исключено, что в будущем
появятся программы, использующие такую технику для введения дополнительных
команд в Бейсик.
Для этого в BLAST
была встроена возможность передачи выражений REM в
интерпретатор, если они начинаются с "выходного" символа
"%". Если BLAST встречает выражение REM, начинающееся с этого символа, он вырабатывает код, который
вызывает передачу выражений REM с опущенным знаком
"%" в интерпретатор во время рабочего запуска. BLAST
сообщает об этом:
COMMENT
TRANSFERED AT LINE XXXX
Вполне возможно, что на практике
могут возникать проблемы. Например, машинный код, содержащийся в строках REM.,
определенно не будет работать во время компиляции, поскольку этот метод
хранения процедур зависит от способа хранения текста в памяти.
Примечание. Вследствие
возможности наложения самого BLAST'a и машиннокодовых
процедур пользователя компилятор не разрешает выполнять компиляцию программ,
содержащих процедуры в машинных кодах из RAM в RAM. Для этого надо использовать ленту или микродрайв.
11. ИСПОЛЬЗОВАНИЕ ЦЕЛЫХ
ПЕРЕМЕННЫХ
Часто можно поднять эффективность BLAST'a,
если заранее сообщить ему, какие из переменных гарантированно содержат только
целые числа из диапазона -65535...+65534. Большинство программ содержат много
таких переменных и вполне стоит оповестить об этом компилятор.
Объявление типа переменной выполняется следующей директивой,
например:
REM! INT I, J. К, А(10,5)
Здесь описаны переменные I, J, К и
весь массив А, т.е. DIM А(10,5) уже давать не надо.
Объявление типа переменной должно быть до употребления переменной.
Примечание. Если переменная была объявлена целой, а в
программе используется не как целая, то результат может быть непредсказуем.
12. СОВМЕСТИМОСТЬ С БЕЙСИКОМ
Это понятие относится не только к языку, но и к программному
обеспечению. В Бейсике можно остановить работающую
программу, посмотреть состояние переменных, выполнить операции
и т.д. Работа может быть продолжена или начата сначала. Все это возможно и под
управлением BLAST'a за одним исключением. Команда CONTINUE не будет работать в программе, прошедшей BLAST.
13. ЗАЩИТА
ОТКОМПИЛИРОВАННЫХ ПРОГРАММ
BLAST содержит целый ряд
возможностей для защиты от несанкционированного входа в откомпилированную
программу.
1.АВТОЗАПУСК
Если в начале бейсик-программы включить строку
REM! AUTORUN
BLAST вызовет автоматическое
выполнение файла после загрузки. С одной стороны это в значительной степени
усложняет взлом программы, а с другой — добавляет необходимый штрих
профессионализма к готовому программному продукту.
2. ЗАЩИЩЕННЫЙ ПИ-КОД
Большинство распространяемых коммерческих программ содержит
процедуры, записанные в машинных кодах и служащие для защиты программ.
Поскольку код Z80 достаточно несложен, широкие круги
имеют возможность для взлома программ и выведения защиты из строя. Пи-код,
который генерируется blast'om, это недокументированный
язык и поэтому представляет более высокий уровень защищенности, чем машинный
код. Поэтому рекомендуем защищающие процедуры писать на Бейсике, а затем
компилировать их в пи-код.
14. КОПИРОВАНИЕ ПРОГРАММ, ПРОШЕДШИХ BLAST
Откомпилированные программы не
могут быть выгружены напрямую через SAVE. Команда S доступна для программ, которые были откомпилированы из RAM в RAM, но S не выгрузит
откомпилированную программу, если она загружалась с ленты или с микродрайва.
Если вы хотите выгрузить программу на одно из этих устройств, продолжайте так:
Запись на ленту:
1. Загрузите откомпилированную
программу.
2. Вставьте следующие строки:
15 LOAD
"<PROG>"
20 RANDOMIZE USR
PEEK 23635 + 256 * PEEK 23636 + 150
3. Наберите:
SAVE
"<PROG>" LINE 15
Можете проверить правильность
записи заменой оператора SAVE на
VERIFY.
15. ЗАПИСЬ НА МИКРОДРАЙВ
Процедура записи на микродрайв точно такая же, за исключением
того, что должны присутствовать обычные параметры микродрайва. Например:
15 LOAD* "M"
; 1 ; "<PROG> "
20 RANDOMIZE USR PEEK
23635 + 256
• PEEK 23636 •+-
150 и наберите:
SAVE* "M" ; 1 ;
"<PROG> " LINE
15
16. ОШИБКИ.
16.1. ОШИБКИ КОМПИЛЯЦИИ
Несмотря на то что в редактор Spectmm'a можно ввести только синтаксически правильный
Бейсик, существуют пути, которыми неверные коды могут попасть в BLAST.
Выходные данные, генерируемые
программой, могут содержать ошибки, и существует вероятность того, что
Бейсиковский текст на ленте или микродрайве может быть нарушен.
Возможно также, что пользователь
введет ошибочную директиву компилятора или инструкцию расширенного Бейсика. По
этой причине BLAST производит проверку всех инструкций,
которые в него поступают.
В то же время не все так просто.
Может быть так, что инструкция воспринимается blast'ом как ошибочная во время компиляции, а
это разрешенное расширение Бейсика, например из тех, которые предоставляют
пользователю некоторые версии языка. Такие расширения полностью допускаются blast'om, беда s
том, что во время компиляции BLAST еще не имеет достаточно
информации, чтобы отличить их от подлинных ошибок.
Выход такой. Когда BLAST встречает возможную синтаксическую ошибку, он
распечатывает на экране подозрительный текст и выдает предупреждение. Затем
компиляция продолжается. Если впоследствии при запуске откомпилированной программы
сомнительная инструкция окажется фактической ошибкой, запуск прервется с
сообщением:
NONSENSE IN BASIC
16.2. ОШИБКИ ВО ВРЕМЯ РАБОТЫ ПРОГРАММЫ
Во время работы откомпилированной
программы ошибки NUMBER TOO BIG, RETURN WITHOUT GO SUB
выдаются таким же образом, как и в работе интерпретатора. Исключением является
ошибка SUBSCRIPT WRONG. Для того, чтобы избежать
постоянной проверки индексов массивов в работе программы, процедуры RTS игнорируют эту ошибку. Если индексы выйдут за свои
пределы, результаты будут непредсказуемыми.