BÁSICO09
BASIC09 es un dialecto de lenguaje de programación BASIC estructurado desarrollado por Microware en nombre de Motorola para la entonces nueva CPU Motorola 6809 y lanzado en febrero de 1980. Se usa principalmente con el sistema operativo OS-9., lanzado en 1979. Microware también lanzó una versión para OS-9/68k en el 68000 como Microware BASIC.
A diferencia de los BASIC típicos de la época, BASIC09 incluye un compilador de varias pasadas que produce un código de bytes compacto conocido como I-code. I-code reemplaza una serie de estructuras de datos que se encuentran en otros BASIC con punteros directos al código y los valores, lo que acelera el rendimiento. Los usuarios pueden seguir compilando el código usando el comando PACK
, momento en el cual OS-9 puede llamarlo directamente y operarlo como código nativo. En el caso del código PACKed, se utiliza una versión reducida del sistema de tiempo de ejecución BASIC09, Runb, que mejora aún más la huella de memoria y el tiempo de carga.
El lenguaje incluye una serie de adiciones de programación estructurada, incluidas variables locales, la capacidad de ignorar los números de línea en favor de rutinas con nombre, estructuras definidas por el usuario y varios tipos de datos base distintos, incluidos 16 bits y 8 bits (byte) enteros, además de punto flotante y cadenas.
Sintaxis
Organización del programa
Una diferencia clave entre BASIC09 y los BASIC convencionales de la época, como el BASIC canónico de Microsoft, es la adición de la estructura PROCEDURE
que creaba bloques de código ejecutables por separado. El código en un PROCEDURE
tenía más en común con los programas completos en otros BASIC, incluidas las variables locales al código y su capacidad para ejecutarse de manera independiente. Los PROCEDURE
se llamaban por su nombre mediante el comando RUN
y podían incluir variables para la semántica de llamadas a funciones; por ejemplo, RUN add(4,7)
llama a un procedimiento llamado add
que toma dos parámetros. Los parámetros se importaron al procedimiento usando la palabra clave PARAM
, en este ejemplo PARAM a,b
:
PROCEDURE add PARAM a,b PRINT a+b
Un efecto secundario del uso de procedimientos con nombre es que el espacio de trabajo de la memoria resultante es, en efecto, su propio espacio de nombres. A este respecto, el sistema BASIC09 aparece para el usuario como un directorio de programas a los que se puede llamar. Esto contrasta con los BASIC típicos, donde solo un programa está disponible en un momento dado y la construcción de programas más grandes que llaman código similar a una biblioteca generalmente requiere que el código fuente se copie y pegue entre programas separados. En BASIC09, el usuario puede LOAD
procedimientos por nombre en el espacio de trabajo y luego llamarlos desde su propio código para construir programas más grandes a partir de los procedimientos almacenados por separado.
Además del código en el área de trabajo, si el programa invoca RUN
con un nombre de procedimiento que no se pudo encontrar, entonces buscará un archivo de disco con el mismo nombre y lo cargará y ejecutará. expediente. Esto funcionó no solo con el código BASIC09, sino también con cualquier otro programa ejecutable, incluidos los archivos de lenguaje de máquina. Esto significaba que BASIC09 podía llamar fácilmente a las rutinas del sistema.
Además de RUN
, otros comandos BASIC comunes también usaban nombres. Por ejemplo, LIST bob
imprimiría el código fuente ("list") del procedimiento llamado "bob", mientras que LIST*
imprime todos los procedimientos actualmente en la memoria. La salida bastante impresa de LIST
podría redirigirse a un archivo o una impresora con una notación similar a una concha, p. LIST bob >/p
. También se podrían SAVE
y LOAD
procedimientos desde el almacenamiento.
Programación estructurada
Además de las propiedades organizativas del PROCEDIMIENTO
, BASIC09 también incluyó una serie de extensiones a las declaraciones de control de flujo que se encuentran en BASIC para proporcionar más estructura. Por ejemplo, la instrucción IF
podría usarse en el formato tradicional IF
...THEN
en una sola línea, o podría usarse en un formato estructurado de varias líneas:
IF x título10 THEN PRINT "x es más grande que 10" ELSE PRINT "x es más pequeño que 10" ENDIFLos bucles
FOR/NEXT
naturalmente tienen un formato estructurado ya que NEXT
se puede colocar en cualquier línea, pero BASIC09 también agregó WHILE/ENDWHILE
y REPEAT/UNTIL
para mayor claridad al trabajar con bucles no indexados. También incluía el LOOP/ENDLOOP
de salida central que usaba la declaración EXITIF
para probar en cualquier parte del cuerpo del bucle.
Tipos de datos
BASIC09 incluía varios tipos de datos integrados. Además de la cadena tradicional (CADENA) y los tipos de coma flotante (REAL) de 40 bits que se encuentran en la mayoría de los BÁSICOS de la época, también incluía el INTEGER con signo de 16 bits, el BYTE sin signo de 8 bits y el tipo lógico BOOLEAN. Los tipos BOOLEAN no se empaquetaron en bytes, un solo BOOLEAN usó un byte completo de 8 bits para almacenar un solo valor. El lenguaje proporcionó operadores booleanos separados por bytes para operaciones por bits en BYTE y INTEGER. A diferencia de otros BASIC que también operaban con diferentes tipos de base, BASIC09 no "decoraba" el nombre de la variable para indicar el tipo y, en su lugar, utilizó el DIM
para las definiciones; por ejemplo, DIM a,b:BOOLEAN
para declarar dos variables BOOLEAN, o DIM c(5):INTEGER
para una matriz de cinco INTEGER.
Además, BASIC09 incluía la palabra clave TYPE
, que permitía definir tipos compuestos, con cada "elemento" listadas en una sola línea separadas por punto y coma. Por ejemplo:
TYPE employee_record=name:STRING;number(2):INTEGER;former:BOOLEAN
define un tipo de registro de empleado llamado employee_record
con tres elementos, name
, number
y ex
. El tipo employee_record ahora se puede usar en una definición como cualquier otro tipo, por ejemplo, DIM employee(100):employee_record
, que define una matriz de 100 employee_record's. Se accede a los elementos en el código usando la notación de puntos, por ejemplo, employees(50).name="Bob"
.
Tiempo de ejecución
Edición
Los números de línea se usaban en la mayoría de los dialectos BASIC principalmente como una forma de apoyar al editor. Los usuarios editarían líneas particulares de código escribiendo un número, y el texto seguiría agregando o reemplazando las líneas que ya están en la memoria. Como cada línea de código tenía un número, esto también las hacía adecuadas para indicar el destino de un GOTO
o GOSUB
, en comparación con otros lenguajes como FORTRAN donde un " separado;etiqueta de línea" se utilizó para este propósito.
BASIC09 normalmente no usaba números de línea, por lo que su editor tuvo que ser modificado para permitir al usuario editar líneas sin referirse a ellas por número. Sin embargo, BASIC09 no asumió ningún tipo de capacidad de pantalla completa, por lo que usar las teclas del cursor no era una opción. En cambio, el sistema tenía un indicador de editor separado y permitía al usuario moverse usando las teclas + y -, avanzando o hacia atrás una línea a la vez. Para insertar una nueva línea de código sin un número de línea, el usuario dejó un espacio en blanco al comienzo de la declaración.
Tenga en cuenta que el idioma distingue entre mayúsculas y minúsculas para los valores proporcionados por el usuario, como los nombres de procedimientos y variables, pero no para las palabras clave. Las palabras clave ingresadas en el editor en minúsculas se mostrarán en mayúsculas cuando el programa se LIST
ed. BASIC09 permitía varias declaraciones en una sola línea de código, pero usaba como separador en lugar de : que se usa en la mayoría de los dialectos. Esto se debe a que usó dos puntos en el operador de asignación :=
, que se sumaba al =
normal. :=
tenía un efecto idéntico a =
, pero hacía más obvia la diferencia entre asignaciones y comparaciones.
Compilador
El compilador multipaso interno convierte el código fuente BASIC09 en un código de bytes tokenizado y optimizado, llamado I-code. I-code se diferencia del enfoque de tokenización más tradicional que se encuentra en la mayoría de los BASIC en que una cantidad de elementos se colocaron directamente en la memoria en lugar de usar referencias que luego debían buscarse.
Por ejemplo, en los intérpretes basados en MS, una referencia variable en el código se deja en formato de cadena; la variable VAR
estaría representada en la memoria por los tres caracteres ASCII "VAR". Durante la ejecución, cuando se encuentra esta variable en el código, el intérprete tiene que buscar esa cadena en una tabla de variables, encontrar la dirección de almacenamiento asociada en la memoria y, finalmente, leer el valor almacenado en esa ubicación. La tabla generalmente se construye de modo que el valor siga al nombre, para ahorrar tiempo durante la búsqueda final.
Por el contrario, en I-code, la dirección de la variable se determina de antemano y la referencia en el código se reemplaza por esa dirección. Esto evita una búsqueda en tiempo de ejecución a través de la tabla de variables. Otras optimizaciones incluyen una rutina separada FOR/NEXT
que se usa cuando la variable de índice es un INTEGER, y bibliotecas matemáticas INTEGER y REAL separadas.
Para mayor rendimiento, BASIC09 también incluyó el comando PACK
que tomó un nombre de procedimiento y devolvió una versión optimizada. Algunas de estas optimizaciones incluyeron la eliminación de instrucciones no codificadas como comentarios de código y el reemplazo de expresiones constantes a un solo valor. Por ejemplo, PACK
reconocería que LET x=x+SQR(100)/2
contiene solo constantes a la derecha y lo reemplaza con el código x= x+5
, que requiere una sola operación en tiempo de ejecución, la suma, la eliminación de la división y la raíz cuadrada. PACK
redujo el consumo de memoria del procedimiento y mejoró el rendimiento entre un 10 % y un 30 %.
Tiempo de ejecución ligero
Aunque era común ejecutar programas dentro del entorno BASIC09, como lo era en otros BASIC, BASIC09 también se envió con una versión separada del código de solo ejecución conocida como Runb. Runb eliminó las funciones de edición y depuración del sistema y, como resultado, tenía aproximadamente la mitad del tamaño del BASIC09 completo.
El propósito de Runb era principalmente ejecutar módulos PACKed cuando se los llamaba desde otros programas. Esto significaba que si el usuario ingresaba el nombre de un módulo BASIC09 en la línea de comandos de OS/9 y ese módulo se marcaba como PACKed, Runb lo abre y lo ejecuta en lugar de BASIC09. Esto reduce la huella de memoria y mejora el tiempo de carga.
Características importantes
- disposiciones razonablemente estructuradas de la corriente de control (por ejemplo, los números de línea se necesitaban principalmente para calcular
GOTO
, como BASIC09 no tenía una declaración de conmutación / caso, o calculadoGOSUB
) - declaración de estructura (traer en cualquier variante BASIC; más común en las implementaciones BASIC posteriores)
- tipos de datos intrínsecos y booleanos
- más de dos caracteres significativos en nombres variables (algunos BASIC del tiempo permitieron sólo uno, muchas variantes de Microsoft BASIC permitieron sólo dos)
- procedimientos con variables locales Todos variables en BASIC09 son locales a procedimientos) y parámetro pasando por referencia
- un depurador razonable (sólo un inconveniente significativo era que uno no podía examinar el contenido de los campos en las estructuras)
- una manera de interactuar con el código de lenguaje de la máquina, que podría pasar parámetros utilizando la secuencia de llamadas BASIC09
- la impresión automática de la fuente, que fortaleció un diseño estándar y evitó el enorme desorden que era la apariencia habitual de un programa de cualquier tamaño en los BASIC interpretados de la época. Los programadores normalmente anularían el mayor número posible de líneas para evitar la memoria del número de línea, no un problema en BASIC09
Contenido relacionado
Unidad de servicio de datos
Recuperación asistida por conocimientos en el contexto de la actividad
Área de trabajo personal