stringtranslate.com

ALGOL 68RS

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.

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

Restricciones en el idioma compilado.

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.

Declaración antes de su uso

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 ;

Procesamiento en paralelo

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.

Ampliaciones a ALGOL 68

Alisado

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

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 (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 .

Estructuras indexables

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.

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 requiriera 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 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

compilación separada

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 .

Módulos de declaración

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

Módulos anidados

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 .

Código y acceso extranjero

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 .

Disponibilidad

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

Referencias

  1. ^ Enlace, SG ; Woodward, PM (agosto de 1977). "Introducción al compilador ALGOL 68 portátil 'RS'". Nota técnica (802). Archivado desde el original el 14 de diciembre de 2012.
  2. ^ Woodward, primer ministro ; Vínculo, SG (1983). Guía de ALGOL 68 para usuarios de RS Systems . Edward Arnold (Editores) Ltd. ISBN 978-0-7131-3490-2.
  3. ^ Lindsey, CH (agosto de 1998). "Encuesta 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 ALGOL 68 de código abierto". FuenteForge . Consultado el 18 de septiembre de 2020 .