Full BASIC , a veces conocido como BASIC estándar o BASIC ANSI , es un estándar internacional que define un dialecto del lenguaje de programación BASIC . Fue desarrollado por el grupo X3.60 del Instituto Nacional Estadounidense de Estándares (ANSI) en asociación con la ECMA europea . Describe una versión avanzada de BASIC con muchas características, incluidas la programación estructurada , la matemática matricial , la entrada/salida para el manejo de archivos y muchas otras opciones.
La estandarización del BASIC por parte de ANSI fue un proceso de dos etapas. La primera, llevada a cabo como Minimal BASIC a partir de 1974, fue un esfuerzo por definir y estandarizar claramente el lenguaje Dartmouth BASIC original para que pudiera implementarse correctamente en diferentes plataformas. Después de su lanzamiento a fines de 1977, la atención se centró en Full BASIC, que se basaría en el más poderoso Structured BASIC que se estaba desarrollando en Dartmouth College . La complejidad del sistema y las muchas adiciones promovidas por los miembros del comité de estándares hicieron que el esfuerzo se estancara y el primer borrador del estándar no estuvo listo hasta 1986, cuatro años después.
El estándar fue ratificado el 26 de junio de 1986 como ECMA-116 [1] y en enero de 1987 como ANSI X3.113-1987 . Fue completamente ignorado; la revolución de los microordenadores había ocurrido mientras se discutía sobre la especificación, y a principios de los años 1980 Microsoft BASIC, que se ejecutaba en decenas de millones de ordenadores domésticos, ya había llegado y desaparecido. Al ver que el proceso se prolongaba, los participantes de Dartmouth se marcharon para producir True BASIC basado en partes del estándar, pero esto tuvo poco uso. Los estándares de facto como el de Microsoft dominaron el mercado y formaron la base para lenguajes más nuevos como Microsoft Visual Basic, que incorporaba conceptos similares. [ cita requerida ]
La introducción de Dartmouth BASIC en 1964 combinó una serie de conceptos emergentes en el campo de la informática, incluyendo el tiempo compartido y la interacción directa con el usuario, conocida en ese momento como una "interfaz conversacional". General Electric , que suministró la computadora central GE 235 en la que funcionaba, utilizó una versión modificada del sistema de Dartmouth para iniciar una oficina de servicios que eventualmente evolucionaría hasta convertirse en el servicio en línea GEnie . Muchas otras empresas, Tymshare y CompuServe entre las que se destacan, introdujeron rápidamente sus propios servicios BASIC alojados, siguiendo el modelo de Dartmouth. [2] [3]
En 1968, Hewlett-Packard (HP) presentó las minicomputadoras de la serie HP 2000 , que ofrecían las mismas características de los sistemas mainframe anteriores en un sistema de montaje en bastidor que podía configurarse de forma completa por unos 100.000 dólares (equivalentes a 876.172 dólares en 2023). [4] Su HP Time-Shared BASIC tenía varias diferencias con respecto a Dartmouth, [5] y pronto fueron copiadas por otros proveedores de minicomputadoras como Data General . Un reticente fue Digital Equipment Corporation (DEC), que no presentó un BASIC de su propio diseño hasta 1972. Esta versión, BASIC-PLUS, era diferente de los dialectos de HP o Dartmouth. A principios de la década de 1970, había tres dialectos principales y docenas de variaciones menores en uso en el mercado.
En enero de 1974 se formó un nuevo grupo bajo el paraguas de ANSI para definir un único estándar BASIC. [6] El equipo de Dartmouth formó una parte central del grupo. Dartmouth estaba trabajando en una versión muy ampliada de BASIC conocida como Structured BASIC (SBASIC) que se convirtió en la base de ANSI. En ese momento, pocos dialectos más admitían sus muchas características nuevas. El grupo decidió que llevaría algún tiempo llegar a un acuerdo sobre un estándar completo basado en SBASIC, por lo que el esfuerzo de ANSI BASIC se dividió en dos hitos. El primero, Minimal BASIC , produciría un estándar que incluyera solo las características más básicas que se requerirían de cualquier implementación. Incluso las características de Dartmouth que habían recibido apoyo durante mucho tiempo, como las matemáticas matriciales, quedarían fuera. El borrador del estándar Minimal BASIC se publicó en enero de 1976, el borrador final en julio de 1977 y se ratificó en diciembre. Arthur Luehrmann, un físico del Dartmouth College que fue un defensor de BASIC y parte del grupo ANSI, declaró más tarde:
"Los primeros años de X3J2 se dedicaron (en retrospectiva, algunos podrían decir que fueron 'desperdiciados') a estandarizar lo que equivale al Dartmouth Basic original de 1964... Minimal Basic era más un juguete que un lenguaje real". [7]
El grupo se concentró entonces en Full BASIC. En ese momento, la revolución de los microordenadores estaba en pleno auge y millones de máquinas que ejecutaban Microsoft BASIC o un BASIC similar estaban entrando en el mercado. [a] A pesar de esto, ninguno de los participantes eran vendedores o proveedores de microordenadores. En cambio, los participantes seguían siendo vendedores de mainframes como IBM , Control Data y General Electric , vendedores de miniordenadores como Digital Equipment Corporation (DEC), Data General y Wang Laboratories , y otras empresas muy grandes como 3M , American Express y Kodak . [9]
El esfuerzo se topó inmediatamente con el efecto del segundo sistema, ya que cada miembro comenzó a añadir su propia lista de características "imprescindibles". Algunos querían que el lenguaje continuara la tradición de estar destinado a usos educativos que se ejecutaban en máquinas pequeñas y deseaban un lenguaje simple con sólo un soporte de archivos rudimentario y características similares. Otros eran usuarios de mainframe que querían soportar programas modulares cargables y otras características de programación expansivas para competir con lenguajes como COBOL o FORTRAN al tiempo que ofrecían una mejor manipulación de cadenas . Un tercer grupo estaba principalmente interesado en aplicaciones comerciales, especialmente usuarios europeos donde BASIC se había convertido en un lenguaje comercial principal, y exigían que el sistema incluyera un manejo extenso de archivos y matemáticas decimales que no sufrieran problemas de redondeo. [10]
John G. Kemeny y Thomas E. Kurtz , los diseñadores originales de BASIC y miembros del grupo ANSI, fueron críticos con el proceso. En un artículo de 1982, Kurtz escribió sobre cómo incluso problemas aparentemente pequeños se habían convertido en grandes controversias. Usó el ejemplo de la OPTION BASE
declaración. Cuando se agregaron matrices por primera vez a BASIC, comenzaban en el índice 1, de modo que DIM A(3)
formaban una matriz con tres ranuras, 1, 2 y 3. En algunos casos, un índice 0 es más natural, por lo que OPTION BASE 0
se agregó en versiones posteriores del código Dartmouth para que la misma definición tuviera cuatro ranuras, 0 a 3. Durante Minimal, hubo un debate continuo sobre cuál debería ser la base predeterminada, y finalmente se seleccionó 0. Cinco años después, durante los esfuerzos completos, se decidió que las matrices podían definir cualquier límite inferior utilizando una nueva sintaxis, DIM YEAR(1970 TO 1990)
. Esto eliminó la demanda de OPTION BASE 0
y se tomó la decisión de cambiar el valor predeterminado a 1 nuevamente. [11]
Inicialmente, el grupo X3.60 tenía como objetivo el verano de 1982 para la primera copia de revisión técnica, que se enviaría al comité ANSI X3 en otoño. Durante este período se enviaría la norma propuesta y se aceptarían los comentarios del público. El borrador final se enviaría de nuevo a X3 en 1983 para su ratificación ese mismo año. [12] Esto resultó bastante optimista. El primer borrador no se publicó hasta enero de 1985 [1] y el borrador final en 1986 para su ratificación en enero de 1987. [13] Durante este tiempo, la norma creció tanto que finalmente se dividió en un módulo central y cinco complementos opcionales, que incluían manejo complejo de archivos, soporte de computación en tiempo real, matemáticas decimales fijas, comandos de edición opcionales e incluso un módulo de gráficos independiente de la plataforma. [14]
El resultado fue criticado durante el período de comentarios públicos. Un revisor señaló que había crecido tanto que "el lenguaje resultante rivaliza con cualquier lenguaje de programación actual en complejidad" y que "cumplir con el estándar completo sería comparable con los proyectos de compilación más importantes que se hayan intentado jamás". [15] Continúa describiendo, por ejemplo, cómo hay no menos de cinco formas diferentes de describir una subrutina, tres para definir la longitud máxima de una cadena y dos formas de definir una matriz. [16] En referencia a la cuestión de los límites de la matriz, se señala que el comité acordó que la solución adoptada era "intolerable" e hizo planes para solucionarla "más adelante". [17]
No hay evidencia de que alguno de los participantes haya construido una versión conforme después del lanzamiento del estándar y cualquier mención de un esfuerzo continuo desaparece rápidamente. Desde 1987, las únicas menciones del estándar son que existe y que True BASIC abarca algunas de sus características. Además, con millones de micros ejecutando alguna variación del estándar de facto de MS en este punto, el nuevo estándar ANSI fue visto como la solución no estándar. [18] Gran parte del éxito original de BASIC en las plataformas micro fue que permitió que los programas se escribieran desde el código fuente impreso , pero a mediados de la década de 1980 esto había sido reemplazado por aplicaciones empaquetadas y la necesidad de BASIC como sistema de distribución se había desvanecido. [19] En el lado de los grandes sistemas, el uso original como lenguaje de enseñanza fue reemplazado cada vez más por Pascal , ya que los problemas externos que BASIC pretendía abordar, como la interactividad y la edición en línea, ahora estaban disponibles en la mayoría de los sistemas. [20]
El proceso de estandarización fue tan lento que incluso el autor de Structured BASIC acabó desistiendo de él. Se le pidió a Stephen Garland que preparara una serie de exámenes del College Board para estudiantes de secundaria, y los escribió en Pascal . Esto fue algo controvertido dado que muchas computadoras de uso generalizado, como la Commodore 64 y la TRS-80, no tenían una implementación completa de Pascal. Luehrmann criticó el esfuerzo y sugirió un curso más general que fuera aplicable a más estudiantes. [21]
Los participantes de Dartmouth en el grupo ANSI se dieron cuenta de que no había esperanzas de que el esfuerzo se completara en un período de tiempo razonable. Abandonaron el esfuerzo y crearon una nueva empresa para llevar su versión del lenguaje al mercado con el nombre de True BASIC . True BASIC combinaba muchas de las características del estándar básico, pero también introducía una serie de cambios propios. Entre los más notables estaba el hecho de que la numeración de líneas era ahora opcional. El lenguaje no fue bien recibido y muchas críticas expresaron las mismas preocupaciones sobre la sobrecarga de funciones que se habían planteado sobre el estándar Full BASIC. Jerry Pournelle lo ridiculizó como una "locura" [22] y John Dvorak lo descartó como "triste" y "condenado al fracaso". [23]
Al igual que las versiones anteriores de BASIC, Full BASIC fue diseñado para funcionar en un entorno de editor de líneas y, por lo tanto, utiliza números de línea para indicar líneas individuales o rangos de líneas que se deben editar o eliminar. Los números de línea pueden variar de 1 a 50.000, en contraste con Minimal, que era de 0 a 9999. Esto significaba que los programas Minimal válidos que usaban la línea 0 no eran válidos en Full. Las líneas lógicas tenían al menos 132 caracteres de longitud. Las líneas lógicas se podían extender a través de varias líneas físicas utilizando el "carácter de continuación", el ampersand. Desafortunadamente, el ampersand también fue seleccionado como el operador de concatenación de cadenas, lo que complicó el analizador. [24]
Los comandos de edición adicionales incluían RENUMBER
y DELETE
, que en ese momento eran comunes en los nuevos dialectos de microcomputadoras. Un nuevo concepto era EXTRACT
, que copiaba un rango de líneas en un nuevo archivo y las borraba del programa original, lo que permitía extraerlas a un subprograma. [25] Estos podían entonces ser invocados usando el CHAIN
comando . CHAIN
también podía incluir un opcional WITH
seguido de una lista de parámetros, en cuyo caso se esperaba que devolviera un valor en una variable con el mismo nombre que el programa (ver "Estructura", más abajo). [26]
Muchas de las palabras clave de uso común que se encuentran en Minimal u otros dialectos se mantuvieron; PRINT
, INPUT
, DATA
y READ
por ejemplo. Hubo numerosos cambios menores en estos comandos. Por ejemplo, en el momento de la edición, las palabras clave se pueden escribir en mayúsculas o minúsculas, o cualquier combinación. Como era el caso en el pasado, normalmente se mostraban en mayúsculas, mientras que una nueva convención fue usar la mayúscula de serpiente para nombres de variables de múltiples caracteres. [27]
Dartmouth BASIC introdujo la REM
declaración para comentarios en línea y esto fue universalmente admitido en otros dialectos. Muchos dialectos también agregaron una forma abreviada, más comúnmente usando la comilla simple, '
como se ve en Microsoft BASIC. Para Full, seleccionaron el signo de exclamación, !
para esta función, [28] aunque parece que no hay razón para no usar la comilla simple ya que no se usa en otros casos - las cadenas no permiten delimitadores de comillas simples, por ejemplo. [29] Un cambio más controvertido fue que la LET
palabra clave ahora era requerida para todas las asignaciones con el fin de simplificar el análisis, mientras que en todos los demás dialectos LET
era opcional. Esto incluía Minimal, por lo que cualquier código Minimal que usara este atajo era incompatible con Full. [30]
Además del conjunto relativamente pequeño de 23 palabras clave y 11 funciones de Minimal, Full agregó docenas de las suyas, para un total de 176 palabras clave (que definen 161 conceptos separados), 38 funciones matemáticas y 14 funciones de cadena si se incluían todas las extensiones. [31] Una lista simple de las palabras clave, dispuesta en tres columnas, llena dos páginas en el documento de estándares. [32]
La principal diferencia entre Full y Minimal era la adición de construcciones de programación estructurada orientada a bloques. En Minimal y en la mayoría de los intérpretes de BASIC, el programa lógicamente consistía en líneas de código independientes y uno podía comenzar la ejecución en cualquier punto mediante GOTO
la ejecución de cualquier número de línea. La única excepción a esta regla era el FOR...NEXT
bucle, donde todas las líneas desde FOR hasta NEXT se consideraban lógicamente como un solo bloque de código. La ramificación hacia o desde un bloque FOR daría como resultado un comportamiento extraño, típicamente dependiente de la implementación, pero generalmente algún tipo de error como "NEXT SIN FOR". [33]
En su totalidad, no se permite la ramificación hacia un bloque FOR...NEXT, ni tampoco la ramificación hacia afuera sin usar la EXIT
instrucción. Se suponía que las implementaciones debían verificar dichas instrucciones y rechazarlas, por ejemplo, al encontrar casos en los que el código GOTO
se convierte en un bucle. La verificación de dicho código es difícil en un intérprete que normalmente examina el programa línea por línea; la verificación de ramificaciones hacia un bloque desde otro código en el programa normalmente requeriría un análisis de todo el programa como un compilador. [16]
En Full, se ampliaron varias palabras clave existentes y se agregaron otras para proporcionar estructuras de bloques adicionales. Cabe destacar la multilínea IF...THEN...ELSE...END IF
, que permitía ejecutar varias líneas de código si se cumplía o no la condición. SELECT...CASE...CASE ELSE...END SELECT
se agregó para crear árboles de decisión, [34] que anteriormente se habrían implementado utilizando o ON...GOTO
múltiples IF
s para seleccionar una línea para ejecutar. FOR...NEXT
Los bucles permanecieron como estaban en Minimal, pero DO...LOOP
se agregó una nueva con variedades probadas en la parte superior DO WHILE...LOOP
y probadas en la parte inferior DO...LOOP UNTIL...
. Ahora se podía salir de todos los bucles de manera segura utilizando los comandos EXIT FOR
y EXIT DO
. [35]
Además de estos cambios en las estructuras de bloques, Full también agregó palabras clave para definir procedimientos, funciones y bloques de programa. Los programas en su conjunto ahora se abrían con la PROGRAM
palabra clave opcional seguida de un nombre de programa y finalizaban, como antes, con END
. Las rutinas se podían construir con SUB...END SUB
y llamar usando CALL name
. Las funciones de varias líneas se creaban con FUNCTION...END FUNCTION
y no declaraban un tipo de retorno ya que era parte del nombre: los nombres de funciones de cadena terminaban con el signo de dólar. El valor de retorno se proporcionaba estableciendo una variable con el mismo nombre que la función, por ejemplo, una función llamada "DOIT" contendría una línea como LET DOIT=1
. Las funciones podían llamar a otras funciones y a sí mismas, lo que significa que el lenguaje era naturalmente recursivo . [36] Full también mantuvo el estilo anterior de definiciones de funciones de una línea usando la DEF
palabra clave, pero eliminó el requisito de que el nombre de la función comenzara con "FN". Por ejemplo, DEF AVERAGE(X,Y)=(X+Y)/2
. [37]
En los BASIC anteriores, no existía el concepto de alcance y todas las variables eran globales . Esto no es adecuado para la construcción de grandes programas modulares, ya que una sección de código puede haber sido escrita utilizando nombres de variables comunes como I
y podría cambiar el valor de esa variable. Como la variable es global, conserva el valor modificado cuando regresa al código original. Un concepto clave de la programación estructurada es la variable local , que mantiene su valor separado de otras variables con el mismo nombre en otras ubicaciones en el programa compuesto. Como BASIC no tenía el concepto de alcance, muchos programas dependían del comportamiento global y usaban variables para pasar información dentro y fuera de las subrutinas. Para permitir ambos conceptos en el nuevo lenguaje, Full BASIC agregó la EXTERNAL
palabra clave que se podía agregar a una función o subrutina y hacer que cualquier variable dentro fuera local. [38] Como los programas BASIC generalmente colocaban las subrutinas al final del código fuente del programa, DECLARE
se agregó la palabra clave para proporcionar declaraciones hacia adelante . [39]
El BASIC completo introdujo nombres de variable largos, rompiendo finalmente con los nombres de una sola letra o de un dígito de letra del pasado. Fijó el nuevo límite en 31 caracteres. Una pequeña desventaja de este cambio fue que las palabras clave tenían que tener espacios entre ellas, mientras que la mayoría de las versiones anteriores permitían omitir los espacios. Esto se debía a que con nombres de una sola letra una línea como FORS=1TOA
puede analizarse como "FORS", que no puede ser una variable en una variedad de dos letras de BASIC. En Full, esto tendría que escribirse FOR S=1 TO A
porque "FORS" es un nombre de variable válido. [40] Como era el caso en los BASIC anteriores, los tipos de datos en Full se denotaban por sufijos en el nombre de la variable. Minimal había evitado este problema al tener solo variables numéricas, pero Full también incluía cadenas, denotadas usando el signo de dólar, por ejemplo A$
. [27]
El BASIC completo requería operaciones matemáticas decimales para la implementación predeterminada del sistema de punto flotante . Como esto no era universalmente compatible en hardware, especialmente en minis y micros, también agregó el OPTION ARITHMETIC NATIVE
que indica que las operaciones matemáticas deben realizarse utilizando la implementación de punto flotante predeterminada del sistema, sea cual sea. Se puede volver al modo BCD con OPTION ARITHMETIC DECIMAL
. Esto se suma a la opción de operaciones matemáticas de punto fijo, si está instalada. Las variables numéricas y de cadena funcionaban de otra manera como las de otros BASIC. [41]
Una nueva incorporación fue la extensión matemática de punto fijo, que permitía que las variables tuvieran una precisión específica. Esto se activaba utilizando el comando OPTIONAL ARITHMETIC FIXED
[b] seguido de un asterisco y un especificador de formato, por ejemplo, OPTION ARITHMETIC FIXED*8.2
que establecía que todas las variables numéricas tuvieran 8 dígitos de precisión y dos decimales. Dicha declaración debe colocarse antes de cualquier código matemático en el resto del programa. [43] Además, cualquier variable individual podía definirse individualmente utilizando algo como DECLARE NUMERIC*8.2 A, B
. [44]
La mayoría de los BASICs admitían la construcción de variables de matriz utilizando la DIM
palabra clave, por ejemplo, DIM A(5), B(2,2)
define dos matrices, la unidimensional A y la bidimensional (matriz) B. En Full BASIC, el límite inferior de cualquier matriz era normalmente 1, por lo que en este caso, la variable A tiene cinco "ranuras", numeradas del 1 al 5. El uso OPTION BASE 0
de esta declaración añadiría otra ranura en el índice 0. [45] Full también añadió un nuevo sistema para especificar directamente los límites inferior y superior utilizando la TO
palabra clave, por ejemplo, DIM A(100 TO 200)
lo que crea una matriz unidimensional de 101 ranuras. [45] Para complicar aún más las cosas, DECLARE NUMERIC
también se podría utilizar para crear matrices; las mismas dimensiones que el último ejemplo se podrían crear con DECLARE NUMERIC A(100 TO 200)
. [16]
La lista de operadores matemáticos admitidos incluía todos los de Minimal, +
, -
, *
y /
. ^
[ 46] La nueva MOD
función devuelve el resto de una división entera. La lista de operadores lógicos se amplió, AND
, OR
y NOT
se había eliminado de Minimal y ahora se volvió a agregar, y se agregaron las formas alternativas de los operadores de comparación, =<
, =>
y ><
. [31]
La lista de funciones integradas principales se mantuvo similar a las versiones anteriores de BASIC, incluidos ejemplos comunes como SQR
o ABS
. Las funciones trigonométricas se ampliaron para incluir , , , ASIN
y ACOS
. ATN
La nueva función devolvía el ángulo entre el origen y un punto X,Y dado. BASIC normalmente calculaba los ángulos en radianes, pero convertía todos los parámetros y salidas a grados, y el sistema exponía la función que se utilizaba en estas conversiones y en otros lugares. [47]COT
CSC
SEC
ANGLE
OPTION ANGLE DEGREES
PI
Dartmouth BASIC había introducido operaciones matriciales relativamente temprano en su evolución, y estas eran parte de Full. Estas sobrecargan las funciones matemáticas existentes, por lo que uno puede multiplicar dos matrices usando MAT A=A*B
o multiplicar el contenido de una matriz por un escalar si el parámetro B no es una matriz. El sistema también agrega varias funciones solo para matrices, que incluyen ZER
o, INV
ert y DET
erminate, entre otras. La adición de matemáticas matriciales también requiere la modificación de palabras clave existentes como PRINT
y INPUT
, que generan o ingresan múltiples elementos según sea necesario para completar el parámetro de la matriz. [48]
Las matrices pueden redimensionarse como parte de una MAT INPUT
especificando los nuevos límites, como MAT INPUT A(3.3)
. Las nuevas dimensiones deben tener una cantidad total de elementos igual o menor que la original DIM
, por lo que en este ejemplo, si la definición original era DIM A(2,2)
, la entrada causaría un error. [49]
Las primeras versiones de Dartmouth BASIC no incluían variables de cadena ni manipulación, las únicas cadenas en un programa eran constantes como PRINT "HELLO, WORLD!"
. La versión 4, de 1968, agregó variables de cadena y un único método para manipularlas, CHANGE
, que convertía cadenas en y desde una matriz que contenía los valores ASCII de los caracteres. Por ejemplo, CHANGE "HELLO, WORLD!" TO A
produciría una matriz de valores en A, donde A(0) era 72, el valor ASCII decimal para "H". Esto hizo que la manipulación de cadenas fuera bastante difícil; por ejemplo, para extraer "HOLA" de "¡HOLA, MUNDO!", uno tendría que:
10 A$ = "¡HOLA, MUNDO!" 20 DIM A ( 25 ), B ( 5 ) 30 CAMBIAR A$ POR A 40 PARA I = 1 A 5 50 B ( I ) = A ( I ) 60 SIGUIENTE I 70 CAMBIAR B POR B$
Muchos dialectos de BASIC habían añadido sus propios métodos para realizar una manipulación de cadenas más útil y evitar esa complicación. Para Full BASIC, el comité seleccionó una variación del concepto introducido por HP, "slicing de cadenas". Este concepto trata la cadena como una matriz de caracteres y puede accederse a ellos utilizando una especificación similar a una matriz conocida como "slice" . Para extraer "HOLA" de "HOLA, MUNDO" en Full, se utilizaría B$=A$(1:5)
. El concepto es similar al de CHANGE
, pero este método produce resultados que son en sí mismos cadenas, no valores numéricos, y por lo tanto se puede PRINT B$
producir "HOLA". Una diferencia significativa entre el enfoque de Full y los anteriores como HP es que utilizaba una sintaxis diferente para el slicing, mientras que los sistemas anteriores utilizaban sintaxis de matriz. Por ejemplo, en HP, la línea equivalente es B$=A$(1,5)
. Como se trata de la misma sintaxis que los accesos a matrices, HP (y similares) generalmente no permitían matrices de cadenas, [50] mientras que esto sí se permitía en Full. [51]
Este enfoque debe contrastarse con la solución seleccionada por DEC, el uso de funciones que devuelven nuevas cadenas, LEFT$
y MID$
. RIGHT$
Esta fue la solución elegida por Microsoft cuando escribieron su BASIC en el PDP-10 . La conversión entre los dos puede ser propensa a errores; para realizar el equivalente de RIGHT$(n)
, Full utilizaría DEF Right$(A$, n) = A$(Len(A$)-n+l)
. [37]
Otra área de enfoque del BASIC completo era la entrada/salida (E/S). La única E/S del BASIC mínimo eran los INPUT
comandos PRINT
y y la capacidad de codificar datos mediante las DATA
instrucciones y READ
. Casi todos los dialectos prácticos añadieron OPEN
y CLOSE
para crear un "canal" que luego se utilizaba para hacer referencia a ese archivo o dispositivo en particular.
INPUT
Ahora se incluía un PROMPT
, seguido de una cadena, dos puntos y luego las variables de entrada, por ejemplo INPUT PROMPT "What is your age? " : A
. [52] En ese momento, casi todos los BASIC incluían una característica similar sin la palabra PROMPT
y usando el separador de impresión existente punto y coma en lugar de dos puntos, por ejemplo, en MS BASIC la misma línea sería INPUT "What is your age? "; A
. Además de esto, Full también agregó las nuevas palabras clave TIMEOUT
and ELAPSED
: INPUT TIMEOUT 30, ELAPSED T, PROMPT "What is your age? ": A
, que continuarán la ejecución después de 30 segundos incluso si el usuario no ingresa nada, y colocarán el tiempo que tomó, posiblemente los 30 segundos, en la variable T. Para los sistemas que carecen de un reloj (lo que no era poco común en ese momento), T siempre devolvería -1. [53]
PRINT
ing se amplió de manera similar con la USING
declaración opcional, que ya había aparecido en varias implementaciones. USING
Normalmente, la cadena de formato usaba signos numéricos, asteriscos y signos de porcentaje para marcar los decimales. La cadena de formato se podía colocar en una variable de cadena y luego hacer referencia a ella, o IMAGE :
se podía hacer referencia a una línea separada opcional que contuviera una por número de línea. [54] [c] Full también agregó nuevos comandos para configurar el área de impresión SET MARGIN
y SET ZONEWIDTH
. [55] Los valores actuales de estas diversas configuraciones (y otras) se podían devolver usando ASK
. Por ejemplo, SET MARGIN 10
seguido de ASK MARGIN J
establecería J en 30. [56]
Operaciones de archivo totalmente compatibles con OPEN
y CLOSE
y un número de canal prefijado con un signo numérico, por ejemplo, OPEN #3: NAME "afile"
. Los datos pueden escribirse luego utilizando INPUT
y PRINT
o READ
y el nuevo WRITE
. [57] Los comandos de manejo de archivos adicionales incluían ERASE
y REWRITE
, y todos estos comandos tenían numerosas opciones y modos. Gran parte de esto se derivó de los diferentes tipos de dispositivos físicos que todavía eran comunes a fines de la década de 1970, la cinta magnética , por ejemplo, solo se podía acceder de manera secuencial, por lo que el nuevo estándar ofrecía opciones para SEQUENTIAL
o STREAM
, etc. La lista de opciones y sus interacciones y limitaciones cubre muchas páginas en el estándar. [58] Por ejemplo, es posible PRINT
a un archivo de DISPLAY
tipo, pero no INTERNAL
de tipo, que requería WRITE
. [59]
Al igual que muchos BASIC de la época, Full agregó el TRACE ON
comando que imprimiría los números de línea a medida que se ejecutaba el programa. También podía redirigir la impresión de los números de línea a otro dispositivo o archivo usando TRACE ON TO #3
, donde #3 era un canal abierto previamente. También agregó la declaración DEBUG ON
relacionada y BREAK
, la última de las cuales causaría una excepción si la depuración se había activado previamente. El estado de depuración estaba limitado a un programa en particular, por lo que podía activarse en un programa y desactivarse en un subprograma, por ejemplo. [60]
Además, Full agregó verdaderos manejadores de excepciones, basados en el WHEN EXCEPTION...END WHEN
bloque. Había dos formas de usar esto, si el bloque de código que comenzaba con WHEN EXCEPTION IN
el código siguiente se ejecutaba como un bloque y cualquier excepción dentro de él haría que saltara a la USE
sección, que opera de manera similar a un ELSE
. También se puede usar definiendo un bloque separado similar a una subrutina usando HANDLER name
que luego se llamaría por nombre usando WHEN EXCEPTION USE name
. [61] El código podría probar qué excepción había ocurrido usando las metavariables EXTYPE
o el EXTEXT$
, ninguno de los cuales necesitaba un ASK
. RETRY
salía del manejador de errores y regresaba a la línea del error, mientras que CONTINUE
se podía usar dentro del código de la línea principal para ignorar errores incluso dentro de WHEN
los bloques. [62]
Casi al mismo tiempo que se estaba diseñando Full, se estaba llevando a cabo un esfuerzo paralelo para definir el Sistema de núcleo gráfico (GKS, por sus siglas en inglés). Este se ofreció como uno de los módulos opcionales de Full. Esto agregó docenas de palabras clave especiales como LINE STYLE
y WINDOW
con una sintaxis que no coincidía con la de los otros módulos del estándar. Por ejemplo, el CLIP
comando activaba el recorte de la ventana gráfica actual de modo que los elementos dibujados fuera de sus límites no fueran visibles; esto tomaba un valor de cadena en lugar de un valor booleano, CLIP "On"
. [63] Se agregaron varios comandos comunes de modificación de imágenes SHIFT
, SCALE
, ROTATE
y SHEAR
. [64]
Como las imágenes suelen construirse a partir de elementos comunes, Full agregó la nueva PICTURE
estructura de bloques, que de otro modo es similar a a SUB
y se invoca con DRAW
en lugar de CALL
. [65] La diferencia es que la salida de un bloque de imagen se puede modificar con la modificación usando WITH
. Por ejemplo, si uno definió a PICTURE CIRCLE
que produjo un círculo de radio uno, se podría dibujar un círculo más pequeño y moverlo hacia un lado con DRAW CIRCLE WITH SHIFT(2) * SCALE(.4)
. [65]
El módulo de tiempo real de Full agregó el concepto de "secciones paralelas" mediante la PARACT
palabra clave. Estas parecían subrutinas (e imágenes) pero tenían una serie de palabras clave adicionales que controlaban su invocación. Por ejemplo, se podía definir un código que respondiera a un EVENT
y luego hacer que se ejecutara emitiendo un MESSAGE
en otra parte del código. Los mensajes podían invocar múltiples controladores utilizando el SHARED
concepto de puertos. [66]
El sistema también permitía que estos bloques y objetos se conectaran a un código externo que crearía estos mensajes. Por ejemplo, se podía tener un código que esperara a un dispositivo que periódicamente creara una salida de texto y luego se llamaría automáticamente al controlador apropiado cuando hubiera un nuevo texto disponible. Debido a que los datos reales de dichos dispositivos tienden a ser de varias partes, no algo simple como una cadena o un número, la biblioteca de tiempo real también agregó la capacidad de definir STRUCTURE
s que luego se podían leer o escribir como una unidad atómica. [67] Estos luego se leían y escribían usando los comandos IN FROM
y OUT TO
, [68] o si los datos eran , el comando y SHARED
, que de lo contrario era similar . [69]GET FROM
PUT TO
Aunque muchos programas en tiempo real pueden modelarse como un sistema que simplemente responde a eventos externos, también es común que el programa mismo publique periódicamente estos eventos. Para esto, Full agregó el START
comando y el asociado WAIT
que pausaría la ejecución durante un tiempo determinado DELAY
(una cantidad de segundos) o TIME
(una hora explícita del día) o hasta que EVENT
se viera un evento. [70]
Las normas ECMA y ANSI no se desarrollaron de manera conjunta, sino en paralelo, aunque con miembros de comités superpuestos. Por el contrario, el grupo de trabajo ISO para BASIC no desarrolló una norma propia, sino que planeó adoptar la norma ECMA o la ANSI. [71]
Independientemente de ANSI, el comité ECMA responsable del estándar BASIC lo dividió en dos: ECMA BASIC-1 y ECMA BASIC-2. BASIC-1 incluía parte del sistema de manipulación de archivos pero carecía del manejo de excepciones, mientras que BASIC-2 agregó el conjunto completo de comandos de archivos, matemáticas decimales fijas y el sistema de manejo de excepciones. [1] Además, en BASIC-1 todas las palabras clave fundamentales como PRINT
eran palabras reservadas que simplificaban el analizador, mientras que en BASIC-2 seguían el patrón ANSI y podían usarse dentro de subrutinas y funciones creadas por el usuario. [1]
El grupo de trabajo de la ISO había planeado inicialmente utilizar la norma de la ECMA. Ante el problema de que existían dos normas candidatas diferentes, en septiembre de 1987 se le encargó que elaborara una única norma internacional que unificara ambas. Esto se logró especificando que el cumplimiento de cualquiera de las dos normas podía considerarse como cumplimiento de la norma ISO. [71]
OPTIONAL
palabra clave no aparece en los ejemplos del documento de normas [42] pero es obligatoria.IMAGE
funciona de la misma manera que FORMAT
en FORTRAN.