Clu | |
---|---|
Jazyková třída | Objektově orientované , procedurální |
Typ provedení | Sestaven |
Objevil se v | 1974 |
Autor | Barbarou Liškovou |
Vývojář | Barbara Liskov a MIT |
Přípona souboru | .clu |
Typový systém |
přísný , statický |
Hlavní implementace | Přenosné Clu, NativeCLU, Klu-Elbrus, clu2c |
Byl ovlivněn | Simula , Lisp , Pascal |
ovlivnil | Ada , C++ , Java , Sather , Lua |
webová stránka | pmg.lcs.mit.edu/CLU.html |
Clu ( anglicky Clu , CLU ) je objektově orientovaný programovací jazyk , jeden z prvních, který implementuje koncept abstraktních datových typů a generické programovací paradigma . Vytvořen skupinou vědců na Massachusetts Institute of Technology pod vedením Barbary Liskov v roce 1974, nenašel široké uplatnění v praxi, nicméně mnoho z jeho prvků bylo použito k vytvoření jazyků jako Ada , C++ , Java , Sather , Python , C# .
Systematické práce na vytvoření programovacího jazyka, který implementuje myšlenky abstrakce dat na syntaktické úrovni, zahájili na jaře roku 1973 Barbara Liskov a zaměstnanec výzkumné laboratoře IBM Steve Zilles . V září 1973 byla zveřejněna jejich společná poznámka [1] , která popisuje předběžnou verzi takového jazyka podobného Pascalu , obsahuje tak výrazný rys budoucího jazyka, jako jsou shluky ; na základě této poznámky byla v roce 1974 připravena zpráva na konferenci SIGPLAN o super-vysokých jazycích [2] . Koncem roku 1973 se již Liskov a Zilles rozhodli pro název budoucího jazyka: jméno „Clu“ bylo vybráno z prvních tří písmen anglického shluku slov [3] . Austin Henderson byl zapojen jako oponent .
V prosinci 1973 začaly v počítačové laboratoři Massachusetts Institute of Technology, s podporou National Science Foundation a DARPA , práce na vytvoření jazyka, skupinu vedl Liskov, Zilles na jazyku zpočátku aktivně pracoval. etapy ve skupině průběžně pracovali tři postgraduální studenti - Russ Atkinson ( Russ Atkinson ), Craig Shaffert ( Craig Schaffert ) a Alan Snyder ( Alan Snyder ), k dílu byli periodicky připojeni i studenti a zaměstnanci ústavu. Veškeré práce byly prováděny na strojích PDP-10 .
Liskov identifikoval 7 klíčových principů jazyka: přísné zaměření na abstrakci dat (odmítání hlubokého studia vlastností, které s abstrakcí dat přímo nesouvisejí), minimalismus, jednoduchost, expresivita prostředků, unifikace (vestavěné typy by se neměly lišit od programátorských). definované typy), bezpečnost a vysoký výkon [4] . V souladu s těmito principy jsou v implementaci zvolena taková řešení, jako je odmítnutí výčtových typů , paralelní přiřazení , statické typování , kontrola typu v době kompilace, run-time garbage collection . V roce 1974 byl implementován první kompilátor jazyka, který uvolnil kód v Lisp, později byl překladač přepsán tak, aby generoval programy v Lisp dialektu MDL , který měl bohatší sadu vestavěných datových struktur a kontrolu typu na fáze kompilace. První implementace jazyka v roce 1974 se jmenovala CLU .5 , podporovala základní konstrukce abstrakce dat, ale ještě neimplementovala zpracování výjimek a iterátory a implementace parametrizovaných typů vyžadovala dynamickou kontrolu typů v runtime. V roce 1975 byl v podstatě navržen mechanismus zpracování výjimek.
V roce 1976 byly implementovány všechny klíčové prvky jazyka, v roce 1977 byl napsán první kompilátor, který generoval kód v assembleru . Překladač byl vytvořen v samotném jazyce Clu, což mělo demonstrovat expresivitu prostředků jazyka. Vytvoření kompilátoru, který generuje vysoce výkonné programy, vyžadovalo vytvoření speciálního běhového prostředí, které implementovalo garbage collection, ladění, speciální techniky zpracování výjimek a podporu iterátorů. V roce 1979 byl dokončen návrh jazyka [5] , v roce 1980 vyšel plnohodnotný kompilátor pro PDP-10 a o něco později byly implementovány kompilátory pro MC68000 a VAX . Mzdové náklady na vytvoření jazyka se odhadují na 14 člověkoroků [6] .
V polovině 80. let byl implementován kompilátor Klu pro sovětské superpočítače Elbrus , jazyk byl vybrán mezi dalšími kandidáty ( Ady , Moduly-2 , Simula ) jako nejholističtější ztělesnění konceptu abstraktních datových typů, přičemž je poměrně jednoduchý na implementovat [7] . V roce 1989 byl vydán kompilátor pro SPARC se systémem SunOS .
Na začátku poloviny 90. let byl vytvořen kompilátor clu2c, který generoval multiplatformní kód C a také několik verzí Portable Clu se sestaveními pro Linux , NetBSD , Mac OS , Windows NT , Digital Unix (na Alpha ), ale praktický zájem o jazyk výrazně poklesl a od konce 90. let se implementace ve skutečnosti nevyvíjely a nový software na Klu nebyl vyvinut.
Barbara Liskov vyhrála v roce 2008 Turingovu cenu v nominaci za návrh jazyka Clu a vytvoření řady účinných kompilátorů pro něj, což je považováno za zásadní přínos pro informatiku, který prokázal praktickou proveditelnost myšlenek abstrakce dat a přeměnil teoretický koncept na obecně uznávaný přístup v programovém průmyslu [8] .
Abstraktní datový typ v Klu je implementován konceptem clusteru, konstrukce, která poskytuje zapouzdření v rámci typu operací na něm a poskytuje polymorfismus (klastr může popisovat širokou třídu datových typů se společnou specifikací - stejnou sadu operace, ale jiná implementace).
Počáteční fragment popisu shluku polymorfního seznamu (s operacemi v notaci Lisp):
seznam = cluster [t: typ] is create, car, cdr, cons, elems rep = array [t] create = proc () return ( cvt ) % vytvoření seznamu return ( rep$new ()) end create ; car = proc ( l:cvt ) return ( t ) signals ( empty ) % získat první prvek seznamu if rep$empty ( l ) then signal empty else return ( rep$bottom ( l )) end end car ; % seznam konce ostatních operacíDefinice clusteru specifikuje specifikaci — sadu operací na typu, definuje vnitřní reprezentaci ( rep) a popisuje implementaci operací. Používají se konstrukce jako převod typu z interní na objektovou reprezentaci a naopak ( cvt), $-notation pro přístup k typovým operacím. Vytvoření implementace clusteru a jeho instance se provádí zadáním konkrétního typu:
lint = seznam [int] ; % seznam celých čísel l:lint := lint$create () ; % vytvořit instanci seznamu l := lint$cons ( 1 , lint$cons ( 2 , lint$cons ( 3 , l ))) % vytvořit seznamVestavěné typy jsou také implementovány jako clustery [9] . Na rozdíl od clusterů definovaných v kódu programu nemůže žádná operace se základními vestavěnými datovými typy Clu ( int, real, bool, null, char, string) změnit strukturu a hodnotu objektu (pokaždé, když je vytvořena nová instance objektu s odpovídajícím stavem pevný). Ale ve snaze o sjednocení je přístup k operacím na vestavěných typech dostupný v clusterové notaci: int$add(n1,n2)přidává n1s n2, string$fetch(s,i)poskytuje přístup k i--tému znaku řetězce a szřetězuje string$concat(s1,s2) řetězce a s1navíc s2je implementován syntaktický cukr , který poskytuje zkrácený zápis pro takové operace: , , ) zavedené v clusterech definovaných vývojářem. n1+n2s[i]s1||s2addfetchconcat
Jako polymorfní shluky jsou implementovány vestavěné kompozitní typy, nazývané "generátory typů" v Klu - pole , sekvence , záznamy , struktury (konstantní záznamy), svazy , varianty [10] .
Jednou z klíčových inovací jazyka bylo zavedení abstrakce řízení - iterátoru . Myšlenkou iterátoru je poskytnout obecnou implementaci přístupu k prvkům abstraktního datového typu, bez ohledu na jeho parametrizaci a vnitřní strukturu. Příklad iterátoru polymorfního seznamu:
elems = iter ( l:cvt ) yields ( t ) for elt:t in rep$elements ( l ) do yield ( elt ) end end elemsVolání iterátoru takto:
for i:int in lint$elems ( l ) do writeint ( i ) endPoužití iterátoru eliminuje použití explicitních čítačů smyček v podmínkách, kdy konkrétní implementace datového typu není předem známa.
Myšlenka koroutinového iterátoru byla následně vypůjčena z Icon , Sather , Python , Ruby , C# (od verze 2.0 ) [11] .
Klu implementuje strukturální zpracování výjimek , výjimky v jazyce jsou rozděleny na statické a dynamické, první slouží k dokončení provádění bloku v rámci jednoho programového bloku (volané operátorem exit s(x1, …, xn)), druhé ukončují provádění programu (volané operátor signal s(x1, …, xn)). V obou případech je výjimka zpracována programovým blokem začínajícím klíčovým slovem except, pokud statická výjimka není zpracována v aktuálním bloku, pak je předána následujícímu; výjimky nezpracované v programu přeruší jeho provádění vydáním příslušných zpráv. Výjimky, které může procedura vyvolat, jsou uvedeny v její specifikaci, výjimky jsou považovány za alternativní ukončení procedury, to znamená, že procedura musí předat hodnotu deklarovanou ve specifikaci na výstup pomocí operátoru return, nebo vydat jednu z výjimek deklarované ve specifikaci pomocí operátorů signalnebo resignal(volaných v bloku exceptpro opakování toho, který způsobil výjimku) s příslušnými parametry. Vestavěné typy implementují standardní výjimky.
Při návrhu mechanismu výjimek byla řešení vypůjčena od PL/1 a Mesa , ale v nich použitý model obnovení výjimek byl výrazně zjednodušen a strukturován [12] a důležitou novinkou se stala schopnost předávat parametry výjimek.