ALGOL 68


De Wikipedia, la enciclopedia libre
  (Redirigido desde ALGOL-68 )
Saltar a navegación Saltar a búsqueda

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

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

Sin embargo, las contribuciones de ALGOL 68 al campo de la informática han sido profundas, amplias y duraderas, aunque muchas de estas contribuciones solo fueron identificadas públicamente cuando reaparecieron en lenguajes de programación desarrollados posteriormente. Muchos lenguajes se desarrollaron específicamente como respuesta a la complejidad percibida del lenguaje, siendo el más notable Pascal , o fueron reimplementaciones para roles específicos, como Ada .

Muchos lenguajes de la década de 1970 rastrean su diseño específicamente hasta ALGOL 68, seleccionando algunas características y abandonando otras que se consideraban demasiado complejas o fuera del alcance de determinados roles. Entre estos se encuentra el lenguaje C , que fue influenciado directamente por ALGOL 68, especialmente por su fuerte tipificación y estructuras. La mayoría de los lenguajes modernos rastrean al menos parte de su sintaxis a C o Pascal y, por lo tanto, directa o indirectamente a ALGOL 68.

Visión general

Las características de ALGOL 68 incluyen sintaxis basada en expresiones, tipos y estructuras / uniones etiquetadas declaradas por el usuario, un modelo de referencia de variables y parámetros de referencia, corte de cadenas, matrices y matrices, y simultaneidad.

ALGOL 68 fue diseñado por la Federación Internacional para el Procesamiento de la Información (IFIP) IFIP Working Group 2.1 sobre lenguajes algorítmicos y cálculos. El 20 de diciembre de 1968, el lenguaje fue adoptado formalmente por el grupo y luego aprobado para su publicación por la Asamblea General de la IFIP.

ALGOL 68 se definió utilizando 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 en particular; en particular, son capaces de expresar el tipo de requisitos que en muchos otros lenguajes de programación los estándares técnicos se etiquetan como semántica , y deben expresarse en prosa de lenguaje natural propensa a la ambigüedad, y luego implementarse en compiladores como código ad hoc adjunto al analizador de lenguaje formal .

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

CHA Koster [8]

Los principales objetivos y principios de diseño de ALGOL 68:

  1. Completitud y claridad de la descripción [9]
  2. Ortogonalidad del diseño [10]
  3. Seguridad [11]
  4. Eficiencia: [12]
    • Comprobación del modo estático
    • Análisis sintáctico independiente del modo
    • Recopilación independiente
    • Optimización de bucle
    • Representaciones: en conjuntos de caracteres mínimos y más grandes

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 , convertirse en un vehículo para ideas complejas o demasiado generales y hacer poco para hacer la tarea del redactor del compilador . más fácil, en contraste con contemporáneos deliberadamente simples (y competidores) 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 procedimientos , gommas [13] y límites formales . [14] Cfr. El idioma del informe no revisado. r0

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

ALGOL 68 también tuvo una influencia notable en la Unión Soviética , cuyos detalles se pueden encontrar en el artículo de 2014 de Andrey Ershov : "ALGOL 68 y su impacto en la URSS y la programación rusa", [15] y "Алгол 68 и его влияние на программирование в СССР и России ". [dieciséis]

Steve Bourne , que estaba en el comité de revisión de ALGOL 68, llevó algunas de sus ideas a su shell Bourne (y por lo tanto, a shells descendientes de Unix como Bash ) y a C (y por lo tanto a descendientes como C ++ ).

La historia completa del proyecto se puede encontrar en CH Lindsey 's Una historia de ALGOL 68 . [17] [18]

Para un tratamiento completo del lenguaje, vea "Programando ALGOL 68 Made Easy" [19] por el Dr. Sian Mountbatten, o "Aprendiendo ALGOL 68 Genie" [20] por Marcel van der Veer que incluye el Informe Revisado.

Historia

Orígenes

ALGOL 68, como su nombre lo indica, es una continuación del lenguaje ALGOL que se formalizó por primera vez en 1960. Ese mismo año, la Federación Internacional para el Procesamiento de la Información (IFIP) formó e inició 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 de seguimiento en marzo de 1964, se acordó que el grupo debería comenzar a trabajar en dos estándares de seguimiento, ALGOL X, que sería una redefinición del lenguaje. con algunas adiciones, y un ALGOL Y , que tendría la capacidad de modificar sus propios programas al estilo del lenguaje LISP . [21]

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 señaló dos temas ampliamente apoyados, la introducción de una tipificación fuerte y el interés en los conceptos de Euler de "árboles" o "listas" para el manejo de colecciones. [22]

En la segunda reunión en octubre en Francia, se presentaron tres propuestas formales, Niklaus Wirth 's ALGOL W junto con comentarios sobre las estructuras de registro de CAR (Tony) Hoare , un lenguaje similar por Gerhard Seegmuller, y un artículo de Adriaan van Wijngaarden en " Diseño ortogonal y descripción de un lenguaje formal ". Este último, escrito en una "W-Grammar" casi indescifrable, resultó ser un cambio decisivo en la evolución del lenguaje. La reunión se cerró con un acuerdo de que van Wijngaarden volvería a escribir la presentación de Wirth / Hoare utilizando su W-Grammar. [22]

Esta tarea aparentemente sencilla resultó en última instancia más difícil de lo esperado y la reunión de seguimiento tuvo que retrasarse seis meses. Cuando se reunió en abril de 1966 en Kootwijk , el borrador de van Wijngaarden permaneció incompleto y Wirth y Hoare presentaron una versión usando descripciones más tradicionales. En general, se estuvo de acuerdo en que su trabajo era "el lenguaje correcto en el formalismo incorrecto". [23] A medida que se exploraron estos enfoques, quedó claro que había una diferencia en la forma en que se describían los parámetros que tendrían efectos en el mundo real, y mientras Wirth y Hoare protestaban que los retrasos adicionales podrían volverse interminables, el comité decidió esperar a que la furgoneta Versión de Wijngaarden. Wirth luego implementó su definición actual como ALGOL W. [24]

En la siguiente reunión en Varsovia en octubre de 1966, [25] 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 avanzado mucho. Se volvieron a explorar las dos propuestas de la reunión anterior, y esta vez surgió un nuevo debate sobre el uso de punteros ; ALGOL W los usó solo para referirse a registros, mientras que la versión de van Wijngaarden podría apuntar a cualquier objeto. Para añadir confusión, John McCarthy presentó una nueva propuesta de la sobrecarga de operadores y la capacidad de juntas y la cadena o construcciones, y Klaus Samelsonquería permitir funciones anónimas . En la confusión resultante, se habló de abandonar todo el esfuerzo. [24] 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. [22]

Publicación

Finalmente, se publicó un borrador de informe en febrero de 1968. Esto se encontró con "conmoción, horror y disensión", [22] principalmente debido a los cientos de páginas de gramática ilegible y terminología extraña. Charles H. Lindsey intentó averiguar qué "lenguaje estaba escondido dentro de él", [26] un proceso que requirió seis semanas-hombre de esfuerzo. El papel resultante, "ALGOL 68 con menos lágrimas", tuvo una amplia circulación. En una reunión de procesamiento de información más amplia en Zurich en mayo de 1968, los asistentes se quejaron de que se les estaba imponiendo el lenguaje y de que IFIP era "el verdadero villano de esta situación irrazonable", ya que las reuniones eran en su mayoría cerradas y no había un mecanismo formal de retroalimentación. Wirth y Peter Naurrenunció formalmente a sus puestos de autoría en el GT2.1 en ese momento. [26]

