stringtranslate.com

ALGOL

ALGOL ( / ˈ æ l ɡ ɒ l , - ɡ ɔː l / ; abreviatura de " Lenguaje algorítmico ") [1] es una familia de lenguajes de programación de computadoras imperativos desarrollados originalmente en 1958. ALGOL influyó mucho en muchos otros lenguajes y fue el método estándar. para la descripción de algoritmos utilizados por la Association for Computing Machinery (ACM) en libros de texto y fuentes académicas durante más de treinta años. [2]

En el sentido de que la sintaxis de la mayoría de los lenguajes modernos es "similar a Algol", [3] podría decirse que fue más influyente que otros tres lenguajes de programación de alto nivel entre los cuales era más o menos contemporáneo: FORTRAN , Lisp y COBOL . [4] Fue diseñado para evitar algunos de los problemas percibidos con FORTRAN y eventualmente dio lugar a muchos otros lenguajes de programación, incluidos PL /I , Simula , BCPL , B , Pascal , Ada y C.

ALGOL introdujo bloques de código y los begin... endpares para delimitarlos. También fue el primer lenguaje que implementó definiciones de funciones anidadas con alcance léxico . Además, fue el primer lenguaje de programación que prestó atención detallada a la definición formal del lenguaje y, a través del Informe Algol 60, introdujo la forma Backus-Naur , una notación gramatical formal principal para el diseño de lenguajes.

Había tres especificaciones principales, nombradas según los años en que se publicaron por primera vez:

ALGOL 68 es sustancialmente diferente de ALGOL 60 y no fue bien recibido, [ ¿según quién? ] por lo que generalmente se entiende que la referencia a "Algol" significa ALGOL 60 y sus dialectos. [ cita necesaria ]

Historia

ALGOL fue desarrollado conjuntamente por un comité de informáticos europeos y americanos en una reunión celebrada en 1958 en el Instituto Federal Suizo de Tecnología en Zurich (cf. ALGOL 58 ). [ cita necesaria ] Especificó tres sintaxis diferentes: una sintaxis de referencia, una sintaxis de publicación y una sintaxis de implementación, sintaxis que le permitieron usar diferentes nombres de palabras clave y convenciones para puntos decimales (comas frente a puntos) para diferentes idiomas. [ cita necesaria ]

ALGOL fue utilizado principalmente por científicos informáticos de investigación en los Estados Unidos y Europa; Las aplicaciones comerciales se vieron obstaculizadas por la ausencia de funciones estándar de entrada/salida en su descripción y la falta de interés en el idioma por parte de los grandes proveedores de computadoras (aparte de Burroughs Corporation ). [ cita necesaria ] Sin embargo, ALGOL 60 se convirtió en el estándar para la publicación de algoritmos y tuvo un efecto profundo en el desarrollo futuro del lenguaje. [¿ según quién? ]

subtítulo
Árbol genealógico de la dinastía de los lenguajes de programación Algol, Fortran y COBOL

John Backus desarrolló el método de forma normal Backus para describir lenguajes de programación específicamente para ALGOL 58. Peter Naur lo revisó y amplió para ALGOL 60 y, por sugerencia de Donald Knuth , se le cambió el nombre a forma Backus-Naur . [9]

Peter Naur: "Como editor del Boletín ALGOL me involucré en los debates internacionales sobre el idioma y fui seleccionado para ser miembro del grupo europeo de diseño de idiomas en noviembre de 1959. En esta capacidad fui el editor del informe ALGOL 60, producido como resultado de la reunión ALGOL 60 en París en enero de 1960." [10]

A la reunión de París (del 1 al 16 de enero) asistieron las siguientes personas: [ cita necesaria ]

Alan Perlis dio una vívida descripción de la reunión: "Las reuniones fueron agotadoras, interminables y estimulantes. Uno se irritaba cuando las buenas ideas eran descartadas junto con las malas de los demás. Sin embargo, la diligencia persistió durante todo el período. La química de el 13 fue excelente." [ Esta cita necesita una cita ]

