HP Time-Shared BASIC ( HP TSB ) es un intérprete de lenguaje de programación BÁSICO para la línea HP 2000 de sistemas informáticos de tiempo compartido basados en minicomputadoras de Hewlett-Packard . TSB es históricamente notable como 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 entre 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 contribuidos 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 remontan su historia al 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 agregaron sus propias soluciones; HP utilizó un sistema similar a Fortran y otros lenguajes con corte de matrices , mientras que DEC introdujo más tarde las MID/LEFT/RIGHT
funciones.
Cuando las microcomputadoras comenzaron a ingresar al mercado a mediados de la década de 1970, aparecieron muchos BASIC nuevos que basaban sus analizadores en la sintaxis de DEC o HP. Altair BASIC , la versión original de lo que se convirtió en Microsoft BASIC , se basó en el BASIC-PLUS de DEC . Otros, incluidos Integer BASIC de Apple , Atari BASIC y North Star BASIC, siguieron el estilo de HP. Esto dificultaba un poco las conversiones entre estas plataformas si se encontraba manejo de cadenas.
El software también era conocido por su nombre versionado, vinculado a la versión de hardware en la 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.
HP también se refirió al lenguaje como "Access BASIC" en algunas publicaciones. Esto coincidía con el nombre de las máquinas en las que se ejecutaba, conocido 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 procesador dual . Se utiliza un procesador HP serie 2100 completamente configurado para la ejecución de la mayor parte del código del sistema y todo el código de usuario, mientras que un segundo procesador HP serie 2100, más pequeño, se utiliza para manejar las líneas seriales RS-232 a través de las cuales se transmite el tiempo. -compartir usuarios conectados. Dependiendo de 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 Modelo 33 ASR y se conectaba directamente al procesador de E/S o mediante un módem o acoplador acústico . Los nombres de cuentas son una combinación de un carácter alfabético, seguido de tres dígitos decimales, por ejemplo , B001. Las cuentas privilegiadas comenzaban con la letra "A" y tenían algunas capacidades adicionales de almacenamiento de programas y comandos. La cuenta de superusuario es A000. Este esquema permite hasta 26.000 cuentas de usuario.
Durante la ejecución, los programas de usuario se cambian a una unidad de cabezal fijo : físicamente un disco, pero que funciona como un tambor magnético . Cuando no se ejecutan, los programas de usuario se almacenan en un disco de almacenamiento cargado con un cartucho o paquete de cabezal móvil . Los usuarios privilegiados también pueden almacenar programas en el tambor, mucho más rápido. Se realizó una copia de seguridad del disco duro en cinta magnética .
Los nombres de programas y archivos constan de una combinación de hasta seis caracteres alfabéticos (AZ) y números (0-9). Los programas se almacenan en un formato tokenizado mediante el comando GUARDAR. También se pueden almacenar en un formato semicompilado, utilizando el comando CSAVE, que les permite iniciarse más rápido. Dado que el sistema estaba estrechamente vinculado al uso de teleimpresores comúnmente disponibles, los finales de línea en los archivos consistían en el carácter de retorno de carro (ASCII CR, 0D hexadecimal), seguido del 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 integrado de edición y ejecución. Las declaraciones se analizan para determinar la sintaxis correcta a medida que se ingresan y luego se almacenan en forma tokenizada. Cada declaración BÁSICA debe estar en una línea con un número único, por ejemplo
10 IMPRIMIR "HOLA MUNDO"
Los números de línea son obligatorios y las declaraciones se colocan automáticamente en secuencia numérica ascendente. Las líneas TSB pueden contener una declaración; No se admite el encadenamiento de varias declaraciones con dos puntos como en MS BASIC. Se permiten múltiples asignaciones de variables, 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 versión anterior (2000A), el lenguaje admitía las siguientes funciones. [1] Las versiones posteriores agregaron muchas más funciones. [2]
GOTO
sentencias y subrutinas mediante sentencias GOSUB
yRETURN
IF/THEN
declaraciónGOTO/OF
yGOSUB/OF
FOR
y bucles de bloques basados en variablesNEXT
DATA
, 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 usuario).Las cadenas en TSB se tratan como una matriz de caracteres, en lugar de 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, deben mencionarse antes de su uso. Por ejemplo, configurará una cadena que puede contener un máximo de 10 caracteres. La longitud máxima de una cadena en TSB es de 72 caracteres. [3]DIM A$[10]
Se accede a las subcadenas dentro de cadenas usando 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 con 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 matrices y subcadenas comienzan con 1.A$(L,R)
A$[L,R]
A$[L]
Esto contrasta marcadamente con los BASIC que siguen el patrón DEC que usan funciones como LEFT$()
, MID$()
y RIGHT$()
para acceder a subcadenas, aunque ANSI BASIC continúa usando 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 declaració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 requeriría cuando cambian las longitudes de las cadenas. MS BASIC tenía una biblioteca extensa para manejar la compresión de la 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 a lo largo de 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 interna está vacía, y tareas simples como la concatenación pueden potencialmente desbordar la cadena a menos que se haya configurado en un tamaño grande para comenzar. con.
Las versiones posteriores de Dartmouth BASIC 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 usó las funciones IZQUIERDA/MID/DERECHA para manipular cadenas, sino que usó el CHANGE
comando que convertía la cadena hacia y desde valores ASCII equivalentes. HP incluyó una funcionalidad idéntica, cambiando solo el nombre a CONVERT
. [5] [a] Además, se podrían utilizar las comillas simples para convertir una constante numérica en un carácter ASCII, lo que permitiría construir una cadena en partes; produjo 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 operaciones en matrices enteras con una sola declaración. Estos también estuvieron disponibles en versiones posteriores de TSB. En su forma más simple, MAT
se usa como una forma alternativa de LET
, aplicando una expresión a todos los elementos de una matriz. Por ejemplo:
100 DIM 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] Funciones y declaraciones adicionales modifican PRINT
e INPUT
invierten matrices y construyen matrices de identidad y demás en una sola declaración. [8]
TSB también incluye una serie de diferencias menores con otros dialectos. Entre los más importantes se encuentran:
#
es una forma opcional de comparación no igual, idéntica a <>
[9]ON...GOTO/GOSUB
sintaxis no es compatible. En cambio, realiza la misma función seleccionando un número de línea de la lista según su posición ordinal. Por ejemplo, siempre irá a la línea 10, mientras que se bifurcará 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
declaració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 hasta que el usuario escriba un solo carácter. T contendrá el tiempo real que tardaron, -256 si el temporizador expiró, o -257 o -258 para indicar problemas con el terminal. [11]ENTER 15,T,A$[1,1]
PRINT "THE NUMBER IS"A", TRY A LARGER VALUE."
PRINT
uso tabulación se detienen 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 al 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.