17. ДИРЕКТИВЫ КОМПИЛЯТОРА
BLAST
предоставляет определенные возможности выбора при компиляции. Они реализуются
посредством директив компилятора. Выполняется это специальными выражениями REM в форме:
REM! ДИРЕКТИВА
Восклицательный знак предоставляет
для BLAST'a простой способ распознавания, надо ли
игнорировать дальнейшее сообщение.
Существуют также две
дополнительные формы инструкции REM:
REM% —
обеспечивает передачу текста или комментария интерпретатору во время работы
программы;
REM& —
применяется для открывания дополнительных инструкций Бейсика, предусмотренных blast'om. Они будут рассмотрены в
соответствующем разделе.
ДИРЕКТИВЫ:
REM! PCODE
— по этой директиве BLAST компилирует программу в
пи-коды.
REM! MACHINE CODE
—генерация в машинные коды.
REM! INT 1,J,K
— объявляет переменные I, J, К как целые.
REM! AUTORUN
— обеспечивает автоматический запуск откомпилированной программы после
загрузки. Эта директива должна быть первой строкой программы.
Ниже приводится список дополнений
к Бейсику, которые распознаются blast'ом. Они вводятся инструкцией
REM&:
1. Включение и выключение клавиши BREAK:
REM& BREAK ON
REM& BREAK OFF По умолчанию эта клавиша
включена.
2. WHILE'.. WEND.
ФОРМА:
REM& WHILE
УСЛОВИЕ
REM& WEND
По этим командам блок операторов,
замыкаемый REM& WEND, выполняется многократно, пока
УСЛОВИЕ истинно (не ноль). Если УСЛОВИЕ ложно, операторы пропускаются.
3. REPEAT
.. UNTIL. ФОРМА:
REM& REPEAT
REM& UNTIL
<УСЛОВИЕ>
Блок операторов между REM& REPEAT и REM& UNTIL выполняется
многократно, пока УСЛОВИЕ имеет ненулевое значение. Независимо от УСЛОВИЯ этот
блок выполняется хотя бы один раз.
4. DOKE.
ФОРМА: REM& DOKE ADR,
Параметры — числовые выражения. Все это — 16-битная инструкция POKE. Результат второго выражения помещается в адрес, на
который указывает первое выражение.
5. DEEK —
16-битная PEEK. Форма записи аналогична предыдущей.
6. CALL
ФОРМА:
REM& CALL ADR,
[СПИСОК ПАРАМЕТРОВ]
Эта команда вызывает процедуру в
машинных кодах, содержащуюся по адресу, задаваемому выражением ADR. Параметры
разделяются запятыми; они могут быть либо числовыми переменными в диапазоне от
0 до 65535, либо адресами числовых переменных, тогда они записываются так:
ИМЯ
ПЕРЕМЕННОЙ
Эти параметры хранятся в таком
порядке, что первый из них находится по адресу, на который указывает регистр
IX. Пример:
REM& CALL
50000. X. Y
При входе в процедуру, хранящуюся
по адресу 50000, параметр Х будет храниться в (IX+0) и
в (IX+1), а адрес переменной Y будет храниться в (IX+2), (IX+3).
7. ELSE.
ФОРМА:
REM&
ELSE СПИСОК ИНСТРУКЦИЙ
Это дополнительное расширение к
инструкции IF .. ELSE, которое
разрешено во многих версиях Бейсика. Например:
IF X=0 THEN
GOSUB 100: REM& ELSE GOSUB 200
Здесь выполняется переход к строке
100, если ХО, а в противном случае — к строке 200.
Помните, что инструкции IF .. THEN .. ELSE
не могут быть вложенными. После ELSE всегда должно
стоять двоеточие.
8. МНОГОСТРОЧНЫЕ ИНСТРУКЦИИ
В Бейсике Spectrum'a есть
возможность задавать и вызывать функции, определяемые пользователем. Их главным
ограничением является только то, что они могут содержать только одну
инструкцию, которая должна быть выражением. BLAST расширяет
эту возможность. Рассмотрим пример инструкции по определению большего из его
параметров:
1000 REM& DEF М(А.В)
1010 IF А > В THEN LET M=A: REM.S ELSE LET M=B
1020 REM& ENDPROC
Имя процедуры и параметры могут состоять из одной буквы, с
возможным последующим значком доллара. Многострочные инструкции могут
применяться рекуррентно.
18. ОПТИМИЗАЦИЯ
BLAST не
просто переводит Бейсиковские инструкции в их машиннокодовые аналоги. Он также
применяет ряд методов, направленных на повышение скорости работы и
компактирование объектной программы. Авторы BLAST'a
широко пользовались старым принципом программирования: "никогда не
откладывай на рабочий прогон то, что можно сделать при компиляции".
Это относится в первую очередь к
обработке массивов и стрин-говых переменных. Например, если, скажем, массив
А(10,10) был назначен как массив с постоянными границами,
BLAST будет знать адреса каждого его заданного элемента, например
А(1,2), уже на этапе компиляции. Более того, даже если одна из границ
постоянная, например A(l,2), BLAST также улучшит
объектный код путем проведения некоторых расчетов индексов переменной во время
компиляции. Если в программе имеется много работы с массивами, это даст большой
выигрыш в повышении скорости вычисления.
При расчете выражений BLAST выбирает наиболее экономичный путь расчета, без
необходимости запоминания и вызова промежуточных значений.
BLAST
различает повторяющиеся места при расчетах сложных выражений. В этих случаях
он рассчитывает их один раз и далее пользуется результатами.
Если позволяет объем памяти, BLAST формирует область переменных во время компиляции, не оставляя
это на прогон. В отличие от Бейсика Spectrum'a, BLAST
сначала использует всю доступную память для хранения переменных, а только потом
занимается "уборкой мусора" (вычищением ненужных более данных).
Во многих случаях
BLAST способен улучшить скорость циклов FOR .. NEXT путем предварительного подсчета необходимого
количества повторов и использования специального счетчика итераций.
BLAST
широко применяет арифметику целых чисел. С целыми числами работа происходит
много быстрее, чем с числами с плавающей запятой.
19. КАК ВЗЯТЬ ОТ BLASTa МАКСИМУМ ВОЗМОЖНОГО.
В отличие от
Бейсик-интерпретатора, BLAST не тратит время при
прогоне программы на поиск строк, данных, определений функций. Он знает их
адреса и обращается напрямую.
Чтобы помочь
BLAST'y и добиться реализации максимума его возможностей, есть несколько
простых принципов, которым надо следовать, дабы переложить как можно больше
работы на / процесс компиляции, оставив минимум на рабочий прогон программы.
Возможности, имеющиеся в прилагаемой программе TOOLKIT,
позволяют это делать.
Например, избегайте инструкций
типа
GOTO выражение
это вынуждает отложить расчет адреса перехода на рабочий
прогон программы. Старайтесь везде, где только возможно, использовать число,
которое может быть известно на этапе компиляции. Это относится и к любым другим
инструкциям, в которых используются числа.
Несмотря на то, что переходы из
циклов FOR..NEXT и входы в них разрешены, старайтесь
этого не делать. Если это сделать, BLAST не сможет
заранее предвидеть последовательность операций и тем самым не использует свои
наиболее мощные возможности по оптимизации.
Пользуйтесь добавленными
расширениями к Бейсику. Они компилируются в более быстрые процедуры, чем их
аналоги. Старайтесь не объявлять один массив дважды, пользуйтесь постоянными
границами.
Везде, где можно, пользуйтесь
однобуквенными именами переменных, поскольку для них BLAST
применяет другой подход.
20. ПРОГРАММА TOOLKIT
К BLAST'y
прилагается довольно обширный набор средств для облегчения разработки программ TOOLKIT.
TOOLKIT
автостартует после загрузки и выдает на экран сообщение:
BLAST TOOLKIT 1985
Как и компилятор
BLAST, TOOLKIT загружается в верхнюю часть RAM и
устанавливает RAMTOP ниже себя. При этом объем
доступной памяти снижается примерно на 2К.
TOOLKIT не
может находиться в памяти компьютера одновременно с blast'om.
Ниже приведен список команд TOOLKIT. Они начинаются со знака "*", обозначаются
одной буквой, за ней идут параметры. N1, N2, N3 — обозначает целые числа;
N1 — N2 — обозначает от
строки N1 до строки N2;
N1 -— обозначает от строки N1 до
конца программы;
N2 — обозначает от начала
программы до конца строки N2. Если номера строк не даны, предполагается, что
речь идет о всей программе.
21. КОМАНДЫ ОБРАБОТКИ
СТРОК
1) Редактировать строку N1: *'E Nl;
2) Копировать строку N1 в N2: *С
N1, N2;
3) Убрать строку N1: *D N1;
4) Перенос строки N1 в N2 (строка
N1 уничтожается): *М N1, N2.
22. Команды обработки
блоков
1) Копирование: *С диапазон, N
По этой команде копируются все строки из заданного диапазона
в строки, начиная с N.
2) Стирание: *D диапазон.
3) Перенос строк: *М диапазон, N.
4) Перенумерация: *R диапазон, N 1,
N2.
Строки из заданного интервала перенумеровываются, им
присваиваются номера от N1 с шагом через N2. По умолчанию N2 равно 10.
23. КОМАНДЫ ОБРАБОТКИ
СТРИНГОВ
1) Поиск: *F
диапазон, N
По этой команде в заданном
диапазоне строк разыскивается заданный стринг. По умолчанию программа будет
искать^ последний введенный стринг.
2) Поиск с заменой: *S диапазон N1, N2 Отыскивается первый стринг и заменяется
на второй. Новая строка проверяется на синтаксис. Если ошибка есть, то первая
же строка, в которой есть ошибка, будет изображена на экране. Все предыдущие
строки, где поиск и замена прошли нормально останутся измененными.
24. ПРОЧИЕ КОМАНДЫ
1) Трассировка: Т* N
По этой команде на экране
печатается номер выполняемой в данный момент инструкции, начиная со строки N.
Замедлить вычисления можно клавишей ПРОБЕЛ, а остановить — кла-вишей ENTER.
2) Устранение всех строк REM, кроме тех, которые начинаются с "!","%",
"&": *К.
3) Запись на магнитофон блока
программы: *W диапазон, имя файла.
4) Запись на ленту в формате,
удобном для компиляции blast'ом с ленты. Программа будет
выгружена блоками, совместно с информацией, необходимой для компиляции: *В имя
файла.
5) Конец работы:
*Q.
ПРИЛОЖЕНИЕ 1
КАРТА ПАМЯТИ БЛАСТА
Графика пользователя
|
PRAMT
|
„ BLAST
|
UDG
|
Стеки GOSUB, машинный стек, свободная область RAM
|
RAMTOP
|
Стек калькулятора
|
STKEND
|
Рабочее пространство
|
STKBOT
|
Область редактирования
|
WORKSP
|
Переменные Бейсика
|
ELINE
|
Программа на Бейсике
|
VARS
|
Информация о каналах
|
PROG
|
Карты микродрайва Системные переменные интерфейса 1
Системные переменные Буфер принтера Атрибуты Экранная память ROM (ПЗУ)
|
CHANS
|
ПРИЛОЖЕНИЕ 2
КАРТА ПАМЯТИ ВО ВРЕМЯ РАБОЧЕГО
ПРОГОНА ПРОГРАММЫ
Графика пользователя
|
PRAMT
|
a BLAST
|
UDG
|
Стеки GOSUB, машинный стек, свободная область RAM
|
RAMTOP
|
Стек калькулятора
|
STKEND
|
Рабочее пространство
|
STKBOT
|
Область редактирования ^
|
WORKSP
|
Переменные
|
ELINE
|
Откомпилированная программа
|
VARS
|
Информация о каналах
|
PROG
|
Карты микродрайва Рабочие процедуры Системные переменные
интерфейса 1 Системные переменные Буфер принтера Атрибуты Экранная память ROM (ПЗУ)
|
CHANS
|
ПРИЛОЖЕНИЕ 3
ТАБЛИЦА КОДОВ ДЛЯ ВХОДА В
БЛАСТ
|
АВС
|
DEF
|
GHI
|
JK
|
LMN
|
OPQ
|
RST
|
UVW
|
XYZ
|
40
|
RYG
|
RYG
|
GRY
|
GW
|
GGY
|
RRY
|
GYG
|
YGW
|
YGG
|
39
|
YGR
|
YWG
|
YGG
|
RG
|
YRG
|
YGG
|
RGR
|
GYG
|
RGR
|
38
|
GYG
|
gyr
|
RGY
|
GY
|
RGY
|
WYR
|
YRG
|
RGR
|
GYG"
|
37
|
RGY
|
GRY
|
GGR
|
YW
|
YRG
|
YGW
|
GYG
|
YGY
|
GGR
|
36
|
YRG
|
GYG
|
RYG
|
GG
|
RGY
|
GRG
|
RGW
|
GYG
|
GGY
|
35
|
GGY
|
YGW
|
YEY
|
GR
|
YRG
|
RGY
|
GYR
|
YGW
|
YRY
|
34
|
RYG
|
RRY
|
GYR
|
YG
|
YYG
|
YYG
|
YRG
|
GRY
|
YGY
|
33
|
YRG
|
YGR
|
YGG
|
RG
|
GGR
|
GRY
|
GYG
|
YRW
|
YRG
|
32
|
RGY
|
GYG
|
RYR
|
YW
|
GGY
|
RGW
|
YGY
|
RGY
|
RYG
|
31
|
GYW
|
GRY
|
GRG
|
GR
|
YGR
|
YRG
|
YGR
|
YRG
|
GRG
|
30
|
YRG
|
YGR
|
YRY
|
RG
|
GRY
|
GYR
|
YRY
|
WYG
|
YGW
|
29
|
RYR
|
GWG
|
GGY
|
RY
|
WYG
|
RGG
|
RYR
|
GGW
|
GRY
|
28
|
GRG
|
YGG
|
YRG
|
YG
|
YGY
|
GRR
|
YGY
|
RRY
|
RGG
|
27
|
RYG
|
RYR
|
RYR
|
GG
|
GWG
|
RYG
|
RWR
|
GYR
|
GRY
|
26
|
YRG
|
GYG
|
YRG
|
YR
|
YGR
|
YRG
|
RGG
|
YWY
|
GYR
|
25
|
GYR
|
YRW
|
GYR
|
GG
|
RYR
|
GYR
|
GYR
|
GYG
|
RGY
|
24
|
RGG
|
RGY
|
GRY
|
WG
|
RGG
|
RGW
|
YGG
|
RGY
|
GYR
|
23
|
GGG
|
YRG
|
RYG
|
GY
|
YRY
|
GRG
|
GWY
|
GRR
|
YGY
|
22
|
YWY
|
RYG
|
YGG
|
YG
|
RYR
|
GYR
|
YRG
|
RGY
|
WYG
|
21
|
GGR
|
RGY
|
GYW
|
GR
|
YGY
|
GGY
|
RRY
|
GRR
|
GRY
|
20
|
RGY
|
YGY
|
RYG
|
RY
|
RYW
|
YRR
|
GYG
|
RYG
|
WYR
|
19
|
YRG
|
GGW
|
YGY
|
GR
|
GWG
|
WGG
|
WGW
|
GGY
|
RRG
|
18
|
RYG
|
RGY
|
RGR
|
RY
|
WYG
|
YRG
|
RYG
|
YGR
|
RGY
|
17
|
YWG
|
YRG
|
RGY
|
GG
|
YGW
|
GYR
|
YGY
|
GYG
|
GYR
|
16
|
GGG
|
RGR
|
YRG
|
RG
|
RGY
|
GGG
|
GGG
|
RGR
|
YRG
|
15
|
YRG
|
YRY
|
WYG
|
RR
|
YRR
|
YRG
|
RYR
|
YRG
|
WYG
|
14
|
GYR
|
RGG
|
YGG
|
RG
|
WGG
|
RGY
|
GWG
|
YGY
|
GGY
|
13
|
GGY
|
GYG
|
YWY
|
GY
|
GWY
|
GRG
|
YGY
|
GYG
|
YRG
|
12
|
RYR
|
GGR
|
GGR
|
YR
|
GWG
|
WYG
|
RGG
|
URG
|
WGY
|
11
|
YRY
|
WGY
|
GRY
|
WY
|
GGY
|
GRY
|
GYG
|
RYR
|
YGR
|
10
|
RRGG
|
RRG
|
RGR
|
YG
|
RYW
|
YGR
|
GGW
|
GWG
|
RGY
|
9
|
GYG
|
RGR
|
YGG
|
GY
|
RGY
|
GGY
|
RYG
|
WYG
|
YYG
|
8
|
RGW
|
YRY-
|
GRY
|
RR
|
GRG
|
RYG
|
YGG
|
YGR
|
GRW
|
7
|
YGR
|
GYW
|
GYG
|
GY
|
GYR
|
YYW
|
GYR
|
GRY
|
RYG
|
6
|
GYR
|
YRG
|
GGR
|
GG
|
RRG
|
RGG
|
YRY
|
WYG
|
YRG
|
|
5
|
YWG
|
GGY
|
YWG
|
YW
|
GGR
|
GYR
|
GYG
|
YGY
|
GYR
|
|
4
|
GGY
|
RGR
|
GGY
|
RR
|
YRG
|
YWY
|
GRY
|
RGW
|
YRG
|
|
3
|
RYR
|
GYG
|
RYR
|
YG
|
RGY
|
GGR
|
RGR
|
GYG
|
RGY
|
|
2
|
YGG
|
GRG
|
YGG
|
RY
|
GRG
|
RYR
|
YRY
|
RGY
|
RYG
|
|
1
|
WYR
|
"YGY
|
WYG
|
YG
|
RYR
|
GWY
|
GYG
|
GRY
|
GGW
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|