Бейсик.
#3
(C) Дм. Рудовский 1996
________________________________
В этой статье речь пойдет о
компиляторах бейсика.
Этот раздел прикладных прог-
рамм интересен тем, что позволя-
ет существенно увеличить ско-
рость работы бейсик-программ и
тем самым снять одно из самых
серьезных ограничений бейсика -
медлительность.
________________
Компиляторы бейсик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. Скомпилированный модуль
работает только при наличии в
памяти блока рабочих процедур RT
CODE.
4. Характеристики компилято-
ра:
Коэффициент объема: 95%
Коэффициент скорости: 145%
Размер "навески": 5К
! Описание программы TOOLKIT
дано во втором номере журнала.
Компилятор бейсик-программ
из пакета 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.
Характеристики компилятора:
v1.0 v2.0
Коэф. объема: 140-180%
Коэф. скорости: 2200% 2500%
Размер "навески": 4.8K 4.8K
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. Все компиляторы обоих
типов не допускают работы ском-
пилированной программы с устрой-
ствами ввода/вывода (магнитофон,
дисковод), обращение к ним воз-
можно только из машинных кодов.
________________________________