Из журнала ZX FORMAT:
В этой статье речь пойдет о компиляторах бейсика. Этот раздел прикладных программ интересен тем, что позволяет существенно увеличить скорость работы бейсик-программ и тем самым снять одно из самых серьезных ограничений бейсика - медлительность.
Компиляторы бейсикa на Спектруме можно разделить на две группы:
1. Компиляторы интерпретирующего типа. Эти компиляторы преобразовывают программу в специальный код, понятный управляющей программе, которая является упрощенным вариантом встроенного интерпретатора, за счет чего и появляется выигрыш в скорости.
Однако, коды скомпилированной программы располагают в области бейсик-программы или в области переменных, что не дает возможности создавать оверлейные (вложенные) процедуры.
2. Компиляторы транслирующего типа. Компиляторы этого типа создают таблицы из адресов подпрограмм и размещают скомпилированную программу, как правило, по произвольному адресу, но из-за усложнения процедуры компиляции, занимают больше места и имеют больше ограничений.
Теперь краткое описание преимуществ и недостатков того и другого типов компиляторов.
Компиляторы первого типа, как правило,не только не накладывают ограничений на применение их, но и позволяют существенно расширить средства стандартного бейсикa. Как пример можно привести Laser Basic Compiler. Кроме того, они, как правило, используют те же области, что и стандартный бейсик для хранения переменных, что позволяет использовать без дополнительных сложностей нестандартные обращения к переменным и функциям.
К недостаткам этого типа компиляторов, кроме указанного выше, можно отнести еще и невозможность создания управляющей программы на бейсикe, и малую эффективность компиляции по объему и скорости.
Для пояснения немного отклонимся от темы: эффективность по объему - отношение длины программы до компиляции к размеру объектного модуля.
Эффективность по скорости - отношение времени выполнения нижеследующей программы до компиляции и после.
Вот эта программа:
Код: Выделить всё
10 FOR I=16384 TO 22527
20 POKE I,255
30 NEXT I
40 STOP
Засеките время с момента нажатия <ENTER> и до момента появления надписи: 9 STOP statement, 40:1
Ну, пора вернуться к компиляторам. Второй тип компиляторов тоже не является идеальным и единственными его достоинствами являются скорость работы и мобильность кода, т.е. возможность компиляции практически куда угодно, а все остальное - сплошные недостатки. Их более, чем достаточно:
Во-первых, масса ограничений, накладываемых компилятором на программу: один не "переваривает" команду BEEP, другой многомерные массивы, третий вообще целочисленный...
Во-вторых, из-за сложностей компиляции существенно вырастает "нагрузка" (блок кодов, необходимый скомпилированной программе для работы.)
Теперь подробнее о конкретных компиляторах:
Первый Тип.
Оптимизирующий компилятор BLAST (должен поставлятся в комплекте с утилитой TOOLKIT).
Сразу должен отметить, что данное описание в большей степени составлено на основании книги "Справочник по системным программам 48К" фирмы СОЛОН и многое из изложенного нуждается в экспериментальной проверке. Проверить все нижеследующее на практике мне не удалось из-за отсутствия в моем архиве нормально дискетированной версии BLAST'а.
BLAST позволяет скомпилировать в непосредственном режиме программы размером не более 3К. При больших размерах требуется предварительная обработка программы отладчиком TOOLKIT. Компилятор воспринимает следующие команды:
*C - Компиляция программы.
*R - Старт откомпилированной программы.
*S - Запись откомпилированного модуля на диск.
*I - Выбор входного устройства для компиляции.
R - память;
E - магнитофон;
М - микродрайв.
*O - Выбор выходного устройства (аналогично входному)
BLAST позволяет существенно расширить возможности стандартного бейсикa, используя конструкцию: REM option.
Options:
!AUTORUN - Автозапуск скомпилированной программы после загрузки;
!PCODE - Генерация защищенного Pi-кода;
!MACHINE CODE - Генерация обычного кода;
!INT парам. - Объявление целых переменных (занимают 2 байта, вместо обычных 5);
%... - Обычный комментарий;
&BREAK (ON/OFF) - Включение/выключение останова по клавише BREAK.
&WHILE условие - оператор цикла, знакомый многим по языкам Pascal, C. При истинности условия оператор пропускается, иначе - происходит переход на оператор, следующий за &WEND.
&WEND - действует аналогично GO TO &WHILE и служит для указания конца цикла WHILE...WEND.
&REPEAT - На оператор, следующий за этим, происходит переход с инструкции &UNTIL.
&UNTIL условие - оператор аналогичный &WHILE, используется в конструкции REPEAT...UNTIL.
Небольшое отклонение для тех, кто не знаком с Паскалем или С.
В алгоритмических языках принято разделять циклы на два типа: циклы с предусловием и циклы с постусловием.
Циклы с предусловием (&WHILE...WEND), при исходном значении условия - ложь, ни разу не выполняются. В отличии от них, циклы с постусловием (FOR...NEXT, REPEAT...UNTIL) выполняются хотя бы один раз, даже если условие ложно.
&DOKE x,y - Версия POKE, но заносит в x слово (2 байта) y;
&DEEK x,y - Функция, равносильная: Y=256*PEEK(X+1)+PEEK(X);
&CALL x,[a,b,c,...] - Вызов подпрограммы в машинных кодах по адресу x, с передачей необязательных параметров a,b,c,... так, что на первый из них указывает регистр IX;
&ELSE операторы - Очень полезное дополнение, существует практически во всех версиях бейсикa и используется в конструкции IF...THEN...ELSE..., где указывает, какие действия производить в случае невыполнения условия после IF.
И еще несколько тонкостей:
1. Скорее всего BLAST попал (или попадет) к Вам с неснятой защитой, с этой проблемой рекомендую обратиться к упомянутому выше источнику.
2. Ежели Вам удалось откомпилировать Вашу программу в BLAST'е, то вот метод выгрузки программы на ленту (на диск также ?):
Код: Выделить всё
15 LOAD "PROC"
20 RANDOMIZE USR PEEK 23635+256*PEEK 23636+150: SAVE "PROC" LINE 15
3. Скомпилированный модуль работает только при наличии в памяти блока рабочих процедур RTCODE.
4. Характеристики компилятора:
Коэффициент объема: 95%
Коэффициент скорости: 145%
Размер "навески": 5К
Компилятор бейсик-программ из пакета LASER BASIC фирмы OASIS SOFTWARE.
Об этом компиляторе говорить много не буду, т.к. позднее, при описании самого LASER BASIC, расскажу и о воспринимаемых им расширениям.
Итак, сделав CLEAR 59799 или ниже, мы загружаем блок компилятора COMPCODE и программу; затем запускаем компилятор директивой RANDOMIZE USR 59800 и ждем, пока экран не очистится и не появится надпись, что, дескать, все окей. Тогда записываем скомпилированную программу, как бейсик-блок, но ни в коем случае не делаем ни RUN, ни CLEAR, т.к. компилятор размещает коды в области переменных, и очистка этой области приведет к уничтожению программы.
Для запуска программы повторяем те же действия, но вместо компилятора грузим пакет рабочих процедур - RTCODE. Запуск программы - GO TO 1.
Характеристики компилятора:
Коэффициент объема: 85-100 %
Коэффициент скорости: 130-150 %
Размер "навески": 5.7K
Второй Тип Компиляторов.
ZX COMPILER v1.0 THRELFALL & HODGSON. 1982 год.
Сей целочисленный компилятор является, наверно, первым из компиляторов для Spectrum-бейсика. Он далеко не самый худший на сегодняшний день, хотя созданная через 3 года 2 версия этого компилятора, живущая в нашей стране под именем MCODER 2, работает несколько быстрее. Так как рассказывать об ограничениях этого компилятора слишком долго, то скажу коротко - если какую-то конструкцию компилятор не воспринимает, он выведет ее на экран и прервет компиляцию.
Для компиляции необходимо опустить RAMTOP на уровень АДРЕС КОМПИЛЯЦИИ-1 (этот метод применяется во всех компиляторах второго типа) и запустить компилятор командой RANDOMIZE USR 60000.
INTEGER COMPILER Мартин Левис 1983 г.
Мартин Левис в 1983 году выпустил компилятор, по характеристикам равный ZX COMPILER v2.0, правда "навеска" была длинней на 0.5К, да в ходе компиляции высвечивалось меньше информации.
В том же году Левис выпускает и компилятор, работающий с плавающей запятой (дробными числами). FLOATING POINT COMPILER занимал практически столько же места, сколько и его целочисленный собрат, однако, быстродействие упало в 6 раз, поэтому если Ваша программа не пользуется дробными числами использовать сей компилятор представляется неэффективным.
Оба эти компилятора запускаются с адреса 59300.
Характеристики FPC v1.0:
Коэффициент объема: >150%
Коэффициент скорости: 400%
Размер "навески": 5.3K
TOBOS FULL FLOATING POINT COMPILER
Пожалуй, это самый мощный компилятор второго типа. Он практически не ставит ограничений на компилируемую программу.
Итак, порядок работы с этим компилятором:
1. Опускаете RAMTOP на нужный адрес, но не выше 50000.
2. Загружаете компилятор.
3. Загружаете программу, которую хотите скомпилировать.
4. Запускаете компилятор директивой RANDOMIZE USR 53100.
5. Записываете кодовый блок по указаниям компилятора.
Главный недостаток этого компилятора - огромный размер "навески", а также очистка всей памяти между скомплированным модулем и "навеской".
Характеристики компилятора:
Коэффициент объема: 95-140%
Коэффициент скорости: 600%
Размер "навески": 12.1K
! Внимание: Все компиляторы второго типа требуют присутствия в памяти себя для нормальной работы скомпилированной программы.
P.S. Все компиляторы обоих типов не допускают работы скомпилированной программы с устройствами ввода/вывода (магнитофон, дисковод), обращение к ним возможно только из машинных кодов.





Ответить с цитированием