ALGOL 68-R fue la primera implementación del lenguaje algorítmico ALGOL 68 .
Autor (es) original (es) | SI Currie, Susan G. Bond , JD Morrison |
---|---|
Desarrollador (es) | Establecimiento de Royal Radar |
Versión inicial | 20 de julio de 1970 |
Escrito en | ALGOL 60 (original) ALGOL 68-R (último) |
Sistema operativo | Jorge 3 |
Plataforma | ICL 1907F |
Tamaño | 34 mil palabras |
Disponible en | inglés |
Tipo | Compilador , traductor |
Licencia | Freeware |
Sitio web | sw |
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 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 manipulación de direcciones y procesamiento de listas. El analizador se escribió utilizando el generador de analizadores sintácticos de dispositivo de mejora de sintaxis (SID) de JM Foster .
Aproximadamente 20K de este es un programa, que creemos que es demasiado grande.
- Currie [3]
La primera versión del compilador ocupaba 34 K palabras. Más tarde fue reescrito en ALGOL 68-R, [4] y tomó 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 sin cargo por International Computers Limited (ICL) en nombre del Royal Radar Establishment (RRE).
Restricciones en el idioma compilado
Es una cuestión de moral. ¡Tenemos una Biblia y estás pecando!
- Mailloux [6]
Para permitir la compilación de una 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.
- Sin procedimiento automático
- Modo vacío explícito
- Sin declarantes formales
- Sin procesamiento paralelo
- goto no se puede omitir
- Unirse solo es válido en posiciones fuertes
Muchas de estas restricciones fueron adoptadas por el informe revisado de ALGOL 68.
Especificación antes de su uso
Para permitir la compilación en una sola pasada, ALGOL 68-R insistió en que todos los identificadores se especificaron (declararon) antes de su uso.
El programa estándar:
proc even = ( int número) 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)));
tendría que reescribirse como:
proc ( int ) bool impar;proc even = ( int número) 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 usó 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 ;modo a = estructura ( ref b b);modo b = [1:10] ref a ;
Sin procedimiento
En el lenguaje estándar, la coerción de procedimiento 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 un elenco de x + 1 a número entero, que después se convirtió al procedimiento número entero de regresar .
El equipo de ALGOL 68-R encontró esto demasiado difícil de manejar e hizo dos cambios en el idioma. La coerción de procedimiento se eliminó, y el modo de forma : expresión se redefinió como una denotación de procedimiento , las conversiones se indican mediante un símbolo val explícito :
real : x co un elenco de real en ALGOL 68 coreal val x co un elenco de 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 ) podría simplemente pasar una denotación de procedimiento:
proc sum = ( int lo, hi, proc ( int ) real term) real : begin real temp: = 0; para i de lo que hi do temp +: = término (i); temperatura terminar ; imprimir (suma (1, 100, ( int i) real : 1 / i))
En la versión del lenguaje definido en el informe revisado se aceptaron estos cambios, aunque la forma del elenco se cambió ligeramente a modo (expresión) .
real (x) co un cambio a real en ALGOL 68 co revisado
Modo vacío explícito
En el idioma original, el modo vacío estaba representado por un modo vacío:
: x: = 3,14; co fundir (x: = 3,14) para anular coproc endit = ir al final; co un procedimiento que devuelve el vacío co
El equipo de ALGOL 68-R decidió utilizar un símbolo vacío explícito para simplificar el análisis (y aumentar la legibilidad):
val vacío x: = 3,14; co fundir (x: = 3,14) para anular coproc endit = void : goto end; co un procedimiento que devuelve el vacío co
Esta modificación del lenguaje fue adoptada por el informe revisado de ALGOL 68.
Sin 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 idioma original, podrían incluir límites de matriz y especificar si el declarante real coincidente era fijo, flexible o cualquiera :
[15] int a; co un declarante real, límites 1:15 co ref [3:] int b = a; co Este es un error coproc x = ( ref [1: ya sea ] int a): ...
Creo que fue una cosa razonable a mí mismo para omitir los límites de los formales-declarantes, pero creo que fue un crimen terrible omitir el bien o el flex
- Lindsey [8]
El equipo de ALGOL 68-R redefinió a los declarantes formales para que fueran iguales a los declarantes virtuales que no incluyen información vinculada. Descubrieron que esto reducía las ambigüedades al analizar el lenguaje y sintieron que no era una característica que se usaría en los programas de trabajo.
Si un procedimiento necesita ciertos límites para sus argumentos, puede verificarlos él mismo con los operadores upb (límite superior) y lwb (límite inferior).
En ALGOL 68-R, el ejemplo anterior podría recodificarse así: (los límites de a en el procedimiento dependerían de la persona que llama).
[15] int a; co un declarante real, límites 1:15 co ref [] int b = a [ en 3]; co use slice para que b tenga límites 3:17 coproc x = ( ref [] int a) void : ... co límites dados por el llamador co
En el informe revisado sobre ALGOL 68 también se eliminaron los límites formales, pero la indicación flexible se movió en su posición para que pudiera incluirse en los declarantes formales:
[1: flex ] int a; co original ALGOL 68, o ALGOL 68-R co flex [1:] int a; co revisado ALGOL 68, co
proc x = ( ref [1: flex ] int a): ... co Original ALGOL 68 co proc x = ( ref [] int a) void : ... co ALGOL 68-R co proc x = ( ref flex [ ] int a) void : ... co Revised ALGOL 68 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 comenzar productor, consumidorfinal
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 el sistema 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 utilizó la función de subprogramación de ICL 1900 para proporcionar facilidades de subprocesos múltiples a los programas ALGOL 68-R con semántica similar a las bibliotecas de subprocesos modernas . [9] No se realizaron cambios en el compilador, solo en la biblioteca en tiempo de ejecución y el enlazador.
goto no se puede omitir
En ALGOL 68, el símbolo goto podría omitirse de un salto:
proc stop =: ...;...comenzar si x> 3 luego detener fi ; co un salto, no una llamada co ...detener: saltar fin
Como ALGOL 68-R era un compilador de una pasada, esto era demasiado difícil, por lo que el símbolo goto se hizo obligatorio.
Se hizo la misma restricción en el sublenguaje oficial, ALGOL 68S . [10]
Unirse solo está permitido en posiciones fuertes
En ALGOL 68 unir es la coacción que produce una unión a partir de un modo constituyente, por ejemplo:
modo ibool = union ( int , bool ); co an ibool es un int o bool co ibool a = true ; co el valor bool true está unido a un ibool co
En ALGOL 68 estándar, la unión era posible en contextos firmes o fuertes , por lo que, por ejemplo, podría aplicarse a los operandos de fórmulas :
op istrue = ( ibool a) bool : ...; si es verdadero 1 co legal porque 1 ( int ) se puede unir a ibool co entonces ...
Los implementadores de ALGOL 68-R encontraron que esto generaba demasiadas situaciones ambiguas, por lo que restringía la coerción unificadora a contextos fuertes .
Los efectos de esta restricción rara vez fueron importantes y, de ser necesario, se podrían solucionar mediante el uso de un molde 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 se eligió porque:
- Como número entero, era un valor negativo grande.
- Como dirección, estaba más allá de la dirección máxima para cualquier programa práctico en un ICL 1900
- Como instrucción era ilegal
- Como texto se muestra como
F00L
- Como número de coma flotante tenía el bit de desbordamiento establecido
Se utilizó el mismo valor para representar cero .
Acariciando
Noto, en algunos de sus programas de muestra, que no está subrayando ni tachando nada.
- Mailloux [13]
En los idiomas de la familia ALGOL , es necesario distinguir entre identificadores y símbolos básicos del idioma. En los textos impresos, esto generalmente se lograba imprimiendo los símbolos básicos en negrita o subrayados ( por ejemplo, comenzar o comenzar ).
En los programas de código fuente , se tuvo que utilizar alguna técnica de arrastre . En muchos lenguajes similares a ALGOL, antes de ALGOL 68-R, esto se lograba encerrando símbolos básicos entre comillas simples ('comenzar', por ejemplo). En 68-R, los símbolos básicos se pueden distinguir escribiéndolos en mayúsculas, utilizándose minúsculas para los identificadores.
Como 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 de papel utilizando un Friden Flexowriter .
Basado en parte en la experiencia de ALGOL 68-R, el informe revisado de ALGOL 68 especificó representaciones de hardware para el idioma, incluido el uso de caracteres SUPERIORES.
Extensiones de ALGOL 68
ALGOL 68-R incluyó extensiones para compilación separada y acceso de bajo nivel a la máquina.
Compilación separada
Dado que ALGOL 68 es un lenguaje fuertemente tipado , las facilidades de biblioteca simples utilizadas por otros idiomas en el sistema ICL 1900 fueron insuficientes. ALGOL 68-R se entregó 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 que podían almacenarse en álbumes . [14]
Un segmento que se pondrá a disposición de otros segmentos terminaría con una lista de declaraciones que estarán disponibles:
graphlib co el nombre del segmento co modo de inicio graphdata = struct (...); modo gráfico = ref graphdata ; proc nuevo gráfico = (...) gráfico : ...; proc dibujar gráfico = ( gráfico g) void : ...; ...fin mantener gráfico , nuevo gráfico, dibujar acabado gráfico
Y luego las funciones gráficas podrían ser utilizadas por otro segmento:
myprog con graphlib de graphalbum begin graph g = new graph (...); ... dibujar gráfico (g); ...final acabado
Acceso al sistema de bajo nivel
Como lenguaje de alto nivel fuertemente tipado, ALGOL 68 evita que los programas accedan directamente al hardware de bajo nivel. No existen operadores para la aritmética de direcciones, por ejemplo.
Dado que ALGOL 68-R no se compiló en el formato estándar ICL semicompilado (listo para vincular), fue necesario ampliar el lenguaje para proporcionar características en ALGOL 68-R para escribir código que normalmente se escribiría en lenguaje ensamblador . Las instrucciones de la máquina se pueden escribir en línea , dentro del código ... secciones edoc y los operadores de manipulación de direcciones inc , dec , dif , como se agregaron. [15]
Un ejemplo, usando una operación de George peri para emitir un comando:
[1: 120] potenciador CHAR;Número de unidad INT;STRUCT (modo de tipo BITS, respuesta, recuento INT, dirección REF CHAR) área de control: = (8r47400014,0,120, buff [1]);...;CÓDIGO 0,6 / número de unidad; 157,6 / typemode OF zona 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 código fuente, bajo una Licencia Pública General GNU (GPL). [dieciséis]
Referencias
- ^ Peck, JEL, ed. (1970), Actas de la conferencia de trabajo de la IFIP sobre la implementación de ALGOL 68 , Múnich: Holanda Septentrional, 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) . Consultado el 22 de abril de 2020 , a través de United Engineering Foundation (UEF).
- ^ Implementación de ALGOL 68, página 21
- ^ Currie, IF; Bond, SG ; Morison, JD (1971), "ALGOL 68-R, Its Implementation and Use", Proc IFIP Congress 1971 (Information Processing 1971) , Ljubljana, 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 - Establecimiento Royal Radar . Consultado el 9 de abril de 2011 .[ enlace muerto permanente ]
- ^ 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" (PDF) . 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) . Holanda Septentrional. ISBN 0-7204-0726-5.
- ^ Raymond, Eric S. (1996). "engañar". El diccionario del nuevo hacker; 3ª edición . Prensa del MIT. pag. 200. ISBN 978-0-262-68092-9.
El compilador Algol 68-R solía inicializar su almacenamiento en la cadena de caracteres "F00LF00LF00LF00L ..." porque como puntero o como número de coma flotante causaba un bloqueo, y como entero o cadena de caracteres era muy reconocible en un vertedero.
- ^ 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 . Oficina de Papelería de Su Majestad (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 de la ICL 1900" . Preservación de software y emulación de máquinas . Consultado el 19 de abril de 2020 .
enlaces externos
- Algol 68 - Sociedad de historia de tecnología y radar de Malvern