ALGOL 60 inspiró muchos idiomas que lo siguieron. Tony Hoare comentó: "Aquí hay un lenguaje tan adelantado a su tiempo que no sólo fue una mejora con respecto a sus predecesores sino también a casi todos sus sucesores". [11] El lenguaje de programación Scheme , una variante de Lisp que adoptó la estructura de bloques y el alcance léxico de ALGOL, también adoptó la redacción "Informe revisado sobre el esquema de lenguaje algorítmico" para sus documentos estándar en homenaje a ALGOL. [12]

ALGOL y la investigación del lenguaje de programación.

Como señaló Peter Landin , [ cita necesaria ] ALGOL fue el primer lenguaje que combinó perfectamente efectos imperativos con el cálculo lambda ( llamado por nombre ) . [ cita necesaria ] Quizás la formulación más elegante del lenguaje se debe a John C. Reynolds , y es la que mejor exhibe su pureza sintáctica y semántica. [¿ según quién? ] El ALGOL idealizado de Reynolds también presentó un argumento metodológico convincente sobre la idoneidad de los efectos locales en el contexto de los lenguajes de llamada por nombre, en contraste con los efectos globales utilizados por los lenguajes de llamada por valor como ML . [ cita necesaria ] La integridad conceptual del lenguaje lo convirtió en uno de los principales objetos de investigación semántica, junto con la programación de funciones computables (PCF) y ML. [ cita necesaria ]

Cronograma de implementaciones de IAL

Hasta la fecha ha habido al menos 70 aumentos, extensiones, derivaciones y sublenguajes de Algol 60. [13]

Los dialectos de Burroughs incluían dialectos especiales de Bootstrapping como ESPOL y NEWP . Este último todavía se utiliza para el software del sistema Unisys MCP.

Propiedades

ALGOL 60, tal como se define oficialmente, no tenía instalaciones de E/S ; Las implementaciones definieron las suyas propias de maneras que rara vez eran compatibles entre sí. Por el contrario, ALGOL 68 ofrecía una extensa biblioteca de instalaciones de transputación (entrada/salida).

ALGOL 60 permitió dos estrategias de evaluación para el paso de parámetros : la llamada por valor común y la llamada por nombre . La llamada por nombre tiene ciertos efectos a diferencia de la llamada por referencia . Por ejemplo, sin especificar los parámetros como valor o referencia , es imposible desarrollar un procedimiento que intercambie los valores de dos parámetros si los parámetros reales que se pasan son una variable entera y una matriz indexada por esa misma variable entera. . [22] Piense en pasar un puntero para intercambiar (i, A [i]) a una función. Ahora que cada vez que se hace referencia al intercambio, se reevalúa. Digamos i := 1 y A[i] := 2, por lo que cada vez que se haga referencia al intercambio devolverá la otra combinación de los valores ([1,2], [2,1], [1,2] y así sucesivamente ). Una situación similar ocurre con una función aleatoria pasada como argumento real.

Muchos diseñadores de compiladores conocen la llamada por nombre por los interesantes " thunks " que se utilizan para implementarla. Donald Knuth ideó la " prueba del hombre o el niño " para separar los compiladores que implementaban correctamente " la recursividad y las referencias no locales". Esta prueba contiene un ejemplo de llamada por nombre.

ALGOL 68 se definió utilizando un formalismo gramatical de dos niveles inventado por Adriaan van Wijngaarden y que lleva su nombre. 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 estándares de lenguajes de programación se denominan "semánticos" 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 lenguaje formal. analizador.

Ejemplos y portabilidad

Comparaciones de ejemplos de código

ALGOL 60

(La forma en que se debe escribir el texto en negrita depende de la implementación, por ejemplo, 'INTEGER' (entre comillas incluidas) para números enteros. Esto se conoce como stropping .)

procedimiento Absmax(a) Tamaño:(n, m) Resultado:(y) Subíndices:(i, k); valor norte, metro; matriz a; número entero n, m, i, k; realmente ;comentario El mayor elemento absoluto de la matriz a, de tamaño n por m, se copia en y, y los subíndices de este elemento en i y k;comenzar con  el número entero p, q; y := 0; yo := k := 1; para p := 1 paso 1 hasta n hacer  para q := 1 paso 1 hasta m hacer  if abs(a[p, q]) > y luego  comenzar y := abs(a[p, q]); yo := p; k := q extremo extremo Absmax

