Бейсик. #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. Все компиляторы обоих типов не допускают работы ском- пилированной программы с устрой- ствами ввода/вывода (магнитофон, дисковод), обращение к ним воз- можно только из машинных кодов. ________________________________