ALGOL 68-R fue la primera implementación del lenguaje algorítmico ALGOL 68 .
En diciembre de 1968, se publicó el informe sobre el lenguaje algorítmico ALGOL 68. Del 20 al 24 de julio de 1970, la Federación Internacional para el Procesamiento de la Información (IFIP) organizó una conferencia de trabajo para discutir los problemas de la implementación del lenguaje. [ 1 ] Un pequeño equipo del Royal Radar Establishment (RRE) asistió para presentar su compilador , escrito por IF Currie, Susan G. Bond [ 2 ] y JD Morrison. Ante las estimaciones de hasta 100 años-hombre para implementar el lenguaje, utilizando compiladores de múltiples pasadas con hasta siete pasadas, describieron cómo ya habían implementado un compilador de una sola pasada que estaba en producción para usos científicos y de ingeniería.
El compilador
El compilador ALGOL 68-R se escribió inicialmente en un dialecto local de ALGOL 60 con extensiones para la manipulación de direcciones y el procesamiento de listas. El analizador sintáctico se escribió utilizando el generador de analizadores sintácticos Syntax Improving Device (SID) de JM Foster .
Aproximadamente 20.000 de este programa, lo cual nos parece demasiado grande. – Currie [ 3 ]
La primera versión del compilador ocupaba 34 K palabras. Posteriormente fue reescrita en ALGOL 68-R, [ 4 ] ocupando alrededor de 36 K palabras para compilar la mayoría de los programas. [ 5 ]
ALGOL 68-R se implementó bajo el sistema operativo George 3 en un ICL 1907F . El compilador fue distribuido gratuitamente por International Computers Limited (ICL) en nombre del Royal Radar Establishment (RRE).
Restricciones en el lenguaje compilado
Para permitir la compilación en una sola pasada, ALGOL 68-R implementó un subconjunto del lenguaje definido en el informe original: [ 7 ]
- Los identificadores, modos y operadores deben especificarse antes de su uso.
- No hay procedimiento automático
- Modo VOID explícito
- No hay declarantes formales
- Sin procesamiento paralelo
- No se puede omitir GOTO.
- La unión solo es válida en posiciones fuertes.
Muchas de estas restricciones fueron adoptadas en el informe revisado sobre ALGOL 68.
Especificaciones antes de su uso
Para permitir la compilación en una sola pasada, ALGOL 68-R exigía que todos los identificadores se especificaran (declararan) antes de su uso.
El programa estándar:
PROC even = ( INT number) BOOL : ( number = 0 | TRUE | odd ( ABS (number - 1))); PROC odd = ( INT number) BOOL : ( number = 0 | FALSE | even ( ABS (number - 1)));
tendría que 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 stub especial para informar al compilador de que un símbolo próximo era un modo en lugar de un operador:
MODO B ; MODO A = ESTRUCTURA ( REF B b); MODO B = [1:10] REF A ;
Ningún procedimiento
En el lenguaje estándar, la coerción procedimental podría, en un contexto fuerte , convertir una expresión de algún tipo en un procedimiento que devuelva ese tipo. Esto podría usarse para implementar la llamada por nombre .
Otro caso en el que se utilizó el procedimiento fue la declaración de procedimientos, en la declaración:
PROC x más 1 = INT : x + 1;
El lado derecho era una conversión de x + 1 a entero, que luego se convertía en un procedimiento que devolvía un entero .
El equipo de ALGOL 68-R consideró que esto era demasiado difícil de manejar e hizo dos cambios en el lenguaje. Se eliminó la coerción procedimental y el modo de forma : expresión se redefinió como una denotación de procedimiento , indicándose las conversiones mediante un símbolo VAL explícito :
REAL : x CO un reparto a REAL en ALGOL 68 COREAL VAL x CO un molde para REAL en ALGOL 68-R CO
El código que tenía un uso válido para la llamada por nombre (por ejemplo, el dispositivo de Jensen ) podía simplemente pasar una denotación de procedimiento:
PROC suma = ( INT lo, hi , PROC ( INT ) REAL término) REAL : BEGIN REAL temp := 0 ; PARA i DESDE lo HACER temp +:= término (i); temperatura FIN ; imprimir (suma (1, 100, ( INT i) REAL : 1/i))
En la versión del idioma definida en el informe revisado, estos cambios fueron aceptados, aunque la forma del casting se modificó ligeramente a modo (expresión) .
REAL (x) CO un casting a REAL en ALGOL 68 CO revisado
Modo de vacío explícito
En el idioma original, el modo VOID estaba representado por un modo vacío:
: x := 3.14; CO convierte (x := 3.14) a void COPROC endit = GOTO end; CO un procedimiento que devuelve void CO
El equipo de ALGOL 68-R decidió utilizar un símbolo VOID explícito para simplificar el análisis sintáctico (y aumentar la legibilidad):
VOID VAL x := 3.14; CO convierte (x := 3.14) a void COPROC endit = VOID : GOTO end; CO un procedimiento que devuelve void CO
Esta modificación del lenguaje fue adoptada por el informe revisado ALGOL 68.
No hay declarantes formales
Los declarantes formales son los modos del lado izquierdo de una declaración de identidad, o los modos especificados en una declaración de procedimiento. En el lenguaje original, podían incluir límites de matriz y especificar si el declarante real correspondiente era fijo, FLEX o EITHER :
[ 15 ] INT a; CO un declarante real, límites 1:15 CO REF [ 3 : ] INT b = a; CO Esto es un error COPROC x = ( REF [ 1 : EITHER ] INT a) : ...
Creo que fue razonable omitir los límites de los declarantes formales, pero creo que fue un crimen terrible omitir el EITHER o el FLEX – Lindsey [ 8 ]
El equipo de ALGOL 68-R redefinió los declaradores formales para que fueran iguales a los declaradores virtuales , que no incluyen información de vinculación. Descubrieron que esto reducía las ambigüedades en el análisis sintáctico del lenguaje y consideraron que no era una característica que se utilizaría en programas funcionales.
Si un procedimiento necesitara ciertos límites para sus argumentos, podría comprobarlos él mismo con los operadores UPB (límite superior) y LWB (límite inferior).
En ALGOL 68-R, el ejemplo anterior podría recodificarse de esta manera: (los límites de a en el procedimiento dependerían de quien lo llama).
[ 15 ] INT a; CO un declarador real, límites 1:15 CO REF [] INT b = a [ AT 3]; CO usar slice para que b tenga límites 3:17 COPROC x = ( REF [] INT a) VOID : ... límites de CO dados por el llamador CO
En el informe revisado sobre ALGOL 68 también se eliminaron los límites formales, pero la indicación FLEX se movió de posición para que pudiera incluirse en los declarantes formales:
[ 1: FLEX ] INT a; CO ALGOL 68 original, o ALGOL 68-R CO FLEX [ 1: ] INT a; CO ALGOL 68 revisado, CO
PROC x = ( REF [ 1: FLEX ] INT a) : ... CO ALGOL 68 original CO PROC x = ( REF [ ] INT a) VOID : ... CO ALGOL 68-R CO PROC x = ( REF FLEX [ ] INT a) VOID : ... CO ALGOL 68 revisado CO
Sin procesamiento paralelo
En ALGOL 68, el código se puede ejecutar en paralelo escribiendo PAR seguido de una cláusula colateral , por ejemplo en:
PAR COMIENZA productor, consumidor FIN
Los procedimientos productor y consumidor se ejecutarán en paralelo. Se proporciona un tipo de semáforo ( SEMA ) con los operadores tradicionales P ( ABAJO ) y V ( ARRIBA ) para sincronizar entre las partes de la cláusula paralela,
Esta función no se implementó en ALGOL 68-R.
Se escribió una extensión llamada ALGOL 68-RT que utilizaba la función de subprogramación de ICL 1900 para proporcionar funcionalidades de multihilo a los programas ALGOL 68-R con una semántica similar a la de las bibliotecas de hilos modernas . [ 9 ] No se realizaron cambios en el compilador, solo en la biblioteca de tiempo de ejecución y el enlazador.
No se puede omitir la instrucción goto.
En ALGOL 68, el símbolo GOTO podía omitirse de un salto:
PROC stop = : ...; ... COMIENZA SI x > 3 ENTONCES detener FI ; CO un salto, no una llamada CO ... detener: SALTAR FINAL
Dado que ALGOL 68-R era un compilador de una sola pasada, esto resultaba demasiado difícil, por lo que el símbolo GOTO se hizo obligatorio.
La misma restricción se aplicó en el subidioma oficial, ALGOL 68S . [ 10 ]
La unión solo está permitida en posiciones fuertes.
En ALGOL 68, la unión es la coerción que produce una UNIÓN a partir de un modo constituyente, por ejemplo:
MODO IBOOL = UNIÓN ( INT , BOOL ); CO un IBOOL es un INT o un BOOL CO IBOOL a = VERDADERO ; CO el valor BOOL VERDADERO se une a un IBOOL CO
En ALGOL 68 estándar, la unión era posible en contextos firmes o fuertes , por lo que, por ejemplo, podía aplicarse a los operandos de las fórmulas :
OP ISTRUE = ( IBOOL a) BOOL : ...; SI ISTRUE 1 CO es legal porque 1 ( INT ) se puede unir a IBOOL CO ENTONCES ...
Los desarrolladores de ALGOL 68-R descubrieron que esto generaba demasiadas situaciones ambiguas, por lo que restringieron la coerción de unión a contextos fuertes .
Los efectos de esta restricción rara vez eran importantes y, de ser necesario, podían solucionarse utilizando una conversión de tipo para proporcionar un contexto sólido en el punto requerido del programa.
F00L
El compilador ALGOL 68-R inicializó la memoria no utilizada al valor -6815700. [ 11 ] [ 12 ]
Este valor fue elegido porque:
- Como número entero, era un valor negativo grande.
- Como dirección, superaba la dirección máxima permitida para cualquier programa práctico en un ICL 1900.
- Como instrucción era ilegal
- Como texto se muestra como
F00L - Como número de punto flotante, tenía el bit de desbordamiento activado.
Se utilizó el mismo valor para representar NIL .
Desgaste
En las lenguas de la familia ALGOL , es necesario distinguir entre los identificadores y los símbolos básicos de la lengua. En los textos impresos, esto se solía lograr imprimiendo los símbolos básicos en negrita o subrayados ( por ejemplo, BEGIN o begin ).
En los programas de código fuente , era necesario utilizar alguna técnica de separación de caracteres . En muchos lenguajes similares a ALGOL, antes de ALGOL 68-R, esto se lograba encerrando los símbolos básicos entre comillas simples (por ejemplo, 'begin'). En 68-R, los símbolos básicos se distinguían escribiéndolos en mayúsculas, reservándose las minúsculas para los identificadores.
Dado que ALGOL 68-R se implementó en una máquina con bytes de 6 bits (y, por lo tanto, un conjunto de 64 caracteres), esto era bastante complejo y, al menos inicialmente, los programas tenían que componerse en cinta perforada con papel utilizando una Friden Flexowriter .
Basándose en parte en la experiencia de ALGOL 68-R, el informe revisado sobre ALGOL 68 especificaba representaciones de hardware para el lenguaje, incluyendo el bloqueo de UPPER.
Extensiones a ALGOL 68
ALGOL 68-R incluía extensiones para la compilación independiente y el acceso de bajo nivel a la máquina.
Compilación por separado
Dado que ALGOL 68 es un lenguaje fuertemente tipado , las sencillas funcionalidades de biblioteca utilizadas por otros lenguajes en el sistema ICL 1900 resultaban insuficientes. ALGOL 68-R se distribuyó con su propio formato de biblioteca y utilidades que permitían compartir modos, funciones, variables y operadores entre segmentos de código compilados por separado, los cuales podían almacenarse en álbumes . [ 14 ]
Un segmento que se pondrá a disposición de otros segmentos terminará con una lista de declaraciones que se pondrán a disposición:
graphlib CO el nombre del segmento CO BEGIN MODE GRAPHDATA = STRUCT ( ... ); MODE GRAPH = REF GRAPHDATA ; PROC new graph = ( ... ) GRAPH : ...; PROC draw graph = ( GRAPH g) VOID : ...; ... FIN MANTENER GRÁFICO , nuevo gráfico, dibujar gráfico FINALIZAR
Y entonces las funciones gráficas podrían ser utilizadas por otro segmento:
myprog CON graphlib DESDE graphalbum COMIENZA GRAFO g = nuevo gráfico (...); ... dibujar gráfica (g); ... FIN FIN
Acceso al sistema de bajo nivel
Al ser un lenguaje de alto nivel fuertemente tipado, ALGOL 68 impide que los programas accedan directamente al hardware de bajo nivel. Por ejemplo, no existen operadores para la aritmética de direcciones.
Dado que ALGOL 68-R no compilaba al formato semicompilado estándar ICL (listo para enlazar), fue necesario extender el lenguaje para proporcionar características que permitieran escribir código que normalmente se escribiría en lenguaje ensamblador . Se podían escribir instrucciones de máquina en línea , dentro de las secciones CODE ... EDOC , y se añadieron los operadores de manipulación de direcciones INC , DEC , DIF y AS . [ 15 ]
Un ejemplo, utilizando una operación peri de George para emitir un comando:
[1 : 120] CHAR buff; INT unitnumber; STRUCT ( BITS typemode, reply, INT count, REF CHAR address) área de control := (8r47400014,0,120,buff[1]); ...; CÓDIGO 0,6/número de unidad; 157,6/modo de tipo DE área de control EDOC
Disponibilidad
Una copia del compilador ALGOL 68-R, ejecutable bajo el emulador del sistema operativo George 3 , por David Holdsworth ( Universidad de Leeds ), está disponible, con el código fuente, bajo una Licencia Pública General GNU (GPL). [ 16 ]
Referencias
- ↑ Peck, JEL, ed. (1970), Actas de la conferencia de trabajo de la IFIP sobre la implementación de ALGOL 68 , Múnich: North-Holland, ISBN 0-7204-2045-8
- ↑ Bond, Susan ; Abbate, Janet (26 de septiembre de 2001). "Historia oral: Susan Bond: Desarrollo del primer compilador ALGOL 68 del mundo" . Wiki de Historia de la Ingeniería y la Tecnología (ETHW) . Instituto de Ingenieros Eléctricos y Electrónicos (IEEE) . Recuperado el 22 de abril de 2020 a través de la Fundación Unida de Ingeniería (UEF).
- ↑ Implementación de ALGOL 68, página 21
- ↑ Currie, IF; Bond, SG ; Morison, JD (1971), "ALGOL 68-R, su implementación y uso", Actas del Congreso IFIP de 1971 (Procesamiento de la información 1971) , Liubliana, Yugoslavia: North-Holland, págs. 360–363 , ISBN 0-7204-2063-6
- ↑ Anónimo (enero de 1977). Sistema Algol 68-R: instalación y mantenimiento (PDF) . División de Investigación en Computación y Software - Royal Radar Establishment . Consultado el 9 de abril de 2011 .
- ↑ Implementación de ALGOL 68, página 294
- ↑ Implementación de ALGOL 68, páginas 21-26
- ↑ Implementación de ALGOL 68, página 276
- ↑ Oliver, JR; Newton, RS (1979). "Experiencia práctica con ALGOL 68-RT" . The Computer Journal . 22 (2): 114– 118. doi : 10.1093/comjnl/22.2.114 .
- ↑ Lindsey, Charles H. ; van der Meulen, SG (1997). «Apéndice 4, el sublenguaje». Introducción informal a ALGOL 68 (revisada) . North-Holland. ISBN 0-7204-0726-5.
- ↑ Raymond, Eric S. (1996). «fool». The new hacker's dictionary; 3.ª edición . MIT Press. pág. 200. ISBN 978-0-262-68092-9
El compilador Algol 68-R solía inicializar su almacenamiento con la cadena de caracteres "F00LF00LF00LF00L..." porque como puntero o como número de punto flotante provocaba un fallo, y como entero o cadena de caracteres era muy reconocible en un volcado de memoria
. - ↑ Sistema Algol 68-R - Instalación y mantenimiento, página 25
- ↑ Implementación de ALGOL 68, página 30
- ↑ Woodward, PM ; Bond, SG (1974). "14 - Segmentación de programas". Guía del usuario de ALGOL 68-R . Her Majesty's Stationery Office (HMSO). págs. 87–89 . ISBN 0-11-771600-6.
- ↑ Sistema Algol 68-R - Instalación y mantenimiento, págs. 26-30
- ↑ Toal, Graham (septiembre de 2018). "George3: Emulación del ICL 1900" . Preservación de software y emulación de máquinas . Recuperado el 19 de abril de 2020 .
Enlaces externos
- Algol 68 – Sociedad de Historia del Radar y la Tecnología de Malvern
- Implementación de ALGOL 68
- Historia de la informática en el Reino Unido