Articulo de referencia

ALGOL 68

"},"paradigms":{"wt":"[[Multi-paradigm programming language|Multi-paradigm]]: [[Concurrent programming language|concurrent]], [[Imperative programming|imperative]]"},"family":{"...

ALGOL 68 (abreviatura de Algorithmic Language 1968 ) es un lenguaje de programación imperativo perteneciente a la familia ALGOL , concebido como sucesor del lenguaje ALGOL 60 y diseñado con el objetivo de lograr un ámbito de aplicación mucho más amplio y una sintaxis y semántica definidas con mayor rigor .

La complejidad de la definición del lenguaje, que abarca varios cientos de páginas repletas de terminología no estándar, dificultó la implementación por parte de los compiladores , y se decía que no tenía "ni implementaciones ni usuarios". Esto era solo parcialmente cierto; ALGOL 68 sí encontró uso en algunos nichos de mercado, especialmente en el Reino Unido , donde fue popular en las máquinas de International Computers Limited (ICL), y en la enseñanza. Fuera de estos ámbitos, su uso fue relativamente limitado.

No obstante, las contribuciones de ALGOL 68 al campo de la informática han sido profundas, de amplio alcance y perdurables, aunque muchas de ellas solo se hicieron públicas cuando reaparecieron en lenguajes de programación desarrollados posteriormente. Muchos lenguajes se desarrollaron específicamente como respuesta a la complejidad percibida del lenguaje, siendo Pascal el más notable , o fueron reimplementaciones para funciones específicas, como Ada .

Muchos lenguajes de la década de 1970 basan su diseño específicamente en ALGOL 68, seleccionando algunas características y descartando otras que se consideraban demasiado complejas o fuera de lugar para las funciones que desempeñaban. La mayoría de los lenguajes modernos derivan al menos parte de su sintaxis de C o Pascal, y por lo tanto, directa o indirectamente, de ALGOL 68.

Descripción general

ALGOL 68 incluye características como sintaxis basada en expresiones, tipos y estructuras/uniones etiquetadas declaradas por el usuario, un modelo de referencia de variables y parámetros de referencia, segmentación de cadenas, matrices y arreglos, y concurrencia.

ALGOL 68 fue diseñado por el Grupo de Trabajo 2.1 de la Federación Internacional para el Procesamiento de la Información (IFIP) sobre Lenguajes Algorítmicos y Cálculos. El 20 de diciembre de 1968, el grupo adoptó formalmente el lenguaje, que posteriormente fue aprobado para su publicación por la Asamblea General de la IFIP.

ALGOL 68 se definió mediante un formalismo , una gramática formal de dos niveles , inventada por Adriaan van Wijngaarden . Las gramáticas de Van Wijngaarden utilizan una gramática libre de contexto para generar un conjunto infinito de producciones que reconocerán un programa ALGOL 68 específico; cabe destacar que son capaces de expresar el tipo de requisitos que en muchos otros estándares técnicos de lenguajes de programación se denominan semántica , y deben expresarse en prosa de lenguaje natural propensa a la ambigüedad, para luego implementarse en compiladores como código ad hoc adjunto al analizador sintáctico del lenguaje formal.

ALGOL 68 fue el primer (y posiblemente uno de los últimos) lenguaje importante para el que se elaboró ​​una definición formal completa antes de su implementación.

Los principales objetivos y principios de diseño de ALGOL 68 son: [ 7 ]

  1. Integridad y claridad de la descripción
  2. Ortogonalidad del diseño
  3. Seguridad
  4. Eficiencia:

ALGOL 68 ha sido criticado, sobre todo por algunos miembros de su comité de diseño, como CAR Hoare y Edsger Dijkstra , por abandonar la simplicidad de ALGOL 60 , convirtiéndose en un vehículo para ideas complejas o demasiado generales, y haciendo poco por facilitar la tarea del escritor de compiladores , a diferencia de contemporáneos (y competidores) deliberadamente simples como C , S-algol y Pascal .

En 1970, ALGOL 68-R se convirtió en el primer compilador funcional para ALGOL 68.

En la revisión de 1973, se omitieron ciertas características, como proceduring , gommas [ 8 ] y formal bounds . [ 9 ] Cf. El lenguaje del informe sin revisar. r0

Si bien las agencias de defensa europeas (en Gran Bretaña, el Royal Signals and Radar Establishment (RSRE)) promovieron el uso de ALGOL 68 por sus esperadas ventajas en materia de seguridad, la parte estadounidense de la alianza de la OTAN decidió desarrollar un proyecto diferente, el lenguaje Ada , haciendo que su uso fuera obligatorio para los contratos de defensa estadounidenses.

ALGOL 68 también tuvo una influencia notable en la Unión Soviética , cuyos detalles se pueden encontrar en el artículo de Andrey Terekhov de 2014: "ALGOL 68 and Its Impact on the URSS and Russian Programming", [ 10 ] y "Алгол 68 и его влияние на программирование в СССР и Rusia". [ 11 ]

Steve Bourne , miembro del comité de revisión de ALGOL 68, incorporó algunas de sus ideas a su intérprete de comandos Bourne (y, por consiguiente, a intérpretes de comandos Unix descendientes como Bash ) y a C (y, por consiguiente, a descendientes como C++ ). El código fuente del intérprete de comandos Bourne, aunque escrito en C, utiliza macros para asemejarlo más a ALGOL. Este lenguaje ha sido apodado " Bournegol ". [ 12 ]

La historia completa del proyecto se puede encontrar en "A History of ALGOL 68" de CH Lindsey . [ 13 ]

Para un tratamiento completo del lenguaje, consulte "Programming ALGOL 68 Made Easy" [ 14 ] de la Dra. Sian Mountbatten, o "Learning ALGOL 68 Genie" [ 15 ] de Marcel van der Veer, que incluye el Informe Revisado.

Historia

Orígenes

ALGOL 68, como su nombre indica, es una continuación del lenguaje ALGOL, formalizado por primera vez en 1960. Ese mismo año, la Federación Internacional para el Procesamiento de la Información (IFIP) creó el Grupo de Trabajo sobre ALGOL, o WG2.1. Este grupo publicó una especificación actualizada de ALGOL 60 en Roma en abril de 1962. En una reunión posterior, celebrada en marzo de 1964, se acordó que el grupo comenzaría a trabajar en dos estándares sucesores: ALGOL X, que sería una redefinición del lenguaje con algunas adiciones, y ALGOL Y , que tendría la capacidad de modificar sus propios programas al estilo del lenguaje LISP . [ 16 ]

Proceso de definición

La primera reunión del grupo ALGOL X se celebró en la Universidad de Princeton en mayo de 1965. Un informe de la reunión destacó dos temas ampliamente respaldados: la introducción de la tipificación fuerte y el interés en los conceptos de Euler de "árboles" o "listas" para el manejo de colecciones. [ 17 ] Aunque se concibió como una "solución a corto plazo a las dificultades existentes", [ 18 ] ALGOL X llegó a tener un compilador. Este compilador fue escrito por Douglas T. Ross del Instituto Tecnológico de Massachusetts (MIT) con el sistema Automated Engineering Design (AED-0), también denominado ALGOL Extended for Design . [ 19 ] [ 20 ]

En la segunda reunión, celebrada en octubre en Francia, se presentaron tres propuestas formales: ALGOL W de Niklaus Wirth , junto con comentarios sobre estructuras de registros de CAR (Tony) Hoare ; un lenguaje similar de Gerhard Seegmüller; y un artículo de Adriaan van Wijngaarden sobre "Diseño y descripción ortogonal de un lenguaje formal". Este último, escrito en una "gramática W" casi indescifrable, resultó ser un punto de inflexión decisivo en la evolución del lenguaje. La reunión concluyó con el acuerdo de que van Wijngaarden reescribiría la propuesta de Wirth/Hoare utilizando su gramática W. [ 17 ]

Esta tarea, aparentemente sencilla, resultó ser más difícil de lo esperado, y la reunión de seguimiento tuvo que posponerse seis meses. Cuando se reunió en abril de 1966 en Kootwijk , el borrador de van Wijngaarden seguía incompleto y Wirth y Hoare presentaron una versión con descripciones más tradicionales. En general, se acordó que su documento era «el lenguaje correcto en el formalismo equivocado». [ 21 ] A medida que se exploraban estos enfoques, quedó claro que existía una diferencia en la forma en que se describían los parámetros que tendría efectos en el mundo real, y aunque Wirth y Hoare protestaron porque más retrasos podrían volverse interminables, el comité decidió esperar la versión de van Wijngaarden. Wirth entonces implementó su definición actual como ALGOL W. [ 22 ]

En la siguiente reunión en Varsovia en octubre de 1966, [ 23 ] hubo un informe inicial del Subcomité de E/S que se había reunido en el Laboratorio Nacional de Oak Ridge y la Universidad de Illinois pero que aún no había logrado mucho progreso. Las dos propuestas de la reunión anterior se exploraron nuevamente, y esta vez surgió un nuevo debate sobre el uso de punteros ; ALGOL W los usaba solo para referirse a registros, mientras que la versión de van Wijngaarden podía apuntar a cualquier objeto. Para aumentar la confusión, John McCarthy presentó una nueva propuesta para la sobrecarga de operadores y la capacidad de encadenar construcciones and y or , y Klaus Samelson quería permitir funciones anónimas . En la confusión resultante, hubo cierta discusión sobre abandonar todo el esfuerzo. [ 22 ] La confusión continuó durante lo que se suponía que sería la reunión de ALGOL Y en Zandvoort en mayo de 1967. [ 17 ]

