Введение

Диалект языка программирования 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 использовал общепринятую систему, заключающуюся в добавлении номера строки ко всем строкам исходного кода. Код редактировался путем ввода номера строки, а затем изменения содержимого этой строки. Строку кода можно было удалить, просто введя ее номер строки, что приводило к замене ее на пустую строку. Виртуальное адресное пространство пользователя 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 и преобразовывала их в строку.

Изменители высказываний

BASIC PLUS добавил понятие "модификаторы операторов", условия, подобные JOSS, которые можно было применять к любому оператору. Например, эквивалентно , а обратное – эквивалентно . Циклы работали как в других версиях BASIC, и команду нельзя было использовать в выражении для досрочного выхода из цикла. Вместо этого для управления досрочным выходом можно было использовать ключевые слова и . Например, продолжать цикл, пока I не станет равно 10, при условии, что последующий код установит значение I, то есть выход может произойти не после 10 итераций, а сразу после того, как код присвоит I значение 10. Модификаторы также можно было использовать для создания компактных однострочных циклов, например, цикл будет выполняться, пока X не станет равно 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 нулями. транспонировала матрицу, а инвертировала ее. Кроме того, , , и могли использоваться для матриц, выполняя соответствующие матричные операции.

Обработка файлов

Оператор "виртуальный 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 также не поддерживал матричные команды.