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 había introducido bloques de código y los begin
pares end
y para delimitarlos, lo que representó un avance clave en el auge 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 podían anidarse unas dentro de otras (lo que fue introducido por primera vez por cualquier lenguaje de programación), con alcance léxico . Dio lugar 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 de ALGOL 60.
Niklaus Wirth basó su propio ALGOL W en ALGOL 60 antes de pasar a desarrollar Pascal . Algol-W estaba destinado a ser la próxima generación de ALGOL, pero el comité de ALGOL 68 decidió un diseño más complejo y avanzado en lugar de un ALGOL 60 simplificado y depurado. Las versiones oficiales de ALGOL reciben su nombre del año en que se publicaron por primera vez. ALGOL 68 es sustancialmente diferente de ALGOL 60 y fue criticado en parte por serlo, por lo 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 Estados Unidos y Europa. Su uso en aplicaciones comerciales se vio obstaculizado por la ausencia de facilidades de entrada/salida estándar en su descripción y la falta de interés en el lenguaje por parte de los grandes fabricantes 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 de los lenguajes.
John Backus desarrolló el método de forma normal de Backus para describir lenguajes de programación específicamente para ALGOL 58. Fue revisado y ampliado por Peter Naur para ALGOL 60 y, por sugerencia de Donald Knuth, renombrado como forma Backus–Naur . [1]
Peter Naur: "Como editor del Boletín ALGOL, me involucré en los debates internacionales sobre el lenguaje y fui seleccionado para ser miembro del grupo de diseño del lenguaje europeo en noviembre de 1959. En esta función, fui el editor del informe ALGOL 60, elaborado como resultado de la reunión ALGOL 60 en París en enero de 1960". [2]
A la reunión en París (del 11 al 16 de enero) asistieron las siguientes personas:
Alan Perlis describió con gran viveza la reunión: "Las reuniones eran agotadoras, interminables y estimulantes. Uno se enfadaba cuando sus 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 entre los 13 era excelente".
El lenguaje originalmente no incluía la recursión . Se insertó en la especificación en el último momento, en contra de los deseos de algunos miembros del comité. [3]
ALGOL 60 inspiró a muchos lenguajes que lo siguieron. Tony Hoare comentó: "He aquí un lenguaje tan adelantado a su tiempo que no sólo fue una mejora respecto de sus predecesores sino también respecto de casi todos sus sucesores". [4] [5]
Hasta la fecha ha habido al menos 70 ampliaciones, 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 definió oficialmente, no tenía funciones de E/S; las implementaciones definían las suyas de maneras que rara vez eran compatibles entre sí. Por el contrario, ALGOL 68 ofrecía una amplia biblioteca de funciones de transput (término de ALGOL 68 para entrada/salida).
ALGOL 60 proporcionó dos estrategias de evaluación para el paso de parámetros : la llamada común por valor 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 la llamada por valor y omitido para la llamada por nombre. La llamada por nombre tiene ciertos efectos en contraste con 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 que está indexada por esa misma variable entera. [19] Piense en pasar un puntero a swap(i, A[i]) en una función. Ahora que cada vez que se hace referencia a swap, se reevalúa. Digamos i := 1 y A[i] := 2, por lo que cada vez que se hace referencia a swap 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 " procesadores " que se utilizan para implementarla. Donald Knuth ideó la " prueba man or boy " para separar los compiladores que implementaban correctamente la " recursión y las referencias no locales". Esta prueba contiene un ejemplo de llamada por nombre.
Hay 35 palabras reservadas de este tipo 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 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 n, m; matriz a; entero n, m, i, k; real y; comentario El mayor elemento absoluto de la matriz a, de tamaño n por m, se copia a y, y los subíndices de este elemento a i y k;comienza entero p, q; y := 0; i := k := 1; para p := 1 paso 1 hasta n hacer para q := 1 paso 1 hasta m hacer si abs(a[p, q]) > y entonces comenzar y := abs(a[p, q]); yo := p; k := q Fin Fin Absmax
Las implementaciones difieren en la forma en que se debe escribir el texto en negrita. La palabra 'INTEGER', incluidas las comillas, se debe utilizar en algunas implementaciones en lugar de entero , como se indica arriba, lo que la designa como una palabra clave especial.
A continuación se muestra un ejemplo de cómo producir una tabla utilizando Elliott 803 ALGOL: [20]
'PRUEBA DE ALGOL DE PUNTA FLOTANTE' COMIENZA REAL A,B,C,D' LEER D' PARA A:= 0.0 PASO D HASTA 6.3 HACER COMENZAR PERFORADORA DE IMPRESIÓN(3) ,££L??' B := SEÑADO(A)' C := COS(A)' PERFORADORA DE IMPRESIÓN (3) , MISMA LINEA , ALINEADA (1,6) , A, B, C' FIN' FIN'
Como ALGOL 60 no tenía funciones de E/S, no existe un programa de Hola mundo portable en ALGOL. El siguiente programa podría (y aún lo hará) compilarse y ejecutarse en una implementación de ALGOL para un mainframe Unisys A-Series, y es una simplificación directa del código tomado de The Language Guide [21] en la página del programa de ejemplo de ALGOL ¡Hola mundo! del Departamento de Ciencias de la Información y Computación de la Universidad de Michigan - Dearborn. [22]
COMENZAR ARCHIVO F(TIPO=REMOTO); MATRIZ EBCDIC E[0:11]; REEMPLAZA E POR "¡HOLA MUNDO!"; ESCRIBIR(F, *, E);FIN.
Donde * etc. representa una especificación de formato como la utilizada en FORTRAN, p. ej. [23]
Un programa más simple que utiliza un formato en línea:
INICIO ARCHIVO F ( TIPO = REMOTO ); ESCRIBIR ( F , < "HOLA MUNDO!" > ); FIN .
Un programa aún más simple que utiliza la declaración Display:
INICIO PANTALLA ( "¡HOLA MUNDO!" ) FIN .
Un ejemplo alternativo, que utiliza la entrada/salida de Elliott Algol, es el siguiente. Elliott Algol utilizó caracteres diferentes para "abrir-cadena-comillas" y "cerrar-cadena-comillas", representados aquí por ' y ' .
programa HiFolks ; comenzar imprimir ' Hola mundo ' fin ;
Aquí hay una versión para el Elliott 803 Algol (A104). El Elliott 803 estándar usaba cinta de papel de 5 agujeros y, por lo tanto, solo tenía mayúsculas. El código carecía de caracteres de comillas, por lo que se usaba £ (signo de almohadilla) para las comillas de apertura y ? (signo de interrogación) para las comillas de cierre. Las secuencias especiales se colocaban entre comillas dobles (por ejemplo, £L?? producía una nueva línea en el teleimpresor).
Gente de alta sociedad COMENZAR IMPRIMIR £HOLA MUNDO£L??' FIN'
La versión de E/S de Algol de la serie ICT 1900 permitía la entrada desde cinta de papel o tarjeta perforada. El modo "completo" de cinta de papel permitía el uso de minúsculas. La salida se realizaba a una impresora de línea. Nótese el uso de '(', ')' y %. [24]
'PROGRAMA' (HOLA) 'COMENZAR' 'COMENTARIO' ABRIR COMILLA ES '(', CERRAR ES ')', EL ESPACIO IMPRIMIBLE TIENE QUE SE ESCRIBE COMO % PORQUE SE IGNORARON 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 indican la asociación de un atributo de un objeto con 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.