HP Time-Shared BASIC ( HP TSB ) es un intérprete del lenguaje de programación BASIC para la línea HP 2000 de sistemas informáticos de tiempo compartido basados en minicomputadoras de Hewlett-Packard . TSB es históricamente conocido por ser la plataforma que lanzó las primeras versiones públicas del juego Star Trek .
El sistema implementa un dialecto de BASIC, así como una cuenta de usuario rudimentaria y una biblioteca de programas que permite que varias personas utilicen el sistema a la vez. Los sistemas fueron una fuerza importante a principios y mediados de la década de 1970 y generaron una gran cantidad de programas. HP mantenía una base de datos de programas aportados y los clientes podían solicitarlos en cinta perforada por una tarifa nominal.
La mayoría de los BASIC de la década de 1970 tienen su origen en el Dartmouth BASIC original de la década de 1960, pero las primeras versiones de Dartmouth no manejaban variables de cadena ni ofrecían funciones de manipulación de cadenas. Los proveedores añadieron sus propias soluciones; HP utilizó un sistema similar a Fortran y otros lenguajes con segmentación de matrices , mientras que DEC introdujo posteriormente las MID/LEFT/RIGHT
funciones.
A mediados de los años 70, cuando los microordenadores empezaron a entrar en el mercado, aparecieron muchos nuevos BASIC que basaban sus analizadores sintácticos en la sintaxis de DEC o HP. Altair BASIC , la versión original de lo que se convertiría en Microsoft BASIC , se basaba en el BASIC-PLUS de DEC . Otros, como Integer BASIC de Apple , Atari BASIC y North Star BASIC, se basaban en el estilo de HP. Esto hacía que las conversiones entre estas plataformas fueran algo difíciles si se encontraban con el manejo de cadenas.
El software también era conocido por su nombre versionado, vinculado a la versión de hardware en el que se ejecutaba, como HP 2000C Time-Shared BASIC y el sistema operativo venía en diferentes variedades: 2000A, 2000B, 2000C, High-Speed 2000C, 2000E y 2000F.
En algunas publicaciones, HP también se refirió al lenguaje como "Access BASIC". Esto coincidía con el nombre de las máquinas en las que se ejecutaba, conocidas como "2000/Access" en algunas publicaciones. Esta terminología parece haber sido utilizada sólo brevemente cuando se lanzó la plataforma por primera vez.
A excepción de los sistemas 2000A y 2000E, el sistema se implementa utilizando una arquitectura de doble procesador . Se utiliza un procesador HP 2100-series totalmente configurado para la ejecución de la mayor parte del código del sistema y de todo el código del usuario, mientras que se utiliza un segundo procesador HP 2100-series más pequeño para manejar las líneas seriales RS-232 a través de las cuales se conectan los usuarios de tiempo compartido . Según la configuración del hardware, el sistema admite hasta 16 o hasta 32 usuarios remotos simultáneos.
El terminal habitual para un sistema TSB era un Teletype Model 33 ASR y se conectaba directamente al procesador de E/S o a través de un módem o acoplador acústico . Los nombres de las cuentas son una combinación de un carácter alfabético, seguido de tres dígitos decimales, p. ej. , B001. Las cuentas privilegiadas comenzaban con la letra "A" y tenían algunas capacidades adicionales de almacenamiento de comandos y programas. La cuenta de superusuario es A000. Este esquema permite hasta 26.000 cuentas de usuario.
Durante la ejecución, los programas de usuario se transfieren a una unidad de cabezal fijo (que en realidad es un disco, pero que funciona como un tambor magnético ). Cuando no se están ejecutando, los programas de usuario se almacenan en un cartucho de cabezal móvil o en un disco cargado por paquetes . Los usuarios privilegiados también pueden almacenar programas en el tambor, que es mucho más rápido. El disco duro se respaldó en una cinta magnética .
Los nombres de programas y archivos consisten en una combinación de hasta seis caracteres alfabéticos (AZ) y números (0-9). Los programas se almacenan en un formato tokenizado , utilizando el comando SAVE. También se pueden almacenar en un formato semicompilado, utilizando el comando CSAVE, que permite que se inicien más rápido. Dado que el sistema estaba estrechamente vinculado al uso de teleimpresoras disponibles comúnmente, los finales de línea en los archivos consistían en el carácter de retorno de carro (ASCII CR, 0D hexadecimal), seguido por el carácter de avance de línea (ASCII LF, 0A hexadecimal).
El lenguaje es una implementación bastante estándar de BASIC, que proporciona un entorno de edición y ejecución integrado. Las sentencias se analizan para comprobar su sintaxis correcta a medida que se ingresan y luego se almacenan en forma de tokens. Cada sentencia BASIC debe estar en una línea numerada de forma única, por ejemplo
10 IMPRIMIR "HOLA MUNDO"
Los números de línea son obligatorios y las instrucciones se colocan automáticamente en secuencia numérica ascendente. Las líneas TSB pueden contener una instrucción; no se admite el encadenamiento de varias instrucciones con dos puntos como en MS BASIC. Se permiten asignaciones de variables múltiples, por ejemplo , , . Como en la mayoría de las versiones de BASIC, el uso de la palabra "LET" era opcional.20 LET A=B=C=42
En la primera versión (2000A), el lenguaje admitía las siguientes características. [1] Las versiones posteriores agregaron muchas más características. [2]
GOTO
sentencias y subrutinas mediante sentencias GOSUB
yRETURN
IF/THEN
declaraciónGOTO/OF
yGOSUB/OF
FOR
Bucle de bloques y NEXT
declaraciones basados en variablesDATA
, READ
yRESTORE
INPUT
, READ #
, PRINT
, PRINT #
yIF END #
MAT READ, MAT INPUT, MAT PRINT, MAT=
) y operaciones ( +, -, *, ZER, CON, IDN, INV, TRN
)AND, OR, NOT
) y operadores relacionales ( <, <=, =, #, <>, >=, and >
)SIN, COS, TAN, ATN
), logaritmos ( LOG, EXP
), raíz cuadrada ( SQR
), generador de números aleatorios ( RND
), otras ( ABS, INT, SGN, MIN, MAX)
, y funciones definidas por el usuarioEn TSB, las cadenas se tratan como una matriz de caracteres, en lugar de como un único objeto de varios caracteres. De forma predeterminada, se les asigna un carácter en la memoria y, si se necesita una cadena de mayor longitud, se debe mencionar antes de usarla. Por ejemplo, se configurará una cadena que pueda contener un máximo de 10 caracteres. La longitud máxima de una cadena en TSB es de 255 caracteres. [3]DIM A$[10]
Se accede a las subcadenas dentro de cadenas mediante una notación de " slicing ": o , donde la subcadena comienza con el carácter más a la izquierda especificado por el índice L y continúa hasta el carácter más a la derecha especificado por el índice R, o la forma donde la subcadena comienza en el carácter más a la izquierda especificado por el índice L y continúa hasta el final de la cadena. TSB acepta () o [] indistintamente. Los índices de matriz y subcadena comienzan con 1.A$(L,R)
A$[L,R]
A$[L]
Esto contrasta marcadamente con los BASIC que siguen el patrón DEC que utilizan funciones como LEFT$()
, MID$()
, y RIGHT$()
para acceder a subcadenas, aunque ANSI BASIC continúa utilizando una sintaxis de subcadena similar a la introducida por Hewlett-Packard. La notación de HP también se puede utilizar en el lado de destino de una instrucción LET o INPUT para modificar parte de un valor de cadena existente, por ejemplo o , lo que no se puede hacer con las primeras implementaciones de LEFT/MID/RIGHT.100 A$[3,5]="XYZ"
120 B$[3]="CHANGE ALL BUT FIRST TWO CHARS"
La principal ventaja de este estilo de acceso a cadenas es que elimina la necesidad de una gestión de memoria compleja que de otro modo se requiere cuando cambian las longitudes de las cadenas. MS BASIC tenía una biblioteca extensa para manejar la compresión de memoria eliminando el espacio muerto en el montón de cadenas cuando el sistema se quedaba sin memoria. También era notoriamente lento y se modificó varias veces durante su vida útil para mejorar el rendimiento o corregir errores. [4] La desventaja del estilo TSB es que la cadena siempre ocupa la cantidad total de espacio DIMed incluso si la cadena en su interior está vacía, y las tareas simples como la concatenación pueden potencialmente desbordar la cadena a menos que se haya configurado con un tamaño grande para empezar.
Las versiones posteriores de Dartmouth BASIC sí incluían variables de cadena, basadas en el mismo patrón que se encuentra en BASIC-PLUS y MS BASIC. Sin embargo, esta versión no utilizaba las funciones LEFT/MID/RIGHT para manipular cadenas, sino que utilizaba el CHANGE
comando que convertía la cadena a y desde valores ASCII equivalentes. HP incluía una funcionalidad idéntica, cambiando sólo el nombre a CONVERT
. [5] [a] Además, se podía utilizar la comilla simple para convertir una constante numérica en un carácter ASCII, lo que permitía construir una cadena en partes; producía la cadena "ABCDEF", sin necesidad de la función. [6]A$='23 '64 '49 "DEF"
CHR$()
Las versiones posteriores de Dartmouth BASIC incluían un conjunto de MAT
comandos que permitían realizar operaciones sobre matrices completas con una única instrucción. Estos comandos también estaban disponibles en versiones posteriores de TSB. En su forma más simple, se MAT
utiliza como una forma alternativa de LET
, aplicando una expresión a todos los elementos de una matriz. Por ejemplo:
100 DIMENSIONES A ( 20 ), B ( 20 ) ... 200 MAT A = A + B
Agregará el valor de cada valor en B a cada entrada en A, de la misma manera que:
100 DIM A ( 20 ), B ( 20 ) ... 200 PARA I = 1 A 20 210 A [ I ] = A [ I ] + B [ I ] 220 SIGUIENTE I
Además de hacer que el código sea más corto y obvio, estos comandos también tienen la ventaja de estar altamente optimizados, superando fácilmente el uso de FOR/NEXT. [7] Las funciones y declaraciones adicionales modifican PRINT
y INPUT
, invierten matrices y construyen matrices de identidad y similares en una sola declaración. [8]
El TSB también incluye una serie de diferencias menores con otros dialectos. Entre las más importantes se encuentran:
#
es una forma opcional de la comparación no igual, idéntica a <>
[9]ON...GOTO/GOSUB
No se admite el uso de la sintaxis de calculate-goto . En su lugar, realiza la misma función eligiendo un número de línea de la lista en función de su posición ordinal. Por ejemplo, siempre irá a la línea 10, mientras que se ramificará a diferentes líneas si el valor de A es 1, 2 o 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
, una variación de la INPUT
instrucción estándar que continúa después de que se alcanza un límite de tiempo. ENTER
tiene tres entradas, un límite de tiempo en segundos, una variable de retorno que contiene el tiempo real transcurrido (o un código de estado) y, finalmente, la entrada del usuario. Por ejemplo, esperará 15 segundos a que el usuario escriba un solo carácter. T contendrá el tiempo real que tardó, -256 si el temporizador expiró o -257 o -258 para indicar problemas con la terminal. [11]ENTER 15,T,A$[1,1]
PRINT "THE NUMBER IS"A", TRY A LARGER VALUE."
PRINT
uso tabulan cada 15 caracteres, dejando 12 al final de la línea para un total de 72. [13]LIN
función opera como una contraparte vertical de TAB
. insertará tres retornos de carro, potencialmente en la línea existente si un punto y coma o una coma final estaban activos, mientras que el caso especial siempre avanzará a la siguiente línea. [14] Integer BASIC tenía una característica similar, llamada .LIN(3)
LIN(-1)
VTAB
CONVERT
, pero convirtió números en cadenas, como la VAL
función .