La próxima reunión del WG2.1 tuvo lugar en Tirrenia en junio de 1968. Se suponía que debía discutir la publicación de compiladores y otras cuestiones, pero en cambio se convirtió en una discusión sobre el lenguaje. van Wijngaarden respondió diciendo (o amenazando) que publicaría solo una versión más del informe. En este punto, Naur, Hoare y Wirth habían abandonado el esfuerzo, y varios más amenazaban con hacerlo. [27] Siguieron varias reuniones más, North Berwick en agosto de 1968, Munich en diciembre que produjo el lanzamiento del Informe oficial en enero de 1969 pero también resultó en la redacción de un contencioso Informe de Minorías. Finalmente, en Banff, Albertaen septiembre de 1969, el proyecto se consideró en general completo y la discusión se centró principalmente en las erratas y una introducción muy ampliada del informe. [28]

El esfuerzo duró cinco años, quemó a muchos de los nombres más importantes de la informática y en varias ocasiones quedó estancado en cuestiones tanto de la definición como del grupo en su conjunto. Hoare publicó una "Crítica de ALGOL 68" casi de inmediato, [29] que ha sido ampliamente referenciada en muchos trabajos. Wirth continuó desarrollando el concepto ALGOL W y lo lanzó como Pascal en 1970.

Implementaciones

ALGOL 68-R

La primera implementación de la norma, basada en el informe preliminar 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, esto era un subconjunto del lenguaje completo, y Barry Mailloux , el editor final del Informe, bromeó diciendo que "es una cuestión de moralidad. ¡Tenemos una Biblia y tú estás pecando!" [30] No obstante, esta versión se hizo muy popular en las máquinas ICL y se convirtió en un lenguaje de uso generalizado en la codificación militar, especialmente en el Reino Unido. [31]

Entre los cambios en 68-R estaba el requisito de que todas las variables se declaren antes de su primer uso. Esto tenía la ventaja significativa de que permitía que el compilador fuera de 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 el efecto secundario de exigir que los procesos se declaren dos veces, una vez como una declaración de los tipos y luego nuevamente como el cuerpo del código. Otro cambio fue eliminar el supuesto modo void , una expresión que no devuelve ningún valor (denominada declaración en otros idiomas) y que exige que se agregue la palabra void donde se hubiera asumido. Además, 68-R eliminó el procesamiento paralelo explícitocomandos basados ​​en el par . [30]

Otros

La primera implementación completa del lenguaje fue introducida en 1974 por CDC Holanda para la serie de mainframe Control Data . Esto tuvo un uso limitado, principalmente para la enseñanza en Alemania y los Países Bajos. [31]

Una versión similar al 68-R se introdujo en la Universidad Carnegie Mellon en 1976 como 68S, y fue nuevamente un compilador de un solo paso basado en varias simplificaciones del original y destinado a ser utilizado en máquinas más pequeñas como el DEC PDP-11 . También se utilizó principalmente con fines didácticos. [31]

Una versión para mainframes de IBM no estuvo disponible hasta 1978, cuando se lanzó una de la Universidad de Cambridge . Esto fue "casi completo". Lindsey lanzó una versión para máquinas pequeñas, incluida la IBM PC en 1984. [31]

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

  • a68g , GPLv3 , escrito por Marcel van der Veer.
  • algol68toc , un puerto de software de código abierto de ALGOL 68RS .
  • frontend experimental Algol68 para GCC, escrito por Jose E. Marchesi. [33]

Cronología

  • "Una historia más breve de Algol 68"
  • ALGOL 68 - 3a generación ALGOL

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

  • Marzo de 1968: Informe preliminar sobre el lenguaje algorítmico ALGOL 68 [39] - Editado por: Adriaan van Wijngaarden , Barry J. Mailloux , John Peck y Cornelis HA Koster .

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

  • Octubre de 1968: Penúltimo informe preliminar sobre el lenguaje algorítmico ALGOL 68 - Capítulos 1-9 [40] Capítulos 10-12 [41] - Editado por: A. van Wijngaarden, BJ Mailloux, JEL Peck y CHA Koster.
  • Diciembre de 1968: Informe sobre el lenguaje algorítmico ALGOL 68 - Separata de Numerische Mathematik, 14, 79-218 (1969); Springer-Verlag. [42] - Editado por: A. van Wijngaarden, BJ Mailloux, JEL Peck y CHA Koster.
  • Marzo de 1970: Informe de minorías, ALGOL Bulletin AB31.1.1, firmado por Edsger Dijkstra , Fraser Duncan , Jan Garwick , Tony Hoare , Brian Randell , Gerhard Seegmüller , Wlad Turski y Mike Woodger .
  • Septiembre de 1973: Informe revisado sobre el lenguaje algorítmico Algol 68 - Springer-Verlag 1976 [43] - Editado por: A. van Wijngaarden, B. Mailloux, J. Peck, K. Koster, M. Sintzoff, CH Lindsey, Lambert Meertens y Richard G. Fisker .
  • otros miembros del WG 2.1 activos en el diseño de ALGOL 68: [18] Friedrich L. Bauer • Hans Bekic • Gerhard Goos • Peter Zilahy Ingerman • Peter Landin • Charles H. Lindsey • John McCarthy • Jack Merner • Peter Naur • Manfred Paul • Willem van der Poel • Doug Ross • Klaus Samelson • Michel Sintzoff • Niklaus Wirth • Nobuo Yoneda .

Cronología de la estandarización

1968: El 20 de diciembre de 1968, el "Informe Final" (MR 101) fue aprobado por el Grupo de Trabajo, a continuación, posteriormente aprobado por la Asamblea General de la UNESCO 's IFIP para su publicación. Se hicieron traducciones de la norma al ruso , alemán , francés y búlgaro , y luego al japonés y al chino . [44] El estándar también se puso a disposición en Braille .

1984: TC97 consideró ALGOL 68 para normalización como "Nuevo elemento de trabajo" TC97 / N1642 [2] [3] [ enlace muerto permanente ] . Alemania Occidental, Bélgica, Países Bajos, URSS y Checoslovaquia dispuestos a participar en la preparación de la norma, pero la URSS y Checoslovaquia "no eran el tipo adecuado de miembros de los comités ISO adecuados" [4] y la normalización ISO de Algol 68 se estancó. [5]

1988: Posteriormente, ALGOL 68 se convirtió en uno de los estándares GOST en Rusia.

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

Elementos de lenguaje notables

Símbolos en negrita y palabras reservadas

El lenguaje estándar contiene alrededor de sesenta palabras reservadas, generalmente en negrita impresas, y algunas con equivalentes de "símbolo breve":

mode , op , prio , proc , flex , heap , loc , long , ref , short , bits , bool , bytes , char , compl , int , real , sema , string , void , channel , file , format , struct , union , en "@",ya sea r0 , es ": =:", no  es no r0 ": / =:" ": ≠:", de "→" r0 , verdadero , falso , vacío , nulo "○", omitir "~", co " ¢ ", comentario " ¢ ", pr , pragmat , case ~ in ~ ouse ~ in ~ out ~ esac " (~ | ~ |: ~ | ~ | ~) ",para ~ de ~ a ~by ~ while ~ do ~ od , if ~ then ~ elif ~ then ~ else ~ fi "(~ | ~ |: ~ | ~ | ~)", par  begin ~ end "(~)", go to , goto , exit "." r0 .

Unidades: Expresiones