A continuación se muestra un ejemplo de cómo producir una mesa utilizando Elliott 803 ALGOL. [23]

PRUEBA DE ALGOL DE PUNTO FLOTANTE' COMENZAR REAL A,B,C,D' RE AÑADIR' PARA A:= 0.0 PASO D HASTA 6.3 DO COMENZAR IMPRIMIR PERFORADOR(3),££L??' B := PECADO(A)' C := COS(A)' IMPRIMIR PERFORACIÓN(3),MISMA LÍNEA,ALINEADA(1,6),A,B,C' FIN FIN'

PUNCH(3) envía la salida a la teleimpresora en lugar de a la perforadora de cinta.
SAMELINE suprime el retorno de carro + avance de línea que normalmente se imprime entre argumentos.
ALIGNED(1,6) controla el formato de la salida con un dígito antes y seis después del punto decimal.

ALGO 68

Los siguientes ejemplos de código son versiones ALGOL 68 de los ejemplos de código ALGOL 60 anteriores.

Las implementaciones de ALGOL 68 utilizaron los enfoques de ALGOL 60 para afilar . En el caso de ALGOL 68, los tokens con tipo de letra en negrita son palabras, tipos (modos) u operadores reservados.

proc abs max = ([,] real a, ref  real y, ref  int i, k) real : comentario El mayor elemento absoluto de la matriz a, de tamaño ⌈a por 2⌈ase transfiere a y, y los subíndices de este elemento a i y k; comentario comienza  real y := 0; yo := ⌊a; k := 2⌊a; para p de ⌊a a ⌈a hazlo  para q de 2⌊a a 2⌈a hazlo  si  abs a[p, q] > y entonces y := abs a[p, q]; yo := p; k := q fi  od  od ; yextremo # abs máx #

Nota: los límites inferior (⌊) y superior (⌈) de una matriz, y la división de la matriz, están directamente disponibles para el programador.

