stringtranslate.com

ALGOL 68RS

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.

Historia

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.

Restricciones en el lenguaje compilado

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.

Declaración antes del uso

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 ;

Procesamiento paralelo

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 .

Ampliaciones de ALGOL 68

Alisado

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 : ...;

Manejo eficiente de matrices

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 .

Estructuras indexables

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.

Vectores

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.

Declaración FORALL

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

Compilación separada

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 .

Módulos de declaración

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

Módulos anidados

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 .

Código y acceso extraterrestre

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 .

Disponibilidad

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 , ALGOL 68RS está disponible en SourceForge . [6]

Referencias

  1. ^ Bond, SG ; Woodward, PM (agosto de 1977). "Introducción al compilador portátil ALGOL 68 'RS'". Nota técnica (802). Archivado desde el original el 14 de diciembre de 2012.
  2. ^ Woodward, PM ; Bond, SG (1983). Guía de ALGOL 68 para usuarios de sistemas RS . Edward Arnold (Publishers) Ltd. ISBN 978-0-7131-3490-2.
  3. ^ Lindsey, CH (agosto de 1998). "Estudio de implementaciones viables de ALGOL 68". Boletín ALGOL (52): 5–8. ISSN  0084-6198.
  4. ^ "Historial del sitio Multics: Avon".
  5. ^ Lindsey, CH (diciembre de 1980). "Implementaciones de ALGOL 68: el compilador ICL 2900". Boletín ALGOL (46): 7–8. ISSN  0084-6198.
  6. ^ van der Veer, Marcel; NevilleDNZ. "Implementaciones de código abierto de ALGOL 68". SourceForge . Consultado el 18 de septiembre de 2020 .