La construcción básica del lenguaje es la unidad . Una unidad puede ser una fórmula , una cláusula adjunta , un texto de rutina o una de varias construcciones técnicamente necesarias (asignación, salto, salto, nihil). El término técnico cláusula adjunta unifica algunas de las construcciones intrínsecamente entre corchetes conocidas como bloquear , hacer declaración , cambiar declaración 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 el encerramiento, por ejemplo ( si ~ entonces ~ else ~ fi , caso~ in ~ out ~ esac , por ~ mientras ~ do ~ od ). Este vigilado comandos de sintaxis fue reutilizado por Stephen Bourne en el común de Unix shell Bourne . 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 básicos tipos de datos (llamados modes en Algol 68 jerga) 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 Es la 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 simplemente azúcar sintáctica para . Es decir, es realmente el identificador constante para una referencia a una variable real local recién generada .ref real x = loc real;x

Además, en lugar de definir ambos floaty double, o inty longy short, etc., ALGOL 68 proporciona modificadores , de modo que lo común actualmente doublese escribiría como long real o long long real en su lugar, por ejemplo. Las constantes preludio max real y min long intse proporcionan para adaptar programas a diferentes implementaciones.

Todas las variables deben declararse, pero la declaración no tiene que preceder al primer uso.

declarador-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 - una sema phore que puede ser inicializado con el op rador nivel .

Se pueden crear tipos complejos a partir de otros más simples utilizando varios constructores de tipos:

  • modo ref : una referencia a un valor de modo de tipo , similar a & en C / C ++ y ref en Pascal
  • struct - usado para construir estructuras, como struct en C / C ++ y grabar en Pascal
  • union : se utiliza para construir uniones, como en C / C ++ y Pascal
  • proc : se usa para especificar procedimientos, como funciones en C / C ++ y procedimientos / funciones en Pascal

Para ver algunos ejemplos, consulte Comparación de ALGOL 68 y C ++ .

Otros símbolos de declaración incluyen: flex , heap , loc , ref , long , short , event S

  • flex : declara que la matriz es flexible, es decir, puede crecer en longitud a pedido.
  • montón : asigna a la variable algo de espacio libre del montón global.
  • loc : asigna a la variable algo de espacio libre de la pila local.
  • long : declara que un int , real o compl es de un tamaño más largo .
  • short : declara que un int , real o compl es de un tamaño más corto .

Se puede declarar un nombre para un modo (tipo) usando una declaración de modo , que es similar a typedef en C / C ++ y escribe en Pascal:

 int max = 99; mode newmode = [0: 9] [0: max] struct ( long  real a, b, c, short  int i, j, k, ref  real r );

Esto es similar al siguiente código C:

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

Para ALGOL 68, solo la indicación de modo nuevo aparece a la izquierda del símbolo igual y, sobre todo, 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 las matrices Algol 68 es uno por defecto, pero puede ser cualquier número 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 = estructura (A a, B b) modo A = proc (A a) A

mientras estos son válidos:

 modo A = estructura ( ref A a, B b) modo A = proc ( ref A a) ref A

Coacciones: casting

Las coacciones producen una coacción a partir de una coacción de acuerdo con tres criterios: el modo a priori de la coacción antes de la aplicación de cualquier coerción, el modo a posteriori de la coacción requerido después de esas coacciones, y la posición sintáctica o "especie" de la coacción. . Las coacciones pueden producirse en cascada.

Las seis coacciones posibles se denominan desprocesamiento , desreferenciación , unión , ensanchamiento , remo y anulación . Cada coerción, a excepción de la unión , prescribe un efecto dinámico correspondiente sobre los valores asociados. Por tanto, muchas acciones primitivas pueden programarse implícitamente mediante coacciones.

Fuerza del contexto - coacciones permitidas:

  • suave - deproceduring
  • Débil - desreferenciar o desprocesar, dando un nombre
  • manso - desreferenciar o desprocesar
  • firme - manso, seguido de unir
  • fuerte - firme, seguido de ensanchamiento, remo o evacuación

Jerarquía de coerción con ejemplos

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

Para obtener más detalles sobre las primarias, secundarias, terciarias y cuaternarias, consulte Precedencia del operador .

pr & co: Pragmats y comentarios

Los Pragmats son directivas en el programa, por lo general sugerencias para el compilador; en los idiomas más nuevos, estos se denominan "pragmas" (no 't'). p.ej

montón de pragmat = 32 pragmat pr montón = 32 pr

Los comentarios se pueden insertar de varias formas:

¢ La forma original de agregar sus 2 centavos a un programa ¢ comentar "negrita" comentar comentar co Estilo i comentar co# Comentario de estilo ii #
£ Este es un comentario de almohadilla / libra para un teclado del Reino Unido £

Normalmente, los comentarios no se pueden anidar en ALGOL 68. Esta restricción se puede eludir utilizando diferentes delimitadores de comentarios (por ejemplo, utilice hash solo para eliminaciones temporales de código).

Expresiones y declaraciones compuestas

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

 medio pi real , un pi; un pi: = 2 * (medio pi: = 2 * arco tan (1))

Esta noción está presente en C y Perl , entre otros. Tenga en cuenta que, como en lenguajes anteriores como Algol 60 y FORTRAN , los espacios están permitidos en los identificadores, por lo que half pies un identificador único (evitando así los guiones bajos versus el caso de camello versus todos los problemas de minúsculas ).

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

( Int suma: = 0; para i a n hacer suma +: = f (i) OD ; suma)

Tenga en cuenta que, al ser una expresión entera, el bloque de código anterior se puede utilizar en cualquier contexto en el que se pueda utilizar un valor entero . Un bloque de código devuelve el valor de la última expresión que evaluó; esta idea está presente en Lisp , entre otros lenguajes.

Todas las declaraciones compuestas terminan con corchetes de cierre distintivos:

  • si cláusulas de elección:
 if condición entonces declaraciones [ declaraciones else ] fi forma "breve": (condición | declaraciones | declaraciones)
 if condition1 then sentencias elif condition2 then sentencias [ else sentencias] fi forma "breve": (condición1 | declaraciones |: condición2 | declaraciones | declaraciones)

Este esquema no solo evita el problema del else pendiente, sino que también evita tener que usar beginy enden secuencias de instrucciones incrustadas .

  • cláusulas de elección de caso :
 cambio de caso en declaraciones, declaraciones, ... [ declaraciones de salida ] esac forma "breve": (cambiar | declaraciones, declaraciones, ... | declaraciones)
 caso switch1 en las declaraciones, declaraciones, ... ouse switch2 en las declaraciones, declaraciones, ... [ a cabo declaraciones] esac "breve" forma de caja declaración: (switch1 | declaraciones, declaraciones, ... |: | switch2 declaraciones, declaraciones , ... | declaraciones)

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

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 más 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 ¢ ( mod de año 4 = 0 y mod de año 100 ≠ 0 o mod de año 400 = 0 | 29 | 28),
¢ Mar ¢ 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ¢ a diciembre ¢ esac ;

Algol68 permitió que el conmutador fuera de tipo int o (de forma única) de unión . Este último permite imponer un tipo fuerte en las variables de unión . cf union a continuación, por ejemplo.

  • hacer cláusula de bucle:
[ para índice] [ desde el primero] [ por incremento] [ hasta el último] [ condición while ] do enunciados od La forma mínima de una "cláusula de bucle" es así: do enunciados od

Esto se consideró el bucle "universal", la sintaxis completa es:

para i de 1 por -22 a -333 mientras que i × i ≠ 4444 do ~ od

El constructo tiene varios aspectos inusuales:

  • solo la parte do ~ od era obligatoria, en cuyo caso el bucle se repetirá indefinidamente.
  • por lo tanto, la cláusula de 100 do ~ od , se repetirá solo 100 veces.
  • el "elemento sintáctico" while permitió a un programador romper antes de un bucle for . p.ej
int suma sq: = 0;para i , mientras print (("Hasta ahora:", i, nueva línea)); suma cuadrada ≠ 70 ↑ 2hacer suma sq +: = i ↑ 2sobredosis