Publicación

Finalmente, en febrero de 1968 se publicó un borrador del informe. Esto provocó «conmoción, horror y disidencia» [ 17 ] , principalmente debido a los cientos de páginas de gramática ilegible y terminología extraña. Charles H. Lindsey intentó descifrar el «lenguaje oculto en él» [ 24 ], un proceso que requirió seis semanas de trabajo. El documento resultante, «ALGOL 68 con menos lágrimas» [ 25 ] , tuvo una amplia difusión. En una reunión más amplia sobre procesamiento de información celebrada en Zúrich en mayo de 1968, los asistentes se quejaron de que se les estaba imponiendo el lenguaje y de que IFIP era «el verdadero culpable de esta situación irracional», ya que las reuniones eran mayoritariamente a puerta cerrada y no existía un mecanismo formal de retroalimentación. Wirth y Peter Naur renunciaron formalmente a sus cargos de autores en el WG2.1 en ese momento [ 24 ] .

La siguiente reunión del WG2.1 tuvo lugar en Tirrenia en junio de 1968. Se suponía que iba a tratar el lanzamiento de compiladores y otros asuntos, pero en su lugar degeneró en una discusión sobre el idioma. Van Wijngaarden respondió diciendo (o amenazando) que solo publicaría una versión más del informe. Para entonces, Naur, Hoare y Wirth habían abandonado el proyecto, y varios más amenazaban con hacerlo. [ 26 ] Le siguieron varias reuniones más: North Berwick en agosto de 1968 y Múnich en diciembre, que dieron lugar a la publicación del Informe oficial en enero de 1969, pero también a la redacción de un controvertido Informe de la Minoría. Finalmente, en Banff, Alberta , en septiembre de 1969, el proyecto se consideró generalmente completo y la discusión se centró principalmente en las erratas y en una Introducción al Informe mucho más amplia. [ 27 ]

El proyecto duró cinco años, agotó a muchos de los nombres más importantes de la informática y, en varias ocasiones, se estancó debido a problemas tanto en la definición como en el grupo en su conjunto. Hoare publicó casi de inmediato una «Crítica de ALGOL 68» [ 28 ] , que ha sido ampliamente citada en numerosas obras. Wirth continuó desarrollando el concepto de ALGOL W y lo lanzó como Pascal en 1970.

Implementaciones

ALGOL 68-R

La primera implementación del estándar, basada en el borrador del Informe de finales de 1968, fue introducida por el Royal Radar Establishment en el Reino Unido como ALGOL 68-R en julio de 1970. Sin embargo, se trataba de un subconjunto del lenguaje completo, y Barry Mailloux , el editor final del Informe, bromeó diciendo: «Es una cuestión de moralidad. ¡Nosotros tenemos una Biblia y ustedes están pecando!» [ 29 ] No obstante, esta versión se hizo muy popular en las máquinas ICL y se convirtió en un lenguaje ampliamente utilizado en la codificación militar, especialmente en el Reino Unido. [ 6 ]

Entre los cambios introducidos en la versión 68-R se encontraba el requisito de que todas las variables se declararan antes de su primer uso. Esto presentaba la ventaja significativa de permitir que el compilador realizara la compilación en una sola pasada, ya que el espacio para las variables en el registro de activación se reservaba antes de su uso. Sin embargo, este cambio también tuvo como efecto secundario la exigencia de que los procedimientos se declararan dos veces: una vez como declaración de los tipos y otra como cuerpo del código. Otro cambio consistió en eliminar el modo VOID implícito , una expresión que no devuelve ningún valor (denominada instrucción en otros lenguajes), y exigir que se añadiera la palabra VOID donde se habría asumido. Además, la versión 68-R eliminó los comandos explícitos de procesamiento paralelo basados ​​en PAR . [ 29 ]

Otros

La primera implementación completa del lenguaje fue introducida en 1974 por CDC Netherlands para la serie de ordenadores centrales Control Data . Su uso fue limitado, principalmente en la enseñanza en Alemania y los Países Bajos. [ 6 ]

En 1976, la Universidad Carnegie Mellon presentó una versión similar a la 68-R, denominada 68S, que también era un compilador de una sola pasada basado en diversas simplificaciones del original y destinado a máquinas más pequeñas como la DEC PDP-11 . Este también se utilizó principalmente con fines didácticos. [ 6 ]

No se lanzó una versión para mainframes de IBM hasta 1978, cuando la Universidad de Cambridge publicó una . Esta versión estaba "casi completa". Lindsey lanzó una versión para máquinas pequeñas, incluyendo el IBM PC, en 1984. [ 6 ]

Se conocen tres implementaciones de Algol 68 de código abierto: [ 30 ]

Cronología

  • "Una breve historia del Algol 68"
  • ALGOL 68 – ALGOL de tercera generación

El lenguaje algorítmico ALGOL 68: Informes y miembros del grupo de trabajo

"Van Wijngaarden caracterizó una vez a los cuatro autores, un tanto irónico, como: Koster: transputter , Peck: sintaxis, Mailloux: implementador, Van Wijngaarden: ideólogo del partido". – Koster.

Cronograma de estandarización

1968: El 20 de diciembre de 1968, el Grupo de Trabajo adoptó el «Informe Final» (MR 101), que posteriormente fue aprobado por la Asamblea General del IFIP de la UNESCO para su publicación. Se realizaron traducciones de la norma al ruso , alemán , francés y búlgaro , y más tarde al japonés y al chino . [ 45 ] La norma también se puso a disposición en Braille .

1984: El TC 97 consideró la estandarización de ALGOL 68 como "Nuevo elemento de trabajo" TC97/N1642.Alemania Occidental, Bélgica, los Países Bajos, la URSS y Checoslovaquia estaban dispuestas a participar en la elaboración de la norma, pero la URSS y Checoslovaquia "no eran el tipo de miembros adecuados para los comités ISO adecuados".y la estandarización ISO de Algol 68 se estancó.

1988: Posteriormente, ALGOL 68 se convirtió en una de las normas GOST en Rusia.

  • GOST 27974-88 Lenguaje de programación ALGOL 68 — Язык программирования АЛГОЛ 68 [ 46 ]
  • GOST 27975-88 Lenguaje de programación ALGOL 68 extendido — Язык программирования АЛГОЛ 68 расширенный [ 47 ]

Elementos lingüísticos destacables

Símbolos en negrita y palabras reservadas

El idioma estándar contiene alrededor de sesenta palabras reservadas, generalmente en negrita en la versión impresa, y algunas con equivalentes de "símbolo breve":

MODO , OP , PRIORIDAD , PROC , FLEXIBLE , MONTON, UBICACIÓN, LARGO, REF, CORTO, BITS, BOOL, BYTES, CARÁCTER, COMPL, INT, REAL, SEMA, CADENA, VACÍO, CANAL, ARCHIVO, FORMATO, ESTRUCTURA, UNIÓN, EN " @ " , EITHER r0 , IS " : = : " , ISNT IS NOT r0 " : / = : " " :: " , OF "" r0 , VERDADERO , FALSO , VACÍO , NIL " " , SALTAR " ~ " , CO " ¢ " , COMENTARIO " ¢ " , PR , PRAGMAT , CASE ~ IN ~ OUSE ~ IN ~ OUT ~ ESAC " ( ~ | ~ |: ~ | ~ | ~ )", FOR ~ FROM ~ TO ~ BY ~ MIENTRAS ~ HACER ~ OD , SI ~ ENTONCES ~ SINO ~ SI ~ ENTONCES ~ SINO ~ FI " ( ~ | ~ |: ~ | ~ | ~ )", PAR BEGIN ~ END "( ~ )", IR A , IR A , SALIR "□" r0 .

Unidades: Expresiones

La construcción básica del lenguaje es la unidad . Una unidad puede ser una fórmula , una cláusula cerrada , un texto rutinario o una de varias construcciones técnicamente necesarias (asignación, salto, omisión, nihil). El término técnico cláusula cerrada unifica algunas de las construcciones inherentemente de corchetes conocidas como bloque , instrucción do , instrucción switch en otros lenguajes contemporáneos. Cuando se usan palabras clave, generalmente se usa la secuencia de caracteres invertida de la palabra clave introductoria para terminar la clausura, por ejemplo ( IF ~ THEN ~ ELSE ~ FI , CASE ~ IN ~ OUT ~ ESAC , FOR ~ WHILE ~ DO ~ OD ). Esta sintaxis de Comando Protegido fue reutilizada por Stephen Bourne en el shell Bourne común de Unix . Una expresión también puede producir un valor múltiple , que se construye a partir de otros valores mediante una cláusula colateral . Esta construcción se parece al paquete de parámetros de una llamada a procedimiento.

modo: Declaraciones

Los tipos de datos básicos (llamados modes en la jerga de Algol 68) son real, int, compl( número complejo ), bool, char, bitsy bytes. Por ejemplo:

INT n = 2; CO n se fija como una constante de 2. CO INT m := 3; CO m es una variable local recién creada cuyo valor se establece inicialmente en 3. CO CO Esto es una abreviatura de ref int m = loc int := 3; CO REAL avogadro = 6.0221415⏨23; CO Número de Avogadro CO long long real long long pi = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510; COMPL raíz cuadrada de menos uno = 0 ⊥ 1;

Sin embargo, la declaración REAL x;es solo azúcar sintáctico para . Es decir, es realmente el identificador constante para una referencia a una variable REAL local recién generada .REFREAL x = LOCREAL;x

