Clu | |
---|---|
Kieliluokka | Oliosuuntautunut , menettelyllinen |
Toteutustyyppi | Käännetty |
Esiintyi | 1974 |
Tekijä | Barbara Liskov |
Kehittäjä | Barbara Liskov ja MIT |
Tiedostotunniste _ | .clu |
Tyyppijärjestelmä |
tiukka , staattinen |
Tärkeimmät toteutukset | Kannettava Clu, NativeCLU, Klu-Elbrus, clu2c |
Vaikutettu | Simula , Lisp , Pascal |
vaikutti | Ada , C++ , Java , Sather , Lua |
Verkkosivusto | pmg.lcs.mit.edu/CLU.html |
Clu ( englanniksi Clu , CLU ) on olio-ohjelmointikieli , yksi ensimmäisistä, jotka ottivat käyttöön abstraktien tietotyyppien ja yleisen ohjelmointiparadigman . Sen loi Massachusetts Institute of Technologyn tutkijaryhmä Barbara Liskovin johdolla vuonna 1974, mutta se ei ole löytänyt laajaa käyttöä käytännössä, mutta monia sen elementtejä on käytetty luomaan kieliä, kuten Ada , C++ , Java , Sather , Python , C# .
Barbara Liskov ja IBM :n tutkimuslaboratorion työntekijä Steve Zilles aloittivat keväällä 1973 systemaattisen työskentelyn sellaisen ohjelmointikielen luomiseksi, joka toteuttaa ajatuksia datan abstraktiosta syntaktisella tasolla . Syyskuussa 1973 julkaistiin heidän yhteinen muistiinpanonsa [1] , jossa kuvataan alustava versio sellaisesta Pascalin kaltaisesta kielestä, joka sisältää sellaisen tulevan kielen erityispiirteen kuin klusterit ; tämän muistiinpanon perusteella laadittiin raportti SIGPLAN [ -konferenssissa huippukorkeatasoisista kielistä vuonna 1974 [2] . Vuoden 1973 loppuun mennessä Liskov ja Zilles olivat jo päättäneet tulevan kielen nimestä: nimi "Clu" valittiin englannin sanaklusterin kolmesta ensimmäisestä kirjaimesta [ 3] . Austin Henderson oli mukana vastustajana .
Joulukuussa 1973 Massachusetts Institute of Technologyn tietojenkäsittelytieteen laboratoriossa National Science Foundationin ja DARPA :n tuella aloitettiin työ kielen luomiseksi, Liskov johti ryhmää, Zilles työskenteli aktiivisesti kielen parissa alussa. vaiheissa ryhmässä työskenteli jatkuvasti kolme jatko-opiskelijaa - Russ Atkinson ( Russ Atkinson ), Craig Shaffert ( Craig Schaffert ) ja Alan Snyder ( Alan Snyder ), myös instituutin opiskelijat ja työntekijät olivat ajoittain yhteydessä työhön. Kaikki työt tehtiin PDP-10- koneilla .
Liskov tunnisti kielen 7 keskeistä periaatetta: tiukka keskittyminen datan abstraktioon (kieltäytyminen sellaisten ominaisuuksien syvällisestä tutkimisesta, jotka eivät suoraan liity tiedon abstraktiin), minimalismi, yksinkertaisuus, keinojen ilmaisu, yhtenäisyys (sisäänrakennetut tyypit eivät saa poiketa ohjelmoijasta). määritellyt tyypit), turvallisuus ja korkea suorituskyky [4] . Näiden periaatteiden mukaisesti toteutuksessa valitaan sellaisia ratkaisuja kuin lueteltujen tyyppien hylkääminen , rinnakkaismääritys , staattinen kirjoittaminen , käännösaikainen tyyppitarkistus, ajonaikainen roskienkeruu . Vuonna 1974 otettiin käyttöön ensimmäinen kielen kääntäjä, joka julkaisi koodin Lisp-kielellä, myöhemmin kääntäjä kirjoitettiin uudelleen luomaan ohjelmia Lisp-murteella MDL , jossa oli rikkaampi joukko sisäänrakennettuja tietorakenteita ja tyyppitarkistus. kokoamisvaihe. Kielen ensimmäinen toteutus vuonna 1974 oli nimeltään CLU .5 , se tuki perustiedon abstraktiokonstruktioita, mutta ei vielä ottanut käyttöön poikkeuskäsittelyä ja iteraattoreita , ja parametroitujen tyyppien käyttöönotto vaati dynaamista tyyppitarkistusta kielessä. suoritusaika. Vuonna 1975 poikkeuksien käsittelymekanismi suunniteltiin pohjimmiltaan.
Vuoteen 1976 mennessä kaikki kielen keskeiset elementit otettiin käyttöön, vuonna 1977 kirjoitettiin ensimmäinen kääntäjä, joka loi koodin assemblerissä . Kääntäjä luotiin itse Clu-kielellä, jonka oli tarkoitus osoittaa kielen keinojen ilmaisukyky. Suorituskykyisiä ohjelmia tuottavan kääntäjän rakentaminen vaati erityisen ajonaikaisen ympäristön luomista, joka toteutti roskien keräämisen, virheenkorjauksen, erityiset poikkeusten käsittelytekniikat ja iteraattorituen. Vuonna 1979 kielen suunnittelu valmistui [5] , vuonna 1980 julkaistiin täysimittainen kääntäjä PDP-10:lle ja kääntäjät MC68000 :lle ja VAX :lle otettiin käyttöön hieman myöhemmin . Kielen luomisen työvoimakustannuksiksi on arvioitu 14 henkilötyövuotta [6] .
1980-luvun puolivälissä Klu-kääntäjä otettiin käyttöön Neuvostoliiton Elbrus -supertietokoneille , kieli valittiin muiden ehdokkaiden ( Ady , Moduly-2 , Simula ) joukosta kokonaisvaltaisimmaksi abstraktien tietotyyppien käsitettä ilmentäväksi, mutta melko yksinkertaiseksi. toteuttaa [7] . Vuonna 1989 SPARCille julkaistiin kääntäjä, jossa oli SunOS .
1990-luvun alussa - puolivälissä luotiin clu2c-kääntäjä, joka tuotti eri alustojen välistä C -koodia sekä useita Portable Clu -versioita, joissa oli koontiversioita Linuxille , NetBSD :lle , Mac OS :lle , Windows NT :lle , Digital Unixille ( Alphassa ), mutta käytännön kiinnostus kieltä kohtaan väheni merkittävästi, ja 1990-luvun lopun jälkeen toteutuksia ei ole varsinaisesti kehitetty, eikä Klu:lle ole kehitetty uusia ohjelmistoja.
Barbara Liskov voitti vuoden 2008 Turing Award -ehdokkuuden Clu-kielen suunnittelusta ja sille tehokkaiden kääntäjien sarjan luomisesta, mikä todettiin perustavanlaatuiseksi panokseksi tietojenkäsittelytieteeseen, todistaen datan abstraktioideoiden käytännön toteutettavuuden ja muuttaen teoreettisen konseptin yleisesti tunnustettu lähestymistapa ohjelmointialalla [8] .
Abstrakti tietotyyppi Klu:ssa toteutetaan klusterin käsitteellä, rakenteella, joka kapseloi sen operaatiotyypin sisällä ja tarjoaa polymorfismin (klusteri voi kuvata laajan luokan tietotyyppejä yhteisellä spesifikaatiolla - sama joukko toiminta, mutta erilainen toteutus).
Alkufragmentti polymorfisen luettelon klusterin kuvauksesta (operaatioilla Lisp-merkinnällä):
list = cluster [t: type] is create, car, cdr, cons, elems rep = array [t] create = proc () return ( cvt ) % listan luominen return ( rep$new ()) end create ; auto = proc ( l:cvt ) return ( t ) signaalit ( tyhjä ) % saa listan ensimmäisen elementin if rep$tyhjä ( l ) sitten signaali tyhjä else return ( rep$bottom ( l )) end end car ; % muiden toimintojen loppuluettelo _Klusterimääritelmä määrittelee spesifikaation — tyypin operaatioiden joukon, määrittelee sisäisen esityksen ( rep) ja kuvaa toimintojen toteutuksen. Konstruktiot, kuten tyyppimuunnos sisäisestä objektiesitykseen ja päinvastoin ( cvt), $käytetään -merkintöjä tyyppitoimintoihin pääsemiseksi. Klusteritoteutuksen ja sen esiintymän luominen toteutetaan määrittämällä tietty tyyppi:
lint = lista [int] ; % kokonaislukuluettelo l:lint := lint$create () ; % luo listan l := lint$cons ( 1 , lint$cons ( 2 , lint$cons ( 3 , l ) ))) % muodostaa listanSisäänrakennetut tyypit toteutetaan myös klustereina [9] . Toisin kuin ohjelmakoodissa määritellyt klusterit, mikään sisäänrakennettujen Clu-perustietotyyppien ( int, real, bool, null, char, string) toiminto ei voi muuttaa objektin rakennetta ja arvoa (joka kerta kun objektista luodaan uusi ilmentymä vastaavalla tilassa kiinteä). Mutta yhdistämisen tavoittelussa sisäänrakennettujen tyyppien toimintoihin pääsy on käytettävissä klusterin merkinnöissä: int$add(n1,n2)lisää n1merkinnällä n2, string$fetch(s,i)tarjoaa pääsyn merkkijonon - : inneen merkin merkiksi sja string$concat(s1,s2) ketjuttaa merkkijonot s1ja s2lisäksi toteutetaan syntaktinen sokeri , joka tarjoaa tällaisten toimintojen lyhennetty merkintä: samannimiset toiminnot ( , , ) on otettu käyttöön kehittäjän määrittämissä klustereissa. n1+n2s[i]s1||s2addfetchconcat
Polymorfisina klustereina toteutetaan sisäänrakennettuja komposiittityyppejä, joita kutsutaan "tyyppigeneraattoreiksi" Klu- taulukoissa , sekvenssit , tietueet , rakenteet (vakiotietueet), liitot , variantit [10] .
Yksi kielen keskeisistä innovaatioista oli ohjausabstraktion – iteraattorin – käyttöönotto . Iteraattorin ideana on tarjota yleinen toteutus pääsystä abstraktin tietotyypin elementteihin riippumatta sen parametroinnista ja sisäisestä rakenteesta. Esimerkki polymorfisesta luetteloiteraattorista:
elems = iter ( l:cvt ) tuottaa ( t ) elt:t :lle rep $elementeissä ( l ) do tuotto ( elt ) end end elementsIteraattorin kutsuminen näin:
for i:int in lint$elems ( l ) do writeint ( i ) endIteraattorin käyttö eliminoi eksplisiittisten silmukkalaskurien käytön olosuhteissa, joissa tietotyypin erityistä toteutusta ei tiedetä etukäteen.
Idea korutiiniiteraattorista lainattiin myöhemmin Iconista , Satherista , Pythonista , Rubysta , C#: sta (versiosta 2.0 lähtien ) [11] .
Klu toteuttaa rakenteellisen poikkeuskäsittelyn , kielen poikkeukset jaetaan staattisiin ja dynaamisiin, ensimmäisiä käytetään lohkon suorittamiseen yhdessä ohjelmalohkossa (kutsuu operaattori exit s(x1, …, xn)), jälkimmäiset lopettavat ohjelman suorittamisen (kutsuvat operaattori signal s(x1, …, xn)). Molemmissa tapauksissa poikkeus käsitellään ohjelmalohkolla, joka alkaa avainsanalla except, jos staattista poikkeusta ei käsitellä nykyisessä lohkossa, se siirretään seuraavaan; Ohjelmassa käsittelemättömät poikkeukset keskeyttävät sen suorittamisen ja lähettävät asianmukaisia sanomia. Poikkeukset, joita proseduuri voi heittää, on määritelty sen spesifikaatiossa, poikkeukset katsotaan vaihtoehtoiseksi poistumiseksi proseduurista, eli proseduurin on välitettävä spesifikaatiossa ilmoitettu arvo lähtöön käyttämällä operaattoria return, tai annettava jokin poikkeuksista ilmoitetaan määrittelyssä käyttämällä operaattoria signaltai resignal(kutsutaan lohkossa excepttoistamaan poikkeuksen aiheuttanut) asianmukaisilla parametreilla. Sisäänrakennetut tyypit toteuttavat vakiopoikkeuksia.
Poikkeusmekanismia suunniteltaessa ratkaisuja lainattiin PL/1 :ltä ja Mesalta , mutta niissä käytettyä poikkeusresumption mallia on merkittävästi yksinkertaistettu ja jäsennelty [12] , ja kyvystä siirtää poikkeusparametreja on tullut tärkeä innovaatio.