Subsiguientes "Extensiones" a la norma Algol68 permitieron que la de elemento sintáctico que ser sustituido por hasta y downto para lograr una pequeña optimización. Los mismos compiladores también incorporaron:

  • hasta (C) : para la terminación tardía del bucle.
  • foreach (S) : para trabajar en matrices en paralelo .

Se pueden encontrar más ejemplos en los ejemplos de código a continuación.

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

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

  vector de modo = [1: 3] real ; # declaración de modo vectorial (typedef) #  matriz de modo = [1: 3,1: 3] real ; # declaración del modo de matriz (typedef) # vector v1: = (1,2,3); # variable de matriz inicialmente (1,2,3) # [] real v2 = (4,5,6); # Matriz constante, tipo equivalente al vector , límites son implícita # op + = ( vector a, b) vector : # binario op Erator definición # ( vector  fuera; porque i de ⌊a a ⌈a hace fuera [i]: = a [i] + b [i] od ; fuera); matriz m: = (v1, v2, v1 + v2); imprimir ((m [, 2:])); # una porción de las columnas 2 y 3 #

Las matrices se pueden cortar de cualquier manera, por ejemplo:

 ref  vector row = m [2,]; # definir una referencia (puntero) a la 2ª fila #  vector de referencia col = m [, 2]; # definir una referencia (puntero) a la segunda columna #

ALGOL 68 admite múltiples estructuras de campo ( struct ) y modos unidos . Las variables de referencia pueden apuntar a cualquier modo, incluidos los sectores de matriz y los campos de estructura.

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

 mode  node = union ( void , real , int , compl , string ), list = struct ( node val, ref  list next);

Ejemplo de uso para caso de unión de nodo :

proc: Procedimientos

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

 proc max of real = ( real a, b) real : si a> b entonces a else b fi ;

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

 proc max de real = ( real a, b) real : (a> b | a | b);

El valor de retorno de a proces el valor de la última expresión evaluada en el procedimiento. También se permiten referencias a procedimientos ( ref proc ). Los parámetros de llamada por referencia se proporcionan especificando referencias (como 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):   para i de  lwb una a  UPB un hacer 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 y tanto esos como los predefinidos pueden estar sobrecargados y sus prioridades pueden ser cambiadas por el codificador. El siguiente ejemplo define el operador maxcon versiones tanto diádicas como monádicas (escaneando los elementos de una matriz).

 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 : ( salida real : = a [ lwb a]; para i de  lwb a + 1 a  upb a do (a [i]> out | out: = a [i]) od ; fuera)

Operaciones de matriz, procedimiento, desreferencia y coerción

Técnicamente, estos no son operadores, sino que se consideran " unidades asociadas con 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 ⎩ ... tanto la rentabilidad verdadera si el estado más bajo de la dimensión de una matriz es fija.
  • Los operadores 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. p.ej. upb de unión ([] int, [,] real, flex [,,,] char)

Relaciones de asignación e identidad, etc.

Técnicamente, estos no son operadores, sino que se consideran " unidades asociadas con nombres ".

Nota: Los cuaternarios incluyen los nombres skip y ~.

": =:" (alternativamente " es ") comprueba si dos punteros son iguales; ": / =:" (alternativamente " no ") comprueba si son desiguales.

Por qué: =: y: / =: son necesarios: considere intentar comparar dos valores de puntero, como las siguientes variables, declaradas como punteros a entero:

ref int ip, jp

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

ip = jp

eliminará la referencia de ambos punteros a valores de tipo int , y los comparará, ya que el operador "=" está definido para int , pero no ref int . No es legal definir "=" para operandos de tipo ref int e int al mismo tiempo, porque entonces las llamadas se vuelven ambiguas, debido a las coerciones implícitas que se pueden aplicar: si los operandos deben dejarse como ref int y esa versión de el operador llamó? ¿O deberían desreferenciarse más a int y esa versión se usa en su lugar? Por lo tanto, la siguiente expresión nunca puede hacerse legal:

ip = nil

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

ip :=: jp
ip :=: nil

si bien es legal, probablemente no hará lo que cabría esperar. Siempre devolverán falso , porque están comparando las direcciones reales de las variables ipy jp, en lugar de lo que apuntan . Para lograr el efecto correcto, habría que escribir

ip :=: ref int(jp)
ip :=: ref int(nil)

Caracteres 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 "pelota de golf" insertado; estos estuvieron disponibles a mediados de la década de 1960 mientras se redactaba el 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 facilidades de entrada y salida de ALGOL 68. Incluye procedimientos predefinidos para la transmisión binaria, formateada y sin formato. Los archivos y otros dispositivos de transmisión se manejan de manera consistente e independiente de la máquina. El siguiente ejemplo imprime una salida sin formato en el dispositivo de salida estándar :

 print ((nueva página, "Título", nueva línea, "El valor de i es", i, "y x [i] es", x [i], nueva línea))

Tenga en cuenta los procedimientos predefinidos newpagey newlinepasados ​​como argumentos.

Libros, canales y archivos

Se considera que la transmisión es 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 con una llamada a match.
  • los canales corresponden a dispositivos físicos. por ejemplo, perforadoras e impresoras de tarjetas.
    • Tres canales estándar se distinguen: se interponen en el canal, se destacan canal, un paso atrás canal.
  • 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 ánimo de un archivo se puede leer, escribir, char, bin y abrir.
    • procedimientos transput incluyen: establish, create, open, associate, lock, close, scratch.
    • Consultar posiciones: 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, y proc set=(ref file f, int page,line,char)void:
    • Un archivo tiene rutinas de eventos . ej on logical file end, on physical file end, on page end, on line end, on format end, on value error, on char error.

transput formateado

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

Ejemplos:

