Системные программы для «ZX-Spectrum» 1993 г.

BLAST - первый полностью совместимый оптимизирующий компилятор Бейсика для Синклер-компьютеров. Вступление. Начало работы.


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 игнорируют эту ошибку. Если индексы вый­дут за свои пределы, результаты будут непредсказуемыми.

 




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Docs - шифрование и дешифровка писем.
Фидо-разговорчики - История "псевдонимов" или кто как и почему называется ...
Графика - картинкa АNSI графики.
Switch 3.5' - Как юзать 3.5 привод после его подключения.
Начало - хочу извиниться перед редакцией газеты ON-LINE...

В этот день...   21 ноября