BASIC-PLUS es un dialecto extendido del lenguaje de programación BASIC que fue desarrollado por Digital Equipment Corporation (DEC) para su uso en su sistema operativo de tiempo compartido RSTS/E para la serie PDP-11 de minicomputadoras de 16 bits a principios de la década de 1970 hasta la década de 1980.
BASIC-PLUS se basó en BASIC-8 para el TSS/8 , [1] basado muy estrechamente en el BASIC original de Dartmouth . BASIC-PLUS agregó una serie de estructuras nuevas, así como características de JOSS relacionadas con declaraciones condicionales y formato. A su vez, BASIC-PLUS fue la versión sobre la que se basó el BASIC original de Microsoft . [2]
Entre las adiciones realizadas a BASIC-PLUS destaca la introducción de funciones de cadena como MID$ y LEFT$ , además del comando CHANGE original de uso múltiple de Dartmouth . En versiones futuras del lenguaje, especialmente la de Microsoft, se eliminó CHANGE y las funciones de cadena de BASIC-PLUS se convirtieron en las únicas formas de realizar este tipo de operaciones. La mayoría de los BÁSICOS hasta el día de hoy siguen esta convención.
Posteriormente, el lenguaje se reescribió como un verdadero compilador como BASIC-Plus-2 y se transfirió a la plataforma VAX-11 como la implementación BASIC nativa de esa máquina. Esta versión sobrevivió a varios cambios de plataforma y hoy se conoce como VSI BASIC para OpenVMS .
Los usuarios se sentarían en una terminal y escribirían declaraciones en lenguaje de programación. Las declaraciones pueden ingresarse directamente en el intérprete de comandos del sistema o ingresarse en un editor de texto , guardarse en un archivo y cargarse en el intérprete de comandos desde el archivo. Los errores en el código fuente se informaron al usuario inmediatamente después de escribir la línea.
Como no se podía garantizar un terminal inteligente con control del cursor, BASIC-PLUS utilizó el sistema común de anteponer a todo el código fuente un número de línea. El código se editó escribiendo el número y luego cambiando el contenido del siguiente código. Se podría eliminar una línea de código escribiendo su número de línea y nada más, configurándola así como una línea vacía.
El espacio de direcciones virtuales de un usuario RSTS/E estaba limitado a un poco menos de 64 KB de espacio. Usando BASIC-PLUS, aproximadamente la mitad de este espacio de direcciones virtuales fue utilizado por el intérprete de comandos combinado y la biblioteca en tiempo de ejecución (llamada Run Time System en RSTS/E). Esto limitó los programas de usuario a aproximadamente 32 kB de memoria.
Los programas grandes se dividían en partes ejecutables separadas mediante el uso de la CHAIN
declaración, y los programas podían encadenarse a números de línea específicos en un programa secundario para indicar que un programa debía comenzar la ejecución en un punto diferente de su primera línea. Esta característica de encadenar a un determinado número de línea permitió que los programas se indicaran entre sí que estaban siendo llamados desde otro programa. El uso de una sección de memoria compartida llamada núcleo común también permitió que los programas se pasaran datos entre sí según fuera necesario. También se podían utilizar archivos de disco , pero eran más lentos.
Para conservar la memoria, el sistema incluía un administrador de memoria de recolección de basura, utilizado tanto para datos de cadenas como para códigos de bytes.
Un programa en ejecución podría interrumpirse, examinarse y modificarse variables y luego reanudarse.
BASIC-PLUS sigue el modelo de versiones posteriores de Dartmouth BASIC , incluidos sus potentes MAT
comandos. Además de esto, DEC agregó una serie de estructuras únicas de control de flujo.
Los números de línea eran enteros positivos del 1 al 32767. [3] Las líneas lógicas de código podían continuar en múltiples líneas físicas utilizando un avance de línea al final de una línea en lugar del carácter de retorno de carro normal . [4] Para facilitar la edición externa del archivo fuente, las versiones posteriores de BASIC-PLUS también permitieron el &
carácter como carácter de continuación de línea.
Se pueden colocar varias declaraciones en una sola línea utilizando :
como separador de declaraciones. [4] El sistema permitía utilizar tabulaciones como espacios en blanco en línea y se utilizaba para hacer los bucles más claros, como en los lenguajes modernos. [5] Los comentarios usaban la REM
palabra clave o el !
carácter, [6] a diferencia de los MS BASIC, que usaban REM
y '
.
El PRINT
comando dividió la pantalla en regiones de 14 espacios de ancho y la coma se usó para moverse entre estas ubicaciones; PRINT 1,2,3
generaría 1, 2 y 3 de forma espaciada, [7] mientras que PRINT 1;2;3
dejaría un solo espacio y produciría "1 2 3". [8] [a] INPUT
permitió especificar una cadena de mensaje, pero usó el punto y coma para separarla en lugar de la coma; . [9]INPUT "WHAT IS THE VALUE";A
Las cadenas pueden estar delimitadas por comillas simples o dobles. [10] Además de las funciones CHR
y ASCII
que convertían caracteres individuales hacia y desde el formato de cadena, [11] BASIC-PLUS también admitía el comando de Dartmouth CHANGE
. CHANGE
repitió la cadena y devolvió el valor ASCII de cada carácter como una ranura en una matriz numérica. Por ejemplo, CHANGE 'HELLO' TO X
devolvería una matriz con los cinco códigos ASCII, 110, 105, 114, 114, 105, en los elementos 1 al 5, y el número 5, la longitud de la cadena, en el elemento 0. [12] Se podría invertir La operación también CHANGE X TO A$
leería los números individuales en la matriz X y los convertiría en una cadena. [13]
BASIC-PLUS agregó el concepto de "modificadores de declaraciones", condiciones similares a JOSS que podrían aplicarse a cualquier declaración. Por ejemplo, es el equivalente a [14] También se proporcionó lo contrario, era el equivalente a . [15]PRINT I IF I <> 10
IF I <> 10 THEN PRINT I
PRINT I UNLESS I = 10
IF I <> 10 THEN PRINT I
FOR
Los bucles funcionaron como en otras versiones de BASIC y el NEXT
comando no se pudo usar en una expresión para salir temprano. [16] En cambio, las palabras clave UNTIL
y WHILE
podrían usarse para controlar las salidas anticipadas. Por ejemplo, continúe el bucle hasta I=10, asumiendo que el siguiente código establecería el valor de I, [17] lo que significa que podría no salir después de 10 iteraciones, sino tan pronto como el código establezca I en 10. [18] Los modificadores podrían También se usaría para construir bucles compactos de una línea; por ejemplo, se buclearía hasta que X fuera 100. [19]FOR I=1 UNTIL I=10
X=X+1 WHILE X<100
Los nombres de variables en las primeras versiones de BASIC-PLUS podían ser una sola letra o una sola letra seguida de un solo dígito. [5] Con la inclusión del "modo extendido" en versiones posteriores, los nombres de las variables podían tener hasta 29 caracteres y se agregó el punto (.) como carácter permitido. Cada nombre de variable todavía tenía que comenzar con una letra. [b] Como en la mayoría de las versiones de BASIC, la LET
palabra clave, para asignación de variables, era opcional. Podría establecer varias variables en un solo valor, como . [20]LET A,B,C=10
El lenguaje admitía tres tipos de datos; números de punto flotante, enteros y cadenas. Las variables sin sufijo eran de punto flotante (8 bytes, rango 0,29 × 10−38 a 1,7 × 1038 , hasta 16 dígitos de precisión). Las variables enteras (16 bits, rango −32768 a +32767) se indicaron con un%
sufijo, [21] variables de cadena (longitud variable) se indicaron con un$
sufijo. [10]
La lista de operadores matemáticos y lógicos era típica de la mayoría de los BÁSICOS, con algunas extensiones. Para matemáticas, se admitían +
, -
, y *
, además de como forma alternativa de para terminales de computadora que podrían no tener ese carácter. Las comparaciones lógicas estándar fueron , , , , y . Una adición interesante fue el operador, que significa "aproximadamente igual". Esto sería verdadero si los dos números se imprimieran igual, es decir, sus seis dígitos más significativos fueran iguales. [22] Los operadores lógicos incluyen el típico , y , junto con , que devuelven verdadero si A y B son verdaderos o ambos son falsos, y que es falso si A es verdadero y B es falso y, en caso contrario, siempre es verdadero. [23]/
^
**
^
=
<
>
<=
>=
<>
==
NOT A
A AND B
A OR B
A XOR B
A EQV B
A IMP B
La DIM
declaración podría asignar matrices unidimensionales y bidimensionales de cualquiera de los tres tipos de datos. El rango de subíndices siempre comenzaba con 0 (pero MAT
las declaraciones no establecían elementos en la fila 0 o la columna 0). [24] [25]
El lenguaje también incluía una serie de MAT
comandos para trabajar con toda la matriz (o MATrix). El MAT READ
comando llenaría la matriz con valores en una DATA
declaración, [26] MAT INPUT
llenaría la matriz con valores escritos por el usuario e MAT PRINT
imprimiría los elementos en formato 1D o 2D. [27] MAT
también podría usarse para establecer valores predeterminados en una matriz usando palabras clave asociadas; por ejemplo, MAT A=ZER
llenaría la matriz A con ceros. [28] TRN
transpondría una matriz completa y INV
la invertiría. [29] Además, +
, -
y *
podrían usarse en matrices, realizando la operación matricial asociada. [30]
La DIM#
declaración "DIM virtual" podría asignar "arreglos de datos virtuales" o "arreglos virtuales" a un archivo de disco, lo que permitía arreglos más grandes que la memoria disponible de la computadora (o incluso su espacio de direcciones) y permitía el uso de elementos de matriz para leer, escribir y ampliar archivos de disco (almacenamiento persistente). Llamaron a esta disposición "almacenamiento de datos virtual" y "núcleo virtual", pero no utilizaron el enfoque moderno de asignar matrices y un archivo mapeado en memoria . En su lugar, se utilizó un único búfer para almacenar 512 bytes de datos a la vez, y cuando se accedía a una entrada en la matriz virtual, se leían los datos correspondientes y se escribían los datos antiguos, según fuera necesario. La CLOSE
declaración provocó que se volviera a escribir el búfer (si era necesario) antes de cerrar el archivo. Debido a que no se almacenaron en caché sectores adicionales, acceder a los datos en el orden "incorrecto" podría multiplicar el número de accesos al disco. Se impusieron reglas adicionales a los arreglos virtuales, de modo que un dato nunca podría abarcar un límite de registro: cada tipo de datos se alineaba con un múltiplo de su tamaño. Las cadenas virtuales se almacenaron como datos ASCIIZ de longitud fija, con tamaños restringidos a 2, 4, 8, 16, 32, 64, 128, 256 o 512 bytes, y se accedió a ellas mediante LSET
y RSET
. [31]
BASIC-PLUS no era un intérprete sino un sistema de compilación y listo : cada línea de BASIC se traducía a "PPCODE" (Código Push-Pop) a medida que se ingresaba, para su posterior ejecución rápida en su máquina virtual. Estas traducciones no tokenizaron las líneas BÁSICAS, sino que las reescribieron para usarlas en una máquina apilada; no se podrían traducir estas representaciones a declaraciones BÁSICAS. Esto evitó la necesidad de decodificar repetidamente las palabras clave como cadenas: una vez convertidas a PPCODE, las palabras clave eran números que apuntaban a rutinas para ejecutar esa función. BASIC-PLUS incluía un COMPILE
comando, pero no era un verdadero compilador; esto simplemente guardó la representación PPCODE del programa para que no fuera necesario volver a compilarlo la próxima vez que se cargara el programa BASIC en la memoria. El sistema almacenaba el programa de un usuario en dos formatos. Uno era el código fuente editable en formato de texto, creado mediante el SAVE
comando y normalmente colocado en un archivo .BAS. La otra era la versión PPCODE del programa creado por el COMPILE
comando y guardado en un archivo .BAC; Los archivos .BAC eran más pequeños, se cargaban y se ejecutaban más rápido, pero no se podían editar. [32]
Posteriormente, DEC desarrolló un producto relacionado llamado Basic Plus 2 ("BP2" o BASIC-Plus-2 ) para agregar funciones adicionales y aumentar el rendimiento.
Utilizó una verdadera compilación en código enhebrado y escribió su salida en archivos objeto compatibles con los archivos objeto de código máquina producidos por el ensamblador y otros sistemas de lenguaje. Estos archivos de objetos podrían guardarse en bibliotecas. Luego, un vinculador (el TKB, también conocido como creador de tareas) creó archivos ejecutables a partir de archivos objeto y bibliotecas. TKB también admitía superposiciones; esto permitió intercambiar rutinas individuales en el espacio de direcciones virtuales según fuera necesario, superponiendo rutinas que no se estaban utilizando actualmente.
Además, los programas BP2 se ejecutaron bajo el sistema RSX Run Time; este RTS solo ocupaba 8 KB del espacio de direcciones virtuales del usuario, dejando 56 KB para el programa del usuario. [33] (La versión 9 de RSTS/E introdujo un espacio separado de instrucciones y datos, y el sistema de tiempo de ejecución RSX "desapareciendo", permitiendo hasta 64 KB de cada código de instrucción y datos). Estos dos factores permitieron que los programas BP2 individuales fueran mucho más grandes. que los programas BASIC-PLUS, lo que a menudo reduce la necesidad de encadenar entre múltiples programas.
A diferencia de BASIC-PLUS (que sólo estaba disponible en RSTS/E), BP2 también estaba disponible para el sistema operativo RSX-11 . Los programas BP2 también eran más compatibles con el posterior VAX BASIC .
Microsoft BASIC se inspiró muy estrechamente en BASIC-PLUS. [2] Las versiones anteriores de MS BASIC, la serie 1.x, carecían de variables enteras, pero estas se agregaron en la serie 2.x que se encontró en muchas máquinas, incluidos los modelos posteriores de Commodore PET y Commodore 64 . La capacidad de colocar comandos lógicos y de bucle en línea, como I = I + 1 UNTIL I = 10
no se copió y no aparece en ninguna versión común de microcomputadora BASIC. MS BASIC también carecía de comandos matriciales.
FOR I=STOP
se interpretaría como .FOR I = S TO P