ALGOL 68RS es el segundo compilador de ALGOL 68 escrito por IF Currie y JD Morrison, en 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 parte de la 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 computadora ICL 1900, casi obsoleta , e implementaba una versión externa. versión actualizada del lenguaje tal como se publicó 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 un traductor compila en código de máquina . El compilador necesitaba conocer sólo los tamaños de los distintos tipos de datos de máquina de objetos y la codificación (conjunto) de caracteres disponible.
El compilador fue escrito en ALGOL 68, arrancado inicialmente usando 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 Centro Regional de Computación de las Universidades del Suroeste (SWURCC) dispuso que este sistema fuera patrocinado por International Computers Limited (ICL) y se vendiera como un producto oficial de ICL. [5]
Más tarde, el Centro Conjunto de Computación de las Universidades de Avon , un gran usuario de Multics, solicitó al equipo 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 admitía 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 estuviera disponible gratuitamente, 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 un solo paso , que requería algunas restricciones en el lenguaje compilado.
El programa ALGOL 68:
PROC par = ( número INT ) BOOL : (número = 0 | VERDADERO | impar ( ABS (número - 1))); PROC impar = ( número INT ) BOOL : (número = 0 | FALSO | par ( ABS (número - 1)));
habría que reescribirlo como:
PROC ( INT ) BOOL impar; PROC par = ( número INT ) BOOL : (número = 0 | VERDADERO | impar ( ABS (número - 1)));impar := ( número INT ) BOOL : ( número = 0 | FALSO | par ( ABS (número - 1)));
Para permitir declaraciones recursivas de modos (tipos), se utilizó una declaración de modo stub 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 la cláusula PAR de los operadores y el modo SEMA con sus ARRIBA , ABAJO y NIVEL asociados.
Una característica errónea importante de ALGOL 68 es que es imposible escribir los procedimientos de transputación estándar ( entrada/salida ) en ALGOL 68 puro. El procedimiento de impresión toma, por ejemplo, una serie de elementos para imprimir de cualquier modo y, mediante un proceso llamado enderezar , los convierte en valores simples que se pueden imprimir. Por ejemplo:
ESTRUCTURA ( INT a, REAL b) c := ...;imprimir(c); { transformado mágicamente para imprimir ((a DE c, b DE c)); }
Los redactores de ALGOL 68RS decidieron que el alisado estuviera disponible como parte del lenguaje. Un modo RECTO se parece a una matriz , pero tiene la característica especial de que los elementos pueden pasar a un modo RECTO si sus componentes pueden pasar a ese modo. Por ejemplo:
ESTRUCTURA ( INT a, REAL b) c; UNIÓN RECTA ( INT , REAL ) z = c;
Ambos campos de C se pueden convertir en UNION ( INT , REAL ) para que se pueda acceder al campo "a OF c" como z[1] y "b OF c" es 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 RECTA ); PROC print = ([] argumentos PRINTMODE ) VOID : ...;
Los modos de matriz de ALGOL 68 son muy potentes e incluyen múltiples dimensiones, límites superiores e inferiores definidos, recorte (creación de una nueva matriz tomando un subconjunto contiguo de una matriz), corte (creación de una nueva matriz eliminando una dimensión de una matriz), y remar (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 eficientemente 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 = ESTRUCTURA 4 CARACTERÍSTICAS ; OP ELEM = ( índice INT , valor BYTES ) CHAR : valor[í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 deseaba un VECTOR o una matriz, una i-struct podría ampliarse al VECTOR o tipo de 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 requiriera 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 múltiples matrices en paralelo y ser controlado por una cláusula WHILE :
[12] INT a, b;...FORALL 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 instalaciones de compilación separadas de ALGOL 68-R y un mecanismo para construir programas de arriba hacia abajo similar a los de ALGOL 68C .
Las bibliotecas en ALGOL 68RS se escriben utilizando módulos de declaración que constan de una secuencia de declaraciones de MODO , 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 ponga a disposición del programa los símbolos de una o más bibliotecas de declaración.
Por ejemplo, una biblioteca de gráficos podría escribirse como:
DECS graphlib UTILIZA alguna otra bibliotecaMODO GRAPHDATA = ESTRUCTURA (...); GRÁFICO DE MODO = DATOS DEL GRÁFICO DE REF ; PROC nuevo gráfico = (...) GRÁFICO : ...; PROC dibujar gráfico = ( GRAPH g) VOID : ...; ...MANTENER GRÁFICO , nuevo gráfico, dibujar gráfico FINALIZAR
Y un programa de usuario para usar esta biblioteca se vería así:
PROGRAMAR myprog USAR graphlib COMENZAR GRÁFICO g = nuevo gráfico (...); ... dibujar el gráfico (g); ...ACABADO FINAL
Para admitir un estilo de programación de arriba hacia abajo, ALGOL 68RS proporcionó las funciones AQUÍ y CONTEXTO .
Se podría escribir un programa con partes que se completarán más tarde marcadas con una etiqueta AQUÍ seguida de una lista de declaraciones que estarán disponibles.
PROGRAMA (paso1, paso2) compilador BEGIN STRING fuente := ...; ÁRBOL árbol de traducción;... AQUÍ pass1 (fuente, árbol de análisis);... INSTRUCCIONES insts; AQUÍ pass2 (parsetree, insts);...ACABADO FINAL
El código a ejecutar en el contexto de las etiquetas AQUÍ se escribiría como:
PROGRAMA pase1 implementación CONTEXTO pase1 EN compilador COMENZAR ... {código usando "fuente" y "parsetree" }ACABADO FINAL
AQUÍ es similar al ALGOL 68C ENVIRON y CONTEXT es equivalente al ALGOL 68C USING .
ALGOL 68RS estaba destinado a ser utilizable para la programación de sistemas de bajo nivel . Para permitir esto, se incluyeron funciones para el acceso al código de máquina y a objetos que no son ALGOL 68RS.
El código se insertó con la construcción CODE :
CÓDIGO DE ALGÚN MODO ( elemento1 , elemento2 , ...) "... código ..."
Donde los elementos son valores ALGOL 68RS que estarán disponibles 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 ALIEN :
ALGÚN MODO nombre = EXTRANJERO " nombre-externo "
Cualquier objeto ALGOL 68RS simple podría convertirse en un VECTOR de caracteres usando el operador SPELL :
ESTRUCTURA ( INT a, REAL b) c = ...;print (("repr interno = ", DELETREAR c, nueva línea));
Un objeto simple es aquel que no contiene matrices ni VECTORES .
El traductor 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 FORMAT s.
A partir de septiembre de 2020 [actualizar], ALGOL 68RS está disponible en SourceForge . [6]