printf (($ 2l "La suma es:" x, g (0) $, m + n)); ¢ imprime lo mismo que: ¢ print ((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. Usando la palabra clave par , una cláusula colateral se convierte en una cláusula paralela , donde la sincronización de acciones se controla mediante semáforos . En A68G, las acciones paralelas se asignan a subprocesos cuando están disponibles en el sistema operativo de alojamiento . En A68S se implementó un paradigma diferente de procesamiento paralelo (ver más abajo).

int ancho inicial del pie = 5;modo  pie = estructura ( nombre de cadena , ancho de sema , punta de bits ¢ vector empaquetado de BOOL ¢
);
 pie pie izquierdo: = pie ("Izquierdo", ancho del pie inicial nivelado , 2r11111), pie derecho: = pie ("Derecho", ancho del pie inicial nivelado , 2r11111);
 
¢ 10 pinzas redondas en una Colt Python de 1968 .357 Magnum ¢ rondas sema = nivel 10;
 
¢ la Magnum necesita más barriles para aprovechar al máximo el paralelismo ¢sema adquirir objetivo = nivel 1;
 prio ∧: = = 1;op ∧: = = ( ref  bits lhs, bits rhs) ref  bits : lhs: = lhs ∧ rhs;
 proc shoot = ( ref  foot foot) void : ( ↓ adquirir objetivo; ↓ rondas; imprimir ("¡BANG!"); ↓ ancho → pie; dedo del pie → pie ∧: = ¬ ( ancho del nivel del contenedor 1 shl → pie); printf (($ g ": ¡¡Ay !! -" 5 (g) l $, nombre → pie, [] bool (dedo del pie → pie) [ancho de bits - ancho inicial del pie + 1:])); ↑ adquirir objetivo
);
 
¢ disparar en paralelo para atender a alguien que espera pararse en un solo pie ¢par ( para el dedo del pie hasta el ancho inicial del pie, haga disparar (pie izquierdo) od , ¢ <= se requiere una coma ¢ para dedo del pie a pie inicial anchura hacer disparar (pie derecho) sobredosis)

Ejemplos de uso

Muestra de código

Este programa de muestra implementa el Tamiz de Eratóstenes para encontrar todos los números primos menores que 100. nil es el análogo ALGOL 68 del puntero nulo en otros idiomas. La notación x de y accede a un miembro x de una estructura y .

begin # Algol-68 tamiz de números primos, estilo funcional #   proc error = ( string s) void : (imprimir ((nueva línea, "error:", s, nueva línea)); ir a detener); proc one to = ( int n) list : ( proc f = ( int m, n) lista : (m> n | nil | cons (m, f (m + 1, n))); f (1, n));    lista de modos = nodo de referencia ; modo nodo = estructura ( int h, lista t); proc cons = ( int n, list l) list : heap node  : = (n, l); proc hd = ( lista l) int : (l es nulo | error ("hd nulo "); omitir | h de l); proc tl = ( lista l) lista : (l es    nulo | error ("tl nil "); saltar | t de l); proc show = ( list l) void : (l isnt  nil | print (("", entero (hd (l), 0))); show (tl (l)));   proc filter = ( proc ( int ) bool p, list l) list : si l es  nil,  entonces  nil  elif p (hd (l)) then cons (hd (l), filter (p, tl (l))) else filter (p, tl (l)) fi ;   proc tamiz = ( lista l) lista : si l es  nulo,  entonces  nil de lo  contrario  proc no es múltiple = ( int n) bool : n mod hd (l) ≠ 0; contras (hd (l), tamiz (filtro (no múltiple, tl (l)))) fi ;   proc primes = ( int n) list : 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 se escribieron en ALGOL 68C , aunque varios otros procedimientos protegidos estrechamente asociados, como un paginador, están escritos en BCPL . [48]
  • Eldon 3: desarrollado en la Universidad de Leeds para ICL 1900, fue escrito en ALGOL 68-R . [49]
  • Máquina flexible : el hardware era personalizado y microprogramable, con un sistema operativo, compilador (modular), editor, recolector de basura y sistema de archivo, todo escrito en ALGOL 68RS . El shell de comandos Curt [50] fue diseñado para acceder a datos escritos de manera similar a los modos Algol-68.
  • VME - S3 fue el lenguaje de implementación del sistema operativo VME. S3 se basó 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 Эльбрус-1 (Elbrus-1) y Эльбрус-2 se crearon utilizando el lenguaje de alto nivel Эль-76 (AL-76), en lugar del ensamblaje tradicional. Эль-76 se parece a Algol-68. La principal diferencia son los tipos de enlace dinámico en Эль-76 admitidos a nivel de hardware. Эль-76 se utiliza para aplicaciones, control de trabajos, programación de sistemas. [51]

Aplicaciones

Tanto ALGOL 68C como ALGOL 68-R están escritos en ALGOL 68, lo que hace que ALGOL 68 sea una aplicación de sí mismo. Otras aplicaciones incluyen:

  • ELLA : un lenguaje de descripción de hardware y un conjunto de herramientas de soporte. Desarrollado por Royal Signals and Radar Establishment durante las décadas de 1980 y 1990.
  • RAF Strike Command System - "... Se produjeron 400K de código ALGOL 68-RT sin errores con tres años-hombre de trabajo ..." [52]

Bibliotecas y API

  • Bibliotecas numéricas NAG : una biblioteca de software de rutinas de análisis numérico . Suministrado en ALGOL 68 durante la década de 1980.
  • TORRIX - un sistema de programación para operaciones en vectores y matrices sobre campos arbitrarios y de tamaño variable por SG van der Meulen y M. Veldhorst. [53]

Representación del programa

Una característica de ALGOL 68, heredada de la tradición ALGOL , son sus diferentes representaciones. Existe un lenguaje de representación utilizado para describir algoritmos en trabajos impresos, un lenguaje estricto (definido rigurosamente en el Informe) y un lenguaje de referencia oficial destinado a ser utilizado en la entrada del compilador. Los ejemplos contienen palabras en negrita , este es el lenguaje estricto . Las palabras reservadas de ALGOL 68 están efectivamente en un espacio de nombres diferente de los identificadores, y se permiten espacios en los identificadores, por lo que el siguiente fragmento es legal:

 int a int real = 3;

El programador que escribe código ejecutable no siempre tiene la opción de escribir en negrita o subrayado en el código, ya que esto puede depender de cuestiones culturales y de hardware. Se han ideado diferentes métodos para denotar estos identificadores. A esto se le llama régimen riguroso . Por ejemplo, todas o algunas de las siguientes pueden ser representaciones de programación disponibles :

 int a int real = 3; # el lenguaje estricto #
'INT'A REAL INT = 3; # COTIZAR estilo de trazo #
.INT A REAL INT = 3; # Estilo de trazo de PUNTO # INT a int real = 3; # Estilo de flejado SUPERIOR # int a_real_int = 3; # Estilo de trazo RES, hay 61 palabras reservadas aceptadas #

Todas las implementaciones deben reconocer al menos POINT, UPPER y RES dentro de las secciones PRAGMAT. De estos, los trazos PUNTO y SUPERIOR son bastante comunes, mientras que el trazo RES es una contradicción con la especificación (ya que no hay palabras reservadas). QUOTE (cita de un solo apóstrofe) fue la recomendación original, mientras que la cita de apóstrofo emparejada, común en ALGOL 60, no se usa mucho en ALGOL 68. [54]

Los siguientes caracteres se recomendaron para la portabilidad y se denominaron "personajes dignos" en el Informe sobre la representación de hardware estándar de Algol 68 Archivado 2014-01-02 en Wayback Machine :

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

Esto reflejó un problema en la década de 1960 en el que algunos equipos no admitían minúsculas ni otros caracteres no ASCII ; de hecho, en el informe de 1973 estaba escrito: "Cuatro caracteres dignos:" | "," _ "," [ ", y"] "- a menudo se codifican de forma diferente, incluso en instalaciones que utilizan nominalmente el mismo juego de caracteres".

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

Ejemplo de diferentes representaciones de programas

ALGOL 68 permite que cada lenguaje natural defina su propio conjunto de palabras clave Algol-68. Como resultado, los programadores pueden escribir programas utilizando palabras clave de su idioma nativo. A continuación se muestra un ejemplo de un procedimiento simple que calcula "al día siguiente", el código está en dos idiomas: inglés y alemán. [ cita requerida ]

# Fecha del día siguiente - variante en inglés # mode  date = struct ( int day, string month, int year); proc el día siguiente = ( fecha x) fecha : si día de x <longitud del mes (mes de x, año de x) entonces (día de x + 1, mes de x, año de x) elif mes de x = " Diciembre " entonces (1," enero ", año dex + 1) else (1, sucesor del mes (mes de x), año de x) fi ;
# Nachfolgetag - Deutsche Variante # menge  datum = tupel ( etiqueta ganz , mosto 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 = "Dezember" dann (1, "enero", jahrvon x + 1) ansonsten (1, nachfolgemonat (monat von x), jahr von x) endewenn ;

Ejemplo ruso / soviético: en inglés, la declaración de caso de Algol68 dice case ~ in ~ out ~ esac , en cirílico dice выб ~ в ~ либо ~ быв .

Algunas Vanitas

Por sus complejidades técnicas, ALGOL 68 necesita una gran cantidad de métodos para negar la existencia de algo:

saltar , "~" o "?" C - un valor indefinido siempre sintácticamente válido, vacío - el único valor admisible para anular , necesario para seleccionar vacío en una unión , vacío - sintácticamente como un modo , pero no uno, 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 del 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 estándares para inhibir la introspección de ciertos tipos. por ejemplo, sema

consulte a continuación para ver otros ejemplos de ℵ.

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

ALGOL 68 deja intencionalmente indefinido lo que sucede en caso de desbordamiento de enteros, la representación de bits enteros y el grado de precisión numérica del punto flotante. Por el contrario, el lenguaje Java ha sido criticado por especificar en exceso este último.

Ambos informes oficiales incluyeron algunas funciones avanzadas que no formaban parte del lenguaje estándar. Estos se indicaron con una ℵ y se consideraron efectivamente privados. Los ejemplos incluyen "≮" y "≯" para plantillas, el outtype / intype para tipificación de pato crudo y los operadores straightout y straightin para "enderezar" matrices y estructuras anidadas.

Extracto del informe de 1973:

§10.3.2.2. Modos de transmisión
a) modosimplout = unión (≮ℒ  int ≯, ≮ℒ  real ≯, ≮ℒ  compl ≯, bool , ≮ℒ bits≯, char , [] char );
b) modo ℵ tipo de salida = ¢ un declarante actual que especifica un modo unido de un conjunto suficiente de modos ninguno de los cuales es 'nulo' o contiene 'flexible', 'referencia a', 'procedimiento' o 'unión de' ¢;
c) modosimplin = unión (≮ ref ℒ  int ≯, ≮ ref ℒ  real ≯, ≮ refcompl ≯, ref  bool , ≮ ref ℒ  bits ≯, ref  char , ref [] char , ref  string );
d) modointype = ¢ ... ¢;
 
