ALGOL 60 (abreviatura de Algorithmic Language 1960 ) es un miembro de la familia ALGOL de lenguajes de programación informática . Fue la continuación de ALGOL 58 , que introdujo bloques de código y pares begin
y end
para delimitarlos, lo que representa un avance clave en el surgimiento de la programación estructurada . ALGOL 60 fue uno de los primeros lenguajes que implementó definiciones de funciones (que podían invocarse de forma recursiva). Las definiciones de funciones de ALGOL 60 podrían anidarse unas dentro de otras (lo que fue introducido por primera vez por cualquier lenguaje de programación), con alcance léxico . Dio origen a muchos otros lenguajes, incluidos CPL , PL/ I , Simula , BCPL , B , Pascal y C. Prácticamente todos los ordenadores de la época tenían un lenguaje de programación de sistemas basado en los conceptos ALGOL 60.
Niklaus Wirth basó su propio ALGOL W en ALGOL 60 antes de desarrollar Pascal . Se pretendía que Algol-W fuera el ALGOL de próxima generación, pero el comité ALGOL 68 decidió un diseño que era más complejo y avanzado en lugar de un ALGOL 60 simplificado y limpio. Las versiones oficiales de ALGOL llevan el nombre del año en que se publicaron por primera vez. ALGOL 68 es sustancialmente diferente de ALGOL 60 y fue criticado parcialmente por serlo, de modo que en general "ALGOL" se refiere a dialectos de ALGOL 60.
ALGOL 60 – junto con COBOL – fueron los primeros lenguajes en buscar la estandarización.
ALGOL 60 fue utilizado principalmente por científicos informáticos de investigación en los Estados Unidos y Europa. Su uso en aplicaciones comerciales se vio obstaculizado 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. Sin embargo, ALGOL 60 se convirtió en el estándar para la publicación de algoritmos y tuvo un profundo efecto en el desarrollo futuro del lenguaje.
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 . [1]
Peter Naur: "Como editor del Boletín ALGOL me involucré en los debates internacionales sobre la lengua y fui seleccionado para ser miembro del grupo europeo de diseño de lenguas en noviembre de 1959. En esta capacidad fui el editor del informe ALGOL 60, elaborado como resultado de la reunión ALGOL 60 en París en enero de 1960." [2]
Al encuentro de París (del 11 al 16 de enero) asistieron las siguientes personas:
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."
El lenguaje originalmente no incluía recursividad . Se incluyó en el pliego de condiciones en el último momento, en contra de los deseos de algunos miembros del comité. [3]
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". [4] [5]
Hasta la fecha ha habido al menos 70 aumentos, extensiones, derivaciones y sublenguajes de ALGOL 60. [6]
Los dialectos de Burroughs incluían dialectos de programación de sistemas especiales como ESPOL y NEWP .
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 (en la jerga de ALGOL 68 para entrada/salida).
ALGOL 60 proporcionó dos estrategias de evaluación para el paso de parámetros : la llamada por valor común y la llamada por nombre . La declaración del procedimiento especificaba, para cada parámetro formal, cuál se iba a utilizar: valor especificado para llamada por valor y omitido para 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. . [19] 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í en). 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.
Hay 35 de estas palabras reservadas en el sublenguaje estándar de Burroughs Large Systems :
ALPHA
ARRAY
BEGIN
BOOLEAN
COMMENT
CONTINUE
DIRECT
DO
DOUBLE
ELSE
END
EVENT
FALSE
FILE
FOR
FORMAT
GO
IF
INTEGER
LABEL
LIST
LONG
OWN
POINTER
PROCEDURE
REAL
STEP
SWITCH
TASK
THEN
TRUE
UNTIL
VALUE
WHILE
ZIP
Hay 71 identificadores restringidos de este tipo en el sublenguaje estándar de Burroughs Large Systems:
ACCEPT
AND
ATTACH
BY
CALL
CASE
CAUSE
CLOSE
DEALLOCATE
DEFINE
DETACH
DISABLE
DISPLAY
DIV
DUMP
ENABLE
EQL
EQV
EXCHANGE
EXTERNAL
FILL
FORWARD
GEQ
GTR
IMP
IN
INTERRUPT
IS
LB
LEQ
LIBERATE
LINE
LOCK
LSS
MERGE
MOD
MONITOR
MUX
NEQ
NO
NOT
ON
OPEN
OR
OUT
PICTURE
PROCESS
PROCURE
PROGRAMDUMP
RB
READ
RELEASE
REPLACE
RESET
RESIZE
REWIND
RUN
SCAN
SEEK
SET
SKIP
SORT
SPACE
SWAP
THRU
TIMES
TO
WAIT
WHEN
WITH
WRITE
y también los nombres de todas las funciones intrínsecas.
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 entonces comenzar y := abs(a[p, q]); yo := p; k := q extremo extremo Absmax
Las implementaciones difieren en cómo se debe escribir el texto en negrita. La palabra 'INTEGER', incluidas las comillas, debe usarse en algunas implementaciones en lugar de integer , arriba, designándola así como una palabra clave especial.
A continuación se muestra un ejemplo de cómo producir una tabla usando Elliott 803 ALGOL: [20]
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 PERFORACIÓN(3) ,££L??' B := PECADO(A)' C := COS(A)' IMPRIMIR PERFORACIÓN(3) , MISMA LÍNEA , ALINEADO(1,6) , A,B,C' FIN' FIN'
Dado que ALGOL 60 no tenía instalaciones de E/S, no existe un programa portátil de saludo en ALGOL. El siguiente programa podría (y aún lo hará) compilar y ejecutarse en una implementación ALGOL para una computadora central Unisys A-Series, y es una sencilla simplificación del código tomado de The Language Guide [21] de la Universidad de Michigan -Dearborn Computer and Information Science. Departamento ¡Hola mundo! Página del programa de ejemplo ALGOL. [22]
COMENZAR ARCHIVO F(TIPO=REMOTO); EBCDIC ARRAY E[0:11]; SUSTITUYA E POR "¡HOLA MUNDO!"; ESCRIBIR(F, *, E);FIN.
Donde * etc. representaba una especificación de formato tal como se utiliza en FORTRAN, por ejemplo, [23]
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:
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 ;
Aquí hay una versión para el Elliott 803 Algol (A104). El Elliott 803 estándar usaba cinta de papel de 5 orificios y, por lo tanto, solo tenía mayúsculas. El código carecía de comillas, por lo que se utilizó £ (signo de libra) para las comillas abiertas 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. Tenga en cuenta el uso de '(', ')' y %. [24]
'PROGRAMA' (HOLA) 'COMENZAR' 'COMENTARIO' LA COTIZACIÓN ABRIR ES '(', CERRAR ES ')', EL ESPACIO IMPRIMIBLE TIENE QUE SE ESCRIBIR COMO % PORQUE SE IGNORAN LOS ESPACIOS; ESCRIBIR TEXTO('('HOLA%MUNDO')'); 'FIN' 'FINALIZAR'
LEAP es una extensión del lenguaje de programación ALGOL 60 que proporciona una memoria asociativa de triples. Los tres elementos de un triple denotan la asociación de que un Atributo de un Objeto tiene un Valor específico. LEAP fue creado por Jerome Feldman (Universidad de California Berkeley) y Paul Rovner (MIT Lincoln Lab) en 1967. LEAP también se implementó en SAIL.