Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
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-битные (байтовые) целые числа, а также числа с плавающей точкой и строки.
BASIC09 is a structured BASIC programming language dialect developed by Microware on behalf of Motorola for the then new Motorola 6809 CPU and released in February 1980. It is primarily used with the OS 9 operating system, released in 1979. Microware also released a version for OS 9/68k on the 68000 as Microware BASIC. In contrast to typical BASICs of the era, BASIC09 includes a multi pass compiler that produces compact bytecode known as I code. I code replaces a number of data structures found in other BASICs with direct pointers to code and values, speeding performance. Users can further compile code using the PACK command, at which point it can be called directly by OS 9 and operated as native code. In the case of PACKed code, a cut down version of the BASIC09 runtime system is used, Runb, further improving memory footprint and load time. The language includes a number of structured programming additions, including local variables, the ability to ignore line numbers in favor of named routines, user defined structures, and several distinct base data types including 16 bit and 8 bit (byte) integers, in addition to floating point and strings.
Редактирование
Числа строк использовались в большинстве диалектов BASIC прежде всего для поддержки редактора. Пользователи редактировали определенные строки кода, вводя номер, а текст, введенный после этого, добавлял или заменял строки, уже находящиеся в памяти. Поскольку каждая строка кода имела номер, это также делало их удобными для указания цели операторов GOTO или GOSUB, в отличие от других языков, таких как FORTRAN, где для этой цели использовалась отдельная "метка" строки. BASIC09 обычно не использовал номера строк, поэтому его редактор пришлось модифицировать, чтобы позволить пользователю редактировать строки, не ссылаясь на них по номеру. Однако BASIC09 не предполагал возможности полноэкранного режима, поэтому использование клавиш курсора было невозможно. Вместо этого система имела отдельный запрос редактора и позволяла пользователю перемещаться с помощью клавиш и , перемещаясь вперед или назад по одной строке за раз. Чтобы вставить новую строку кода без номера строки, пользователь оставлял пробел в начале оператора. Следует отметить, что язык чувствителен к регистру для значений, вводимых пользователем, таких как имена процедур и переменных, но не для ключевых слов. Ключевые слова, введенные в редактор в нижнем регистре, будут отображаться в верхнем регистре при выводе программы командой LIST. BASIC09 допускал несколько операторов в одной строке кода, но использовал в качестве разделителя вместо , используемого в большинстве диалектов. Это было связано с тем, что он использовал двоеточие в операторе присваивания :=, в дополнение к обычному =. Оператор := имел тот же эффект, что и =, но делал различие между присваиванием и сравнением более явным.
Line numbers were used in most BASIC dialects primarily as a way to support the editor. Users would edit particular lines of code by typing a number, with the text following either adding to or replacing the lines already in memory. As every line of code had a number, this also made them suitable for indicating the target of a GOTO or GOSUB, compared to other languages like FORTRAN where a separate "line label" was used for this purpose. BASIC09 did not normally use line numbers, so its editor had to be modified to allow the user to edit lines without referring to them by number. However, BASIC09 did not assume any sort of full screen capability, so using cursor keys was not an option. Instead, the system had a separate editor prompt and allowed the user to move about using the and keys, moving forward or backward one line at a time. To insert a new line of code without a line number, the user left a blank at the start of the statement. Note that the language is case sensitive for user provided values like procedure and variable names, but not for keywords. Keywords typed into the editor in lower case will be shown in upper case when the program is LISTed. BASIC09 allowed multiple statements on a single line of code, but used the as a separator instead of the used in most dialects. This is because it used the colon in the := assignment operator, which was in addition to the normal =. := was identical in effect to =, but made the difference between assignments and comparisons more obvious.
Компилятор
Внутренний многопроходный компилятор преобразует исходный код 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%.
The internal multipass compiler converts BASIC09 source code into a tokenized, optimized, bytecode, called I code. I code differs from the more traditional tokenizing approach found in most BASICs in that a number of items were placed directly in memory instead of using references that then had to be looked up. For instance, in MS based interpreters, a variable reference in code is left in string format; the variable VAR would be represented in memory by the three ASCII characters "VAR". During execution, when this variable is encountered in the code the interpreter has to look up that string in a table of variables, find the associated storage address in memory, and then finally read the value stored in that location. The table is usually constructed so that the value follows the name, to save time during the final lookup. In contrast, in I code the address of the variable is determined in advance and the reference in code is replaced by that address. This avoids a runtime search through the variable table. Other optimizations include a separate FOR/NEXT routine used when the index variable is an INTEGER, and separate INTEGER and REAL math libraries. For added performance, BASIC09 also included the PACK command which took a procedure name and returned an optimized version. Some of these optimizations included removing non coding instructions like code comments and the replacement of constant expressions to a single value. For instance, PACK would recognize that LET x=x+SQR(100)/2 contains only constants on the right, and replaces it with the code x=x+5, which requires only a single operation at runtime, the addition, removing the division and square root. PACK reduced the memory footprint of the procedure and improved performance by about 10 to 30%.
Легкий срок работы
Хотя было обычным запускать программы в среде BASIC09, как и в других версиях BASIC, BASIC09 также поставлялся с отдельной версией для запуска кода, известной как Runb. Runb лишался функций редактирования и отладки, что позволило уменьшить его размер примерно вдвое по сравнению с полной версией BASIC09. Основное назначение Runb заключалось в запуске PACKed-модулей при вызове из других программ. Это означало, что если пользователь вводил имя BASIC09-модуля в командной строке OS/9, и этот модуль был помечен как PACKed, то он открывался и запускался Runb, а не BASIC09. Это снижало потребление памяти и сокращало время загрузки.
Although it was common to run programs within the BASIC09 environment, as it was in other BASICs, BASIC09 also shipped with a separate run only version of the code known as Runb. Runb removed the editing and debugging features of the system, and was about half the size of the full BASIC09 as a result. The purpose of Runb was primarily to run PACKed modules when called from other programs. This meant that if the user typed in the name of a BASIC09 module in the OS/9 command line, and that module has been marked as PACKed, it is opened and run by Runb instead of the BASIC09. This reduces memory footprint and improves load time.