Además, en lugar de definir tanto floatcomo double, o inty longy short, etc., ALGOL 68 proporciona modificadores , de modo que el actualmente común doublese escribiría como LONG REAL o LONG LONG REAL en su lugar, por ejemplo. Las constantes de preludiomax real y min long intse proporcionan para adaptar los programas a diferentes implementaciones.

Todas las variables deben ser declaradas, pero la declaración no tiene por qué preceder a su primer uso.

declarante primitivo: INT , REAL , COMPL , COMPLEX G , BOOL , CHAR , STRING , BITS , BYTES , FORMAT , FILE , PIPE G , CHANNEL , SEMA

  • BITS – un "vector empaquetado" de BOOL .
  • BYTES – un "vector empaquetado" de CHAR .
  • STRING – una matriz FLEXIBLE de CHAR .
  • SEMA : un foro SEMA que se puede inicializar con el nivel del operador OP .

Los tipos complejos se pueden crear a partir de tipos más simples utilizando varios constructores de tipos:

  • Modo REF : una referencia a un valor de tipo modo , similar a & en C/C++ y REF en Pascal.
  • STRUCT – se utiliza para construir estructuras, como STRUCT en C/C++ y RECORD en Pascal.
  • UNION – se utiliza para construir uniones, como en C/C++ y Pascal.
  • PROC – se utiliza para especificar procedimientos, como funciones en C/C++ y procedimientos/funciones en Pascal.

Otros símbolos de declaración incluyen: FLEX , HEAP , LOC , REF , LONG , SHORT , EVENT S

  • FLEX : declara que el array es flexible, es decir, que su longitud puede aumentar según se requiera.
  • HEAP : asigna una cantidad variable de espacio libre del montón global.
  • LOC – asigna a la variable algo de espacio libre en la pila local.
  • LONG – declara que un INT , REAL o COMPL es de un tamaño LONG .
  • SHORT : declara que un INT , REAL o COMPL es de un tamaño SHORT .

Se puede declarar un nombre para un modo (tipo) utilizando una declaración MODE , que es similar a TYPEDEF en C/C++ y TYPE en Pascal:

INT max=99; MODO NUEVOMODO = [0:9][0:max] ESTRUCTURA ( LARGO REAL a, b, c, CORTO INT i, j, k, REF REAL r );

Esto es similar al siguiente código C:

const int max = 99 ; typedef struct { double a , b , c ; short i , j , k ; float * r ; } newmode [ 9 + 1 ][ max + 1 ];

Para ALGOL 68, solo aparece la indicación de modo NEWMODE a la izquierda del símbolo de igual, y lo más importante es que la construcción se realiza y se puede leer de izquierda a derecha sin tener en cuenta las prioridades. Además, el límite inferior de los arreglos de Algol 68 es uno por defecto, pero puede ser cualquier entero desde - max int hasta max int .

Las declaraciones de modo permiten que los tipos sean recursivos : definidos directa o indirectamente en términos de sí mismos. Esto está sujeto a algunas restricciones; por ejemplo, estas declaraciones son ilegales:

MODO A = REF A MODO A = STRUCT ( A a, B b) MODO A = PROC ( A a) A

mientras estos sean válidos:

MODO A = ESTRUCTURA ( REF A a, B b) MODO A = PROC ( REF A a) REF A

Coacciones: casting

Las coerciones generan un objeto coaccionado a partir de un objeto coaccionado según tres criterios: el modo a priori del objeto coaccionado antes de la aplicación de cualquier coerción, el modo a posteriori del objeto coaccionado requerido después de dichas coerciones, y la posición sintáctica o "tipo" del objeto coaccionado. Las coerciones pueden ser en cascada.

Las seis coerciones posibles se denominan desprocedimiento , desreferenciación , unión , ampliación , reordenamiento y anulación . Cada coerción, excepto la unión , prescribe un efecto dinámico correspondiente sobre los valores asociados. Por lo tanto, muchas acciones primitivas pueden programarse implícitamente mediante coerciones.

Fuerza del contexto: coacciones permitidas:

  • suave – desprocedimiento
  • débil – desreferenciación o desprocedimiento, que produce un nombre
  • manso – desreferenciación o desprocedimiento
  • firme – manso, seguido de unificador
  • fuerte – firme, seguido de ensanchamiento, remo o vaciado

Jerarquía de coerción con ejemplos

ALGOL 68 tiene una jerarquía de contextos que determinan el tipo de coerciones disponibles en un punto particular del programa. Estos contextos son:

Para obtener más detalles sobre los operadores primarios, secundarios, terciarios y cuaternarios, consulte la sección de precedencia de operadores .

Relaciones públicas y co: Aspectos prácticos y comentarios

Las pragmats (del latín "pragmatic remarks") son directivas del programa, normalmente sugerencias para el compilador; en lenguajes más recientes se denominan "pragmas" (sin "t"). Por ejemplo:

PRAGMAT montón=32 PRAGMAT PR montón=32 PR

Los comentarios pueden insertarse de diversas maneras:

¢ La forma original de aportar tu granito de arena a un programa ¢ COMENTARIO "negrita" comentario COMENTARIO CO Estilo i comentario CO # Comentario sobre el estilo ii # £ Este es un comentario de almohadilla/libra para un teclado del Reino Unido £

Normalmente, en ALGOL 68 no se pueden anidar comentarios. Esta restricción se puede sortear utilizando diferentes delimitadores de comentarios (por ejemplo, usar el símbolo de almohadilla solo para eliminar código temporalmente).

Expresiones y enunciados compuestos

ALGOL 68 es un lenguaje de programación orientado a expresiones , por lo que el valor devuelto por una instrucción de asignación es una referencia al destino. Por lo tanto, el siguiente es código ALGOL 68 válido:

REAL medio pi, un pi; un pi := 2 * ( medio pi := 2 * arc tan(1) )

Esta noción está presente en C y Perl , entre otros. Cabe destacar que, al igual que en lenguajes anteriores como Algol 60 y FORTRAN , se permiten espacios en los identificadores, de modo que half pise trata de un único identificador (evitando así los problemas relacionados con los guiones bajos , el formato camel case y el uso exclusivo de minúsculas ).

Como otro ejemplo, para expresar la idea matemática de una suma de f(i)i=1 a n, basta con la siguiente expresión entera de ALGOL 68 :

( INT suma := 0; PARA i HASTA n HACER suma +:= f(i) HACER suma)

Cabe destacar que, al tratarse de una expresión entera, el bloque de código anterior puede utilizarse en cualquier contexto donde se admita un valor entero . Un bloque de código devuelve el valor de la última expresión evaluada; esta idea está presente en Lisp , entre otros lenguajes.

Las expresiones compuestas finalizan todas con corchetes distintivos:

  • Cláusulas condicionales de elección:
SI condición ENTONCES instrucciones [ SI NO instrucciones ] FI Forma "breve": ( condición | instrucciones | instrucciones )
SI condición1 ENTONCES instrucciones SINO SI condición2 ENTONCES instrucciones [ SINO instrucciones ] FI Forma "breve": ( condición1 | instrucciones |: condición2 | instrucciones | instrucciones )

Este esquema no solo evita el problema del else colgante , sino que también evita tener que usar BEGINy ENDen secuencias de instrucciones anidadas .

  • Cláusulas de elección de caso :
Sentencias CASE switch IN , sentencias,... [ OUT sentencias ] Forma "breve" de ESAC : ( switch | sentencias, sentencias,... | sentencias )
CASE switch1 IN instrucciones, instrucciones,... OUSE switch2 IN instrucciones, instrucciones,... [ OUT instrucciones ] ESAC Forma "abreviada" de la instrucción CASE : ( switch1 | instrucciones, instrucciones,... |: switch2 | instrucciones, instrucciones,... | instrucciones )

Ejemplo de cláusula Choice con símbolos Brief :

PROC días en el mes = ( INT año, mes) INT : (mes| 31, (año÷×4=0 ∧ año÷×100≠0 ∨ año÷×400=0 | 29 | 28 ), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );

Ejemplo de cláusula de elección con símbolos en negrita :

PROC días en el mes = ( INT año, mes) INT : CASO mes EN 31, SI año MOD 4 EQ 0 Y año MOD 100 NE 0 O año MOD 400 EQ 0 ENTONCES 29 SINO 28 FI , 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ESAC ;

Ejemplo de cláusula de elección que combina símbolos en negrita y breve :

PROC días en el mes = ( INT año, mes) INT : CASO mes EN 31 de enero, ¢Feb¢ (año MOD 4 = 0 Y año MOD 100 ≠ 0 O año MOD 400 = 0 | 29 | 28), ¢Mar¢ 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ¢ a Dic. ¢ ESAC ;

Algol68 permitía que el interruptor fuera de tipo INT o (únicamente) UNION . Este último permite imponer un tipado estricto a las variables UNION . Véase, por ejemplo, el ejemplo de unión a continuación.

  • hacer cláusula de bucle:
[ PARA índice ] [ DESDE primero ] [ POR incremento ] [ HASTA último ] [ MIENTRAS condición ] Instrucciones DO OD La forma mínima de una "cláusula de bucle" es, por lo tanto: Instrucciones DO OD

Este se consideraba el bucle "universal", la sintaxis completa es:

PARA i DESDE 1 HASTA -22 HASTA -333 MIENTRAS i×i≠4444 HACER ~ OD