Prueba algol68 de punto flotante:( reales a,b,c,d;   # printf – envía la salida al archivo  destacado . # # imprimirf($p$); – selecciona una nueva página # printf(($pg$,"Ingrese d:"));  re añadir);   para paso desde 0 mientras a:=paso*d; a <= 2*pi hacer printf($l$); # $l$ - selecciona una nueva línea . # b := pecado(a); c := porque(a); printf(($zd.6d$,a,b,c)) # formatea la salida con 1 dígito antes y 6 después del punto decimal. # sobredosis)

Línea de tiempo: Hola mundo

Las variaciones y la falta de portabilidad de los programas de una implementación a otra se demuestran fácilmente con el clásico programa hola mundo . [ cita necesaria ]

ALGOL 58 (IAL)

ALGOL 58 no tenía instalaciones de E/S.

ALGOL 60 familia

Dado que ALGOL 60 no tenía funciones de E/S, no existe un programa portátil de saludo en ALGOL. Los siguientes tres ejemplos están en Burroughs Extended Algol. Los dos primeros salen directamente al terminal interactivo en el que se ejecutan. El primero usa una matriz de caracteres, similar a C. El lenguaje permite que el identificador de la matriz se use como un puntero a la matriz y, por lo tanto, en una declaración REPLACE.

COMENZAR ARCHIVO  F  ( TIPO = REMOTO ) ;  ARRAY EBCDIC  E [ 0 : 11 ]; SUSTITUYA E POR "¡HOLA MUNDO!" ; ESCRIBIR ( F , * , E ); FIN .         

Un programa más simple que utiliza un formato en línea:

COMENZAR ARCHIVO  F  ( TIPO = REMOTO ) ;  ESCRIBIR ( F ,  < "¡HOLA MUNDO!" > );  FIN .

Un programa aún más simple que utiliza la instrucción Display. Tenga en cuenta que su salida terminaría en la consola del sistema ("SPO"):

COMENZAR LA PANTALLA  ( " ¡HOLA MUNDO!" )  FINALIZAR .

Un ejemplo alternativo que utiliza E/S de Elliott Algol es el siguiente. Elliott Algol usó caracteres diferentes para "comilla de cadena abierta" y "comilla de cadena cerrada", representados aquí por ' y ' .

programa Hola Gente ; comenzar imprimir ' Hola mundo ' terminar ;      

A continuación se muestra una versión de Elliott 803 Algol (A104). El Elliott 803 estándar usaba cinta de papel de cinco agujeros y, por lo tanto, solo tenía mayúsculas. El código carecía de caracteres de cotización, por lo que se utilizó £ (signo de la libra británica) para la cotización abierta y? (Signo de interrogación) para una cita cercana. Las secuencias especiales se colocaron entre comillas dobles (por ejemplo, ££L?? produjo una nueva línea en el teleimpresor).

 HOLA AMIGOS' COMENZAR IMPRIMIR £HOLA MUNDO£L??' FIN'

La versión Algol I/O de la serie ICT 1900 permitía la entrada desde cinta de papel o tarjeta perforada. El modo 'lleno' de cinta de papel permite minúsculas. La salida fue a una impresora de línea. Los caracteres de comillas de apertura y cierre se representaron usando '(' y ')' y espacios por %. [24]

 'COMENZAR' ESCRIBIR TEXTO('('HOLA%MUNDO')'); 'FIN'

ALGO 68

El código ALGOL 68 se publicó con palabras reservadas normalmente en minúsculas, pero en negrita o subrayadas.

comenzar printf(($gl$,"¡Hola mundo!"))fin

En el lenguaje del "Informe Algol 68", las instalaciones de entrada/salida se denominaron colectivamente "Transput".

Cronología de los caracteres especiales de ALGOL

Los ALGOL se concibieron en una época en la que los conjuntos de caracteres eran diversos y evolucionaban rápidamente; Además, los ALGOL se definieron de modo que solo se requirieran letras mayúsculas .

1960: IFIP – El lenguaje y el informe Algol 60 incluían varios símbolos matemáticos que están disponibles en computadoras y sistemas operativos modernos, pero, desafortunadamente, no eran compatibles con la mayoría de los sistemas informáticos en ese momento. Por ejemplo: ×, ÷, ≤, ≥, ≠, ¬, ∨, ∧, ⊂, ≡, ␣ y ⏨.

Septiembre de 1961: ASCII: al conjunto de caracteres ASCII , que entonces se encontraba en una etapa inicial de desarrollo, se le agregó el carácter \ (barra invertida) para admitir los operadores booleanos de ALGOL /\ y \/ . [25]

1962: ALCOR : este conjunto de caracteres incluía el inusual carácter de cruz rúnica "᛭" [26] para multiplicación y el símbolo de exponente decimal "⏨" [27] para notación de punto flotante. [28] [29] [30]

1964: GOST : el estándar soviético GOST 10859 de 1964 permitía la codificación de caracteres de 4, 5, 6 y 7 bits en ALGOL. [31]

1968: El "Informe Algol 68": utilizó caracteres ALGOL existentes y adoptó además los caracteres →, ↓, ↑, □, ⌊, ⌈, ⎩, ⎧, ○, ⊥ y ¢ que se pueden encontrar en el teclado IBM 2741 con Cabezales de impresión tipo bola (o pelota de golf ) insertados (como la pelota de golf APL ). Estos estuvieron disponibles a mediados de la década de 1960 mientras se redactaba ALGOL 68. El informe fue traducido al ruso, alemán, francés y búlgaro y permitió la programación en idiomas con conjuntos de caracteres más grandes, por ejemplo, el alfabeto cirílico del BESM -4 soviético. Todos los caracteres de ALGOL también forman parte del estándar Unicode y la mayoría de ellos están disponibles en varias fuentes populares .

Octubre de 2009: Unicode : el (símbolo de exponente decimal) para notación de punto flotante se agregó a Unicode 5.2 para lograr compatibilidad con versiones anteriores del software ALGOL del programa histórico Buran . [32]

Otras lecturas

Ver también

Referencias

  1. ^ El nombre de esta familia de lenguas a veces se da en mayúsculas (Algol 60 Archivado el 25 de junio de 2007 en Wayback Machine ) y, a veces, en mayúsculas (ALGOL68 Archivado el 13 de septiembre de 2014 en Wayback Machine ). Para simplificar, este artículo utiliza ALGOL .
  2. ^ Algoritmos recopilados de ACM Archivado el 17 de octubre de 2011 en Wikiwix Archivos comprimidos de los algoritmos. ACM .
  3. ^ O'Hearn, PW; Tennent, RD (septiembre de 1996). "Lenguajes similares a Algol, Introducción". Archivado desde el original el 14 de noviembre de 2011.
  4. ^ "El lenguaje de programación ALGOL" Archivado el 6 de octubre de 2016 en Wayback Machine , Universidad de Michigan-Dearborn
  5. ^ Backus, John Warner ; Bauer, Friedrich Ludwig ; Verde, Julien; Katz, Carlos ; McCarthy, Juan ; Naur, Pedro ; Perlis, Alan Jay ; Rütishauser, Heinz ; Samelson, Klaus ; Vauquois, Bernard ; Wegstein, José Enrique ; van Wijngaarden, Adriaan ; Woodger, Michael (mayo de 1960). Naur, Peter (ed.). "Informe sobre el lenguaje algorítmico ALGOL 60". Comunicaciones de la ACM . Copenhague, Dinamarca. 3 (5): 299–314. doi : 10.1145/367236.367262 . ISSN  0001-0782. S2CID  278290.
  6. ^ "Informe revisado sobre el lenguaje algorítmico Algol 60". 1963. Archivado desde el original el 25 de junio de 2007 . Consultado el 8 de junio de 2007 .
  7. ^ "Un traductor ALGOL 60 para el X1" (PDF) . 1961. Archivado (PDF) desde el original el 9 de octubre de 2022 . Consultado el 7 de enero de 2021 .
  8. ^ "Informe revisado sobre el lenguaje algorítmico ALGOL 68" (PDF) . 1973. Archivado (PDF) desde el original el 13 de septiembre de 2014 . Consultado el 13 de septiembre de 2014 .
  9. ^ Knuth, Donald E. (1964). "Forma normal de Backus frente a forma de Backus Naur". Comunicaciones de la ACM . 7 (12): 735–736. doi : 10.1145/355588.365140 . S2CID  47537431.
  10. ^ Mención del premio ACM: Peter Naur Archivado el 2 de abril de 2012 en Archive-It , 2005
  11. ^ "Consejos sobre el diseño del lenguaje de programación" Archivado el 15 de septiembre de 2009 en Wayback Machine , CAR Hoare, diciembre de 1973. Página 27. (Esta afirmación a veces se atribuye erróneamente a Edsger W. Dijkstra , también involucrado en la implementación del primer compilador ALGOL 60 ).
  12. ^ Dybvig, RK; et al. Rees, Jonathan; Clinger, William; Abelson, Hal (eds.). "Informe revisado (3) sobre el esquema de lenguaje algorítmico (dedicado a la memoria de ALGOL 60)". Archivado desde el original el 14 de enero de 2010 . Consultado el 20 de octubre de 2009 .
  13. ^ "La enciclopedia de lenguajes informáticos". Archivado desde el original el 27 de septiembre de 2011 . Consultado el 20 de enero de 2012 .
  14. ^ Historia del Museo de la Computación Archivado el 20 de agosto de 2010 en Wayback Machine , Zuse-Computer Z23 histórico, restaurado por Konrad Zuse Schule en Hünfeld, para el Centro de Historia del Museo de la Computación en Mountain View (California) EE. UU.
  15. ^ Luz del día, EG (2011). "El grito de guerra de Dijkstra por la generalización: el advenimiento del procedimiento recursivo, finales de la década de 1950 y principios de la de 1960". La revista informática . 54 (11): 1756-1772. CiteSeerX 10.1.1.366.3916 . doi : 10.1093/comjnl/bxr002. Archivado desde el original el 12 de marzo de 2013. 
  16. ^ Kruseman Aretz, FEJ (30 de junio de 2003). "El compilador Dijkstra-Zonneveld ALGOL 60 para Electrologica X1". Ingeniería de software (PDF) . Historia de la Informática. Ámsterdam: Centrum Wiskunde & Informatica. Archivado (PDF) desde el original el 4 de marzo de 2016.
  17. ^ Hoare, Antonio (1980). "El traje viejo del emperador". Comunicaciones de la ACM . 24 (2): 75–83. doi : 10.1145/358549.358561 .
  18. ^ Koffman, Eliot. "Todo lo que realmente necesito saber lo aprendí en CS1" (PDF) . Archivado desde el original (PDF) el 12 de octubre de 2012 . Consultado el 20 de mayo de 2012 .
  19. ^ "GOGOL - PDP-1 Algol 60 (lenguaje informático)". Enciclopedia histórica en línea de lenguajes de programación. Archivado desde el original el 2 de febrero de 2018 . Consultado el 1 de febrero de 2018 .
  20. ^ Mounier-Kuhn, Pierre (2014). "Algol en Francia: del proyecto universal a la cultura integrada". Anales IEEE de la historia de la informática . 36 (4): 6–25. doi :10.1109/MAHC.2014.50. ISSN  1058-6180. S2CID  16684090.
  21. ^ Wippermann, Hans-Wilm (1968) [15 de junio de 1967, 1966]. "Definición von Schrankenzahlen en Triplex-ALGOL". Computación (en alemán). Karlsruhe, Alemania: Springer. 3 (2): 99-109. doi :10.1007/BF02277452. ISSN  0010-485X. S2CID  36685400.
  22. ^ Ah, Alfred V .; Sethi, Ravi ; Ullman, Jeffrey D. (1986). Compiladores: principios, técnicas y herramientas (1ª ed.). Addison-Wesley. ISBN 0-201-10194-7., Sección 7.5 y referencias allí contenidas
  23. ^ "803 ALGOL" Archivado el 29 de mayo de 2010 en Wayback Machine , el manual de Elliott 803 ALGOL
  24. ^ "Serie ICL 1900: Idioma Algol". Publicación técnica ICL 3340. 1965.
  25. ^ Cómo ASCII obtuvo su barra invertida Archivado el 11 de julio de 2014 en Wayback Machine , Bob Bemer
  26. ^ cruz de hierro/rúnica
  27. ^ Símbolo de exponente decimal
  28. ^ Baumann, R. (octubre de 1961). “Manual ALGOL del Grupo ALCOR, Parte 1” [Manual ALGOL del Grupo ALCOR]. Elektronische Rechenanlagen (en alemán): 206–212.
  29. ^ Baumann, R. (diciembre de 1961). “Manual ALGOL del Grupo ALCOR, Parte 2” [Manual ALGOL del Grupo ALCOR]. Elektronische Rechenanlagen (en alemán). 6 : 259–265.
  30. ^ Baumann, R. (abril de 1962). “Manual ALGOL del Grupo ALCOR, Parte 3” [Manual ALGOL del Grupo ALCOR]. Elektronische Rechenanlagen (en alemán). 2 .
  31. ^ "Estándar GOST 10859". Archivado desde el original el 16 de junio de 2007 . Consultado el 5 de junio de 2007 .
  32. ^ Broukhis, Leonid (22 de enero de 2008). "Propuesta revisada para codificar el símbolo exponente decimal" (PDF) . www.unicode.org . ISO/IEC JTC 1/SC 2/WG 2. Archivado (PDF) desde el original el 31 de julio de 2015 . Consultado el 24 de enero de 2016 . Esto significa que aún puede surgir la necesidad de transcodificar software y documentación basados ​​en GOST: algoritmos numéricos heredados (algunos de los cuales pueden ser de interés, por ejemplo para el aterrizaje automático del transbordador Buran...) optimizados para el punto flotante no IEEE La representación de BESM-6 no se puede simplemente recompilar y se puede esperar que funcione de manera confiable, y puede ser necesaria alguna intervención humana.

enlaces externos