Clu | |
---|---|
Nyelvóra | Objektumorientált , procedurális |
A végrehajtás típusa | Összeállított |
Megjelent | 1974 |
Szerző | Liskov Barbara |
Fejlesztő | Barbara Liskov és az MIT |
Fájlkiterjesztés _ | .clu |
Típusrendszer |
Szigorú , statikus |
Főbb megvalósítások | Hordozható Clu, NativeCLU, Klu-Elbrus, clu2c |
Befolyásolt | Simula , Lisp , Pascal |
befolyásolta | Ada , C++ , Java , Sather , Lua |
Weboldal | pmg.lcs.mit.edu/CLU.html |
A Clu ( angolul Clu , CLU ) egy objektum-orientált programozási nyelv , amely az elsők között valósította meg az absztrakt adattípusok koncepcióját és az általános programozási paradigmát . A Massachusettsi Műszaki Egyetem tudóscsoportja alkotta meg 1974 -ben Barbara Liskov vezetésével , de a gyakorlatban nem talált széles körű alkalmazást, azonban számos elemét felhasználták olyan nyelvek létrehozására, mint az Ada , C++ , Java , Sather , Python , C# .
1973 tavaszán Barbara Liskov és az IBM kutatólaboratóriumának munkatársa, Steve Zilles megkezdte a szisztematikus munkát egy olyan programozási nyelv létrehozásán, amely szintaktikai szinten valósítja meg az adatabsztrakció gondolatait . 1973 szeptemberében jelent meg közös jegyzetük [1] , amely egy ilyen Pascal-szerű nyelv előzetes változatát írja le , benne van a leendő nyelv olyan jellegzetessége, mint a klaszterek ; e jegyzet alapján 1974 - ben jelentés készült a SIGPLAN konferencián a szuper-magas szintű nyelvekről [2] . 1973 végén Liskov és Zilles már döntött a leendő nyelv nevéről: a „Clu” nevet az angol szócsoport [3] első három betűjéből választották . Austin Henderson ellenfélként vett részt .
1973 decemberében a Massachusetts Institute of Technology számítástechnikai laboratóriumában a National Science Foundation és a DARPA támogatásával megkezdődött a nyelv létrehozása, Liskov vezette a csoportot, Zilles kezdetben aktívan dolgozott a nyelven. szakaszában három végzős hallgató dolgozott folyamatosan a csoportban - Russ Atkinson ( Russ Atkinson ), Craig Shaffert ( Craig Schaffert ) és Alan Snyder ( Alan Snyder ), az intézet hallgatóit és alkalmazottait is időszakosan kapcsolták a munkához. Minden munka PDP-10 gépeken történt .
Liskov a nyelv 7 alapelvét azonosította: szigorú összpontosítás az adatok absztrakciójára (az adatabsztrakcióhoz közvetlenül nem kapcsolódó jellemzők mélyreható tanulmányozásának elutasítása), minimalizmus, egyszerűség, az eszközök kifejezőkészsége, egységesítés (a beépített típusok nem különbözhetnek a programozóitól). meghatározott típusok), biztonság és nagy teljesítmény [4] . Ezen elveknek megfelelően a megvalósítás során olyan megoldásokat választanak, mint a felsorolt típusok elutasítása , párhuzamos hozzárendelés , statikus gépelés , fordítási idejű típusellenőrzés, futásidejű szemétgyűjtés . 1974 - ben implementálták a nyelv első fordítóját, amely Lisp nyelvű kódot adott ki, később a fordítót átírták, hogy a Lisp dialektusú MDL programokat generáljon , amelyek gazdagabb beépített adatstruktúrákkal és típusellenőrzéssel rendelkeztek. összeállítási szakaszban. A nyelv első implementációja 1974-ben a CLU .5 nevet kapta , támogatta az alapvető adatabsztrakciós konstrukciókat, de kivételkezelést és iterátort még nem valósított meg, a paraméterezett típusok megvalósítása pedig dinamikus típusellenőrzést igényelt a futásidő. 1975-ben a kivételkezelő mechanizmust alapvetően megtervezték.
1976-ra a nyelv összes kulcsfontosságú eleme megvalósult, 1977-ben megírták az első fordítót, amely az assemblerben generált kódot . Magán a Clu nyelven készült a fordítóprogram, amely a nyelv eszközeinek kifejezőképességét hivatott demonstrálni. A nagy teljesítményű programokat generáló fordító felépítéséhez egy speciális futási környezet létrehozására volt szükség, amely szemétgyűjtést, hibakeresést, speciális kivételkezelési technikákat és iterátor támogatást valósított meg. 1979-ben elkészült a nyelv tervezése [5] , 1980 -ban megjelent egy teljes értékű fordító a PDP-10-hez, az MC68000 és a VAX fordítói pedig valamivel később kerültek bevezetésre . A nyelv létrehozásának munkaerőköltségét 14 emberévre becsülik [6] .
Az 1980-as évek közepén a Klu fordítót a szovjet Elbrus szuperszámítógépekhez vezették be, a nyelvet a többi jelölt közül ( Ady , Moduly-2 , Simula ) választották ki, mint a legholisztikusabban megtestesítő az absztrakt adattípusok fogalmát, miközben meglehetősen egyszerű volt. végrehajtani [7] . 1989-ben megjelent egy fordító a SPARC számára, amely SunOS -t futtatott .
Az 1990-es évek elején-közepén létrehozták a clu2c fordítót, amely platformok közötti C kódot , valamint a Portable Clu több verzióját generálta Linuxra , NetBSD -re , Mac OS -re , Windows NT -re , Digital Unixra ( Alpha -on ), de A nyelv iránti gyakorlati érdeklődés jelentősen csökkent, és az 1990-es évek vége óta ténylegesen nem fejlesztettek ki implementációkat, és nem fejlesztettek ki új szoftvert a Klu-n.
Barbara Liskov elnyerte a 2008-as Turing-díjat a Clu nyelv megtervezéséért és a hozzá tartozó hatékony fordítóprogramok sorozatának létrehozásáért, amely alapvető hozzájárulása a számítástechnikához, bizonyítja az adatabsztrakciós ötletek gyakorlati megvalósíthatóságát, és egy elméleti koncepciót a programozási ágazatban általánosan elismert megközelítés [8] .
Egy absztrakt adattípust a Klu-ban a fürt koncepciója valósít meg, egy olyan konstrukció, amely beágyazást biztosít a rajta végzett műveletek típusán belül, és polimorfizmust biztosít (a klaszter adattípusok széles osztályát írja le közös specifikációval - ugyanazzal a készlettel műveletek, de eltérő megvalósítás).
Egy polimorf lista klaszterének leírásának kezdeti töredéke (műveletekkel Lisp jelöléssel):
list = cluster [t: type] is create, car, cdr, cons, elems rep = array [t] create = proc () return ( cvt ) % listakészítés return ( rep $new ()) end create ; car = proc ( l:cvt ) return ( t ) jelek ( üres ) % megkapja a lista első elemét if rep$empty ( l ) then sign empty else return ( rep$bottom ( l )) end end car ; % egyéb műveletek véglista _A fürtdefiníció megadja a specifikációt – a típuson végrehajtott műveletek halmazát, meghatározza a belső reprezentációt ( rep), és leírja a műveletek megvalósítását. Olyan szerkezeteket használnak, mint a típuskonverzió belsőről objektumreprezentációra és fordítva ( cvt), $-jelölés a típusműveletek eléréséhez. A fürt megvalósításának és példányának létrehozása egy adott típus megadásával valósul meg:
lint = lista [int] ; % egész számok listája l:lint := lint$create () ; % példányosítja a listát l := lint$cons ( 1 , lint$cons ( 2 , lint$cons ( 3 , l ) ))) % összeállítja a listátA beépített típusokat klaszterként is megvalósítják [9] . A programkódban definiált klaszterekkel ellentétben az alapvető beépített Clu adattípusokon ( int, real, bool, null, char, string) egyetlen művelet sem módosíthatja az objektum szerkezetét és értékét (minden alkalommal, amikor az objektum új példánya jön létre a megfelelő állapottal rögzített). De az egységesítés érdekében a beépített típusok műveleteihez fürtjelöléssel lehet hozzáférni: int$add(n1,n2)hozzáadja n1a -t n2, string$fetch(s,i)hozzáférést biztosít a ikarakterlánc -edik karakteréhez , sés string$concat(s1,s2) összefűzi a karakterláncokat , s1és s2ezen túlmenően egy szintaktikai cukrot valósítanak meg, amely az ilyen műveletek rövidített jelölése: a fejlesztő által meghatározott klaszterekben bevezetett azonos nevű műveletek ( , , ).n1+n2s[i]s1||s2addfetchconcat
Polimorf klaszterekként beépített kompozit típusokat valósítanak meg, amelyeket Klu-ban "típusgenerátoroknak" neveznek - tömbök , sorozatok , rekordok , struktúrák (konstans rekordok), uniók , változatok [10] .
A nyelv egyik legfontosabb újítása a vezérlőabsztrakció – egy iterátor – bevezetése volt . Az iterátor ötlete az, hogy egy absztrakt adattípus elemeihez való hozzáférés általános megvalósítását biztosítsa, függetlenül annak paraméterezésétől és belső struktúrájától. Példa egy polimorf lista iterátorra:
elems = iter ( l:cvt ) hozamok ( t ) elt:t esetén rep $elemekben ( l ) do hozam ( elt ) end end elemsEgy iterátor meghívása így:
mert i:int in lint$elems ( l ) do writeint ( i ) endAz iterátor használata kiküszöböli az explicit hurokszámlálók használatát olyan körülmények között, amikor az adattípus konkrét megvalósítása nem ismert előre.
A korutin iterátor ötletét ezt követően az Icon , Sather , Python , Ruby , C# (a 2.0 verzió óta ) kölcsönözték [11] .
A Klu strukturális kivételkezelést valósít meg, a kivételeket a nyelvben statikusra és dinamikusra osztják, az előbbiek egy blokk végrehajtásának befejezésére szolgálnak egyetlen programblokkon belül (az operátor hívja meg exit s(x1, …, xn)), az utóbbiak a programvégrehajtást fejezik be (a operátor signal s(x1, …, xn)). A kivételt mindkét esetben a kulcsszóval kezdődő programblokk kezeli except, ha az aktuális blokkban nem kezelünk statikus kivételt, akkor az átkerül a következőre; a programban nem kezelt kivételek megfelelő üzenetek kiadásával megszakítják annak végrehajtását. A kivételek, amelyeket egy eljárás dobhat, a specifikációjában vannak megadva, a kivételek alternatív kilépésnek minősülnek az eljárásból, vagyis az eljárásnak a specifikációban deklarált értéket kell átadnia a kimenetnek az operátor segítségével return, vagy ki kell adnia valamelyik kivételt a specifikációban deklaráltan a signalvagy operátorok használatával resignal(a blokkban meghívva excepta kivételt okozó megismétlésére) a megfelelő paraméterekkel. A beépített típusok szabványos kivételeket valósítanak meg.
A kivételmechanizmus tervezésekor a megoldásokat a PL/1 -től és a Mesa -tól kölcsönözték , de a bennük használt kivétel-újraindítási modell jelentősen leegyszerűsödött és strukturált [12] , és fontos újítássá vált a kivételparaméterek átadásának lehetősége.