BASIC-PLUS — это расширенный диалект языка программирования BASIC , разработанный Digital Equipment Corporation (DEC) для использования в ее операционной системе с разделением времени RSTS/E для 16-битных миникомпьютеров серии PDP-11 в начале 1970-х годов. 1980-е годы.
BASIC-PLUS был основан на BASIC-8 для TSS/8 , [1] который сам по себе очень близок к оригинальному Dartmouth BASIC . В BASIC-PLUS добавлен ряд новых структур, а также функции JOSS , касающиеся условных операторов и форматирования. В свою очередь, BASIC-PLUS был версией, на основе которой был создан оригинальный Microsoft BASIC . [2]
Примечательным среди дополнений, внесенных в BASIC-PLUS, было введение строковых функций, таких как MID$ и LEFT$ , в дополнение к оригинальной универсальной команде CHANGE Дартмута . В будущих версиях языка, особенно Microsoft, CHANGE был удален, и строковые функции BASIC-PLUS стали единственным способом выполнения подобных операций. Большинство BASIC-ов по сей день следуют этому соглашению.
Позже язык был переписан как настоящий компилятор как BASIC-Plus-2 и портирован на платформу VAX-11 как собственная реализация BASIC для этой машины. Эта версия пережила несколько изменений платформы и сегодня известна как VSI BASIC для OpenVMS .
Пользователи сидели за терминалом и вводили операторы языка программирования. Операторы можно было либо ввести непосредственно в командный интерпретатор системы, либо ввести в текстовый редактор , сохранить в файл и загрузить в командный интерпретатор из файла. Об ошибках в исходном коде пользователю сообщалось сразу после набора строки.
Поскольку интеллектуальный терминал с управлением курсором не мог быть гарантирован, BASIC-PLUS использовал общую систему префикса всего исходного кода с номером строки. Код был отредактирован путем ввода номера и последующего изменения содержимого следующего кода. Строку кода можно было удалить, введя ее номер и ничего больше, тем самым установив для нее пустую строку.
Виртуальное адресное пространство пользователя RSTS/E было ограничено чуть менее 64 КБ. При использовании BASIC-PLUS около половины этого виртуального адресного пространства использовалось объединенным интерпретатором команд и библиотекой времени выполнения (называемой системой времени выполнения в RSTS/E). Это ограничивало пользовательские программы примерно 32 КБ памяти.
Большие программы разбивались на отдельные исполняемые части с помощью этого CHAIN
оператора, и программы могли связываться с определенными номерами строк во вторичной программе, чтобы указать, что программа должна начать выполнение в другой точке, чем ее первая строка. Эта особенность привязки к определенному номеру строки позволяла программам сигнализировать друг другу, что они вызываются из другой программы. Использование раздела общей памяти, называемого общим ядром, также позволяло программам передавать данные друг другу по мере необходимости. Дисковые файлы также можно было использовать, но они работали медленнее.
Для экономии памяти в систему был включен диспетчер памяти для сбора мусора, используемый как для строковых данных, так и для байт-кода.
Выполняемую программу можно было прервать, просмотреть и изменить переменные, а затем возобновить.
BASIC-PLUS тесно связан с более поздними версиями Dartmouth BASIC , включая его мощные MAT
команды. Помимо этого, DEC добавила ряд уникальных структур управления потоком данных.
Номера строк представляли собой положительные целые числа от 1 до 32767. [3] Логические строки кода можно было продолжать на нескольких физических строках, используя перевод строки в конце строки вместо обычного символа возврата каретки . [4] Для облегчения внешнего редактирования исходного файла в более поздних версиях BASIC-PLUS этот &
символ также допускался в качестве символа продолжения строки.
Несколько операторов можно разместить в одной строке, используя :
разделитель операторов. [4] Система позволяла использовать табуляцию в качестве пробелов в строке и делала циклы более понятными, как в современных языках. [5] В комментариях использовалось либо REM
ключевое слово, либо !
символ, [6] в отличие от MS BASIC, где использовались REM
и '
.
Команда PRINT
разделяла экран на области шириной 14 пробелов, а для перемещения между этими местами использовалась запятая; PRINT 1,2,3
выведет 1, 2 и 3 через пробел, [7] в то время как PRINT 1;2;3
оставит один пробел и выдаст «1 2 3». [8] [a] INPUT
позволяло указать строку подсказки, но для ее разделения использовалась точка с запятой, а не запятая; . [9]INPUT "WHAT IS THE VALUE";A
Строки могут быть разделены одинарными или двойными кавычками. [10] В дополнение к функциям CHR
и ASCII
, которые преобразовывали отдельные символы в строковый формат и обратно, [11] BASIC-PLUS также поддерживал команду Дартмута CHANGE
. CHANGE
повторил строку и вернул значение ASCII каждого символа в виде слота в числовом массиве. Например, CHANGE 'HELLO' TO X
будет возвращен массив с пятью кодами ASCII: 110, 105, 114, 114, 105 в элементах с 1 по 5 и числом 5, длиной строки, в элементе 0. [12] Можно выполнить обратный ход. операция также CHANGE X TO A$
будет читать отдельные числа в массиве X и преобразовывать их в строку. [13]
В BASIC-PLUS добавлена концепция «модификаторов операторов», условий, подобных JOSS , которые можно применять к любому оператору. Например, является эквивалентом [14] Было также предусмотрено обратное: эквивалент . [15]PRINT I IF I <> 10
IF I <> 10 THEN PRINT I
PRINT I UNLESS I = 10
IF I <> 10 THEN PRINT I
FOR
циклы работали, как и в других версиях BASIC, и NEXT
команду нельзя было использовать в выражении для досрочного выхода. [16] Вместо этого ключевые слова UNTIL
и WHILE
можно использовать для управления ранним выходом. Например, продолжайте цикл до тех пор, пока I=10, предполагая, что следующий код установит значение I, [17] это означает, что он может завершиться не после 10 итераций, а как только код установит I на 10. [18] Модификаторы могут также может использоваться для создания компактных однострочных циклов, например, будет выполняться до тех пор, пока X не станет 100. [19]FOR I=1 UNTIL I=10
X=X+1 WHILE X<100
Имена переменных в ранних версиях BASIC-PLUS могли состоять из одной буквы или одной буквы, за которой следовала одна цифра. [5] С включением «Режима расширения» в более поздних версиях имена переменных могли иметь длину до 29 символов, а в качестве разрешенного символа была добавлена точка (.). Имя каждой переменной по-прежнему должно было начинаться с буквы. [b] Как и в большинстве версий BASIC, LET
ключевое слово для назначения переменной было необязательным. Он может присваивать нескольким переменным одно значение, например . [20]LET A,B,C=10
Язык поддерживал три типа данных; числа с плавающей запятой, целые числа и строки. Переменные без суффикса были с плавающей запятой (8 байт, диапазон 0,29 × 10).от −38 до 1,7 × 1038 , точность до 16 цифр). Целочисленные переменные (16-битные, диапазон от -32768 до +32767) обозначались суффиксом%
, [21] строковые переменные (длина переменной) обозначались суффиксом$
. [10]
Список математических и логических операторов был типичным для большинства Бейсиков, с некоторыми расширениями. Для математики поддерживались , , и , а также +
альтернативная форма для компьютерных терминалов ,-
которые могли не иметь этого символа. Стандартными логическими сравнениями были , , , , , и . Одним из интересных дополнений стал оператор «приблизительно равно». Это возвратило бы значение true, если бы два числа были напечатаны одинаково, то есть их шесть старших цифр были бы одинаковыми. [22] Логические операторы включали типичные , и , а также , которые возвращают истину, если оба A и B истинны или оба ложны, и который является ложным, если A истинно, а B ложно, а в противном случае всегда истинно. [23]*
/
^
**
^
=
<
>
<=
>=
<>
==
NOT A
A AND B
A OR B
A XOR B
A EQV B
A IMP B
Оператор DIM
может выделять одномерные и двумерные массивы любого из трех типов данных. Диапазон индексов всегда начинался с 0 (но MAT
операторы не устанавливали элементы в строке 0 или столбце 0). [24] [25]
В язык также включен ряд MAT
команд для работы со всем массивом (или MATrix). Команда MAT READ
заполнит матрицу значениями в DATA
операторе, [26] MAT INPUT
заполнит массив введенными пользователем значениями и MAT PRINT
распечатает элементы в формате 1D или 2D. [27] MAT
также можно использовать для установки значений по умолчанию в матрице с использованием связанных ключевых слов, например, MAT A=ZER
для заполнения массива A нулями. [28] TRN
транспонировали бы всю матрицу и INV
инвертировали бы ее. [29] Кроме того, +
, -
, и *
могут использоваться с матрицами, выполняя соответствующую матричную операцию. [30]
Оператор DIM#
«virtual DIM» мог сопоставить «виртуальные массивы данных» или «виртуальные массивы» с файлом на диске, что позволяло использовать массивы, превышающие доступную память компьютера (или даже его адресное пространство), и позволяло использовать элементы массива для чтения, записи и расширения дисковых файлов (постоянное хранилище). Они назвали эту схему «виртуальным хранилищем данных» и «виртуальным ядром», но в ней не использовался современный подход к размещению массивов и файла, отображаемого в памяти . Вместо этого использовался один буфер для одновременного хранения 512 байтов данных, и при доступе к записи в виртуальном массиве соответствующие данные считывались, а старые данные записывались по мере необходимости. Этот CLOSE
оператор вызвал обратную запись буфера (при необходимости) перед закрытием файла. Поскольку никакие дополнительные сектора не кэшировались, доступ к данным в «неправильном» порядке мог увеличить количество обращений к диску. К виртуальным массивам были наложены дополнительные правила, согласно которым один элемент данных никогда не мог охватывать границу записи: каждый тип данных выравнивался по кратному его размеру. Виртуальные строки хранились в виде данных ASCIIZ фиксированной длины с размерами, ограниченными 2, 4, 8, 16, 32, 64, 128, 256 или 512 байтами, и доступ к ним осуществлялся с помощью LSET
и RSET
. [31]
BASIC-PLUS был не интерпретатором, а системой компиляции и запуска : каждая строка BASIC транслировалась в «PPCODE» (Push-Pop Code) по мере ее ввода для последующего быстрого выполнения на виртуальной машине. Эти переводы не маркировали строки BASIC, а переписывали их для использования на стековой машине; вы не можете перевести эти представления обратно в выражения BASIC. Это позволило избежать необходимости многократно декодировать ключевые слова как строки: после преобразования в PPCODE ключевые слова представляли собой числа, указывающие на подпрограммы для запуска этой функции. BASIC-PLUS включал COMPILE
команду, но это не был настоящий компилятор; это просто сохраняло представление PPCODE программы, так что его не нужно было перекомпилировать при следующей загрузке программы BASIC в память. Система хранила программу пользователя в двух форматах. Одним из них был редактируемый исходный код в текстовом формате, созданный с помощью SAVE
команды и обычно помещаемый в файл .BAS. Другой была версия программы PPCODE, созданная командой COMPILE
и сохраненная в файле .BAC; Файлы .BAC были меньше, загружались и работали быстрее, но их нельзя было редактировать. [32]
Сопутствующий продукт под названием Basic Plus 2 («BP2» или BASIC-Plus-2 ) был позже разработан DEC для добавления дополнительных функций и повышения производительности.
Он использовал настоящую компиляцию в многопоточный код и записывал выходные данные в объектные файлы, совместимые с объектными файлами машинного кода, созданными ассемблером и другими языковыми системами. Эти объектные файлы можно хранить в библиотеках. Компоновщик (TKB, также известный как построитель задач) затем создавал исполняемые файлы из объектных файлов и библиотек. TKB также поддерживает наложения; это позволяло при необходимости заменять отдельные подпрограммы в виртуальном адресном пространстве, перекрывая подпрограммы, которые в настоящее время не используются.
Кроме того, программы BP2 работали под управлением системы времени выполнения RSX; этот RTS занимал только 8 КБ виртуального адресного пространства пользователя, оставляя 56 КБ для программы пользователя. [33] (В версии 9 RSTS/E появилось отдельное пространство инструкций и данных, а также «исчезающая» система времени выполнения RSX, позволяющая использовать до 64 КБ каждого кода инструкции и данных.) Эти два фактора позволили отдельным программам BP2 быть намного больше. чем программы BASIC-PLUS, что часто снижает необходимость в ЦЕПИ между несколькими программами.
В отличие от BASIC-PLUS (который был доступен только в RSTS/E), BP2 также был доступен для операционной системы RSX-11 . Программы BP2 также были более совместимы с более поздним VAX BASIC .
Microsoft BASIC очень близок к BASIC-PLUS. [2] В более ранних версиях MS BASIC, серии 1.x, отсутствовали целочисленные переменные, но они были добавлены в серии 2.x, которая была обнаружена на многих машинах, включая более поздние модели Commodore PET и Commodore 64 . Возможность размещать логические и циклические команды в строке, как бы I = I + 1 UNTIL I = 10
не копировалась и не присутствует ни в одной распространенной версии микрокомпьютерного Бейсика. В MS BASIC также отсутствовали матричные команды.
FOR I=STOP
они интерпретировались как .FOR I = S TO P