![]() Informe revisado sobre el lenguaje algorítmico - Algol 68 Editado por: A. van Wijngaarden et al, septiembre de 1973 [1] | |
Paradigmas | Multi-paradigma : concurrente , imperativo |
---|---|
Familia | ALGOL |
Diseñada por | A. van Wijngaarden , BJ Mailloux , JEL Peck y CHA Koster , et al. |
Apareció por primera vez | Informe final: 1968 r0 |
Lanzamiento estable | Algol 68 / RR / Informe revisado: 1973 r1 |
Disciplina de mecanografía | estático , fuerte , seguro , estructural |
Alcance | Léxico |
Implementaciones importantes | |
ALGOL 68C , Algol 68 Genie (reciente), ALGOL 68-R , ALGOL 68RS , ALGOL 68S , FLACC , Алгол 68 Ленинград / Unidad de Leningrado , Odra ALGOL 68 | |
Dialectos | |
ALGOL 68 / FR (Informe final r0 ) | |
Influenciado por | |
ALGOL 60 , ALGOL Y | |
Influenciado | |
C , [3] [5] C ++ , [6] Bourne shell , KornShell , Bash , Steelman , Ada , Python , [7] Seed7 , Mary , S3 |
Este artículo contiene caracteres Unicode 6.0 " Técnicos varios ". Sin el soporte de representación adecuado , es posible que vea signos de interrogación, cuadros u otros símbolos en lugar de algo como "₁₀" ( símbolo de exponente decimal U + 23E8 TTF ). |
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.
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:
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.
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]
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]
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.
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]
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]
Año | Evento | Contribuyente |
---|---|---|
Marzo de 1959 | Boletín ALGOL Edición 1 (Primera) | Peter Naur / ACM |
Febrero de 1968 | Proyecto de informe (RD) publicado [34] | Grupo de trabajo IFIP 2.1 |
Marzo de 1968 | Informe final de Algol 68 r0 presentado en la reunión de Múnich | Grupo de trabajo IFIP 2.1 |
Junio de 1968 | Reunión en Tirrenia, Italia | Grupo de trabajo IFIP 2.1 |
Agosto 1968 | Reunión en North Berwick, Escocia | Grupo de trabajo IFIP 2.1 |
Diciembre de 1968 | Informe final de ALGOL 68 r0 presentado en la reunión de Múnich | Grupo de trabajo IFIP 2.1 |
Abril de 1970 | ALGOL 68-R (R) bajo GEORGE 3 en un ICL 1907F | Royal Signals y Radar Est. |
Septiembre de 1973 | Algol 68 Informe revisado [35] r1 Publicado | Grupo de trabajo IFIP 2.1 |
1975 | ALGOL 68C (C) - compilador transportable (zcode VM ) | S. Bourne , Andrew Birrell y Michael Guy |
Junio de 1975 | GE Hedrick y Alan Robertson. El compilador del subconjunto ALGOL 68 del estado de Oklahoma. 1975 Conferencia Internacional sobre ALGOL 68. | |
Junio de 1977 | Conferencia Strathclyde ALGOL 68, Escocia | ACM |
Mayo de 1978 | Propuestas para ALGOL H - Un superlenguaje de ALGOL 68 [36] | AP Black, VJ Rayward-Smith |
1984 | Compilador completo de ALGOL 68S (S) para Sun, SPARC y PC | CH Lindsey y col., Manchester |
Agosto de 1988 | Boletín ALGOL Edición 52 (último) | Ed. CH Lindsey / ACM |
Mayo de 1997 | Algol68 S (S) publicado en Internet [37] | Charles H. Lindsey |
Noviembre de 2001 | Algol 68 Genie (G) publicado en Internet [38] (licencia de código abierto GNU GPL) | Marcel van der Veer |
"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.
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.
Este artículo contiene caracteres Unicode 6.0 " Técnicos varios ". Sin el soporte de representación adecuado , es posible que vea signos de interrogación, cuadros u otros símbolos en lugar de algo como "₁₀" ( símbolo de exponente decimal U + 23E8 TTF ). |
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 .
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.
Los básicos tipos de datos (llamados mode
s en Algol 68 jerga) son real
, int
, compl
( número complejo ), bool
, char
, bits
y 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 float
y double
, o int
y long
y short
, etc., ALGOL 68 proporciona modificadores , de modo que lo común actualmente double
se escribiría como long real o long long real en su lugar, por ejemplo. Las constantes preludio max real
y min long int
se 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
Se pueden crear tipos complejos a partir de otros más simples utilizando varios constructores de tipos:
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
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
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:
ALGOL 68 tiene una jerarquía de contextos que determinan el tipo de coacciones disponibles en un punto particular del programa. Estos contextos son:
Ubicación de contexto | Coacciones disponibles | Ejemplos de coerción en el contexto | ||||
---|---|---|---|---|---|---|
Lado derecho de:
También:
| El ensanchamiento ocurre si no hay pérdida de precisión. Por ejemplo: un INT será coaccionado a un REAL y un REAL será coaccionado a un REAL LARGO. Pero no al revés. Ejemplos: INT a INT LARGO INT a REAL REAL para CUMPLIR BITS a [] BOOL BYTES a STRING Una variable también se puede coaccionar (remar) a una matriz de longitud 1. Por ejemplo: INT a [1] INT REAL a [1] REALetc. | |||||
| Ejemplo:
| |||||
| Ejemplos:REF REF BOOL a BOOL REF REF REF INT a INT | |||||
| Ejemplos:REF BOOL a REF BOOL REF REF INT a REF INT REF REF REF REAL a REF REAL REF REF REF REF ESTRUCTURA a REF ESTRUCTURA | |||||
El LHS de las asignaciones, como "~" en: ~ := ... | Ejemplo:
|
Para obtener más detalles sobre las primarias, secundarias, terciarias y cuaternarias, consulte Precedencia del operador .
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).
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 pi
es 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:
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 begin
y end
en secuencias de instrucciones incrustadas .
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.
[ 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:
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:
Se pueden encontrar más ejemplos en los ejemplos de código a continuación.
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 :
Algol68 r0 como en el Informe final de 1968nodo n: = "1234"; real r; int i; compl c; cadena s caso r, i, c, s :: = n en imprimir (("real:", r)), imprimir (("int:", i)), imprimir (("compl:", c)), print (("cadena:", s)) fuera de impresión (( "?:", n)) esac | Algol68 r1 como en el Informe revisado de 1973nodo n: = "1234"; # o n: = VACÍO; # caso n en ( void ): print (("void:", "EMPTY")), ( r real ): imprimir (("real:", r)), ( int i): print (("int:", i)), ( compl c): print (("compl:", c)), ( String s): print (( "cadena", s)) fuera de impresión (( "?:", n)) esac |
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 proc
es 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 .
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 max
con 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)
prio ridad | Operación r0 y r1 | + Algol68 r0 | + Algol68 G |
---|---|---|---|
Efectivamente 12 (primaria) | desreferenciar, desprocesar (~, ~), subíndice [~], remar [~,], rebanar [~: ~], denotaciones de tamaño largas y cortas | procesando | currying (~ ,,,), diag , trnsp , fila , col |
Efectivamente 11 (secundaria) | de (selección), loc & heap (generadores) | → (selección) | nuevo (generadores) |
Técnicamente, estos no son operadores, sino que se consideran " unidades asociadas con nombres ".
prio ridad (Terciario) | Algol68 "Personajes dignos [6] " r0 & r1 | + Algol68 r0 y r1 | + Algol68 C, G | + Algol68 r0 |
---|---|---|---|---|
10 | no ~, arriba , abajo , lwb , upb , -, abs , arg , bin , entier , leng , level , impar , repr , round , acortar | ¬, ↑, ↓, ⌊, ⌈ | norma , rastro , t , det , inv | lws , ups , ⎩, ⎧, btb , ctb |
prio ridad (Terciario) | Algol68 "Personajes dignos" r0 y r1 | + Algol68 r0 y r1 | + Algol68 C, G | + Algol68 r0 |
---|---|---|---|---|
9 | + *, yo | + ×, ⊥ | ! | |
8 | shl , shr , **, arriba , abajo , lwb , upb | ↑, ↓, ⌊, ⌈ | × × , ^, lws , ups , ⎩, ⎧ | |
7 | *, /,%, over ,% *, mod , elem | ×, ÷, ÷ ×, ÷ *,% ×, □ | ÷: | |
6 | -, + | |||
5 | <, lt , <=, le ,> =, ge ,>, gt | ≤, ≥ | ||
4 | eq =, ne ~ = / = | ≠, ¬ = | ||
3 | &, y | ∧ | / \ | |
2 | o | ∨ | \ / | |
1 | minusab , plusab , timesab , divab , sobreab , modab , plusto , -: =, +: =, *: =, /: =,%: =,% *: =, + =: | ×: =, ÷: =, ÷ ×: =, ÷ *: =,% ×: = | menos , más , div , overb , modb , ÷ :: =, prus |
Detalles específicos:
Técnicamente, estos no son operadores, sino que se consideran " unidades asociadas con nombres ".
prio ridad (Cuaternarios) | Algol68 "Personajes dignos" r0 y r1 | + Algol68 r0 y r1 | + Algol68 C, G, R | + Algol68 r0 |
---|---|---|---|---|
Efectivamente 0 | : =, es : = :, no : / =:: ~ = :, en @, ":", ";" | : ≠:: ¬ =: | : =: = C , =: = R | .. = ,. =, ct , ::, ctab , :: =, .., no es , "..", ".," |
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 ip
y jp
, en lugar de lo que apuntan . Para lograr el efecto correcto, habría que escribir
ip :=: ref int(jp)
ip :=: ref int(nil)
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 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 newpage
y newline
pasados como argumentos.
Se considera que la transmisión es de libros , canales y archivos :
match
.establish, create, open, associate, lock, close, scratch
.char number, line number, page number
.space
, backspace
, newline
, newpage
.get good line, get good page, get good book
, y proc set=(ref file f, int page,line,char)void:
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" 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))
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)
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
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]
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:
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 :
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".
Representación | Código |
---|---|
Algol68 "estricto" como se publica normalmente | ¢ subrayado o tipografía en negrita ¢ modo xint = int ; xint sum sq: = 0; para i , mientras suma cuadrada ≠ 70 × 70 hacer suma sq +: = i ↑ 2 sobredosis |
Quote stropping (como wikitexto ) | 'pr' cita 'pr'
'modo' 'xint' = 'int';
suma 'xint' sq: = 0;
'por' yo 'mientras' suma cuadrada ≠ 70 × 70
'hacer' suma sq +: = i ↑ 2
'sobredosis' |
Para un compilador de código de caracteres de 7 bits | .PR SUPERIOR .PR
MODO XINT = INT;
XINT suma cuadrada: = 0;
POR MI MIENTRAS suma sq / = 70 * 70
HACER suma sq +: = i ** 2
sobredosis |
Para un compilador de código de caracteres de 6 bits | .PR PUNTO .PR
.MODO .XINT = .INT;
.XINT SUM SQ: = 0;
.PARA YO .Mientras SUMA CUADRADA NE 70 * 70
.HACER SUM SQ .PLUSAB I .UP 2
.SOBREDOSIS |
Algol68 usando res stropping (palabra reservada) | .PR RES .PR
modo .xint = int;
.xint sum sq: = 0;
por mi tiempo suma cuadrada ≠ 70 × 70
hacer suma sq +: = i ↑ 2
sobredosis |
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 выб ~ в ~ либо ~ быв .
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) modo ℵ simplout = 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) modo ℵ simplin = unión (≮ ref ℒ int ≯, ≮ ref ℒ real ≯, ≮ ref ℒ compl ≯, ref bool , ≮ ref ℒ bits ≯, ref char , ref [] char , ref string ); d) modo ℵ intype = ¢ ... ¢; §10.3.2.3. Alisado a) op ℵ straightout = ( outtype x) [] simplout : ¢ el resultado de "enderezar" 'x' ¢; b) op ℵ straightin = ( intype x) [] simplin : ¢ el resultado de enderezar 'x' ¢;
Excepto donde se indique (con un superíndice ), el lenguaje descrito anteriormente es el del "Informe revisado (r1) ".
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.
Después de la revisión del informe, se han propuesto algunas extensiones del lenguaje para ampliar la aplicabilidad:
ENVIRON
y USING
de ALGOL 68C [56]Hasta ahora, solo se ha implementado una parametrización parcial, en Algol 68 Genie.
Nombre | Año | Objetivo | Estado | Descripción | CPU de destino | Licencia | Lenguaje de implementación |
---|---|---|---|---|---|---|---|
ALGOL generalizado | 1962 | Científico | NL | ALGOL para gramáticas generalizadas | |||
ALGOL Y Y | 1966 | Propuesta de borrador | Intl | Primera versión de Algol 68 | Especificación | ACM | |
ALGOL 68 DR | 1968 | Propuesta de borrador | Intl | Informe preliminar del IFIP WG 2.1 | Especificación - marzo | ACM | |
ALGOL 68 r0 | 1968 | Estándar | Intl | Informe final del IFIP WG 2.1 | Especificación - agosto | ACM | |
ALGOL 68-R R | 1970 | Militar | Reino Unido | ICL 1900 | ALGOL 60 | ||
EPOS ALGOL E | 1971 | Científico | |||||
ALGOL 68RS RS | 1972 | Militar | Reino Unido | Sistema compilador portátil | ICL 2900 / Serie 39, Multics, VMS & C generador (1993) | Copyright de la corona | ALGOL 68RS |
Algol 68 con áreas | 1972 | Experimental y otros | Reino Unido | Adición de áreas a Algol 68 | |||
Mini ALGOL 68 | 1973 | Investigar | NL | "Un intérprete para programas simples Algol 68" | Intérprete portátil | Mathematisch Centrum | ALGOL 60 |
ORÉGANO | 1973 | Investigar | nosotros | "La importancia de los modelos de implementación". | UCLA | ||
ALGOL 68C C | 1975 | Científico | Reino Unido | Cambridge Algol 68 | ICL , IBM 360, PDP 10 y Unix, Telefunken , Tesla y Z80 (1980) [57] | Cambridge | ALGOL 68C |
Informe revisado ALGOL 68 r1 | 1975 | Estándar | Intl | Informe revisado del IFIP WG 2.1 | Especificación | ACM | |
Algol H H | 1975 | Experimental y otros | Reino Unido | Extensiones propuestas al sistema de modo de Algol 68 | Especificación | ALGOL W | |
Odra Algol 68 | 1976 | usos prácticos | URSS / Polonia | Odra 1204 / IL | Soviético | ALGOL 60 | |
Oklahoma ALGOL 68 | 1976 | instrucción de programación | Estados Unidos | Implementación de la Universidad Estatal de Oklahoma [58] | IBM 1130 y el Sistema / 370 /158 | Desconocido | ANSI Fortran 66 . |
Berlín ALGOL 68 | 1977 | Investigar | Delaware | "La implementación de ALGOL 68 en Berlín" & [59] | Una máquina ALGOL 68 abstracta: compilador independiente de la máquina | Universidad técnica de berlín | CDL 2 |
FLACC F | 1977 | De múltiples fines | California | Implementación completa del informe revisado con funciones de depuración | Sistema / 370 | arrendamiento, Chion Corporation | Ensamblador |
ALGOL 68-RT RT | 1979 | Científico | Reino Unido | Paralelo ALGOL 68-R | |||
RS Algol rs | 1979 | Científico | Reino Unido | ||||
ALGOL 68+ | 1980 | Científico | NL | Superlenguaje propuesto de ALGOL 68 [60] | |||
M-220 ALGOL 68 | URSS | M-220 | Soviético | EPSILON | |||
Leningrado ALGOL 68 L | 1980 | Telecomunicaciones | URSS | Idiomas completos + módulos | IBM, DEC, CAMCOH, PS 1001 y PC | Soviético | |
Interactivo ALGOL 68 I | 1983 | Reino Unido | Compilación incremental | ordenador personal | No comercial shareware | ||
ALGOL 68S S | 1985 | Científico | Intl | Versión Sun de ALGOL 68 | Sun-3 , Sun SPARC (bajo SunOS 4.1 y Solaris 2), Atari ST (bajo GEMDOS ), Acorn Archimedes (bajo RISC OS ), VAX-11 bajo Ultrix-32 | ||
Algol68toC [61] (ctrans) | 1985 | Electrónica | Reino Unido | ctrans de ELLA ALGOL 68RS | Generador C portátil | Software de código abierto 1995 | ALGOL 68RS |
MK2 Interactivo ALGOL 68 | 1992 | Reino Unido | Compilación incremental | ordenador personal | Shareware no comercial [62] | ||
Algol 68 Genie G | 2001 | Idioma completo | NL | Incluye cláusula de garantía estándar | Intérprete portátil | GPL | C |
Algol 68 Genie versión 2.0.0 | 2010 | Idioma completo | NL | Intérprete portátil; compilación opcional de unidades seleccionadas | GPL | C |
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.
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]
|
|
|
|journal=
( ayuda )