Парадигма | императив |
---|---|
Впервые появилась | 1970; 50 лет назад (1970 г.) |
OS | RSTS / E |
Под влиянием | |
Dartmouth BASIC, Tymshare SUPER BASIC | |
Под влиянием | |
Microsoft BASIC |
BASIC-PLUS является расширенным диалектом BASIC языка программирования, который был разработан Digital Equipment Corporation (DEC) для использования на его RSTS / E операционная система с разделением времени для 16-разрядных миникомпьютеров серии PDP-11 с начала 1970-х по 1980-е годы.
BASIC-PLUS был основан на BASIC-8 для TSS / 8, который сам очень близко основан на оригинальном Dartmouth BASIC. BASIC-PLUS добавил ряд новых структур, а также функции из JOSS, касающиеся условных операторов и форматирования. В свою очередь, BASIC-PLUS был версией, на которой был скопирован оригинальный Microsoft BASIC.
Язык был позже переписан как настоящий компилятор на BASIC -Plus-2, и был перенесен на платформу VAX-11 в качестве собственной реализации BASIC этой машины. Эта версия пережила несколько изменений платформы и сегодня известна как VSI BASIC для OpenVMS.
Пользователи садились за терминал и печатали в операторах языка программирования. Операторы могут быть либо непосредственно введены в системный интерпретатор команд , либо введены в, сохранены в файл и загружены в командный интерпретатор из файла. Об ошибках в исходном коде пользователю сообщалось сразу после ввода строки.
Поскольку интеллектуальный терминал с управлением курсором не мог быть гарантирован, BASIC-PLUS использовал общую систему префикса всего исходного кода с номером строки. Код был отредактирован путем ввода номера и последующего изменения содержимого следующего кода. Строку кода можно удалить, введя ее номер и ничего больше, тем самым установив для нее пустую строку.
Виртуальное адресное пространство пользователя RSTS / E было ограничено чуть менее 64 КБ пространства. При использовании BASIC-PLUS около половины этого виртуального адресного пространства использовалось объединенным интерпретатором команд и библиотекой времени выполнения (названной системой времени выполнения в RSTS / E). Это ограничивало пользовательские программы примерно 32 кБ памяти.
Большие программы были разбиты на различные части с помощью оператора CHAIN
, и программы могли связать с определенными номерами строк во вторичной программе, чтобы указать, что программа должен начинать выполнение с другой точки от его первой строки. Эта функция привязки к определенному номеру строки позволяла программам сигнализировать друг другу, что они вызываются из другой программы. Использование раздела разделяемой памяти под названием core common также позволяло программам передавать данные друг другу по мере необходимости. Файлы с диска также можно было использовать, но они работали медленнее.
Для экономии памяти в систему включен диспетчер памяти для сбора мусора, используемый как для строковых данных, так и для байт-кода.
Выполняющуюся программу можно прервать, проверить и изменить переменные, а затем возобновить.
BASIC-PLUS во многом повторяет более поздние версии Dartmouth BASIC, включая его мощные команды MAT
. Вдобавок к этому DEC добавила ряд уникальных структур управления потоком.
Номера строк были положительными целыми числами от 1 до 32767. Логические строки кода можно было продолжить на нескольких физических строках, используя перевод строки в конце строки вместо обычного символ возврата каретки. Для облегчения внешнего редактирования исходного файла более поздние версии BASIC-PLUS также допускали использование символа и
в качестве символа продолжения строки.
В одну строку можно поместить несколько операторов, используя :
в качестве разделителя операторов. Система позволяла использовать табуляции в качестве встроенных пробелов и использовалась для того, чтобы сделать циклы более понятными, как в современных языках. В комментариях использовалось ключевое слово REM
или символ !
, в отличие от MS BASIC, в которых использовались имена переменных REM
и '
.
в ранних версиях BASIC. -PLUS может быть одной буквой или одной буквой, за которой следует одна цифра. С включением «Режима расширения» в более поздних версиях имена переменных могли быть длиной до 29 символов, а точка (.) Была добавлена как разрешенный символ. Однако каждое имя переменной должно начинаться с буквы.
Как и в большинстве версий BASIC, ключевое слово LET
для присвоения переменных было необязательным. Он может установить несколько переменных в одно значение, например LET A, B, C = 10
. Язык поддерживает три типа данных; числа с плавающей запятой, целые числа и строки. Переменные без суффикса были с плавающей запятой (8 байтов, диапазон от 0,29 x 10E-38 до 1,7 x 10E38, точность до 16 знаков). Целочисленные переменные (16-битные, диапазон от -32768 до +32767) обозначались суффиксом %
, строковые переменные (переменной длины) обозначались суффиксом $
.
Оператор DIM
может выделять одномерные и двухмерные массивы любого из трех типов данных. Диапазон индексов всегда начинался с 0 (но операторы MAT
не устанавливали элементы в строке 0 или столбце 0).
Оператор DIM #
«виртуальный DIM» мог отображать "виртуальные массивы данных" или "виртуальные массивы" в файл на диске, что позволяло использовать массивы больше, чем доступная память компьютера (или даже его адресное пространство), и позволяло использовать элементы массива для чтения, записи, и расширить файлы на диске (постоянное хранилище). Они назвали эту схему «виртуальным хранилищем данных» и «виртуальным ядром», но при этом не использовался современный подход к размещению массивов и отображенного в память файла в той же виртуальной памяти и затем разрешая диспетчеру виртуальной памяти обрабатывать весь доступ через подкачку. Вместо этого программа сначала выполнит оператор OPEN
, который открывает файл со связанным номером файла и назначает ему один файловый буфер с одной записью (512 байт). Затем оператор DIM #
свяжет область данных этого файла с одним или несколькими массивами, которые можно «использовать» так же, как любой массив на основе памяти. При каждом доступе к элементу виртуального массива BASIC-PLUS будет вычислять, какая запись файла содержит данные. Если правильной записи не было в буфере файла, он прочитает эту запись. (Если бы в буфер была произведена запись, он бы записал этот «грязный» буфер обратно на диск перед чтением новой записи.) Когда присутствует правильная запись, BASIC-PLUS скопирует данные в правую часть или из правой части буфер. Оператор CLOSE
вызывал перезапись буфера (при необходимости) перед закрытием файла. Поскольку никакие дополнительные секторы не кэшировались, доступ к данным в «неправильном» порядке мог умножить количество обращений к диску. Дополнительные правила были наложены на виртуальные массивы, так что один элемент данных никогда не мог перекрывать границу записи: каждый тип данных был выровнен по кратному своему размеру. Виртуальные строки хранились как данные ASCIIZ фиксированной длины с размерами, ограниченными 2, 4, 8, 16, 32, 64, 128, 256 или 512 байтами, и доступ к ним осуществлялся с помощью LSET
и RSET
.
В язык также включен ряд команд MAT
для работы со всем массивом (или MATrix). Команда MAT READ
заполняет матрицу значениями в операторе DATA
, MAT INPUT
заполняет массив значениями, введенными пользователем, а MAT PRINT
распечатает элементы в 1D или 2D формате. MAT
может также использоваться для установки значений по умолчанию в матрице с использованием связанных ключевых слов, например, MAT A = ZER
заполнит массив A нулями. TRN
преобразует всю матрицу, а INV
инвертирует ее. Кроме того, +
, -
и *
можно использовать в матрицах, выполняя соответствующую матричную операцию.
Команда PRINT
разделяет экран на области шириной 14 пробелов, и запятая использовалась для перемещения между этими местами; PRINT 1,2,3
выведет 1, 2 и 3 с разнесением, а PRINT 1; 2; 3
оставит один пробел и выдаст «1 2 3 ". INPUT
позволяет указать строку приглашения, но использует точку с запятой для ее разделения, а не запятую; ВВОД «ЧТО ТАКОЕ ЗНАЧЕНИЕ»; A
.
Строки могут быть разделены одинарными или двойными кавычками. В дополнение к функциям CHR
и ASCII
, которые преобразовывают отдельные символы в строковый формат и из него, BASIC-PLUS также поддерживает мощную команду Дартмута CHANGE
. CHANGE
выполняет итерацию строки и возвращает значение ASCII каждого символа как слот в числовом массиве. Например, CHANGE 'HELLO' TO X
вернет массив из пяти элементов. Можно также отменить операцию: CHANGE X TO A $
считывает отдельные числа в массиве X и конвертирует их в строку.
Циклы FOR
работали так же, как в более поздних версиях BASIC, а команду NEXT
нельзя использовать в выражении. Вместо этого можно использовать ключевые слова UNTIL
и WHILE
для управления ранним выходом. Например, FOR I = 1 UNTIL 10
продолжить цикл до тех пор, пока I = 10, с предположением, что следующий код установит значение I.
BASIC-PLUS также позволяет большинству управляющих структур размещаться после других команд. Например, PRINT I IF I <10
эквивалентно IF I>= 10 THEN PRINT I
Также было предусмотрено обратное: PRINT I UNLESS I = 10
был эквивалентом IF I <>10 THEN PRINT I
. Использование условного выражения может создать цикл, например, X = X + 1 WHILE X <100
будет повторяться до тех пор, пока X не станет 100. Это предложило компактный формат для многих общих структур цикла.
BASIC-PLUS была не интерпретатором, а системой compile and go : каждая строка BASIC переводилась в "PPCODE" (Push-Pop Code) по мере ввода, для последующего быстрого выполнения на своей виртуальной машине. Эти переводы не токенизировали строки BASIC, но переписывали их для использования на стековой машине; вы не можете перевести эти представления обратно в операторы BASIC. Это избавило от необходимости многократно декодировать ключевые слова как строки: после преобразования в PPCODE ключевые слова были числами, указывающими на подпрограммы для запуска этой функции. BASIC-PLUS включал команду COMPILE
, но это не был настоящий компилятор; это просто сохраняло представление PPCODE программы, так что его не нужно было перекомпилировать при следующей загрузке программы BASIC в память. Система хранит программу пользователя в двух форматах. Один из них - это редактируемый исходный код в текстовом формате, созданный с помощью команды SAVE
и обычно помещаемый в файл.BAS. Другой был PPCODE-версией программы, созданной командой COMPILE
и сохраненной в файле.BAC; Файлы.BAC были меньше, загружались и работали быстрее, но их нельзя было редактировать.
Связанный продукт под названием Basic Plus 2 («BP2» или BASIC-Plus-2 ), позже был разработан DEC для добавления дополнительных функций и повышения производительности.
Он использовал настоящую компиляцию в многопоточный код и записывал свой вывод в объектные файлы, совместимые с объектными файлами машинного кода, созданными ассемблером и другими языковыми системами. Эти объектные файлы могут храниться в библиотеках. Компоновщик (построитель задач TKB) затем создал исполняемые файлы из объектных файлов и библиотек. TKB также поддерживает оверлеи; это позволяло при необходимости переносить отдельные подпрограммы в виртуальное адресное пространство, перекрывая подпрограммы, которые в настоящее время не используются. Кроме того, программы
BP2 работали в системе времени выполнения RSX; этот RTS занимал только 8 КБ виртуального адресного пространства пользователя, оставляя 56 КБ для программы пользователя. (В RSTS / E версии 9 было введено отдельное пространство инструкций и данных, а также «исчезающая» система времени выполнения RSX, разрешающая до 64 Кбайт каждого кода инструкции и данных.) Эти два фактора позволили отдельным программам BP2 быть намного больше, чем BASIC- PLUS, что часто снижает необходимость в ЦЕПИ между несколькими программами.
В отличие от BASIC-PLUS (который был доступен только в RSTS / E), BP2 также был доступен для операционной системы RSX-11. Программы BP2 также были более совместимы с более поздней версией VAX BASIC.
Microsoft BASIC был очень похож на BASIC-PLUS. В более ранних версиях MS BASIC, серии 1.x, отсутствовали целочисленные переменные, но они были добавлены в серию 2.x, которая использовалась на многих машинах, включая более поздние модели Commodore PET и Коммодор 64. Возможность размещать логические и циклические команды в строке, например I = I + 1 UNTIL I = 10
не была скопирована и не появляется ни в одной из распространенных версий микрокомпьютерного BASIC. В MS BASIC также отсутствовали матричные команды.