HP Time-Shared BASIC ( HP TSB ) — интерпретатор языка программирования BASIC для линейки мини- компьютеров HP 2000 компании Hewlett-Packard с разделением времени . TSB исторически известен как платформа, на которой были выпущены первые публичные версии игры Star Trek .
Система реализует диалект BASIC, а также элементарную учетную запись пользователя и библиотеку программ, что позволяет нескольким людям использовать систему одновременно. Эти системы были основной силой в начале-середине 1970-х годов и генерировали большое количество программ. HP поддерживала базу данных программ, предоставленных другими, и клиенты могли заказывать их на перфоленте за номинальную плату.
Большинство BASIC 1970-х годов ведут свою историю от оригинального Dartmouth BASIC 1960-х годов, но ранние версии Dartmouth не обрабатывали строковые переменные и не предлагали функции манипуляции строками. Поставщики добавляли собственные решения; HP использовала систему, похожую на Fortran и другие языки с нарезкой массива , в то время как DEC позже представила эти MID/LEFT/RIGHT
функции.
С появлением микрокомпьютеров на рынке в середине 1970-х годов появилось много новых BASIC, которые основывали свои парсеры на синтаксисе DEC или HP. Altair BASIC , первоначальная версия того, что стало Microsoft BASIC , была создана по образцу BASIC-PLUS от DEC. Другие, включая Integer BASIC от Apple , Atari BASIC и North Star BASIC, были созданы по образцу HP. Это несколько затрудняло преобразования между этими платформами, если сталкивалась с обработкой строк.
Программное обеспечение также было известно по его версии, привязанной к версии оборудования, на котором оно работало, например, HP 2000C Time-Shared BASIC , а операционная система выпускалась в различных вариантах — 2000A, 2000B, 2000C, High-Speed 2000C, 2000E и 2000F.
HP также называла язык "Access BASIC" в некоторых публикациях. Это совпадало с наименованием машин, на которых он работал, известных как "2000/Access" в некоторых публикациях. Эта терминология, по-видимому, использовалась лишь недолгое время, когда платформа была впервые запущена.
За исключением систем 2000A и 2000E, система реализована с использованием двухпроцессорной архитектуры . Один полностью сконфигурированный процессор серии HP 2100 используется для выполнения большей части системного кода и всего пользовательского кода, в то время как второй, меньший процессор серии HP 2100 используется для обработки последовательных линий RS-232 , через которые подключались пользователи с разделением времени . В зависимости от конфигурации оборудования система поддерживает до 16 или до 32 одновременных удаленных пользователей.
Обычным терминалом для системы TSB был Teletype Model 33 ASR, подключенный напрямую к процессору ввода-вывода или через модем или акустический соединитель . Имена учетных записей представляют собой комбинацию одного буквенного символа, за которым следуют три десятичных цифры, например , B001. Привилегированные учетные записи начинались с буквы «A» и имели некоторые дополнительные возможности хранения команд и программ. Учетная запись суперпользователя — A000. Эта схема допускает до 26 000 учетных записей пользователей.
Во время выполнения пользовательские программы передаются на фиксированный привод головки — физически диск, но работающий как магнитный барабан . Когда пользовательские программы не выполняются, они хранятся на картридже с подвижной головкой или дисковом хранилище с пакетной загрузкой . Привилегированные пользователи также могут хранить программы на гораздо более быстром барабане. Резервное копирование жесткого диска производилось на магнитную ленту .
Имена программ и файлов состоят из смеси до шести буквенных символов (AZ) и цифр (0-9). Программы хранятся в токенизированном формате с помощью команды SAVE. Их также можно хранить в полукомпилированном формате с помощью команды CSAVE, что позволяет им запускаться быстрее. Поскольку система была тесно связана с использованием общедоступных телетайпов, окончания строк в файлах состояли из символа возврата каретки (ASCII CR, 0D шестнадцатеричный), за которым следовал символ перевода строки (ASCII LF, 0A шестнадцатеричный).
Язык представляет собой довольно стандартную реализацию BASIC, предоставляющую интегрированную среду редактирования и выполнения. Операторы анализируются на предмет правильности синтаксиса по мере их ввода, а затем сохраняются в токенизированной форме. Каждый оператор BASIC должен находиться на уникально пронумерованной строке, например
10 ПЕЧАТЬ "ПРИВЕТ, МИР"
Номера строк обязательны, и операторы автоматически размещаются в возрастающей числовой последовательности. Строки TSB могут содержать один оператор; объединение нескольких операторов с двоеточием, как в MS BASIC, не поддерживается. Разрешено назначение нескольких переменных, например , , . Как и в большинстве версий BASIC, использование слова «LET» было необязательным.20 LET A=B=C=42
В самой ранней версии (2000A) язык поддерживал следующие возможности. [1] В более поздних версиях было добавлено гораздо больше возможностей. [2]
GOTO
операторов и подпрограмм с помощью операторов GOSUB
иRETURN
IF/THEN
операторGOTO/OF
иGOSUB/OF
FOR
Блок-цикл и NEXT
операторы на основе переменныхDATA
, READ
, иRESTORE
INPUT
, READ #
, PRINT
, PRINT #
, иIF END #
MAT READ, MAT INPUT, MAT PRINT, MAT=
) и операций ( +, -, *, ZER, CON, IDN, INV, TRN
)AND, OR, NOT
) и реляционные операторы ( <, <=, =, #, <>, >=, and >
)SIN, COS, TAN, ATN
), логарифмы ( LOG, EXP
), квадратный корень ( SQR
), генератор случайных чисел ( RND
), другие ( ABS, INT, SGN, MIN, MAX)
, и определяемые пользователем функцииСтроки в TSB рассматриваются как массив символов, а не как один многосимвольный объект. По умолчанию им выделяется один символ в памяти, и если требуется строка большей длины, их необходимо указать перед использованием. Например, создаст строку, которая может содержать максимум 10 символов. Максимальная длина строки в TSB составляет 255 символов. [3]DIM A$[10]
Доступ к подстрокам внутри строк осуществляется с помощью нотации « нарезки »: или , где подстрока начинается с самого левого символа, указанного индексом L, и продолжается до самого правого символа, указанного индексом R, или формы, где подстрока начинается с самого левого символа, указанного индексом L, и продолжается до конца строки. TSB принимает () или [] взаимозаменяемо. Индексы массивов и подстрок начинаются с 1.A$(L,R)
A$[L,R]
A$[L]
Это резко контрастирует с BASIC, следующим шаблону DEC, который использует такие функции LEFT$()
, как MID$()
, и RIGHT$()
для доступа к подстрокам, хотя ANSI BASIC продолжает использовать синтаксис подстрок, аналогичный введенному Hewlett-Packard. Нотация HP также может использоваться на стороне назначения оператора LET или INPUT для изменения части существующего строкового значения, например или , что невозможно было сделать с ранними реализациями LEFT/MID/RIGHT.100 A$[3,5]="XYZ"
120 B$[3]="CHANGE ALL BUT FIRST TWO CHARS"
Главное преимущество этого стиля доступа к строкам заключается в том, что он устраняет необходимость в сложном управлении памятью , которое в противном случае потребовалось бы при изменении длины строк. MS BASIC имел длинную библиотеку для обработки сжатия памяти путем удаления мертвого пространства в куче строк , когда система исчерпывала память. Он также был печально известен своей медлительностью и несколько раз модифицировался в течение своего существования с целью повышения производительности или исправления ошибок. [4] Недостатком стиля TSB является то, что строка всегда занимает весь объем пространства DIMed, даже если строка внутри пуста, и простые задачи, такие как конкатенация, могут потенциально переполнить строку, если изначально не был установлен большой размер.
Более поздние версии Dartmouth BASIC включали строковые переменные, основанные на том же шаблоне, что и в BASIC-PLUS и MS BASIC. Однако эта версия не использовала функции LEFT/MID/RIGHT для работы со строками, а вместо этого использовала команду CHANGE
, которая преобразовывала строку в эквивалентные значения ASCII и обратно. HP включала идентичную функциональность, изменив только имя на CONVERT
. [5] [a] Кроме того, можно было использовать одинарные кавычки для преобразования числовой константы в символ ASCII, что позволяло создавать строку по частям; получалась строка «ABCDEF» без необходимости в функции. [6]A$='23 '64 '49 "DEF"
CHR$()
Более поздние версии Dartmouth BASIC включали набор MAT
команд, которые позволяли выполнять операции над целыми массивами ( матрицами ) с помощью одного оператора. Они также были доступны в более поздних версиях TSB. В своей простейшей форме MAT
используется как альтернативная форма LET
, применяя выражение ко всем элементам массива. Например:
100 РАЗМЕР А ( 20 ), Б ( 20 ) ... 200 МАТЕРИАЛ А = А + Б
Добавит значение каждого значения в B к каждой записи в A, таким же образом, как:
100 РАЗМЕР A ( 20 ), B ( 20 ) ... 200 ДЛЯ I = 1 ДО 20 210 A [ I ] = A [ I ] + B [ I ] 220 СЛЕДУЮЩИЙ I
Помимо того, что эти команды делают код короче и очевиднее, они также имеют преимущество в том, что они высоко оптимизированы и легко превосходят использование FOR/NEXT. [7] Дополнительные функции и операторы изменяют PRINT
и INPUT
, инвертируют массивы и строят матрицы идентичности и т. п. в одном операторе. [8]
TSB также включает в себя ряд более мелких различий с другими диалектами. Среди наиболее важных:
#
является необязательной формой сравнения неравенства, идентичной <>
[9]ON...GOTO/GOSUB
синтаксиса не поддерживается. Вместо этого выполняет ту же функцию, выбирая номер строки из списка на основе ее порядкового положения. Например, всегда будет переходить на строку 10, тогда как будет переходить на другие строки, если значение A равно 1, 2 или 3. [10]GOTO expression OF 1,2,3...
GOTO 1 OF 10,20,30
GOTO A OF 100,200,300
IF C+D THEN 1600
C+D
IF
IF
ENTER
, вариант стандартного INPUT
оператора, который продолжается после достижения лимита времени. ENTER
имеет три входа, лимит времени в секундах, возвращаемую переменную, содержащую фактическое прошедшее время (или код состояния), и затем, наконец, пользовательский ввод. Например, будет ждать 15 секунд, пока пользователь введет один символ. T будет содержать фактическое время, которое он потратил, -256, если таймер истек, или -257 или -258, чтобы указать на проблемы с терминалом. [11]ENTER 15,T,A$[1,1]
PRINT "THE NUMBER IS"A", TRY A LARGER VALUE."
PRINT
используются для табуляции через каждые 15 символов, оставляя 12 в конце строки, что в сумме дает 72 символа. [13]LIN
работает как вертикальный аналог TAB
. вставит три символа возврата каретки, потенциально на существующей строке, если была активна конечная точка с запятой или запятая, в то время как особый случай всегда будет переходить на следующую строку. [14] Integer BASIC имел похожую функцию, называемую .LIN(3)
LIN(-1)
VTAB
CONVERT
, но он преобразовывал числа в строки, как и VAL
функция.