Введение

BASIC09 — это структурированный диалект языка программирования BASIC, разработанный компанией Microware по заказу Motorola для нового процессора Motorola 6809 и выпущенный в феврале 1980 года. Он в основном используется с операционной системой OS 9, выпущенной в 1979 году. Microware также выпустила версию для OS 9/68k на базе процессора 68000 под названием Microware BASIC. В отличие от типичных BASIC того времени, BASIC09 включает в себя многопроходный компилятор, который генерирует компактный байт-код, известный как I-код. I-код заменяет ряд структур данных, используемых в других BASIC, прямыми указателями на код и значения, что повышает производительность. Пользователи могут дополнительно компилировать код с помощью команды PACK, после чего он может быть вызван непосредственно операционной системой OS 9 и выполняться как машинный код. В случае с PACK-кодом используется урезанная версия среды выполнения BASIC09, Runb, что еще больше снижает потребление памяти и время загрузки. Язык включает в себя ряд средств структурного программирования, таких как локальные переменные, возможность игнорировать номера строк в пользу именованных подпрограмм, пользовательские структуры данных и несколько различных базовых типов данных, включая 16-битные и 8-битные (байтовые) целые числа, а также числа с плавающей точкой и строки.

Редактирование

Числа строк использовались в большинстве диалектов BASIC прежде всего для поддержки редактора. Пользователи редактировали определенные строки кода, вводя номер, а текст, введенный после этого, добавлял или заменял строки, уже находящиеся в памяти. Поскольку каждая строка кода имела номер, это также делало их удобными для указания цели операторов GOTO или GOSUB, в отличие от других языков, таких как FORTRAN, где для этой цели использовалась отдельная "метка" строки. BASIC09 обычно не использовал номера строк, поэтому его редактор пришлось модифицировать, чтобы позволить пользователю редактировать строки, не ссылаясь на них по номеру. Однако BASIC09 не предполагал возможности полноэкранного режима, поэтому использование клавиш курсора было невозможно. Вместо этого система имела отдельный запрос редактора и позволяла пользователю перемещаться с помощью клавиш и , перемещаясь вперед или назад по одной строке за раз. Чтобы вставить новую строку кода без номера строки, пользователь оставлял пробел в начале оператора. Следует отметить, что язык чувствителен к регистру для значений, вводимых пользователем, таких как имена процедур и переменных, но не для ключевых слов. Ключевые слова, введенные в редактор в нижнем регистре, будут отображаться в верхнем регистре при выводе программы командой LIST. BASIC09 допускал несколько операторов в одной строке кода, но использовал в качестве разделителя вместо , используемого в большинстве диалектов. Это было связано с тем, что он использовал двоеточие в операторе присваивания :=, в дополнение к обычному =. Оператор := имел тот же эффект, что и =, но делал различие между присваиванием и сравнением более явным.

Компилятор

Внутренний многопроходный компилятор преобразует исходный код BASIC09 в токенизированный, оптимизированный байт-код, называемый I-кодом. I-код отличается от более традиционного подхода к токенизации, используемого в большинстве BASIC, тем, что ряд элементов помещаются непосредственно в память, а не через ссылки, которые затем необходимо искать. Например, в интерпретаторах на базе MS ссылка на переменную в коде остается в строковом формате; переменная VAR будет представлена в памяти тремя символами ASCII "VAR". Во время выполнения, при встрече этой переменной в коде, интерпретатор должен искать эту строку в таблице переменных, находить соответствующий адрес хранения в памяти и, наконец, считывать значение, сохраненное по этому адресу. Таблица обычно строится так, чтобы значение следовало за именем, для экономии времени при окончательном поиске. В отличие от этого, в I-коде адрес переменной определяется заранее, и ссылка в коде заменяется этим адресом. Это позволяет избежать поиска в таблице переменных во время выполнения. Другие оптимизации включают отдельную подпрограмму FOR/NEXT, используемую при целочисленном индексе, и отдельные математические библиотеки для целых и вещественных чисел. Для повышения производительности BASIC09 также включал команду PACK, которая принимала имя процедуры и возвращала оптимизированную версию. Некоторые из этих оптимизаций включали удаление неисполняемых инструкций, таких как комментарии, и замену константных выражений на одно значение. Например, PACK распознает, что LET x=x+SQR(100)/2 содержит только константы в правой части, и заменяет это кодом x=x+5, который требует только одной операции во время выполнения – сложения, исключая деление и извлечение квадратного корня. PACK уменьшал объем памяти, занимаемый процедурой, и повышал производительность примерно на 10–30%.

Легкий срок работы

Хотя было обычным запускать программы в среде BASIC09, как и в других версиях BASIC, BASIC09 также поставлялся с отдельной версией для запуска кода, известной как Runb. Runb лишался функций редактирования и отладки, что позволило уменьшить его размер примерно вдвое по сравнению с полной версией BASIC09. Основное назначение Runb заключалось в запуске PACKed-модулей при вызове из других программ. Это означало, что если пользователь вводил имя BASIC09-модуля в командной строке OS/9, и этот модуль был помечен как PACKed, то он открывался и запускался Runb, а не BASIC09. Это снижало потребление памяти и сокращало время загрузки.