§10.3.2.3. Alisado
a) opstraightout = ( outtype x) [] simplout : ¢ el resultado de "enderezar" 'x' ¢;
b) opstraightin = ( intype x) [] simplin : ¢ el resultado de enderezar 'x' ¢;

Comparaciones con otros idiomas

  • 1973 - Notas comparativas sobre Algol 68 y PL / I - SH Valentine - Febrero de 1973
  • 1973 - BR Alexander y GE Hedrick. Una comparación de PL / 1 y ALGOL 68. Simposio internacional sobre computadoras y sistemas chinos de entrada / salida. págs. 359–368.
  • 1976 - Evaluación de ALGOL 68, JOVIAL J3B, Pascal , Simula 67 y TACPOL versus TINMAN - Requisitos para un lenguaje de programación de orden superior común.
  • 1976 - Una comparación de lenguajes [ enlace muerto permanente ] - Una comparación de las propiedades de los lenguajes de programación ALGOL 68, CAMAC-IML , Coral 66 , PAS 1 , PEARL , PL / 1 , PROCOL , RTL / 2 en relación con la programación en tiempo real - R. Roessler; K. Schenk - Octubre de 1976 [7]
  • 1976 - Evaluación de ALGOL 68, JOVIAL J3B, PASCAL, SIMULA 67 y TACPOL Versus [requisitos del lenguaje Steelman | TINMAN] Requisitos para un lenguaje de programación de orden superior común. Octubre de 1976 [8]
  • 1977 - Informe al Grupo de Trabajo de Idiomas de Alto Orden (HOLWG) - Resumen Ejecutivo - Comité Coordinador de Evaluación de Idiomas - Evaluación de PL / I , Pascal , ALGOL 68, HAL / S , PEARL , SPL / I , PDL / 2 , LTR, CS-4 , LIS , Euclid , ECL , Moral, RTL / 2 , Fortran , COBOL , ALGOL 60 , TACPOL , CMS-2 , Simula 67, JOVIAL J3B, JOVIAL J73 y Coral 66 .
  • 1977 - Comparación de PASCAL y ALGOL 68 [55] - Andrew S. Tanenbaum - junio de 1977.
  • 1980 - Una comparación crítica de varias implementaciones de lenguajes de programación : Algol 60, FORTRAN, Pascal y Algol 68.
  • 1993 - Cinco pequeños lenguajes y cómo crecieron - BLISS , Pascal , Algol 68, BCPL & C - Dennis M. Ritchie - Abril de 1993.
  • 1999 - Sobre la ortogonalidad : Algol68, Pascal y C
  • 2000 - Una comparación de matrices en ALGOL 68 y BLISS - Universidad de Virginia - Michael Walker - Primavera de 2000
  • 2009 - On Go - oh, vamos - ¿Qué tan bien resistirá Go de Google contra el lenguaje de programación Brand X? - David Given - noviembre de 2009
  • 2010 - Algol y Pascal de "Conceptos en lenguajes de programación - Lenguajes procedimentales estructurados en bloques" - por Marcelo Fiore
  • Comparación de ALGOL 68 y C ++

Revisiones

Excepto donde se indique (con un superíndice ), el lenguaje descrito anteriormente es el del "Informe revisado (r1) ".

El idioma del informe no revisado

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

op  yf = ( bool a, proc  bool b) bool : (a | b | falso );op  orf = ( bool a, proc  bool b) bool : (a | verdadero | b);

b solo se evalúa si a es verdadera.

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

si es  falso  yf  co proc bool: co (print ("No se debe ejecutar"); verdadero ) entonces ...

contra las expectativas ingenuas de los programadores, la impresión se ejecutaría, ya que sólo se procedió al valor de la cláusula adjunta elaborada después de yf . Inserción textual del proc bool comentado : lo hace funcionar.

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

Antes de la revisión, el programador podría decidir que los argumentos de un procedimiento se evalúen en serie en lugar de colateralmente mediante el uso de 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 será evaluado 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.

Propuestas de ampliación de IFIP WG 2.1

Después de la revisión del informe, se han propuesto algunas extensiones del lenguaje para ampliar la aplicabilidad:

  • Parametrización parcial (también conocida como Currying ): 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, un logaritmo de función de dos parámetros, base y argumento, podría especializarse en log natural, binario o decádico. ,
  • extensión del módulo : para el soporte de la vinculación externa, se propusieron dos mecanismos, módulos de definición ascendente , una versión más potente de las instalaciones de ALGOL 68-R y agujeros descendentes , similar a las cláusulas ENVIRONy USINGde ALGOL 68C [56]
  • 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).

Hasta ahora, solo se ha implementado una parametrización parcial, en Algol 68 Genie.

Cronograma de implementación y especificación de ALGOL 68s

El lenguaje S3 que se usó para escribir el sistema operativo ICL VME y mucho otro software de sistema en la serie ICL 2900 fue un derivado directo de Algol 68. Sin embargo, omitió muchas de las características más complejas y reemplazó los modos básicos con un conjunto de tipos de datos que se asignaron directamente a la arquitectura de hardware de la serie 2900.

Implementación de extensiones específicas

ALGOL 68R (R) de RRE fue la primera implementación del subconjunto ALGOL 68, que se ejecutó en ICL 1900 . Según el idioma original, las principales restricciones del subconjunto fueron la definición antes del uso y ningún procesamiento paralelo. Este compilador fue popular en las universidades del Reino Unido en la década de 1970, donde muchos estudiantes de ciencias de la computación aprendieron ALGOL 68 como su primer lenguaje de programación; el compilador era conocido por sus buenos mensajes de error.

ALGOL 68RS (RS) de RSRE era un sistema compilador portátil escrito en ALGOL 68RS (arrancado de ALGOL 68R) e implementado en una variedad de sistemas, incluidos ICL 2900 / Serie 39 , Multics y DEC VAX / VMS . El lenguaje se basó en el Informe revisado, pero con restricciones de subconjunto similares a ALGOL 68R. Este compilador sobrevive en forma de compilador Algol68-to-C.

