Разработано | Motorola |
---|---|
Developer | Microware |
Впервые появилось | 1980; 40 лет назад (1980 г.) |
Стабильный выпуск | 1.1.0 / 5 января 2003 г.; 17 лет назад (05.01.2003) |
BASIC09 - это структурированный диалект языка программирования BASIC, разработанный Microware от имени Motorola для новый на тот момент Motorola 6809 CPU и выпущенный в феврале 1980 года. Он в основном используется с OS-9 операционной системой, выпущенной в 1979 году. Microware также выпустила версию для OS-9 / 68k на 68000 как Microware BASIC .
В отличие от типичных BASIC того времени, BASIC09 включает многопроходный компилятор, который создает компактный байт-код, известный как I-код . I-код заменяет ряд структур данных, имеющихся в других BASIC, прямыми указателями на код и значения, повышая производительность. Пользователи могут дополнительно компилировать код с помощью команды PACK
, после чего он может быть вызван непосредственно OS-9 и работать как собственный код. В случае PACKed кода используется урезанная версия BASIC09 runtime system, Runb, что дополнительно сокращает объем памяти и время загрузки.
Язык включает ряд дополнений структурного программирования, включая локальные переменные, возможность игнорировать номера строк в пользу именованных подпрограмм, определяемых пользователем структур и несколько различных базовых типов данных, включая 16-битные и 8-битные (байтовые) целые числа, в дополнение к плавающей запятой и строкам.
Ключевым отличием BASIC09 от традиционных BASIC того времени, таких как канонический Microsoft BASIC, является добавление структуры PROCEDURE
/ END
, которая созданы отдельно исполняемые блоки кода. Код в ПРОЦЕДУРЕ
имел больше общего с полными программами в других BASIC, включая переменные, которые были локальными для кода и выполнялись автономно. PROCEDURE
были вызваны с помощью команды RUN
и могли включать переменные для семантики вызова функций; например, RUN add (4,7)
вызывает процедуру с именем add
, которая принимает два параметра. Параметры были импортированы в процедуру с использованием ключевого слова PARAMETER
, в этом примере PARAMETER a, b
:
PROCEDURE add PARAMETER a, b PRINT a + b END
A side- Эффект от использования именованных процедур состоит в том, что результирующее рабочее пространство памяти фактически является собственным пространством имен. В этом отношении система BASIC09 представляется пользователю каталогом вызываемых программ. Это контрастирует с типичными BASIC, где в данный момент времени доступна только одна программа, а построение более крупных программ, вызывающих библиотечный код, обычно требует, чтобы исходный код был скопирован и вставлен между отдельными программами. В BASIC09 пользователь может ЗАГРУЗИТЬ
процедуры по имени в рабочую область, а затем вызывать их из собственного кода для создания более крупных программ из отдельно хранимых процедур.
В дополнение к коду в рабочей области, если программа вызвала RUN
с именем процедуры, которое не удалось найти, она будет искать файл на диске с тем же именем и запускать его. Это работало не только с кодом BASIC09, но и с любой другой исполняемой программой, включая файлы машинного языка. Это означало, что BASIC09 мог легко вызывать системные подпрограммы.
Помимо RUN
, другие общие команды BASIC также использовали имена. Например, LIST bob
распечатает исходный код («список») процедуры с именем «bob», а LIST *
распечатает все процедуры, находящиеся в настоящее время в памяти. Красиво напечатанный вывод из LIST
может быть перенаправлен в файл или на принтер с нотацией, подобной оболочке, например СПИСОК bob>/ p
. Также можно было бы СОХРАНИТЬ
и ЗАГРУЗИТЬ
процедуры из хранилища.
В дополнение к организационным свойствам ПРОЦЕДУРА
, BASIC09 также включал ряд расширений к операторам управления потоком, найденным в BASIC, для обеспечения большей структуры. Например, оператор IF
может использоваться в традиционном формате IF
... THEN
в одной строке или в структурированном мульти формат строки:
IF x>10 THEN PRINT "больше 10" ELSE PRINT "меньше 10" ENDIF
FOR / NEXT
циклы естественно имеют структурированный формат, как NEXT
можно разместить в любой строке, но BASIC09 также добавил WHILE / ENDWHILE
и REPEAT / UNTIL
для дополнительной ясности при работе с неиндексированными циклами. Он также включал центральный выход LOOP / ENDLOOP
, который использовал оператор EXITIF
для тестирования в любом месте тела цикла.
BASIC09 включены несколько встроенных типов данных. В дополнение к традиционным строковым (STRING) и 40-битным типам с плавающей запятой (REAL), используемым в большинстве BASIC того времени, он также включал 16-битный знаковый INTEGER, 8-битный беззнаковый BYTE и логический тип BOOLEAN. Типы BOOLEAN не были упакованы в байты, один BOOLEAN использовал весь 8-битный байт для хранения одного значения. В языке предусмотрены отдельные побайтные логические операторы для побитовых операций с байтами и целыми числами. В отличие от других BASIC, которые также работали с другими базовыми типами, BASIC09 не «украшал» имя переменной, чтобы указать тип, а вместо этого использовал DIM
для определений; например, DIM a, b: BOOLEAN
для объявления двух переменных BOOLEAN или DIM c (5): INTEGER
для массива из пяти INTEGER.
Кроме того, BASIC09 включал ключевое слово TYPE
, которое позволяло определять составные типы, при этом каждый «элемент» перечислялся в одной строке, разделенной точкой с запятой. Например:
TYPE employee_record = name: STRING; number (2): INTEGER; ранее: BOOLEAN
определяет тип записи сотрудника с именем employee_record
с тремя элементами, имя
, номер
и бывший
. Тип employee_record теперь может использоваться в определении, как и любой другой тип, например, DIM employee (100): employee_record
, который определяет массив из 100 employee_record. Доступ к элементам в коде осуществляется с использованием точечной нотации, например, employee (50).name = "Bob"
.
Номера строк использовались в большинстве BASIC диалекты прежде всего как способ поддержки редактора. Пользователи могли редактировать определенные строки кода, набирая номер, а текст после него либо добавлял, либо заменял строки, уже находящиеся в памяти. Поскольку каждая строка кода имела номер, это также делало их подходящими для указания цели GOTO
или GOSUB
по сравнению с другими языками, такими как FORTRAN, где Для этого использовалась отдельная «метка линии».
BASIC09 обычно не использовал номера строк, поэтому его редактор пришлось изменить, чтобы пользователь мог редактировать строки, не обращаясь к ним по номеру. Однако BASIC09 не предполагал возможности полноэкранного режима, поэтому использование клавиш курсора не подходило. Вместо этого в системе было отдельное приглашение редактора и позволяло пользователю перемещаться с помощью клавиш + и -, перемещаясь вперед или назад по одной строке за раз. Чтобы вставить новую строку кода без номера строки, пользователь оставил пробел в начале оператора.
Обратите внимание, что язык чувствителен к регистру для значений, предоставленных пользователем, таких как процедура и имена переменных, но не для ключевых слов. Ключевые слова, набранные в редакторе в нижнем регистре, будут отображаться в верхнем регистре, когда программа LIST
ed. BASIC09 допускает использование нескольких операторов в одной строке кода, но использует \ в качестве разделителя вместо :, используемого в большинстве диалектов. Это связано с тем, что он использовал двоеточие в операторе присваивания : =
, который в дополнение к обычному =
. :=
был идентичен по действию =
, но имел различие между присваиваниями и сравнения более очевидны.
Внутренний многопроходный компилятор преобразует исходный код BASIC09 в токенизированный, оптимизированный, байт-код, называемый I-кодом. I-код отличается от более традиционного подхода к токенизации, встречающегося в большинстве BASIC, тем, что ряд элементов помещался непосредственно в память вместо использования ссылок, которые затем нужно было искать.
Например, в MS на основе интерпретаторам, ссылка на переменную в коде остается в строковом формате; переменная VAL
будет представлена в памяти тремя буквами VAL. Во время выполнения, когда эта переменная встречается в коде, интерпретатор должен найти эту строку в таблице переменных, найти связанный адрес хранения в памяти, а затем, наконец, прочитать значение, хранящееся в этом месте. Таблица обычно строится таким образом, что значение следует за именем, чтобы сэкономить время во время окончательного поиска.
Напротив, в I-коде адрес переменной определяется заранее, а ссылка в коде заменяется по этому адресу. Это позволяет избежать поиска во время выполнения по таблице переменных. Другие оптимизации включают в себя отдельную процедуру FOR / NEXT
, используемую, когда индексной переменной является INTEGER, и отдельные математические библиотеки INTEGER и REAL.
Для повышения производительности BASIC09 также включает PACK
команда, которая взяла имя процедуры и вернула оптимизированную версию. Некоторые из этих оптимизаций включали удаление инструкций, не связанных с кодированием, таких как комментарии кода, и замену константных выражений на одно значение. Например, PACK
распознает, что LET x = x + SQR (100) / 2
содержит только константы справа, и заменяет его кодом x = x + 5
, который требует только одной операции во время выполнения, сложения, удаления деления и извлечения квадратного корня. PACK
сократил объем памяти, занимаемый процедурой, и повысил производительность примерно на 10–30%.
Хотя обычно в среде BASIC09 запускались программы, как и в других BASIC, BASIC09 также поставлялся с отдельной версией кода только для запуска, известной как Runb. Runb удалил из системы возможности редактирования и отладки, и в результате его размер был примерно вдвое меньше, чем у BASIC09.
Целью Runb было в первую очередь запускать упакованные модули при вызове из других программ. Это означало, что если пользователь ввел имя модуля BASIC09 в командной строке OS / 9 и этот модуль был помечен как PACKed, он открывается и запускается Runb вместо BASIC09. Это сокращает объем памяти и сокращает время загрузки.
GOTO
, поскольку В BASIC09 не было оператора switch / case или вычисленного объявления структуры GOSUB
)