Idris (programmeringsspråk)

Idris
Språkklass Funktionell
Framträdde i 2007 [3] [4] [5]
Författare Edwin Brady
Filtillägg _ .idreller.lidr
Släpp Idris 2 version 0.5.1 [1]  (20 september 2021 ) ( 2021-09-20 )
Typ system strikt , statiskt , beroende typstöd
Blivit påverkad Agda , Coq , [2] Epigram , Haskell , [2] ML , [2] Rust
Licens BSD-3
Hemsida idris-lang.org

Idris  är ett rent , totalt funktionellt allmänt programmeringsspråk med en Haskell - liknande syntax och stöd för beroende typer [6] . Typsystemet liknar Agda -systemet .

Språket stöder automatiska korrekturer jämförbara med Coq , inklusive stöd för taktik, men fokuserar inte på dem, utan är positionerat som ett allmänt programmeringsspråk . Målen med skapandet: "tillräcklig" prestanda, enkel biverkningshantering och sätt att implementera inbäddningsbara domänspecifika språk .

Implementerat i Haskell , tillgängligt som ett Hackage- paket [7] . Idris källkod kompileras till en uppsättning mellanrepresentationer [8] och från dem till C -kod, som exekveras med hjälp av en skräpsamlare som använder Cheney-algoritmen . Officiellt implementerad är också möjligheten att kompilera till JavaScript -kod (inklusive för Node.js ). Det finns tredjepartsimplementationer av kodgeneratorer för Java , JVM , CIL , Erlang , PHP och (begränsat) LLVM .

Språket är uppkallat efter den sjungande draken Idris från 1970 års brittiska barn-tv-program Ivor the Tank Engine [9] .

Språket kombinerar funktioner från de stora populära funktionella programmeringsspråken med funktioner lånade från automatiska provsystem, vilket effektivt suddar ut gränsen mellan de två språkklasserna.

Den andra versionen av språket (släpptes 2020, baserad på den "kvantitativa typteorin" [10] ) skiljer sig markant från den första: fullt stöd för linjära typer har lagts till , koden kompileras som standard i Scheme , språkkompilatorn är skriven på själva språket .

Funktionell programmering

Språkets syntax (som Agda ) är nära den för Haskell [11] . Hej världen! på Idris ser ut så här:

modul Main main : IO () main = putStrLn "Hej världen!"

Skillnaderna mellan detta program och dess Haskell-motsvarighet är det enda (istället för dubbelt) kolon i huvudfunktionssignaturen och frånvaron av ordet "var" i moduldeklarationen.

Liksom de flesta moderna funktionella programmeringsspråk, stöder språket rekursiva (definierade av induktion) datatyper och parametrisk polymorfism . Sådana typer kan definieras som i den traditionella "Haskell98"-syntaxen:

data Träd a = Nod ( Träd a ) ( Träd a ) | blad a

och i den mer allmänna GADT- syntaxen:

data Träd : Typ -> Typ där Nod : Träd a -> Träd a -> Träd ett blad : a -> Träd a

Med hjälp av beroende typer är det möjligt, i stadiet av typkontroll, att utföra beräkningar som involverar de värden som parametrerar typerna. Följande kod definierar en lista med en statiskt given längd, traditionellt kallad vektor :

data Vect : Nat -> Typ -> Typ där Nol : Vect 0 a (::) : ( x : a ) -> ( xs : Vect na ) -> Vect ( n + 1 ) a

Denna typ kan användas så här:

total tillägg : Vect na -> Vect ma -> Vect ( n + m ) a tillägg Nil ys = ys lägg till ( x :: xs ) ys = x :: lägg till xs ys

Funktionen lägger till en vektor av typelement mtill en avektor av ntypelement a. Eftersom den exakta typen av indatavektorer beror på värden som definitivt är kända vid kompileringstidpunkten, kommer den resulterande vektorn att innehålla exakt (n + m)element av typen a.

Ordet " total" anropar en analys av fullständighetskontroll mot , som, för att undvika att gå in i en oändlig loop , kommer att rapportera ett fel om funktionen inte täcker alla möjliga fall av , eller inte kan (automatiskt) bevisas.

Ett annat exempel: parvis addition av två vektorer parametriserade av deras längd:

totalt parLägg till : Num a => Vect na -> Vect na -> Vect na parAdd Noll Nol = Noll parLägg till ( x :: xs ) ( y :: ys ) = x + y :: parLägg till xs ys

Numbetyder att typen atillhör typklassen Num . Funktionen klarar typkontrollen framgångsrikt, fallet när en av vektorerna kommer att ha värdet Noll, medan den andra kommer att vara ett tal, kan inte hända. Typsystemet kontrollerar vid kompilering att längden på båda vektorerna kommer att matcha. Detta förenklar texten i funktionen, som inte längre krävs för att hantera detta specialfall.

Automatisk korrektur

Beroende typer är tillräckligt kraftfulla för att beskriva de flesta egenskaperna hos program, så att ett Idris-program kan bevisa invarianter vid kompilering. Detta gör språket till ett interaktivt korrektursystem .

Idris stöder två sätt att arbeta med det automatiska bevissystemet: genom att skriva successiva anrop till taktik ( Coq -stil , medan uppsättningen av tillgängliga taktiker inte är lika rik som i Coq, men kan utökas med vanliga metaprogrammeringsverktyg ) eller steg för steg -stegssäker utveckling ( Epigram och Agda stil ).

Anteckningar

  1. Release 0.5.1 . Arkiverad från originalet den 1 april 2022. Hämtad 1 april 2022.
  2. 1 2 3 Idris, ett språk med beroende typer . Hämtad 26 oktober 2014. Arkiverad från originalet 11 maj 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 , kap 1. Going Functional § Why Strong Static Typing?, sid. 5.
  7. Mena, 2014 , Ch. 13. Starka typer för att beskriva erbjudanden § Introduktion av Idris, sid. 305.
  8. Plattformsövergripande kompilatorer för funktionella språk . Hämtad 18 maj 2017. Arkiverad från originalet 14 maj 2015.
  9. Vanliga frågor . Hämtad 19 juli 2015. Arkiverad från originalet 21 juli 2015.
  10. Kvantitativ typteoris syntax och semantik . Hämtad 25 maj 2020. Arkiverad från originalet 9 november 2020.
  11. Mena, 2014 , Ch. 13. Starka typer för att beskriva erbjudanden § Beroende typning, sid. 304.

Litteratur

  • Alejandro Serrano Mena. Ch. 13. Starka typer för att beskriva erbjudanden. // Början Haskell. Ett projektbaserat tillvägagångssätt. - Apress , 2014. - 402 sid. - ISBN 978-1-4302-6250-3 .
  • Bruce Tate, Fred Daoud, Jack Moffitt, Ian Dees. Idris // Sju fler språk på sju veckor. Språk som formar framtiden. - Den pragmatiska bokhyllan, 2014. - S. 243-275. — 319 sid. — ISBN 978-1-94122-215-7 .
  • Edwin Brady. Typdriven utveckling med Idris. - Manning Publications , 2017. - 480 sid. — ISBN 9781617293023 .

Länkar