En ALGOL 68S (S) de la Universidad Carnegie Mellon, se mejoró el poder del procesamiento paralelo al agregar una extensión ortogonal, eventing . Cualquier declaración de variable que contenga evento de palabra clave hizo asignaciones a esta variable elegible para evaluación en paralelo, es decir, el lado derecho se convirtió en un procedimiento que se movió a uno de los procesadores del sistema multiprocesador C.mmp . Los accesos a tales variables se retrasaron después de la terminación de la asignación.

Cambridge ALGOL 68C (C) fue un compilador portátil que implementó un subconjunto de ALGOL 68, restringiendo las definiciones de los operadores y omitiendo la recolección de basura, las filas flexibles y el transput formateado.

Algol 68 Genie (G) de M. van der Veer es una implementación de ALGOL 68 para las computadoras y los sistemas operativos actuales.

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

Citas

  • ... El esquema de composición tipográfica adoptado por C tiene una deuda considerable con Algol 68, aunque tal vez no surgió en una forma que los partidarios de Algol aprobarían. La noción central que capturé de Algol fue una estructura de tipos basada en tipos atómicos (incluidas las estructuras), compuesta en matrices, punteros (referencias) y funciones (procedimientos). El concepto de uniones y elencos de Algol 68 también tuvo una influencia que apareció más tarde. Dennis Ritchie, abril de 1993. [2]
  • ... C no desciende de Algol 68 es cierto, sin embargo, hubo influencia, gran parte de ella tan sutil que es difícil de recuperar incluso cuando pienso mucho. En particular, el tipo de unión (una adición tardía a C) se debe a A68, no en ningún detalle, sino en la idea de tener tal tipo en absoluto. 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í, claro, "largo". Dennis Ritchie , 18 de junio de 1988 [4]
  • "Felicitaciones, su Maestro lo ha hecho" - Niklaus Wirth [64]
  • Cuanto más lo veo, más infeliz me vuelvo - EW Dijkstra, 1968 [65]
  • [...] se dijo que la popularidad de A68 era inversamente proporcional [...] a la distancia desde Amsterdam - Guido van Rossum [66]
  • [...] Lo mejor que pudimos hacer fue enviar con él un informe minoritario, expresando nuestra opinión considerada de que, "... como herramienta para la creación confiable de programas sofisticados, el lenguaje fue un fracaso". [...] - CAR Hoare en su conferencia sobre el premio Turing de octubre de 1980 [67]
  • “[...] Más que nunca se requerirá de una herramienta de programación adecuada que asista, por estructura, al programador en los aspectos más difíciles de su trabajo, a saber, en la creación confiable de programas sofisticados. En este sentido No vemos cómo el lenguaje propuesto aquí es un paso significativo hacia adelante: por el contrario, sentimos que su visión implícita de la tarea del programador es muy similar a, digamos, hace diez años. Esto nos obliga a la conclusión de que, considerado como herramienta de programación, el lenguaje debe considerarse obsoleto. [...] " Informe de la minoría del Grupo de Trabajo de 1968 el 23 de diciembre de 1968. [68]

Ver también

Referencias

