Введение
Диалект языка программирования BASIC, используемый в операционной системе RSTS/E на компьютерах PDP 11. BASIC PLUS – расширенный диалект языка программирования BASIC, разработанный компанией Digital Equipment Corporation (DEC) для использования в операционной системе RSTS/E на 16-битных миникомпьютерах серии PDP 11 в начале 1970-х – 1980-х годах. BASIC PLUS был основан на BASIC 8 для TSS/8, который, в свою очередь, был очень тесно связан с оригинальным BASIC, разработанным в Дартмутском колледже. BASIC PLUS добавил ряд новых структур, а также заимствовал функции из JOSS, касающиеся условных операторов и форматирования. BASIC PLUS послужил основой для создания оригинального Microsoft BASIC. Среди заметных дополнений в BASIC PLUS – внедрение строковых функций, таких как и , в дополнение к универсальной команде оригинального Dartmouth BASIC. В последующих версиях языка, в частности, в Microsoft BASIC, был удален, и строковые функции BASIC PLUS стали единственным способом выполнения подобных операций. Большинство версий BASIC до сих пор придерживаются этой традиции. Позже язык был переписан как полноценный компилятор под названием BASIC Plus 2 и портирован на платформу VAX 11, став его встроенной реализацией BASIC. Эта версия пережила несколько смен платформ и сегодня известна как VSI BASIC для OpenVMS.
BASIC PLUS is an extended dialect of the BASIC programming language that was developed by Digital Equipment Corporation (DEC) for use on its RSTS/E time sharing operating system for the PDP 11 series of 16 bit minicomputers in the early 1970s through the 1980s. BASIC PLUS was based on BASIC 8 for the TSS/8, itself based very closely on the original Dartmouth BASIC. BASIC PLUS added a number of new structures, as well as features from JOSS concerning conditional statements and formatting. In turn, BASIC PLUS was the version on which the original Microsoft BASIC was patterned. Notable among the additions made to BASIC PLUS was the introduction of string functions like and , in addition to Dartmouth's original all purpose command. In future versions of the language, notably Microsoft's, was removed and BASIC PLUS's string functions became the only ways to perform these sorts of operations. Most BASICs to this day follow this convention. The language was later rewritten as a true compiler as BASIC Plus 2, and was ported to the VAX 11 platform as that machine's native BASIC implementation. This version survived several platform changes, and is today known as VSI BASIC for OpenVMS.
Операция
Пользователи работали за терминалом и вводили операторы языка программирования. Эти операторы можно было вводить непосредственно в командный интерпретатор системы или в текстовый редактор, сохранять в файл и загружать из файла в командный интерпретатор. Ошибки в исходном коде сообщались пользователю сразу после ввода строки. Поскольку наличие интеллектуального терминала с управлением курсором не гарантировалось, BASIC PLUS использовал общепринятую систему, заключающуюся в добавлении номера строки ко всем строкам исходного кода. Код редактировался путем ввода номера строки, а затем изменения содержимого этой строки. Строку кода можно было удалить, просто введя ее номер строки, что приводило к замене ее на пустую строку. Виртуальное адресное пространство пользователя RSTS/E было ограничено чуть менее чем 64 КБ. При использовании BASIC PLUS около половины этого виртуального адресного пространства занимали командный интерпретатор и библиотека времени выполнения (на RSTS/E называемая Run Time System). Это ограничивало размер пользовательских программ примерно 32 КБ памяти. Большие программы разбивались на отдельные исполняемые фрагменты с помощью оператора, а программы могли переходить к определенным номерам строк во вторичной программе, чтобы указать, что выполнение должно начаться не с первой строки. Эта возможность перехода к определенному номеру строки позволяла программам сигнализировать друг другу о том, что они были вызваны из другой программы. Для передачи данных между программами также использовался общий сегмент памяти, называемый core common. Можно было использовать и дисковые файлы, но они работали медленнее. Для экономии памяти система включала менеджер памяти со сборкой мусора, который использовался как для строковых данных, так и для байт-кода. Выполняющуюся программу можно было прервать, изучить и изменить значения переменных, а затем продолжить ее выполнение.
Синтаксис и особенности
BASIC PLUS тесно основан на более поздних версиях Dartmouth BASIC, включая его мощные команды MAT. Помимо этого, DEC добавила ряд уникальных конструкций управления потоком выполнения.
Редактирование
Числа строк были положительными целыми числами от 1 до 32767. Логические строки кода могли быть продолжены на нескольких физических строках, используя символ новой строки в конце строки вместо обычного символа возврата каретки. Для удобства внешнего редактирования исходного файла, более поздние версии BASIC PLUS также допускали символ обратной косой черты (\) в качестве символа продолжения строки. Несколько операторов могли быть размещены на одной строке, используя двоеточие (:) в качестве разделителя операторов. Система позволяла использовать табуляции в качестве встроенных пробелов и применялась для повышения наглядности циклов, как в современных языках программирования. Комментарии использовали либо ключевое слово REM, либо символ апострофа ('), в отличие от MS BASIC, которые использовали REM и апостроф (').
Стандартные отчеты
Команда разделила экран на области шириной 14 символов, и запятая использовалась для перехода между этими позициями; выводила бы 1, 2 и 3 с пробелами между ними, в то время как оставляла бы один пробел и выдавала "1 2 3". позволяла указать строку запроса, но использовала точку с запятой для её разделения, а не запятую; строки могли быть заключены в одинарные или двойные кавычки. В дополнение к функциям `CHR$` и `ASC`, которые преобразовывали отдельные символы в строковый формат и обратно, BASIC PLUS также поддерживал команду `VAL` из Dartmouth. `VAL` проходила по строке и возвращала ASCII-код каждого символа в виде элемента числового массива. Например, `VAL "nirri"` вернула бы массив с пятью кодами ASCII: 110, 105, 114, 114, 105, в элементах с 1 по 5, а также число 5, длину строки, в элементе 0. Можно было выполнить и обратную операцию: команда читала отдельные числа из массива X и преобразовывала их в строку.
Strings could be delimited by single or double quotes. In addition to the and functions that converted single characters to and from string format, BASIC PLUS also supported Dartmouth's command. iterated the string and returned each character's ASCII value as a slot in a numeric array. For instance, would return an array with the five ASCII codes, 110, 105, 114, 114, 105, in elements 1 through 5, and the number 5, the length of the string, in element 0. One could reverse the operation as well, would read the individual numbers in the X array and convert it to a string.
Изменители высказываний
BASIC PLUS добавил понятие "модификаторы операторов", условия, подобные JOSS, которые можно было применять к любому оператору. Например, эквивалентно , а обратное – эквивалентно . Циклы работали как в других версиях BASIC, и команду нельзя было использовать в выражении для досрочного выхода из цикла. Вместо этого для управления досрочным выходом можно было использовать ключевые слова и . Например, продолжать цикл, пока I не станет равно 10, при условии, что последующий код установит значение I, то есть выход может произойти не после 10 итераций, а сразу после того, как код присвоит I значение 10. Модификаторы также можно было использовать для создания компактных однострочных циклов, например, цикл будет выполняться, пока X не станет равно 100.
loops worked as in other versions of BASIC, and the command could not be used in an expression to exit early. Instead, the and keywords could be used to control early exits. For instance, continue looping until I=10, with the assumption that following code would set the value of I, meaning it might not exit after 10 iterations but as soon as the code set I to 10. Modifiers could also be used to build compact one line loops, for instance, would loop until X was 100.
Переменные, выражения и матрицы
Имена переменных в ранних версиях BASIC PLUS могли состоять из одной буквы или одной буквы, за которой следовала одна цифра. С включением режима "Extend mode" в более поздних версиях, имена переменных могли быть длиной до 29 символов, и точка (.) была добавлена в качестве допустимого символа. Каждое имя переменной по-прежнему должно было начинаться с буквы. Как и в большинстве версий BASIC, ключевое слово для присваивания значений переменным было необязательным. Оно могло присваивать несколько переменных одному и тому же значению, например, язык поддерживал три типа данных: числа с плавающей точкой, целые числа и строки. Переменные без суффикса были числами с плавающей точкой (8 байт, диапазон от 0,29 до 1,7, до 16 знаков точности). Целые переменные (16 бит, диапазон от −32768 до +32767) обозначались суффиксом, а строковые переменные (переменная длина) – суффиксом. Список математических и логических операторов был типичным для большинства BASIC, с некоторыми дополнениями. Для математических операций поддерживались , , , и , а также в качестве альтернативной формы для компьютерных терминалов, которые могли не поддерживать этот символ. Стандартными логическими сравнениями были , , , , , и . Интересным дополнением был оператор, обозначающий "приблизительно равно". Он возвращал истину, если два числа отображались бы одинаково, то есть их шесть наиболее значащих цифр совпадали. Логические операторы включали типичные , и , а также , который возвращает истину, если A и B одновременно истинны или одновременно ложны, и , который возвращает ложь, если A истинно, а B ложно, и в противном случае всегда возвращает истину. Оператор мог выделять одномерные и двумерные массивы любого из трех типов данных. Диапазон индексов всегда начинался с 0 (но операторы не устанавливали элементы в строке 0 или столбце 0). Язык также включал ряд команд для работы со всем массивом (или MATрицей). Команда заполняла матрицу значениями из оператора, заполняла массив значениями, введенными пользователем, и выводила элементы в формате 1D или 2D. Также можно было использовать для установки значений по умолчанию в матрице с помощью связанных ключевых слов, например, заполняла массив A нулями. транспонировала матрицу, а инвертировала ее. Кроме того, , , и могли использоваться для матриц, выполняя соответствующие матричные операции.
The language supported three data types; floating point numbers, integers, and strings. Variables with no suffix were floating point (8 bytes, range 0.29 to 1.7, up to 16 digits of precision). Integer variables (16 bit, range −32768 to +32767) were indicated with a suffix, string variables (variable length) were indicated with a suffix. The list of mathematical and logical operators was typical of most BASICs, with some extensions. For math, , , , and were supported, along with as an alternate form of for computer terminals that might not have that character. Standard logical comparisons were , , , , , and One interesting addition was the operator, for "approximately equal". This would return true if the two numbers would be printed the same, that is, their six most significant digits were the same. Logical operators included the typical , and , along with , which return true if both A and B are true or both are false, and which is false if A is true and B is false and otherwise always true. The statement could allocate one dimensional and two dimensional arrays of any of the three data types. The range of subscripts always began with 0 (but statements did not set elements in row 0 or column 0). The language also included a number of commands to work with the entire array (or MATrix). The command would fill the matrix with values in a statement, would fill the array with user typed values, and would print out the elements in a 1D or 2D format. could also be used to set default values in a matrix using associated keywords, for instance, would fill the A array with zeros. would transpose an entire matrix, and would invert it. Additionally, , , and could be used on matrixes, performing the associated matrix operation.
Обработка файлов
Оператор "виртуальный DIM" мог сопоставлять "виртуальные массивы данных" или "виртуальные массивы" с файлом на диске, что позволяло использовать массивы, превышающие доступную память компьютера (или даже его адресное пространство), а также использовать элементы массива для чтения, записи и расширения файлов на диске (постоянное хранилище). Они называли эту систему "виртуальным хранилищем данных" и "виртуальной памятью", но она не использовала современный подход, заключающийся в выделении массивов и файла с отображением в память. Вместо этого использовался единый буфер для хранения 512 байт данных за один раз, и при обращении к элементу виртуального массива соответствующие данные считывались, а старые данные записывались обратно, если это требовалось. Оператор приводил к тому, что буфер перезаписывался на диск (при необходимости) перед закрытием файла. Поскольку дополнительные секторы не кэшировались, доступ к данным в "неправильном" порядке мог многократно увеличивать количество обращений к диску. На виртуальные массивы накладывались дополнительные ограничения: один элемент данных не мог пересекать границу записи; каждый тип данных выравнивался по границе, кратной его размеру. Виртуальные строки хранились как данные ASCIIZ фиксированной длины, с размерами, ограниченными значениями 2, 4, 8, 16, 32, 64, 128, 256 или 512 байт, и к ним обращались с помощью и .
Виртуальная машина
BASIC PLUS не был интерпретатором, а системой компиляции и немедленного запуска: каждая строка BASIC преобразовывалась в "PPCODE" (Push Pop Code) по мере ввода, для последующего быстрого выполнения на виртуальной машине. Эти преобразования не разбивали строки BASIC на токены, а переписывали их для использования на стековой машине; эти представления нельзя было преобразовать обратно в операторы BASIC. Это позволило избежать необходимости многократной декодировки ключевых слов как строк: после преобразования в PPCODE ключевые слова становились числами, указывающими на подпрограммы для выполнения соответствующей функции. BASIC PLUS включал команду, но это не был полноценный компилятор; она просто сохраняла PPCODE-представление программы, чтобы не приходилось перекомпилировать её при следующей загрузке BASIC-программы в память. Система хранила программу пользователя в двух форматах. Один – редактируемый исходный код в текстовом формате, создаваемый с помощью команды и обычно сохраняемый в файле BAS. Другой – версия программы в PPCODE, создаваемая командой и сохраняемая в файле BAC; файлы BAC были меньше и загружались быстрее, но не подлежали редактированию.
BASIC плюс 2
Позже DEC разработала связанный продукт под названием Basic Plus 2 ("BP2" или BASIC Plus 2), чтобы добавить дополнительные функции и повысить производительность. В нем использовалась настоящая компиляция в потоковый код, а результаты выводились в объектные файлы, совместимые с объектными файлами машинного кода, генерируемыми ассемблером и другими языковыми системами. Эти объектные файлы можно было хранить в библиотеках. Затем компоновщик (TKB, также известный как построитель задач) создавал исполняемые файлы из объектных файлов и библиотек. TKB также поддерживал наложения, что позволяло подгружать отдельные подпрограммы в виртуальное адресное пространство по мере необходимости, заменяя ими неиспользуемые подпрограммы. Кроме того, программы BP2 работали под управлением RSX Run Time System; эта RTS занимала всего 8 КБ виртуального адресного пространства пользователя, оставляя 56 КБ для программы пользователя. (В RSTS/E версии 9 было введено раздельное пространство для инструкций и данных, а также "исчезающая" RSX Run Time System, позволяющая использовать до 64 КБ для кода и данных соответственно.) Эти два фактора позволяли отдельным программам BP2 быть значительно больше, чем программам BASIC PLUS, часто снижая необходимость в использовании оператора CHAIN для объединения нескольких программ. В отличие от BASIC PLUS (доступного только для RSTS/E), BP2 также был доступен для операционной системы RSX 11. Программы BP2 также были более совместимы с более поздней версией VAX BASIC.
Сравнение с MS BASIC
Microsoft BASIC был тесно смоделирован по образцу BASIC PLUS. В более ранних версиях MS BASIC, серии 1.x, отсутствовали целочисленные переменные, но они были добавлены в серии 2.x, которая встречалась на многих компьютерах, включая более поздние модели Commodore PET и Commodore 64. Возможность размещать логические и операторы циклов в одной строке, как , не была перенесена и не встречается ни в одной распространенной версии BASIC для микрокомпьютеров. MS BASIC также не поддерживал матричные команды.