Idris (ohjelmointikieli)

Idris
Kieliluokka Toimiva
Esiintyi 2007 [3] [4] [5]
Tekijä Edwin Brady
Tiedostotunniste _ .idrtai.lidr
Vapauta Idris 2 -versio 0.5.1 [1]  (20. syyskuuta 2021 ) ( 2021-09-20 )
Tyyppijärjestelmä tiukka , staattinen , riippuvainen tyyppituki
Vaikutettu Agda , Coq , [2] Epigram , Haskell , [2] ML , [2] Rust
Lisenssi BSD-3
Verkkosivusto idris-lang.org

Idris  on puhdas , täydellinen toiminnallinen yleiskäyttöinen ohjelmointikieli, jossa on Haskellin kaltainen syntaksi ja tuki riippuville tyypeille [6] . Tyyppijärjestelmä on samanlainen kuin Agda - tyyppijärjestelmä .

Kieli tukee Coqiin verrattavia automaattisia oikolukuja , mukaan lukien tuki taktiikalle, mutta ei keskity niihin, vaan se on sijoitettu yleiskäyttöiseksi ohjelmointikieleksi . Sen luomisen tavoitteet: "riittävä" suorituskyky, sivuvaikutusten hallinnan helppous ja keinot upotettavien verkkotunnuskohtaisten kielten toteuttamiseen .

Toteutettu Haskellissa , saatavana Hackage- pakettina [7] . Idris-lähdekoodi kootaan joukoksi väliesityksiä [8] ja niistä C - koodiksi, joka suoritetaan käyttämällä Cheney -algoritmia kopiojätteenkerääjällä . Myös virallisesti toteutettu kyky kääntää JavaScript -koodiksi (mukaan lukien Node.js ). On olemassa kolmansien osapuolien koodigeneraattoreita Javalle , JVM :lle , CIL :lle , Erlangille , PHP :lle ja (rajoitetusti) LLVM :lle .

Kieli on nimetty laulavan lohikäärme Idrisin mukaan vuoden 1970 brittiläisestä lasten TV-ohjelmasta Ivor the Tank Engine [9] .

Kielessä yhdistyvät suosituimpien toiminnallisten ohjelmointikielten ominaisuudet automaattisista todistejärjestelmistä lainattuihin ominaisuuksiin, mikä hämärtää tehokkaasti kahden kieliluokan välistä rajaa.

Kielen toinen versio (julkaistu vuonna 2020, perustuu "kvantitatiiviseen tyyppiteoriaan" [10] ) eroaa merkittävästi ensimmäisestä: täysi tuki lineaarisille tyypeille on lisätty , koodi käännetään oletuksena Scheme , kielen kääntäjä on kirjoitettu itse kielellä .

Toiminnallinen ohjelmointi

Kielen syntaksi (kuten Agdan syntaksi ) on lähellä Haskellin syntaksia [11] . Hei maailma! Idriksessä näyttää tältä:

moduuli Main main : IO () main = putStrLn "Hei, maailma!"

Erot tämän ohjelman ja sen Haskell-vastineen välillä ovat yksi (kaksoispiste) kaksoispiste pääfunktion allekirjoituksessa ja "jos"-sanan puuttuminen moduulin määrittelystä.

Kuten useimmat nykyaikaiset toiminnalliset ohjelmointikielet, kieli tukee rekursiivisia (induktion määrittelemiä) tietotyyppejä ja parametrista polymorfismia . Tällaiset tyypit voidaan määritellä kuten perinteisessä "Haskell98"-syntaksissa:

data Puu a = Solmu ( Puu a ) ( Puu a ) | lehti a

ja yleisemmässä GADT- syntaksissa:

data Puu : Tyyppi -> Kirjoita missä Solmu : Puu a -> Puu ​​a -> Puu ​​a Lehti : a -> Puu ​​a

Riippuvien tyyppien avulla on mahdollista tyyppitarkistuksen vaiheessa suorittaa laskelmia, jotka sisältävät tyyppejä parametroivia arvoja. Seuraava koodi määrittelee listan, jolla on staattisesti annettu pituus, jota kutsutaan perinteisesti vektoriksi :

tiedot Vect : Nat -> Tyyppi -> Tyyppi jossa Nolla : Vect 0 a (::) : ( x : a ) -> ( xs : Vect na ) -> Vect ( n + 1 ) a

Tätä tyyppiä voidaan käyttää seuraavasti:

yhteensä liite : Vect na -> Vect ma -> Vect ( n + m ) a liitä Nil ys = ys liitä ( x :: xs ) ys = x :: liitä xs ys

