Clu

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# .

Historia

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] .

Klusterit

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 listan

Sisää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] .

Iteraattorit

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 elements

Iteraattorin kutsuminen näin:

for i:int in lint$elems ( l ) do writeint ( i ) end

Iteraattorin 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] .

Poikkeuskäsittely

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.

Muistiinpanot

  1. Barbara Liskov, Steve Zilles. Lähestymistapa abstraktioon  //  Laskentarakenteiden ryhmämuistio. - 1973. - Voi. 88 .
  2. Barbara Liskov, Stephen Zilles. Ohjelmointi abstrakteilla tietotyypeillä  //  ACM SIGPLAN -symposiumin julkaisut erittäin korkean tason kielistä. - N.Y .: ACM, 1974. - Voi. 9 . - s. 50-59 . - doi : 10.1145/800233.807045 . Arkistoitu alkuperäisestä 22. joulukuuta 2012.
  3. Liskov, 1992 , "CLU valittiin kielen nimeksi syksyllä 1973. Nimi valittiin, koska se on "klusterin" kolme ensimmäistä kirjainta", s. 3.
  4. Liskov, 1992 , s. kahdeksan.
  5. Liskov, 1992 , "Teimme kielisuunnittelun viimeisen passin vuonna 1979", s. 22.
  6. Liskov, 1992 , s. 21.
  7. Safonov, 1989 , s. 194.
  8. ACM Turing -palkinto menee vaikuttavien innovaatioiden luojalle tietokoneohjelmistojen suunnittelussa.  MIT :n Liskov on edelläkävijä nykyaikaisen ohjelmointikielen ja ohjelmiston luotettavuuden standardina . Turing-palkinto . ACM (10. maaliskuuta 2009). - "Liskov suunnitteli CLU-ohjelmointikielen, oliokeskeisen kielen, joka sisältää "klustereita" tarjoamaan johdonmukaista, systemaattista abstraktien tietotyyppien käsittelyä, jotka koostuvat joukosta dataa ja joukosta toimintoja, jotka voidaan suorittaa datalle. Hän ja hänen kollegansa MIT:stä kehittivät myöhemmin tehokkaita CLU-kääntäjätoteutuksia useille eri koneille, mikä oli tärkeä askel hänen ideoidensa käytännöllisyyden osoittamisessa. Tietojen abstraktio on nykyään yleisesti hyväksytty ohjelmistosuunnittelun perusmenetelmä, joka keskittyy dataan prosessien sijaan ja joka usein tunnistetaan "modulaariseksi" tai "oliosuuntautuneeksi" ohjelmoimiseksi. Haettu 30. marraskuuta 2012. Arkistoitu alkuperäisestä 16. tammikuuta 2013.
  9. Safonov, 1989 , s. 198.
  10. Safonov, 1989 , s. 201-207.
  11. Jed Liu, Aaron Kimball, Andrew C. Myers. Interruptible Iterators  //  POPL '06 Konferenssilevy 33. ACM SIGPLAN-SIGACT -symposiumista ohjelmointikielten periaatteista. - N.Y .: ACM, 2006. - Voi. 1 (41) . - s. 283-294 . — ISBN 1-59593-027-2 . - doi : 10.1145/1111037.1111063 .
  12. Liskov, 1992 , s. 16.

Kirjallisuus

  • Barbara Liskov, John Gatag. Abstraktien ja spesifikaatioiden käyttö ohjelmien kehittämisessä. — M .: Mir , 1989. — 424 s. - ISBN 5-03-000489-0 .
  • Vladimir Safonov. Klu-ohjelmointikieli ja Klu-Elbrus-järjestelmä // Ohjelmointikielet ja menetelmät Elbrus-järjestelmässä. - M .: Science , 1989. - S. 189-242. — 389 s. — ISBN 5-02-013983-1 .
  • Barbara Liskov, Russell Atkinson, Toby Bloom, Eliot Moss, J. Craig Schaffert, Robert Scheifler, Alan Snyder. CLU Reference Manual  / toimittanut G. Goos, J. Hartmanis. - Berliini - Heidelberg - New York: Springer-Verlag , 1981. - 190 s. — ( Lecture Notes in Computer Science , osa 114). — ISBN 3-540-10836-X .
  • Barbara Liskov . CLU :n historiaa  . Ohjelmointikielten historia (1. huhtikuuta 1992). doi : 10.1145/234286.1057826 . Haettu 30. marraskuuta 2012. Arkistoitu alkuperäisestä 16. tammikuuta 2013.