clu | |
---|---|
clase de idioma | Orientado a objetos , procedimental |
tipo de ejecución | compilado |
Apareció en | 1974 |
Autor | Bárbara Liskov |
Desarrollador | Bárbara Liskov y MIT |
extensión de archivo | .clu |
sistema de tipos |
estricto _ estático |
Implementaciones principales | Clu portátil, NativeCLU, Klu-Elbrus, clu2c |
sido influenciado | Simula , Lisp , Pascal |
influenciado | Ada , C++ , Java , Sather , Lua |
Sitio web | pmg.lcs.mit.edu/CLU.html |
Clu ( inglés Clu , CLU ) es un lenguaje de programación orientado a objetos , uno de los primeros en implementar el concepto de tipos de datos abstractos y el paradigma de programación genérico . Creado por un grupo de científicos del Instituto Tecnológico de Massachusetts bajo el liderazgo de Barbara Liskov en 1974, no ha encontrado una amplia aplicación en la práctica, sin embargo, muchos de sus elementos se han utilizado para crear lenguajes como Ada , C++ , Java , Sather , Python , C# .
El trabajo sistemático sobre la creación de un lenguaje de programación que implemente las ideas de abstracción de datos a nivel sintáctico comenzó en la primavera de 1973 por Barbara Liskov y un empleado del laboratorio de investigación de IBM , Steve Zilles . En septiembre de 1973, se publicó su nota conjunta [1] , que describe una versión preliminar de un lenguaje similar a Pascal , que incluye una característica tan distintiva del futuro lenguaje como los grupos ; En base a esta nota, se preparó un informe en la conferencia SIGPLAN sobre lenguajes de superalto nivel en 1974 [2] . A fines de 1973, Liskov y Zilles ya habían decidido el nombre del futuro idioma: el nombre "Clu" se eligió de las tres primeras letras del grupo de palabras en inglés [3] . Austin Henderson estuvo involucrado como oponente .
En diciembre de 1973, en el laboratorio de informática del Instituto Tecnológico de Massachusetts, con el apoyo de la Fundación Nacional de Ciencias y DARPA , se comenzó a trabajar en la creación de un lenguaje, Liskov dirigió el grupo, Zilles trabajó activamente en el lenguaje en los primeros etapas, tres estudiantes graduados trabajaron de manera continua en el grupo: Russ Atkinson ( Russ Atkinson ), Craig Shaffert ( Craig Schaffert ) y Alan Snyder ( Alan Snyder ), estudiantes y empleados del instituto también se conectaron periódicamente al trabajo. Todo el trabajo se realizó en máquinas PDP-10 .
Liskov identificó 7 principios clave del lenguaje: un enfoque estricto en la abstracción de datos (rechazo al estudio profundo de características que no están directamente relacionadas con la abstracción de datos), minimalismo, simplicidad, expresividad de los medios, unificación (los tipos incorporados no deben diferir de los del programador). tipos definidos), seguridad y alto rendimiento [4] . De acuerdo con estos principios, en la implementación se eligen soluciones tales como el rechazo de tipos enumerados , la asignación en paralelo , la tipificación estática , la verificación de tipos en tiempo de compilación y la recolección de elementos no utilizados en tiempo de ejecución . En 1974, se implementó el primer compilador del lenguaje, liberando código en Lisp, luego se reescribió el compilador para generar programas en el dialecto Lisp MDL , que tenía un conjunto más rico de estructuras de datos integradas y verificación de tipos en el etapa de compilación. La primera implementación del lenguaje en 1974 se llamó CLU .5 , admitía las construcciones básicas de abstracción de datos, pero aún no implementaba el manejo de excepciones ni los iteradores , y la implementación de tipos parametrizados requería una verificación dinámica de tipos en el tiempo de ejecución En 1975, se diseñó básicamente el mecanismo de manejo de excepciones.
Para 1976 se implementaron todos los elementos clave del lenguaje, en 1977 se escribió el primer compilador que generaba código en ensamblador . El compilador se creó en el propio lenguaje Clu, que se suponía que debía demostrar la expresividad de los medios del lenguaje. La creación de un compilador que generara programas de alto rendimiento requería la creación de un entorno de tiempo de ejecución especial que implementara la recolección de elementos no utilizados, la depuración, técnicas especiales de manejo de excepciones y compatibilidad con iteradores. En 1979, se completó el diseño del lenguaje [5] , en 1980 se lanzó un compilador completo para el PDP-10 y los compiladores para MC68000 y VAX se implementaron un poco más tarde . Los costos de mano de obra para la creación de la lengua se estiman en 14 años-hombre [6] .
A mediados de la década de 1980, se implementó el compilador Klu para las supercomputadoras soviéticas Elbrus , el lenguaje se seleccionó entre otros candidatos ( Ady , Moduly-2 , Simula ) como el que incorpora de manera más holística el concepto de tipos de datos abstractos, a la vez que es bastante simple de usar. implementar [7] . En 1989 se lanzó un compilador para SPARC con SunOS .
A principios y mediados de la década de 1990, se creó el compilador clu2c, que generó código C multiplataforma , así como varias versiones de Portable Clu con compilaciones para Linux , NetBSD , Mac OS , Windows NT , Digital Unix (en Alpha ), pero el interés práctico en el lenguaje disminuyó significativamente y, desde finales de la década de 1990, no se han desarrollado implementaciones y no se ha desarrollado nuevo software en Klu.
Barbara Liskov ganó el Premio Turing 2008 , en la nominación de diseñar el lenguaje Clu y crear una serie de compiladores eficientes para él, señalado como una contribución fundamental a la informática, demostrando la viabilidad práctica de las ideas de abstracción de datos y convirtiendo un concepto teórico en un enfoque generalmente reconocido en la industria de la programación [8] .
Un tipo de datos abstracto en Klu se implementa mediante el concepto de un clúster, una construcción que proporciona encapsulamiento dentro del tipo de operaciones en él y proporciona polimorfismo (un clúster puede describir una amplia clase de tipos de datos con una especificación común: el mismo conjunto de operaciones, pero diferente implementación).
El fragmento inicial de la descripción de un grupo de una lista polimórfica (con operaciones en notación Lisp):
list = cluster [t: type] is create, car, cdr, cons, elems rep = array [t] create = proc () return ( cvt ) % creación de lista return ( rep$new ()) end create ; car = proc ( l:cvt ) return ( t ) señales ( vacío ) % obtener el primer elemento de la lista if rep$empty ( l ) luego señalar vacío else return ( rep$bottom ( l )) end end car ; % lista final de otras operacionesLa definición de clúster especifica la especificación: un conjunto de operaciones en el tipo, define la representación interna ( rep) y describe la implementación de las operaciones. Se utilizan construcciones tales como la conversión de tipo de representación interna a de objeto y viceversa ( cvt), $notación - para acceder a operaciones de tipo. La creación de una implementación de clúster y su instancia se implementa especificando un tipo específico:
pelusa = lista [int] ; % lista de enteros l:lint := lint$create () ; % crea una instancia de la lista l := lint$cons ( 1 , lint$cons ( 2 , lint$cons ( 3 , l ))) % construye la listaLos tipos incorporados también se implementan como clústeres [9] . A diferencia de los clústeres definidos en el código del programa, ninguna operación en los tipos de datos integrados básicos de Clu ( int, real, bool, null, char, string) puede cambiar la estructura y el valor del objeto (cada vez que se crea una nueva instancia del objeto con el estado correspondiente fijado). Pero en la búsqueda de la unificación, el acceso a operaciones en tipos incorporados está disponible en notación de clúster: int$add(n1,n2)agrega n1con n2, string$fetch(s,i)proporciona acceso al icarácter -ésimo de la cadena y sconcatena string$concat(s1,s2) cadenas y s1, s2además, se implementa un azúcar sintáctico que proporciona una notación abreviada para tales operaciones: , , ) introducidas en grupos definidos por el desarrollador. n1+n2s[i]s1||s2addfetchconcat
Como grupos polimórficos, se implementan tipos compuestos incorporados, llamados "generadores de tipos" en Klu: arreglos , secuencias , registros , estructuras (registros constantes), uniones , variantes [10] .
Una de las innovaciones clave del lenguaje fue la introducción de una abstracción de control: un iterador . La idea de un iterador es proporcionar una implementación genérica de acceso a los elementos de un tipo de datos abstracto, independientemente de su parametrización y estructura interna. Un ejemplo de un iterador de lista polimórfica:
elems = iter ( l:cvt ) produce ( t ) para elt:t en rep$ elements ( l ) produce ( elt ) end end elemsLlamar a un iterador como este:
for i:int in lint$elems ( l ) do writeint ( i ) endEl uso de un iterador elimina el uso de contadores de bucle explícitos en condiciones en las que no se conoce de antemano la implementación específica del tipo de datos.
La idea de un iterador de rutina se tomó prestada posteriormente de Icon , Sather , Python , Ruby , C# (desde la versión 2.0 ) [11] .
Klu implementa el manejo de excepciones estructurales , las excepciones en el lenguaje se dividen en estáticas y dinámicas, las primeras se usan para completar la ejecución de un bloque dentro de un solo bloque de programa (llamadas por el operador exit s(x1, …, xn)), las últimas terminan la ejecución del programa (llamadas por el operador). operador signal s(x1, …, xn)). En ambos casos, la excepción es manejada por un bloque de programa que comienza con la palabra clave except, si una excepción estática no se maneja en el bloque actual, entonces se pasa al siguiente; las excepciones no manejadas en el programa interrumpen su ejecución con la emisión de los mensajes apropiados. Las excepciones que puede lanzar un procedimiento se especifican en su especificación, las excepciones se consideran como una salida alternativa del procedimiento, es decir, el procedimiento debe pasar el valor declarado en la especificación a la salida usando el operador return, o emitir una de las excepciones declarado en la especificación usando los operadores signalo resignal(llamados en el bloque exceptpara repetir el que causó la excepción) con los parámetros apropiados. Los tipos integrados implementan excepciones estándar.
Al diseñar el mecanismo de excepción, se tomaron prestadas las soluciones de PL/1 y Mesa , pero el modelo de reanudación de excepción utilizado en ellos se ha simplificado y estructurado significativamente [12] , y la capacidad de pasar parámetros de excepción se ha convertido en una innovación importante.