Citas

  1. ^ van Wijngaarden, Adriaan ; Mailloux, Barry James ; Peck, John Edward Lancelot ; Koster, Cornelis Hermanus Antonius ; Sintzoff, Michel ; 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 (PDF) desde el original el 19 de abril de 2019 . Consultado el 11 de mayo de 2019 .
  2. ↑ a b Dennis Ritchie (abril de 1993). "El desarrollo del lenguaje C" (PDF) . Archivado desde el original (PDF) el 6 de noviembre de 2005 . Consultado el 26 de abril de 2007 .
  3. ^ Influencia en C: tipos, estructuras, matrices, punteros y procedimientos - Dennis Ritchie [2]
  4. ↑ a b Dennis Ritchie (junio de 1988). "C y Algol 68" . Consultado el 15 de septiembre de 2006 .
  5. ^ Influencia en C: unión, estructura, sintaxis y precisión larga - Dennis Ritchie [4]
  6. ^ "Una historia de C ++: 1979-1991" (PDF) . Marzo de 1993. Página 12, segundo párrafo: Algol68 [dio] sobrecarga de operadores (§3.3.3), referencias (§3.3.4) y la capacidad de declarar variables en cualquier lugar de un bloque (§3.3.1) . Consultado el 6 de mayo de 2008 .
  7. ^ "Entrevista con Guido van Rossum" . Julio de 1998. Archivado desde el original el 1 de mayo de 2007 . Consultado el 29 de abril de 2007 .
  8. ^ "Una historia más breve de ALGOL 68" . Archivado desde el original el 10 de agosto de 2006 . Consultado el 15 de septiembre de 2006 .
  9. ^ Completitud y claridad de la descripción. Archivado el 17 de marzo de 2013 en la Wayback Machine.
  10. ^ Diseño ortogonal Archivado el 17 de marzo de 2013 en la Wayback Machine.
  11. ^ Seguridad Archivado el 17 de marzo de 2013 en la Wayback Machine.
  12. ^ Eficiencia Archivado el 17 de marzo de 2013 en la Wayback Machine.
  13. ^ "¿Gommas?" .
  14. ^ Informe revisado sobre el lenguaje algorítmico Algol 68 Archivado el 17 de marzo de 2013 en Wayback Machine . jmvdveer.home.xs4all.nl (20 de diciembre de 1968). Consultado el 21 de julio de 2013.
  15. ^ Terekhov, Andrey (2014). "ALGOL 68 y su impacto en la programación de la URSS y Rusia". 2014 Tercera Conferencia Internacional sobre Tecnología Informática en Rusia y en la ex Unión Soviética . págs. 97-106. doi : 10.1109 / SoRuCom.2014.29 . ISBN 978-1-4799-1799-0. S2CID  16097093 .
  16. ^ http://toc.proceedings.com/25445webtoc.pdf "Алгол 68 и его влияние на программирование в СССР и России" - páginas: 336 y 342
  17. ^ Lindsey 1996 .
  18. ↑ a b Lindsey, Charles H. (1996). Bergin, TJ; Gibson, RG (eds.). Una historia de ALGOL 68 . Avisos ACM SIGPLAN . Historia de los lenguajes de programación-II . 28 . también en ACM SIGPLAN Notices 28 (3), marzo de 1993 (incluye una bibliografía completa de las reuniones y discusiones antes, durante y después del desarrollo de ALGOL 68). Prensa ACM . págs. 97-132. doi : 10.1145 / 155360.155365 . ISBN 978-0-201-89502-5.
  19. ^ Programación fácil de Algol 68
  20. ^ Aprendiendo ALGOL 68 Genie
  21. ^ Lindsey 1993 , p. 7.
  22. ↑ a b c d Lindsey , 1993 , p. 9.
  23. ^ Lindsey 1993 , p. 24.
  24. ↑ a b Lindsey , 1993 , p. 10.
  25. ^ "El boletín de Algol" .
  26. ↑ a b Lindsey , 1993 , p. 12.
  27. ^ Lindsey 1993 , p. 13.
  28. ^ Lindsey 1993 , p. 15.
  29. ^ Hoare, C. a. R. (noviembre de 1968). "Crítica de ALGOL 68" . Boletín ALGOL . 29 : 27-29.
  30. ^ a b 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
  31. ^ a b c d Koster, CHA "Una historia más corta de Algol 68" . Archivado desde el original el 17 de diciembre de 2007.
  32. van der Veer, Marcel. "Implementaciones de código abierto Algol 68" . algol68.sourceforge.net .
  33. ^ E. Marchesi, José. "Interfaz Algol68 para GCC" . jemarch.net .
  34. ^ Proyecto de informe (DR) publicado
  35. ^ Informe revisado de Algol 68
  36. ^ Propuestas para ALGOL H - Un superlenguaje de ALGOL 68
  37. ^ Algol68 S (S) publicado en Internet
  38. Algol 68 Genie (G)
  39. ^ "Proyecto de informe sobre el lenguaje algorítmico ALGOL 68" . Marzo de 1968. Archivado desde el original el 30 de septiembre de 2007 . Consultado el 22 de junio de 2007 .
  40. ^ "Penúltimo informe preliminar sobre el lenguaje algorítmico ALGOL 68 - Capítulos 1-9" (PDF) . Octubre de 1968 . Consultado el 22 de junio de 2007 . [ enlace muerto permanente ]
  41. ^ "Penúltimo informe preliminar sobre el lenguaje algorítmico ALGOL 68 - Capítulos 10-12" (PDF) . Octubre de 1968 . Consultado el 22 de junio de 2007 . [ enlace muerto permanente ]
  42. ^ "Informe sobre el lenguaje algorítmico ALGOL 68" (PDF) . Diciembre de 1968 . Consultado el 30 de diciembre de 2007 .
  43. ^ "Informe revisado sobre el lenguaje algorítmico Algol 68" . Septiembre de 1973. Archivado desde el original el 27 de septiembre de 2007 . Consultado el 30 de abril de 2007 .
  44. ^ Lu Hu-quan (1971). "La traducción de Algol 68 al chino" (PDF) . Pekín, China: Instituto de Matemáticas, Academia Sinica . Consultado el 17 de agosto de 2012 .
  45. ^ "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 .
  46. ^ "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 .
  47. ^ Sintaxis de formato en ALGOL 68G Archivado 2008-01-09 en Wayback Machine
  48. ^ Needham, RM; Wilkes, MV (enero de 1979). "La computadora Cambridge CAP y su sistema operativo" (PDF) . Investigación de Microsoft .
  49. ^ David Holdsworth (invierno de 2009-2010). "KDF9 Time Sharing: ¡Eldon 2 no es EGDON!" . Resurrección informática - Número 49 . Sociedad de Conservación de Computadoras . Consultado el 3 de octubre de 2010 .
  50. ^ http://www.vitanuova.com/dist/doc/rsre-3522-curt.pdf
  51. ^ Эльбрус Бабаяна и Pentium Пентковского . Ixbt.com. Consultado el 21 de julio de 2013.
  52. ^ 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 .
  53. ^ Aplicaciones, bibliotecas y suites de prueba - Grupo de preservación de software . Softwarepreservation.org. Consultado el 21 de julio de 2013.
  54. ^ Informe revisado, página 123, nota al pie
  55. ^ "Vrije Universiteit Amsterdam" (PDF) .
  56. ^ Lindsey, CH; Boom, HJ (diciembre de 1978). "Una instalación de módulos y compilación separada para ALGOL 68" . Boletín ALGOL (43): 19–53. doi : 10.1145 / 1061719.1061724 (inactivo 2021-05-31) . Consultado el 29 de enero de 2020 .Mantenimiento de CS1: DOI inactivo a partir de mayo de 2021 ( enlace )
  57. ^ "Copia archivada" (PDF) . Archivado desde el original (PDF) el 15 de abril de 2010 . Consultado el 20 de marzo de 2010 . CS1 maint: copia archivada como título ( enlace )
  58. ^ http://htportal.acm.org/ft_gateway.cfm?id=803425&type=pdf [ enlace muerto permanente ]
  59. ^ Una máquina ALGOL 68 abstracta y su aplicación en un compilador independiente de la máquina: Springer . Springerlink.com. Consultado el 21 de julio de 2013.
  60. ^ "Copia archivada" . Archivado desde el original el 10 de marzo de 2011 . Consultado el 20 de marzo de 2010 .CS1 maint: copia archivada como título ( enlace )
  61. ^ Implementaciones de código abierto Algol 68 - Examinar archivos en . Sourceforge.net. Consultado el 21 de julio de 2013.
  62. ^ [1] Archivado el 29 de agosto de 2006 en la Wayback Machine.
  63. ^ "Copia archivada" (PDF) . Archivado desde el original (PDF) el 2 de enero de 2014 . Consultado el 27 de agosto de 2005 . CS1 maint: copia archivada como título ( enlace )
  64. ^ CHA Koster (1993). "La realización de Algol 68". CiteSeerX 10.1.1.76.2072 .  Cite journal requiere |journal=( ayuda )
  65. ^ Dijkstra, EW "Para el editor ALGOL 68 Mathematische Centrum" . Archivado desde el original el 21 de abril de 2007 . Consultado el 28 de abril de 2007 .
  66. van Rossum, Guido (junio de 2005). "Lista de deseos de Python-Dev: dowhile" . Consultado el 28 de abril de 2007 .
  67. ^ Hoare, CAR (febrero de 1981) [basado en su conferencia sobre el Premio Turing de 1980 ]. "La ropa vieja del emperador" . Comunicaciones de la ACM . 24 (2): 75–83. doi : 10.1145 / 358549.358561 . S2CID 97895 . Archivado desde el original el 8 de mayo de 2013.  URL alternativa archivada el 2 de octubre de 2017 en la Wayback Machine.
  68. ^ "Boletín ALGOL (mencionado en AB30.1.1.1)" . Marzo de 1970. Archivado desde el original el 30 de septiembre de 2007 . Consultado el 1 de marzo de 2007 .

Trabajos citados

  • Brailsford, DF y Walker, AN, Introducción a la programación de ALGOL 68 , Ellis Horwood / Wiley, 1979
  • Lindsey, CH y van der Meulen, SG, Introducción informal a ALGOL 68 , Holanda Septentrional, 1971
  • Lindsey, CH (2 de marzo de 1993). "Una historia de ALGOL 68". Avisos ACM SIGPLAN . 28 (3): 97-132. doi : 10.1145 / 155360.155365 .
  • McGettrick, AD, ALGOL 68, A First and Second Course , Cambridge Univ. Prensa, 1978
  • Peck, JEL, compañero de ALGOL 68 , Univ. de la Columbia Británica, octubre de 1971
  • Tanenbaum, AS, A Tutorial on ALGOL 68 , Computing Surveys 8 , 155-190, junio de 1976 y 9 , 255-256, septiembre de 1977, [9] [ enlace muerto permanente ]
  • Woodward, PM y Bond, SG, ALGOL 68-R Users sic Guide , Londres, Her Majesty's Stationery Office, 1972

enlaces externos

  • Informe revisado sobre el lenguaje algorítmico ALGOL 68 La 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ínculo del informe revisado
  • Un tutorial sobre Algol 68 , por Andrew S. Tanenbaum , en Computing Surveys , vol. 8, No. 2, junio de 1976, con Corrección (Vol. 9, No. 3, septiembre de 1977)
  • Algol 68 Genie: un compilador-intérprete de GNU GPL Algol 68
  • Implementaciones de código abierto ALGOL 68, en SourceForge
  • Representación de hardware estándar Algol68 (.pdf) Archivado el 2 de enero de 2014 en Wayback Machine
  • Из истории создания компилятора с Алгол 68
  • Algol 68 - 25 años en la URSS
  • Система программ динамической поддержки для транслятора с Алгол 68
  • Historia de C con herencia de Algol68
  • McJones, Paul, "Implementaciones y dialectos de Algol 68" , Software Preservation Group , Computer History Museum , 2011-07-05
  • Compilador ALGOL 68 habilitado para web para pequeños experimentos
Obtenido de " https://en.wikipedia.org/w/index.php?title=ALGOL_68&oldid=1040344638 "