Esta construcción presenta varios aspectos inusuales:

  • Solo la parte DO ~ OD era obligatoria, en cuyo caso el bucle iterará indefinidamente.
  • por lo tanto, la cláusula TO 100 DO ~ OD se repetirá solo 100 veces.
  • El "elemento sintáctico" WHILE permitía a un programador salir de un bucle FOR antes de tiempo. Por ejemplo:
INT suma de cuadrados:=0; PARA i MIENTRAS print(("Hasta ahora:",i,newline)); suma sq≠70↑2 HACER suma sq+:=i↑2 sobredosis

Las posteriores "extensiones" al estándar Algol68 permitieron reemplazar el elemento sintáctico TO por UPTO y DOWNTO para lograr una pequeña optimización. Los mismos compiladores también incorporaron:

  • HASTA (C) – para terminación tardía del bucle.
  • FOREACH (S) – para trabajar con matrices en paralelo .

Encontrará más ejemplos en los ejemplos de código que aparecen a continuación.

struct, union & [:]: Estructuras, uniones y arreglos

ALGOL 68 admite matrices con cualquier número de dimensiones y permite segmentar filas o columnas completas o parciales.

MODO VECTOR = [1:3] REAL ; # declaración de MODO vector (typedef) # MODO MATRIZ = [1:3,1:3] REAL ; # declaración de MODO matriz (typedef) # VECTOR v1 := (1,2,3); # variable de matriz inicialmente (1,2,3) # [] REAL v2 = (4,5,6); # matriz constante, tipo equivalente a VECTOR , los límites están implícitos # OP + = ( VECTOR a,b) VECTOR : # definición de operador binario # ( VECTOR out ; FOR i FROM ⌊a TO ⌈a DO out[i] := a[i]+b[i] OD ; out); MATRIZ m := (v1, v2, v1+v2); print ((m[,2:])); # una porción de la segunda y tercera columna #

Las matrices se pueden segmentar en cualquier sentido, por ejemplo:

REF VECTOR fila = m[2,]; # define una REF (puntero) a la segunda fila # REF VECTOR columna = m[,2]; # define una REF (puntero) a la segunda columna #

ALGOL 68 admite múltiples estructuras de campo ( STRUCT ) y modos unificados . Las variables de referencia pueden apuntar a cualquier MODO , incluyendo segmentos de matriz y campos de estructura.

Como ejemplo de todo esto, aquí está la declaración tradicional de lista enlazada:

MODO NODO = UNIÓN ( VOID , REAL , INT , COMPL , STRING ); MODO LISTA = ESTRUCTURA ( NODO val, REF LISTA siguiente);

Ejemplo de uso para UNION CASE de NODE :

proc: Procedimientos

Las declaraciones de procedimiento ( PROC ) requieren especificaciones de tipo tanto para los parámetros como para el resultado ( VOID si no hay ninguno):

PROC max of real = ( REAL a, b) REAL : IF a > b THEN a ELSE b FI ;

o bien, utilizando la forma "breve" de la declaración condicional:

PROC max of real = ( REAL a, b) REAL : (a>b | a | b);

El valor de retorno de `a` es el valor de la última expresión evaluada en el procedimiento. También se permiten procreferencias a procedimientos ( `ref proc` ). Los parámetros por referencia se proporcionan especificando referencias (como `ref` ref real) en la lista de argumentos formales. El siguiente ejemplo define un procedimiento que aplica una función (especificada como parámetro) a cada elemento de una matriz:

PROC apply = ( REF [] REAL a, PROC ( REAL ) REAL f): FOR i FROM LWB a TO UPB a DO a[i] := f(a[i]) OD 

Esta simplicidad de código era inalcanzable en el predecesor de ALGOL 68, ALGOL 60 .

op: Operadores

El programador puede definir nuevos operadores , tanto estos como los predefinidos pueden sobrecargarse y sus prioridades pueden modificarse. El siguiente ejemplo define un operador MAXcon versiones diádica y monádica (recorriendo los elementos de un array).

PRIO MAX = 9; OP MAX = ( INT a,b) INT : ( a>b | a | b ); OP MAX = ( REAL a,b) REAL : ( a>b | a | b ); OP MAX = ( COMPL a,b) COMPL : ( ABS a > ABS b | a | b ); OP MAX = ([] REAL a) REAL :   ( REAL out := a[ LWB a]; PARA i DESDE LWB a + 1 HASTA UPB a HACER ( a[i]>out | out:=a[i] ) OD ; afuera)

Operaciones con matrices, procedimientos, desreferenciación y coerción

Técnicamente, no se trata de operadores, sino que se consideran " unidades asociadas a nombres ".

operadores monádicos

Operadores diádicos con prioridades asociadas

Detalles específicos:

  • Los terciarios incluyen los nombres NIL y ○.
  • LWS : En Algol68 r0, los operadores LWS y ⎩ ... devuelven TRUE si el estado inferior de la dimensión de una matriz está fijo.
  • Los operadores de UPS y ⎧ son similares en el estado superior .
  • Los operadores LWB y UPB están disponibles automáticamente en UNIONES de diferentes órdenes (y MODOS ) de matrices. Por ejemplo, UPB deunion([]int, [,]real, flex[,,,]char)

Relaciones de asignación e identidad, etc.

Técnicamente, no se trata de operadores, sino que se consideran " unidades asociadas a nombres ".

Nota: Los cuaternarios incluyen los nombres SKIP y ~.

:=:(Alternativamente IS ) comprueba si dos punteros son iguales; (Alternativamente ISNT ) comprueba si son diferentes.:/=:

Por qué :=:y :/=:son necesarios

Consideremos la posibilidad de comparar dos valores de puntero, como las siguientes variables, declaradas como punteros a enteros:

REFINT ip, jp

Ahora consideremos cómo decidir si estos dos apuntan a la misma ubicación, o si uno de ellos apunta a NIL . La siguiente expresión

ip = jp

Se desreferenciarán ambos punteros a valores de tipo INT y se compararán, ya que el operador = está definido para INT , pero no para REF INT . No es válido definir = para operandos de tipo REF INT e INT al mismo tiempo, porque entonces las llamadas se vuelven ambiguas, debido a las conversiones implícitas que se pueden aplicar: ¿deben dejarse los operandos como REF INT y llamarse a esa versión del operador? ¿O deben desreferenciarse aún más a INT y usar esa versión en su lugar? Por lo tanto, la siguiente expresión nunca puede ser válida:

ip = NIL

De ahí la necesidad de construcciones separadas que no estén sujetas a las reglas de conversión normales para operandos a operadores. Pero hay un inconveniente. Las siguientes expresiones:

ip :=: jp
ip :=: NIL

Aunque legal, probablemente no hará lo que se espera. Siempre devolverán FALSE , porque están comparando las direcciones reales de las variables y , en lugar de a qué apuntan . Para lograr el efecto correcto, habría que escribiripjp

ip :=: REFINT(jp)
ip :=: REFINT(NIL)

Personajes especiales

Teclado IBM 2741 con símbolos APL

La mayoría de los caracteres "especiales" de Algol (⊂, ≡, ␣, ×, ÷, ≤, ≥, ≠, ¬, ⊃, ≡, ∨, ∧, →, ↓, ↑, ⌊, ⌈, ⎩, ⎧, ⊥, ⏨, ¢, ○ y □) se pueden encontrar en el teclado IBM 2741 con el cabezal de impresión APL "golf-ball" insertado; estos estuvieron disponibles a mediados de la década de 1960 mientras se redactaba ALGOL 68. Estos caracteres también forman parte del estándar Unicode y la mayoría de ellos están disponibles en varias fuentes populares .

transput: Entrada y salida

Transput es el término utilizado para referirse a las funciones de entrada y salida de ALGOL 68. Incluye procedimientos predefinidos para la transputación sin formato, formateada y binaria. Los archivos y otros dispositivos de transputación se gestionan de forma consistente e independiente de la máquina. El siguiente ejemplo imprime una salida sin formato en el dispositivo de salida estándar :

 imprimir ((nuevapágina, "Título", nuevalínea, "El valor de i es ", yo, "y x[i] es ", x[i], salto de línea)) 

Tenga en cuenta los procedimientos predefinidos newpagey newlinelos que se pasan como argumentos.

Libros, canales y archivos

El TRANSPUESTO se considera de LIBROS , CANALES y ARCHIVOS :

  • Los libros se componen de páginas, líneas y caracteres, y pueden estar respaldados por archivos.
    • Se puede localizar un libro específico por su nombre llamando a match.
  • Los CANALES corresponden a dispositivos físicos, por ejemplo, perforadoras de tarjetas e impresoras.
    • Se distinguen tres canales estándar: canal de entrada , canal de salida y canal de retroceso .
  • Un ARCHIVO es un medio de comunicación entre un programa y un libro que se ha abierto a través de algún canal.
    • El estado de un archivo puede ser lectura, escritura, carácter, contenedor y apertura.
    • Los procedimientos de transporte incluyen: establish, create, open, associate, lock, close, scratch.
    • Consultas sobre el puesto: char number, line number, page number.
    • Las rutinas de diseño incluyen:
      • space, backspace, newline, newpage.
      • get good line, get good page, get good book, yPROC set=(REFFILE f, INT page,line,char)VOID:
    • Un archivo tiene rutinas de eventos . Por ejemplo on logical file end, on physical file end, on page end, on line end, on format end, on value error, on char error:

transporte formateado

El "transput formateado" en el transput de ALGOL 68 tiene su propia sintaxis y patrones (funciones), con FORMAT s incrustado entre dos caracteres $. [ 48 ]

