ALGOL 68RS es el segundo compilador de ALGOL 68 escrito por IF Currie y JD Morrison, en el Royal Signals and Radar Establishment (RSRE). [1] A diferencia del anterior ALGOL 68-R , fue diseñado para ser portátil e implementó el lenguaje del Informe Revisado.
Se escribieron versiones de ALGOL 68RS para la serie ICL 2900 , Multics y VAX con VMS . [2] [3]
Posteriormente, partes de este compilador fueron liberadas al dominio público , como traductor de ALGOL 68 a C , como parte del lanzamiento público del lenguaje de descripción de hardware ELLA , también por RSRE.
Aunque el compilador ALGOL 68-R , escrito por IF Currie, JD Morrison y SG Bond , fue un gran éxito, sufrió dos problemas importantes: había sido escrito para la casi obsoleta computadora ICL 1900 e implementó una versión desactualizada del lenguaje ya que fue lanzado antes de que el Informe Revisado sobre ALGOL 68 estuviera disponible.
RSRE necesitaba un compilador más nuevo para varios proyectos internos, por lo que el equipo de Currie y Morrison escribió un nuevo compilador diseñado para la portabilidad de software multiplataforma entre máquinas. El compilador se ocupó del análisis de ALGOL 68, produciendo un lenguaje intermedio de alto nivel conocido como lenguaje de flujo que luego se compila en código de máquina mediante un traductor . El compilador solo necesitaba conocer los tamaños de los diversos tipos de datos de máquina de objetos y la codificación de caracteres (conjunto) disponible.
El compilador fue escrito en ALGOL 68, inicialmente arrancado utilizando el compilador ALGOL 68-R.
Un equipo de dos programadores de Oxford University Computing Services escribió un generador de código para la serie ICL 2900. [4] Martyn Thomas , del South West Universities Regional Computer Centre (SWURCC), consiguió que este sistema fuera patrocinado por International Computers Limited (ICL) y vendido como un producto oficial de ICL. [5]
Más tarde, el Centro de Computación Conjunto de las Universidades de Avon , un importante usuario de Multics, solicitó al equipo de SWURCC que produjera una versión Multics de ALGOL 68RS. También se escribió una versión para la computadora VAX de Digital Equipment Corporation (DEC) .
Finalmente, el equipo de SWURCC formó una empresa, Praxis , que inicialmente apoyó la versión Multics de ALGOL 68RS.
RSRE también utilizó el compilador ALGOL 68RS para proyectos internos, incluida la máquina Flex y el lenguaje de diseño de hardware ELLA. Cuando se decidió que ELLA estaría disponible de forma gratuita, se encargó a Praxis que escribiera un traductor de ALGOL 68 a C llamado ctrans , basado en el compilador ALGOL 68RS.
Al igual que el compilador ALGOL 68-R anterior, ALGOL 68RS era un compilador de una sola pasada , lo que requería algunas restricciones en el lenguaje compilado.
El programa ALGOL 68:
PROC par = ( INT número) BOOL : ( número = 0 | VERDADERO | impar ( ABS (número - 1))); PROC impar = ( INT número) BOOL : ( número = 0 | FALSO | par ( ABS (número - 1)));
Debería reescribirse como:
PROC ( INT ) BOOL impar; PROC par = ( INT número) BOOL : ( número = 0 | VERDADERO | impar ( ABS (número - 1)));impar := ( INT número) BOOL : ( número = 0 | FALSO | par ( ABS (número - 1)));
Para permitir declaraciones recursivas de modos (tipos), se utilizó una declaración de modo especial para informar al compilador que un símbolo próximo era un modo en lugar de un operador:
MODO B , A = ESTRUCTURA ( REF B b), B = [1:10] REF A ;
Al igual que ALGOL 68-R, se omitieron los operadores de la cláusula PAR y el modo SEMA con sus operadores UP , DOWN y LEVEL asociados .
Una de las principales fallas de ALGOL 68 es que es imposible escribir los procedimientos estándar de transput ( entrada/salida ) en ALGOL 68 puro. El procedimiento de impresión toma, por ejemplo, una matriz de elementos para imprimir de cualquier modo y, mediante un proceso llamado enderezamiento , los convierte en valores simples que se pueden imprimir. Por ejemplo:
ESTRUCTURA ( INT a, REAL b) c := ...;print(c); { transformado mágicamente en print ((a OF c, b OF c)); }
Los autores de ALGOL 68RS decidieron que el enderezamiento estuviera disponible como parte del lenguaje. Un modo STRAIGHT se parece a una matriz , pero tiene la característica especial de que los elementos pueden ser forzados a un modo STRAIGHT si sus componentes pueden ser forzados a ese modo. Por ejemplo:
ESTRUCTURA ( INT a, REAL b) c; UNIÓN RECTA ( INT , REAL ) z = c;
Ambos campos de C pueden convertirse en UNION ( INT , REAL ), de modo que se puede acceder al campo "a OF c" como z[1] y "b OF c" como z[2].
El procedimiento de impresión estándar ahora se puede declarar como:
MODO MODO IMPRESIÓN = UNIÓN ( INT , REAL , ... MODO IMPRESIÓN DIRECTO ); PROC imprimir = ([] MODO IMPRESIÓN argumentos ) VOID : ...;
Los modos de matriz de ALGOL 68 son muy potentes, e incluyen múltiples dimensiones, límites superiores e inferiores definidos, recorte (crear una nueva matriz tomando un subconjunto contiguo de una matriz), corte (crear una nueva matriz quitando una dimensión de una matriz) y remado (crear una nueva matriz agregando una dimensión a una matriz existente).
Por ejemplo:
[5:23, -7:7] INT a; { una matriz bidimensional } REF [,] INT b = a [ 6:21, 0:3 ] { una porción de a } REF [] INT c = a [5] { solo una fila de a }
Si bien el compilador hizo todos los esfuerzos posibles para generar un código óptimo para todos los casos, se consideró que agregar algunas funciones más simples permitiría un mejor código en algunos casos. Con este fin, ALGOL 68RS incluyó estructuras indexables (i-structs), vectores y la declaración FORALL .
ALGOL 68 ya incluía estructuras de longitud fija para manejar de manera eficiente caracteres y datos de bits en máquinas basadas en palabras , los modos BYTES y BITS . Una variable BYTES contenía una palabra de máquina de caracteres, una variable BITS contenía los bits de una palabra de máquina.
ALGOL 68RS generalizó estas ideas. Una variable STRUCT 4 CHAR contenía exactamente 4 caracteres. El tamaño era parte del tipo. En la mayoría de los sistemas ALGOL 68RS, el modo BYTES era equivalente a STRUCT 4 CHAR .
MODO BYTES = STRUCT 4 CHAR ; OP ELEM = ( INT índice, BYTES val) CHAR : val[índice];...BYTES b = "abcd";...imprimir (2 ELEM b);
El compilador ALGOL 68RS compilaría cualquier constante de cadena en un STRUCT n CHAR apropiado .
En contextos donde se desea un VECTOR o una matriz, una i-estructura podría ampliarse al tipo de VECTOR o matriz apropiado.
Un VECTOR es una matriz simplificada, con una sola dimensión y un límite inferior fijado en 1.
VECTOR [4] INT a; { similar a [1:4] INT a; }
En cualquier contexto donde se requiera una matriz, un VECTOR podría convertirse en una matriz.
La declaración FORALL permite recorrer de manera eficiente los elementos de una matriz.
[12] INT a := ...;FORALL xa EN a DO xa := xa * 2 OD
xa será una referencia a cada elemento de a por turno. FORALL puede recorrer varias matrices en paralelo y ser controlado por una cláusula WHILE :
[12] INT a, b;...PARA TODOS xa EN a, xb EN b MIENTRAS xa > xb HACER f(xa, xb)sobredosis
ALGOL 68RS proporcionó un mecanismo para construir bibliotecas similares a las facilidades de compilación separadas de ALGOL 68-R y un mecanismo para construir programas de manera descendente similar a los de ALGOL 68C .
Las bibliotecas en ALGOL 68RS se escriben utilizando módulos de declaración que consisten en una secuencia de declaraciones de MODE , variable, operador y procedimiento seguidas de una lista de mantenimiento que define qué declaraciones son visibles para otros segmentos.
Luego, el usuario de la biblioteca agrega un encabezado USE que le indica al compilador que haga que los símbolos de una o más bibliotecas de declaración estén disponibles para el programa.
Por ejemplo, una biblioteca de gráficos podría escribirse como:
DECS graphlib USE alguna otra bibliotecaMODO GRAPHDATA = STRUCT (...); MODO GRAFICO = REF GRAPHDATA ; PROC nuevo grafico = (...) GRAFICO : ...; PROC dibujar grafico = ( GRAFICO g) VOID : ...; ...MANTENER GRÁFICO , nuevo gráfico, dibujar gráfico FINALIZAR
Y un programa de usuario para utilizar esta biblioteca se vería así:
PROGRAMA myprog USO graphlib BEGIN GRAPH g = nuevo gráfico (...); ... dibujar la gráfica (g); ...FINALIZACIÓN
Para respaldar un estilo de programación de arriba hacia abajo, ALGOL 68RS proporcionó las facilidades HERE y CONTEXT .
Se podría escribir un programa con partes que se completarán más tarde y que estarán marcadas con una etiqueta HERE seguida de una lista de declaraciones que estarán disponibles.
PROGRAMA (pass1, pass2) compilador BEGIN CADENA fuente := ...; ÁRBOL parsetree;... AQUÍ pass1 (fuente, árbol de análisis);... INSTRUCCIONES insts; AQUÍ pass2 (parsetree, insts);...FINALIZACIÓN
El código a ejecutar en el contexto de las etiquetas HERE se escribiría como:
PROGRAMA pass1 implementación CONTEXTO pass1 EN compilador COMIENZO ... { código que utiliza "source" y "parsetree" }FINALIZACIÓN
AQUÍ es similar al ALGOL 68C ENVIRON y CONTEXT es equivalente al ALGOL 68C USING .
ALGOL 68RS fue diseñado para ser utilizado en la programación de sistemas de bajo nivel . Para permitir esto, se incluyeron funciones para acceder a código de máquina y objetos que no son de ALGOL 68RS.
El código se insertó con la construcción CODE :
CÓDIGO DE ALGÚNMODO ( elemento1 , elemento2 , ...) "... código ..."
Donde los elementos son valores ALGOL 68RS que se pondrán a disposición para la inserción del código y SOMEMODE es el modo devuelto. El modo se puede omitir si el código no devuelve ningún valor.
El acceso a objetos que no son ALGOL68 estaba disponible con la inserción de ALIEN :
ALGUNOMODO nombre = ALIEN " nombre-externo "
Cualquier objeto ALGOL 68RS simple podría convertirse en un VECTOR de caracteres utilizando el operador SPELL :
ESTRUCTURA ( INT a, REAL b) c = ...;imprimir (("repr interna = ", SPELL c, nueva línea));
Un objeto simple es aquel que no contiene matrices ni VECTOR .
El traductor de ALGOL 68 a C escrito por Praxis para el sistema ELLA contiene la mayor parte del compilador ALGOL 68RS. La excepción notable es el código para manejar los FORMAT .
A partir de septiembre de 2020 [actualizar], ALGOL 68RS está disponible en SourceForge . [6]