Funktio liittää tyyppielementtien vektorin mtyyppielementtien avektoriin . Koska syöttövektoreiden tarkka tyyppi riippuu arvoista, jotka ovat varmasti tiedossa käännöshetkellä, tuloksena oleva vektori sisältää täsmälleen tyypin elementtejä . na(n + m)a

Sana " total" vaatii jäsentämisen täydellisyyden tarkistuksen :tä vastaan , joka, jotta vältytään päättymättömästä silmukasta , ilmoittaa virheestä, jos funktio ei kata kaikkia mahdollisia -tapauksia tai sitä ei voida (automaattisesti) todistaa.

Toinen esimerkki: kahden pituuden mukaan parametroidun vektorin pareittainen lisääminen:

pari yhteensä Lisää : Num a => Vanha na -> Vanha na -> Vect na pariLisäys Nolla Nolla = Ei pariLisää ( x :: xs ) ( y :: ys ) = x + y :: pariLisää xs ys

Numtarkoittaa, että tyyppi akuuluu tyyppiluokkaan Num . Funktio läpäisee tyyppitarkistuksen. Tapausta, jossa yhden vektorin arvo on Nolla, kun taas toinen on luku, ei voi tapahtua. Tyyppijärjestelmä tarkistaa käännöshetkellä, että molempien vektoreiden pituus täsmää. Tämä yksinkertaistaa funktion tekstiä, jota ei enää tarvita tämän erikoistapauksen käsittelemiseksi.

Automaattinen todistus

Riippuvat tyypit ovat tarpeeksi tehokkaita kuvaamaan useimpia ohjelmien ominaisuuksia, joten Idris-ohjelma voi todistaa invariantteja käännöshetkellä. Tämä muuttaa kielen interaktiiviseksi todistejärjestelmäksi .

Idris tukee kahta tapaa työskennellä automaattisen todistusjärjestelmän kanssa: kirjoittamalla peräkkäisiä taktiikkakutsuja ( Coq -tyyli , kun taas käytettävissä olevien taktiikkojen joukko ei ole yhtä runsas kuin Coqissa, mutta sitä voidaan laajentaa tavallisilla metaohjelmointityökaluilla ) tai vaiheittain -askelvarma kehitys ( Epigram ja Agda tyyli ).

Muistiinpanot

  1. Julkaisu 0.5.1 . Arkistoitu alkuperäisestä 1. huhtikuuta 2022. Haettu 1. huhtikuuta 2022.
  2. 1 2 3 Idris, kieli, jolla on riippuvaisia ​​tyyppejä . Haettu 26. lokakuuta 2014. Arkistoitu alkuperäisestä 11. toukokuuta 2021.
  3. https://web.archive.org/web/20080320233322/http://www-fp.cs.st-and.ac.uk/~eb/darcs/Idris/
  4. https://web.archive.org/web/20080322004024/http://www.cs.st-andrews.ac.uk:80/~eb/
  5. http://hackage.haskell.org/package/idris-0.1.3/src/LICENSE
  6. Mena, 2014 , Ch 1. Toimiva toiminta § Miksi vahva staattinen kirjoittaminen?, s. 5.
  7. Mena, 2014 , Ch. 13. Vahvat tyypit tarjousten kuvaamiseen § Esittelyssä Idris, s. 305.
  8. Monialustaiset kääntäjät funktionaalisille kielille . Haettu 18. toukokuuta 2017. Arkistoitu alkuperäisestä 14. toukokuuta 2015.
  9. Usein kysytyt kysymykset . Haettu 19. heinäkuuta 2015. Arkistoitu alkuperäisestä 21. heinäkuuta 2015.
  10. Kvantitatiivisen tyyppiteorian syntaksi ja semantiikka . Haettu 25. toukokuuta 2020. Arkistoitu alkuperäisestä 9. marraskuuta 2020.
  11. Mena, 2014 , Ch. 13. Vahvat tyypit tarjousten kuvaamiseen § Riippuvainen kirjoittaminen, s. 304.

Kirjallisuus

  • Alejandro Serrano Mena. Ch. 13. Vahvat tyypit tarjousten kuvaamiseen. // Alku Haskell. Projektipohjainen lähestymistapa. - Apress , 2014. - 402 s. - ISBN 978-1-4302-6250-3 .
  • Pääosissa Bruce Tate, Fred Daoud, Jack Moffitt, Ian Dees. Idris // Seitsemän muuta kieltä seitsemässä viikossa. Kielet, jotka muokkaavat tulevaisuutta. - Pragmaattinen kirjahylly, 2014. - S. 243-275. — 319 s. — ISBN 978-1-94122-215-7 .
  • Edwin Brady. Tyyppiohjattu kehitys Idriksen kanssa. - Manning Publications , 2017. - 480 s. — ISBN 9781617293023 .

Linkit