Ejemplos:

printf (($2l"La suma es:"x, g(0)$, m + n)); ¢ imprime lo mismo que: ¢ imprimir ((nueva línea, nueva línea, "La suma es:", espacio, entero (m + n, 0)) 

par: Procesamiento paralelo

ALGOL 68 admite la programación de procesamiento paralelo. Mediante la palabra clave PAR , una cláusula colateral se convierte en una cláusula paralela , donde la sincronización de las acciones se controla mediante semáforos . En A68G, las acciones paralelas se asignan a subprocesos cuando están disponibles en el sistema operativo anfitrión . En A68S se implementó un paradigma diferente de procesamiento paralelo (véase más abajo).

PROC eat = VOID : ( muffins-:=1; print(("¡Qué rico!",nueva línea))), hablar = VOID : ( palabras-:=1; imprimir(("Yak...",nueva línea))); INT magdalenas := 4, palabras := 8; SEMA boca = NIVEL 1; PAR BEGIN WHILE magdalenas > 0 DO DOWN boca;   comer; ARRIBA boca OD , MIENTRAS palabras > 0 HACER ABAJO boca; hablar; Boca ARRIBA OD FINAL

Misceláneas

Debido a su complejidad técnica, ALGOL 68 necesita una gran variedad de métodos para negar la existencia de algo:

SKIP , "~" o "?" C – un valor indefinido siempre sintácticamente válido, EMPTY – el único valor admisible para VOID , necesario para seleccionar VOID en una UNION , VOID – sintácticamente como un MODE , pero no lo es, NIL o "○" – un nombre que no denota nada, de un modo de referencia no especificado, () o específicamente [1:0] INT : un vacío es una matriz vacía (aquí específicamente de MODO [] INT ). indefinido : un procedimiento de informes estándar que genera una excepción en el sistema de tiempo de ejecución. ℵ – Se utiliza en el informe de normas para inhibir ciertos tipos de introspección . Por ejemplo, SEMA.

El término NIL IS var siempre se evalúa como VERDADERO para cualquier variable (pero consulte arriba el uso correcto de IS  :/=:), mientras que no se sabe a qué valor se evalúa una comparación x < SKIP para cualquier entero x .

ALGOL 68 deja intencionadamente sin definir qué sucede en caso de desbordamiento de enteros , la representación de bits de enteros y el grado de precisión numérica para punto flotante.

Ambos informes oficiales incluían algunas características avanzadas que no formaban parte del lenguaje estándar. Estas se indicaban con un ℵ y se consideraban, en la práctica, privadas. Algunos ejemplos son "≮" y "≯" para plantillas, OUTTYPE / INTYPE para tipado dinámico básico , y los operadores STRAIGHTOUT y STRAIGHTIN para "enderezar" matrices y estructuras anidadas.

Ejemplos de uso

Ejemplo de código

Este programa de ejemplo implementa la criba de Eratóstenes para encontrar todos los números primos menores que 100. NIL es el equivalente en ALGOL 68 del puntero nulo en otros lenguajes. La notación x OF y accede a un miembro x de una estructura y .

INICIO # Criba de números primos Algol-68, estilo funcional # PROC error = ( STRING s) VOID :  (print(( newline, " error: ", s, newline)); GOTO stop); PROC one to = ( INT n) LIST : ( PROC f = ( INT m,n) LIST : (m>n | NIL | cons(m, f(m+1,n))); f(1,n)); MODE LIST = REF NODE ; MODE NODE = STRUCT ( INT h, LIST t); PROC cons = ( INT n, LIST l) LIST : HEAP NODE := (n,l); PROC hd = ( LIST l) INT : ( l IS NIL | error("hd NIL "); SKIP | h OF l ); PROC tl = ( LIST l) LIST : ( l IS NIL | error("tl NIL "); SKIP | t OF l ); PROC show = ( LIST l) VOID : ( l ISNT NIL | print((" ",whole(hd(l),0))); show(tl(l))); PROC filter = ( PROC ( INT ) BOOL p, LIST l) LIST : IF l IS NIL THEN NIL ELIF p(hd(l)) THEN cons(hd(l), filter(p,tl(l))) ELSE filter(p, tl(l)) FI ; PROC sieve = ( LIST l) LIST : IF l IS NIL THEN NIL ELSE PROC not multiple = ( INT n) BOOL : n MOD hd(l) ~= 0;    cons(hd(l), sieve(filter(not multiple, tl(l)))) FI ; PROC primos = ( INT n) LISTA : tamiz( tl( uno a(n) ));    mostrar( primos(100) ) FIN

Sistemas operativos escritos en ALGOL 68

  • Computadora Cambridge CAP : todos los procedimientos que constituyen el sistema operativo fueron escritos en ALGOL 68C , aunque varios otros procedimientos protegidos estrechamente asociados, como un paginador, están escritos en BCPL . [ 49 ]
  • Eldon 3 – Desarrollado en la Universidad de Leeds para el ICL 1900 fue escrito en ALGOL 68-R . [ 50 ]
  • Máquina Flex : el hardware era personalizado y microprogramable, con un sistema operativo, compilador (modular), editor, recolector de basura y sistema de archivos, todo escrito en ALGOL 68RS . El intérprete de comandos Curt [ 51 ] fue diseñado para acceder a datos tipados de forma similar a los modos de Algol-68.
  • VMES3 era el lenguaje de implementación del sistema operativo VME. S3 se basaba en ALGOL 68, pero con tipos de datos y operadores alineados con los ofrecidos por la serie ICL 2900 .

Nota: Las computadoras de la era soviética Elbrus-1 y Elbrus-2 se crearon utilizando el lenguaje de alto nivel AL-76, en lugar del lenguaje ensamblador tradicional. AL-76 se asemeja a Algol-68. La principal diferencia radica en los tipos de enlace dinámico que AL-76 admite a nivel de hardware. AL-76 se utiliza para aplicaciones, control de trabajos y programación de sistemas. [ 52 ]

Aplicaciones

Tanto ALGOL 68C como ALGOL 68-R están escritos en ALGOL 68, lo que convierte a ALGOL 68 en una aplicación en sí misma. Otras aplicaciones incluyen:

Bibliotecas y API

Representación del programa

Una característica de ALGOL 68, heredada de la tradición ALGOL , son sus diferentes representaciones. Los programas en el lenguaje estricto (que se define rigurosamente en el Informe) denotan árboles de producción en forma de una secuencia de símbolos gramaticales, y deben representarse utilizando algún lenguaje de representación , de los cuales existen muchos y adaptados a diferentes propósitos.

  • Los lenguajes de representación destinados a describir algoritmos en obras impresas se conocen como lenguajes de publicación y suelen utilizar una tipografía rica para destacar palabras en negrita e indicaciones de operadores.
  • Los lenguajes de representación destinados a ser utilizados en la entrada del compilador, lo que llamaríamos lenguajes de programación , están limitados por las restricciones impuestas por los métodos de entrada y los conjuntos de caracteres, y tienen que recurrir a regímenes de resaltado para distinguir entre letras y dígitos en negrita y sin negrita.
  • Los lenguajes de representación destinados tanto a ser producidos como consumidos por ordenadores, conocidos como lenguajes de hardware , suelen utilizar una representación binaria compacta.

El Informe Revisado define un lenguaje de referencia y recomienda que los lenguajes de representación destinados a ser leídos por humanos sean lo suficientemente similares al lenguaje de referencia como para que los símbolos puedan distinguirse "sin mayor explicación". Estos lenguajes de representación se denominan implementaciones del lenguaje de referencia .

Por ejemplo, la construcción en el lenguaje estricto bold-begin-symbol podría representarse como begin en un lenguaje de publicación, como BEGIN en un lenguaje de programación o como los bytes 0xC000 en algún lenguaje de hardware. De manera similar, el lenguaje estricto difiere del símbolo que podría representarse como ≠ o como /=.

Las palabras reservadas de ALGOL 68 se encuentran efectivamente en un espacio de nombres diferente al de los identificadores, y los espacios están permitidos en los identificadores en la mayoría de los regímenes de restricción, por lo que este siguiente fragmento es válido:

INT un entero real = 3;

El programador que escribe código ejecutable no siempre tiene la opción de usar negrita o subrayado , ya que esto puede depender del hardware y de factores culturales. Se han ideado diferentes métodos para indicar estos identificadores. Esto se denomina régimen de stropeo . Por ejemplo, algunas o todas las siguientes representaciones de programación pueden estar disponibles :

'INT'A REAL INT = 3; # Estilo de strupping de CITA # .INT A REAL INT = 3; # Estilo de saturación de PUNTO # INT un entero real = 3; # Estilo de trazo MAYÚSCULAS # int a_real_int = 3; # Estilo de strupping RES, hay 61 palabras reservadas aceptadas #

Todas las implementaciones deben reconocer al menos POINT, UPPER y RES dentro de las secciones PRAGMAT. De estos, el uso de POINT y UPPER es bastante común. QUOTE (comillas con apóstrofo simple) fue la recomendación original .

Puede parecer que el stropping de RES es una contradicción con la especificación, ya que no hay palabras reservadas en Algol 68. Esto no es así. En el stropping de RES, la representación de la palabra en negrita (o palabra clave) begin es begin , y la representación del identificador begin es begin_ . Nótese que el carácter de guion bajo es solo un artefacto de representación y no forma parte del identificador representado. Por el contrario, en lenguajes sin stropping con palabras reservadas, como por ejemplo C, no es posible representar un identificador if , ya que la representación if_ representa el identificador if_ , no if .

Los siguientes caracteres fueron recomendados por su portabilidad y denominados "caracteres dignos" en el Informe sobre la representación de hardware estándar de Algol 68  :

  • ^ Caracteres dignos: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "#$%'()*+,-./:;<=>@[ ]_|

Esto reflejaba un problema de la década de 1960 en el que algunos equipos no admitían minúsculas ni otros caracteres que no fueran ASCII ; de hecho, en el informe de 1973 se escribía: "Cuatro caracteres importantes — "|", "_", "[" y "]" — a menudo se codifican de forma diferente, incluso en instalaciones que nominalmente utilizan el mismo conjunto de caracteres."

  • Personajes base: Los "personajes dignos" son un subconjunto de los "personajes base".

Ejemplo de diferentes representaciones de programas

ALGOL 68 permite que cada idioma defina su propio conjunto de palabras clave. De esta forma, los programadores pueden escribir programas utilizando palabras clave de su idioma nativo. A continuación, se muestra un ejemplo de un procedimiento sencillo que calcula "el día siguiente"; el código está escrito en dos idiomas: inglés y alemán.

# Fecha del día siguiente - variante en inglés # MODO FECHA = ESTRUCTURA ( INT día, CADENA mes, INT año); PROC el día siguiente = ( FECHA x) FECHA : SI día DE x < duración del mes (mes DE x, año DE x) ENTONCES (día DE x + 1, mes DE x, año DE x) SINO SI mes DE x = "diciembre" ENTONCES (1, "enero", año DE x + 1) SINO (1, sucesor del mes (mes DE x), año DE x) FI ;
# Nachfolgetag - Deutsche Variante # MENGE DATUM = TUPEL ( etiqueta GANZ , WORT monat, GANZ jahr); FUNKTION naechster tag nach = ( DATUM x) DATUM : WENN tag VON x < monatslaenge(monat VON x, jahr VON x) DANN (tag VON x + 1, monat VON x, jahr VON x) WENNABER monat VON x = "diciembre" DANN (1, "enero", jahr VON x + 1) ANSONSTEN (1, nachfolgemonat(monat VON x), jahr VON x) ENDEWENN ;

Ejemplo ruso/soviético: En inglés, la sentencia case de Algol68 se lee CASE ~ IN ~ OUT ~ ESAC , en cirílico se lee выб ~ в ~ либо ~ быв .

Revisiones

Salvo que se indique lo contrario (con un superíndice ), el lenguaje descrito anteriormente es el del "Informe revisado (r1) ".

El lenguaje del informe sin revisar

El idioma original (según el "Informe final" r0 ) difiere en la sintaxis de la conversión de modo y tenía la característica de procedurar , es decir, convertir el valor de un término en un procedimiento que evalúa dicho término. Proceder estaría destinado a hacer evaluaciones perezosas . La aplicación más útil podría haber sido la evaluación en cortocircuito de operadores booleanos. En:

OP ANDF = ( BOOL a, PROC BOOL b) BOOL :(a | b | FALSE ); OP ORF = ( BOOL a, PROC BOOL b) BOOL :(a | TRUE | b);

b solo se evalúa si a es verdadero.

Tal como se define en ALGOL 68, no funcionó como se esperaba, por ejemplo en el código:

SI FALSO Y CO proc bool: CO ( print ("No debería ejecutarse"); VERDADERO ) ENTONCES ...

Contrariamente a las expectativas ingenuas de los programadores, la impresión se ejecutaría, ya que solo se procesó el valor de la cláusula incluida después de ANDF . La inserción textual de PROC BOOL : comentado soluciona el problema.

Algunas implementaciones emulan el comportamiento esperado para este caso especial mediante la extensión del lenguaje.

Antes de la revisión, el programador podría decidir que los argumentos de un procedimiento se evalúen de forma secuencial en lugar de colateralmente, utilizando punto y coma en lugar de comas ( gomma s).

Por ejemplo en:

PROC test = ( REAL a; REAL b) :... ... prueba (x MÁS 1, x);

Se garantiza que el primer argumento a probar se evaluará antes que el segundo, pero de la forma habitual:

PROC test = ( REAL a, b) :... ... prueba (x MÁS 1, x);

Entonces, el compilador podría evaluar los argumentos en el orden que le pareciera conveniente.

Propuestas de ampliación del Grupo de Trabajo 2.1 de IFIP

Tras la revisión del informe, se han propuesto algunas ampliaciones del lenguaje para extender su aplicabilidad:

  • parametrización parcial (también conocida como currificación ): creación de funciones (con menos parámetros) mediante la especificación de algunos, pero no todos los parámetros para una llamada, por ejemplo, una función logaritmo de dos parámetros, base y argumento, podría especializarse a logaritmo natural, binario o decádico, [ 55 ]
  • Extensión de módulo : para el soporte de enlaces externos, se propusieron dos mecanismos: módulos de definición ascendente , una versión más potente de las funcionalidades de ALGOL 68-R , y agujeros descendentes , similares a las cláusulas ENVIRONy de ALGOL 68C . [ 56 ]USING
  • Parámetros de modo : para la implementación de polimorfismo paramétrico limitado (la mayoría de las operaciones en estructuras de datos como listas, árboles u otros contenedores de datos se pueden especificar sin tocar la carga útil). [ 57 ]

Hasta ahora, la parametrización parcial se ha implementado en Algol 68 Genie, y un subconjunto de la funcionalidad de Módulos y Compilación Separada se ha implementado en GCC.

Cronograma de especificación e implementación de True ALGOL 68

El lenguaje S3 , utilizado para escribir el sistema operativo ICL VME y gran parte del software del sistema en la serie ICL 2900, era una derivación directa de ALGOL 68. Sin embargo, omitía muchas de las funciones más complejas y reemplazaba los modos básicos con un conjunto de tipos de datos que se correspondían directamente con la arquitectura de hardware de la serie 2900.

Extensiones específicas de la implementación

ALGOL 68R de RRE fue la primera implementación de un subconjunto de ALGOL 68, que se ejecutaba en el ICL 1900. Basado en el lenguaje original, las principales restricciones del subconjunto eran la definición previa al uso y la ausencia de procesamiento paralelo. Este compilador fue popular en las universidades del Reino Unido en la década de 1970, donde muchos estudiantes de informática aprendieron ALGOL 68 como su primer lenguaje de programación; el compilador era conocido por sus claros mensajes de error.

ALGOL 68RS (RS), de RSRE, era un sistema de compilación portátil escrito en ALGOL 68RS (basado en ALGOL 68R) e implementado en diversos sistemas, como ICL 2900 / Serie 39 , Multics y DEC VAX/VMS . El lenguaje se basaba en el Informe Revisado, pero con restricciones de subconjunto similares a las de ALGOL 68R. Este compilador aún existe como compilador de Algol68 a C.

En ALGOL 68S (S) de la Universidad Carnegie Mellon, la potencia del procesamiento paralelo se mejoró añadiendo una extensión ortogonal, eventing . Cualquier declaración de variable que contuviera la palabra clave EVENT hacía que las asignaciones a dicha variable fueran aptas para la evaluación paralela; es decir, el lado derecho se convertía en un procedimiento que se trasladaba a uno de los procesadores del sistema multiprocesador C.mmp . Los accesos a dichas variables se retrasaban tras la finalización de la asignación.

Cambridge ALGOL 68C (C) era un compilador portátil que implementaba un subconjunto de ALGOL 68, restringiendo las definiciones de operadores y omitiendo la recolección de basura, las filas flexibles y la transposición formateada.

Algol 68 Genie (G), de Marcel van der Veer, es una implementación de ALGOL 68 para los ordenadores y sistemas operativos actuales. El intérprete implementa una extensión: la propuesta de parametrización parcial de Charles Lindsey, publicada en 1976, que dota al lenguaje imperativo Algol 68 de un sublenguaje funcional.

La colección de compiladores GNU , GNU Algol 68, implementa varias extensiones de GNU al lenguaje, [ 68 ] [ 69 ] proporcionando un superlenguaje estricto de ALGOL 68, como lo permite explícitamente el Informe revisado. [ 1 ] : 51

"A pesar de las buenas intenciones, un programador puede violar la portabilidad al emplear inadvertidamente una extensión local. Para evitar esto, cada implementación debe proporcionar una opción pragmat PORTCHECK. Mientras esta opción esté activa, el compilador imprime un mensaje para cada construcción que reconoce como violatoria de alguna restricción de portabilidad." [ 70 ]

Citas

  • ... El esquema de composición de tipos adoptado por C tiene una deuda considerable con Algol 68, aunque quizás no surgió en una forma que los seguidores de Algol aprobaran. La noción central que tomé de Algol fue una estructura de tipos basada en tipos atómicos (incluidas estructuras), compuestos en arreglos, punteros (referencias) y funciones (procedimientos). El concepto de uniones y conversiones de Algol 68 también tuvo una influencia que apareció más tarde. Dennis Ritchie, abril de 1993. [ 2 ]
  • ... Es cierto que C no desciende de Algol 68, pero sí hubo influencia, mucha de ella tan sutil que resulta difícil de detectar incluso pensando detenidamente. En particular, el tipo de unión (una adición tardía a C) sí le debe algo a A68, no en los detalles, sino en la idea misma de tener tal tipo. Más profundamente, la estructura de tipos en general e incluso, de alguna manera extraña, la sintaxis de declaración (la parte del constructor de tipos) se inspiraron en A68. Y sí, por supuesto, "largo". Dennis Ritchie , 18 de junio de 1988 [ 3 ]
  • "Felicitaciones, tu Maestro lo ha logrado" – Niklaus Wirth [ 71 ]
  • Cuanto más lo veo, más infeliz me siento – EW Dijkstra, 1968 [ 72 ]
  • [...] se decía que la popularidad de A68 era inversamente proporcional a [...] la distancia desde ÁmsterdamGuido van Rossum [ 73 ]
  • [...] Lo mejor que pudimos hacer fue enviar un informe minoritario, en el que exponíamos nuestra opinión meditada de que, "...como herramienta para la creación fiable de programas sofisticados, el lenguaje fue un fracaso." [...]CAR Hoare en su discurso de aceptación del Premio Turing de octubre de 1980 [ 74 ]
  • «[...] Más que nunca, se exigirá a una herramienta de programación adecuada que, por su estructura, ayude al programador en los aspectos más difíciles de su trabajo, a saber, en la creación fiable de programas sofisticados. En este sentido, no vemos cómo el lenguaje aquí propuesto representa un avance significativo: al contrario, consideramos que su visión implícita de la tarea del programador es muy similar a la de hace diez años. Esto nos lleva a la conclusión de que, considerado como una herramienta de programación, el lenguaje debe considerarse obsoleto. [...]» Informe minoritario del Grupo de Trabajo de 1968, 23 de diciembre de 1968. [ 75 ]

Véase también

Referencias

Citas

  1. 1 2 van Wijngaarden, Adriaan ; Mailloux, Barry James ; Peck, John Edward Lancelot ; Koster, Cornelis Hermanus Antonius ; Sintzoff, Michel [en francés] ; Lindsey, Charles Hodgson ; Meertens, Lambert Guillaume Louis Théodore ; Fisker, Richard G., eds. (1976). Informe revisado sobre el lenguaje algorítmico ALGOL 68 (PDF) . Springer-Verlag . ISBN 978-0-387-07592-1. OCLC 1991170 . Archivado del original (PDF) el 19-04-2019 . Recuperado el 11-05-2019 . 
  2. 1 2 Dennis Ritchie (abril de 1993). "El desarrollo del lenguaje C" ( PDF) . Archivado del original (PDF) el 6 de noviembre de 2005. Recuperado el 26 de abril de 2007. La noción central que capté de Algol fue una estructura de tipos basada en tipos atómicos (incluidas las estructuras), compuesta en arreglos, punteros (referencias) y funciones (procedimientos). El concepto de uniones y conversiones de Algol 68 también tuvo una influencia que apareció más tarde.
  3. 1 2 Dennis Ritchie (junio de 1988). "C y Algol 68" . Archivado del original el 27 de agosto de 2009. Recuperado el 15 de septiembre de 2006. En particular, el tipo de unión (una adición tardía a C) le debe a A68, no en ningún detalle, sino en la idea misma de tener tal tipo. Más profundamente, la estructura de tipos en general e incluso, de alguna manera extraña, la sintaxis de declaración (la parte del constructor de tipos) se inspiró en A68. Y sí, por supuesto, "largo".
  4. "Historia de C++: 1979–1991" (PDF) . Marzo de 1993. Página 12, segundo párrafo: Algol68 [introdujo] la sobrecarga de operadores (§3.3.3), las referencias (§3.3.4) y la capacidad de declarar variables en cualquier parte de un bloque (§3.3.1). Archivado del original (PDF) el 30 de octubre de 2008. Consultado el 6 de mayo de 2008 .
  5. "Entrevista con Guido van Rossum" . Julio de 1998. Archivado del original el 1 de mayo de 2007. Consultado el 29 de abril de 2007 .
  6. 1 2 3 4 5 "Una breve historia de ALGOL 68" . Archivado del original el 10 de agosto de 2006. Recuperado el 15 de septiembre de 2006 .
  7. van der Veer, Marcel. "Informe revisado sobre el lenguaje algorítmico Algol 68" . 0.1. Objetivos y principios de diseño.
  8. "¿Gommas?" .
  9. Informe revisado sobre el lenguaje algorítmico Algol 68 algol68genie.nl
  10. Terekhov, Andrey (2014). ALGOL 68 y su impacto en la URSS y la programación rusa . Tercera Conferencia Internacional de 2014 sobre Tecnología Informática en Rusia y en la Antigua Unión Soviética. pp. 97–106 . doi : 10.1109/SoRuCom.2014.29 . ISBN  978-1-4799-1799-0. S2CID 16097093 . 
  11. Терехов, Андрей Николаевич (2014). Алгол 68 и его влияние на программирование в СССР и России [ Algol 68 y su influencia en la programación en la URSS y Rusia ] (PDF) . Третья Международная конференция, Развитие вычислительной техники and ее programmного обеспечения в России и странах бывшего СССР: historia y perspectivas (en ruso). págs. 336-347 . 
  12. Peek, Jerry; O'Reilly, Tim; Loukides, Michael Kosta (1997). "46.6 Cuidado con el error Bourne Shell-e". Herramientas avanzadas de Unix (2.ª ed.). Cambridge Paris: O'Reilly. ISBN  1-56592-260-3. Consultado el 21 de mayo de 2026 .
  13. 1 2 Lindsey, Charles H. (1996). "Una historia de ALGOL 68". En Bergin, TJ; Gibson, RG (eds.). Historia de los lenguajes de programación II . ACM Press . págs. 27–96 . ISBN  978-0-201-89502-5.También en Lindsey, CH (marzo de 1993). "Una historia de ALGOL 68". ACM SIGPLAN Notices . 28 (3): 97– 132. doi : 10.1145/155360.155365 .Incluye una bibliografía exhaustiva de las reuniones y debates que tuvieron lugar antes, durante y después del desarrollo de ALGOL 68.
  14. Mountbatten, Sian. "Programación de Algol 68 simplificada" (PDF) . Archivado del original (PDF) el 29 de abril de 2023.
  15. van der Veer, Marcel. Aprendiendo ALGOL 68 Genie (PDF) .
  16. Lindsey 1993 , pág. 7.
  17. 1 2 3 4 Lindsey 1993 , pág. 9.
  18. Lindsey 1993 , pág. 4.
  19. Ross, Douglas T. (octubre de 1966). "Una teoría algorítmica del lenguaje (AB26.2.2)" . Centro de Información Técnica de Defensa . Instituto Tecnológico de Massachusetts. pág. 6. Archivado del original el 26 de junio de 2013. Recuperado el 12 de agosto de 2020 . 
  20. Ross, DT (agosto de 1967). "AB26.2.2 Características esenciales para un ALGOL X funcional" . Avisos de ACM SIGPLAN: Boletín ALGOL . 26 (2). Association for Computing Machinery: Biblioteca digital. doi : 10.1145/1139498.1139500 . S2CID 38156680. Recuperado el 12 de agosto de 2020 . 
  21. Lindsey 1993 , pág. 24.
  22. 1 2 Lindsey 1993 , pág. 10.
  23. "El Boletín ALGOL" .
  24. 1 2 Lindsey 1993 , pág. 12.
  25. Lindsey, CH (1972). "ALGOL 68 con menos lágrimas" (PDF) . The Computer Journal . 15 (1): 176– 188. doi : 10.1093/comjnl/15.2.176 .
  26. Lindsey 1993 , pág. 13.
  27. Lindsey 1993 , pág. 15.
  28. ^ Hoare, CAR (noviembre de 1968). «Crítica de MR93 (Crítica de ALGOL 68)» . Boletín ALGOL . 29 : 27-29 .
  29. 1 2 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
  30. van der Veer, Marcel. "Implementaciones de Algol 68 de código abierto" . algol68.sourceforge.net .
  31. 1 2 E. Marchesi, José. "Frontal Algol 68" . gcc.gnu.org .
  32. ^ E. Marchesi, José (enero de 2025). "Una interfaz Algol 68 para GCC" . lwn.net .
  33. ^ Van Wijngaarden, A.; Mailloux, BJ; Peck, J.; Koster, CHA (1 de marzo de 1968). "Borrador de informe sobre el lenguaje algorítmico ALGOL 68" . Boletín ALGOL (Sup 26): 1– 84 . Consultado el 7 de abril de 2023 , hasta marzo de 1968.
  34. Sidney Marshall, "ALGOL 68 Implementation", Actas de la Conferencia de Trabajo de la IFIP sobre la Implementación de ALGOL 68 , Múnich, 20-24 de julio de 1970, JEL Peck, editor, North Holland, páginas 239-243 .
  35. Sidney Marshall, Sobre la implementación de ALGOL 68 , Tesis doctoral, Dartmouth College, 1972.
  36. Informe revisado de Algol 68
  37. Black, AP; Rayward-Smith, VJ (1978-05-01). "Propuestas para ALGOL H: un superlenguaje de ALGOL 68" . Boletín ALGOL (42): 36–49 . Recuperado el 7 de abril de 2023 vía mayo de 1978.
  38. "Algol68 S (S) publicado en internet" . Archivado del original el 3 de diciembre de 2005. Consultado el 30 de agosto de 2004 .
  39. Veer, Marcel van der. «El proyecto Algol 68 Genie» . algol68genie.nl . Consultado el 7 de abril de 2023 .
  40. "Borrador de informe sobre el lenguaje algorítmico ALGOL 68" . Marzo de 1968. Archivado del original el 30 de septiembre de 2007. Consultado el 22 de junio de 2007 .
  41. Mailloux, BJ; Peck, JEL; Koster, CHA (octubre de 1968). "Penúltimo borrador del informe sobre el lenguaje algorítmico ALGOL 68 – Capítulos 1–9" . Consultado el 1 de enero de 2025 .
  42. Mailloux, BJ; Peck, JEL; Koster, CHA (octubre de 1968). "Penúltimo borrador del informe sobre el lenguaje algorítmico ALGOL 68 – Capítulos 10–12" . Consultado el 1 de enero de 2025 .
  43. "Informe sobre el lenguaje algorítmico ALGOL 68" (PDF) . Diciembre de 1968. Archivado del original (PDF) el 6 de abril de 2008. Consultado el 30 de diciembre de 2007 .
  44. "Informe revisado sobre el lenguaje algorítmico Algol 68" . Septiembre de 1973. Archivado del original el 27 de septiembre de 2007. Consultado el 30 de abril de 2007 .
  45. ^ Lu Hu Quan (1971). "La traducción de Algol 68 al chino" (PDF) . Pekín, China: Instituto de Matemáticas, Academia Sínica . Consultado el 17 de agosto de 2012 .
  46. ^ "GOST 27974-88 Lenguaje de programación ALGOL 68 - Язык программирования АЛГОЛ 68" (PDF) (en ruso). GOST . 1988. Archivado desde el original (PDF) el 15 de noviembre de 2008 . Consultado el 15 de noviembre de 2008 .
  47. ^ "GOST 27975-88 Lenguaje de programación ALGOL 68 extendido - Язык программирования АЛГОЛ 68 расширенный" (PDF) (en ruso). GOST . 1988. Archivado desde el original (PDF) el 29 de abril de 2011 . Consultado el 15 de noviembre de 2008 .
  48. "Sintaxis de formato en ALGOL 68G" . Archivado del original el 9 de enero de 2008. Consultado el 7 de abril de 2023 .
  49. Needham, RM; Wilkes, MV (enero de 1979). "La computadora Cambridge CAP y su sistema operativo" (PDF) . Microsoft Research .
  50. David Holdsworth (Invierno 2009–2010). "KDF9 Time Sharing: Eldon 2 no es EGDON!" . Computer Resurrection – Número 49 . Computer Conservation Society . Consultado el 3 de octubre de 2010 .
  51. IF Currie; JM Foster (septiembre de 1982). "RSRE Memorandum" (PDF) . vitanuova.com . Archivado del original (PDF) el 24 de abril de 2023. Consultado el 7 de abril de 2023 .
  52. Эльбрус Бабаяна y Pentium Пентковского . Ixbt.com. Consultado el 21 de julio de 2013.
  53. 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 .
  54. Aplicaciones, bibliotecas y conjuntos de pruebas — Software Preservation Group . Softwarepreservation.org. Consultado el 8 de febrero de 2026.
  55. Lindsey, CH (julio de 1974). "Parametrización parcial" . Boletín ALGOL (37): 24–26 . Recuperado el 19 de septiembre de 2022 .
  56. Lindsey, CH; Boom, HJ (diciembre de 1978). "Un sistema de módulos y compilación separada para ALGOL 68" . Boletín de ALGOL (43): 19–53 . Consultado el 29 de enero de 2020 .Comentarios erratas
  57. Lindsey, CH (julio de 1974). "Modales" . Boletín ALGOL (37): 26–29 . Recuperado el 19 de septiembre de 2022 .
  58. "Un intérprete para programas sencillos de ALGOL 68" (PDF) . Archivado del original (PDF) el 18 de julio de 2011.
  59. Nadrchal, J. (mayo de 1978). "Implementación de AB42.2.1 en TESLA 200" . Boletín ALGOL (42).
  60. Anderson, Raymond (marzo de 1980). "ALGOL68C en el Z80" (PDF) . Liverpool Software Gazette (tercera edición): 52–57 . Archivado del original (PDF) el 15 de abril de 2010. Consultado el 20 de marzo de 2010 . 
  61. Hedrick, GE; Robertson, Alan (10–12 de junio de 1975). El compilador de subconjuntos ALGOL 68 del estado de Oklahoma . Conferencia internacional de 1975 sobre ALGOL 68. Stillwater, OK.
  62. Hedrick, GE (agosto de 1977). "Instrucción de ALGOL68 en la Universidad Estatal de Oklahoma". Boletín ACM SIGCSE . 9 (3). Nueva York, NY, EE. UU.: ACM: 16–20 . doi : 10.1145/382175.803425 .
  63. Koch, Wilfried; Oeters, Christoph (1977). "La implementación de ALGOL 68 en Berlín". ACM SIGPLAN Notices . 12 (6): 102– 108. doi : 10.1145/872738.807149 .
  64. Koch, W.; Oeters, C. (1975). Mülbacher, J. (ed.). Una máquina ALGOL 68 abstracta y su aplicación en un compilador independiente de la máquina . GI — 5. Jahrestagung. Lecture Notes in Computer Science. Vol. 34. Berlín, Heidelberg: Springer. pp. 642– 653. doi : 10.1007/3-540-07410-4_665 .  
  65. "La Enciclopedia de los Lenguajes de Computación" . Archivado del original el 10 de marzo de 2011. Consultado el 20 de marzo de 2010 .
  66. Implementaciones de código abierto de ALGOL 68: explore los archivos en Sourceforge.net. Consultado el 21 de julio de 2013.
  67. "Archivo ZIP de la versión MK2.1" . Archivado del original el 29/08/2006.
  68. "El Grupo de Trabajo GNU Algol 68" .
  69. "Algol 68" .
  70. Hansen, Wilfred J.; Boom, Hendrik. "Informe sobre la representación de hardware estándar para Algol 68" (PDF) . Archivado del original (PDF) el 2 de enero de 2014. Consultado el 27 de agosto de 2005 .
  71. CHA Koster (1993). La creación de Algol 68. Lecture Notes in Computer Science. CiteSeerX 10.1.1.76.2072 . 
  72. Dijkstra, EW "Al editor ALGOL 68 Mathematische Centrum" . Archivado del original el 21 de abril de 2007. Consultado el 28 de abril de 2007 .
  73. van Rossum, Guido (junio de 2005). "Lista de deseos de Python-Dev: dowhile" . Recuperado el 28 de abril de 2007 .
  74. Hoare, CAR (febrero de 1981) [basado en su conferencia del Premio Turing de 1980 ]. "Las viejas ropas del emperador" . Communications of the ACM . 24 (2): 75– 83. doi : 10.1145/358549.358561 . S2CID 97895 . URL alternativa archivada el 2 de octubre de 2017 en Wayback Machine.
  75. "Boletín ALGOL (mencionado en AB30.1.1.1)" . Marzo de 1970. Archivado del original el 30 de septiembre de 2007. Consultado el 1 de marzo de 2007 .

Obras citadas

  • Lindsey, CH (1993-03-02). "Una historia de ALGOL 68" . ACM SIGPLAN Notices . 28 (3): 97– 132. doi : 10.1145/155360.155365 .

Lecturas adicionales

  • Brailsford, DF; Walker, AN (1979). Programación introductoria de ALGOL 68. Ellis Horwood/Wiley. ISBN 978-0-85312-127-5.
  • Lindsey, CH; van der Meulen, SG (1977). Introducción informal a ALGOL 68 (PDF) (edición revisada  ). Holanda del Norte. ISBN 978-0-7204-0504-0.
  • McGettrick, AD (1978). ALGOL 68, Un primer y segundo curso . Cambridge Univ. Press. ISBN 978-0-521-29143-9.
  • Peck, JEL (octubre de 1971). Un compañero ALGOL 68 (Informe técnico). Univ. de Columbia Británica. TR-71-01.
  • Tanenbaum, AS (junio de 1976). "Un tutorial sobre ALGOL 68". Computing Surveys . 8 (2). ACM: 155–190 . doi : 10.1145/356669.356671 . hdl : 1871/2611 .y Tanenbaum, AS (septiembre de 1977). "Correcciones: Un tutorial sobre ALGOL 68". Computing Surveys . 9 (3): 255– 256. doi : 10.1145/356698.356706 .
  • Woodward, PM; Bond, SG (1972). Guía del usuario de ALGOL 68-R . Londres: Her Majesty's Stationery Office. ISBN 978-0-11-771422-9.
  • Informe revisado sobre el lenguaje algorítmico ALGOL 68. Referencia oficial para usuarios e implementadores del lenguaje (archivo PDF grande, escaneado del Boletín ALGOL).
  • Informe revisado sobre el lenguaje algorítmico ALGOL 68. Versión HTML con hipervínculos del informe revisado.
  • Tutorial sobre Algol 68 , por Andrew S. Tanenbaum , en Computing Surveys , vol. 8, n.º 2, junio de 1976, con correcciones (vol. 9, n.º 3, septiembre de 1977).
  • Algol 68 Genie: un compilador-intérprete GNU GPL Algol 68
  • Implementaciones de ALGOL 68 de código abierto en SourceForge.
  • Representación del hardware estándar Algol68 (.pdf) Archivado el 2 de enero de 2014 en Wayback Machine
  • Esta historia está compilada con Algol 68
  • Algol 68: 25 años en la URSS
  • Programa de sistema de potencia dinámica para el traductor con algoritmo 68
  • Historia de C con herencia de Algol68
  • McJones, Paul, "Implementaciones y dialectos de Algol 68" , Software Preservation Group , Computer History Museum , 5 de julio de 2011
  • Compilador ALGOL 68 con acceso web para pequeños experimentos.