Idris (programmeringssprog)

Idris
Sprog klasse Funktionel
Dukkede op i 2007 [3] [4] [5]
Forfatter Edwin Brady
Filtypenavn _ .idreller.lidr
Frigøre Idris 2 version 0.5.1 [1]  (20. september 2021 ) ( 2021-09-20 )
Type system streng , statisk , afhængig type support
Blev påvirket Agda , Coq , [2] Epigram , Haskell , [2] ML , [2] Rust
Licens BSD-3
Internet side idris-lang.org

Idris  er et rent , totalt funktionelt programmeringssprog til generelle formål med en Haskell - lignende syntaks og understøttelse af afhængige typer [6] . Typesystemet ligner Agda -systemet .

Sproget understøtter automatiske korrekturer , der kan sammenlignes med Coq , herunder understøttelse af taktik, men fokuserer ikke på dem, men er placeret som et programmeringssprog til generelle formål . Målene for dets oprettelse: "tilstrækkelig" ydeevne, nem håndtering af bivirkninger og midler til implementering af indlejrbare domænespecifikke sprog .

Implementeret i Haskell , tilgængelig som en Hackage- pakke [7] . Idris kildekode er kompileret til et sæt mellemrepræsentationer [8] og fra dem til C -kode, som udføres ved hjælp af en kopigarbage collector ved hjælp af Cheney-algoritmen . Også officielt implementeret er muligheden for at kompilere til JavaScript -kode (inklusive for Node.js ). Der er tredjepartsimplementeringer af kodegeneratorer til Java , JVM , CIL , Erlang , PHP og (begrænset) LLVM .

Sproget er opkaldt efter den syngende drage Idris fra det britiske børne-tv-show Ivor the Tank Engine fra 1970 [9] .

Sproget kombinerer funktioner fra de store populære funktionelle programmeringssprog med funktioner lånt fra automatiske korrektursystemer, hvilket effektivt udvisker grænsen mellem de to sprogklasser.

Den anden version af sproget (udgivet i 2020, baseret på "kvantitativ typeteori" [10] ) adskiller sig væsentligt fra den første: fuld understøttelse af lineære typer er blevet tilføjet , koden er kompileret som standard i Scheme , sprogkompileren er skrevet på selve sproget .

Funktionel programmering

Sprogets syntaks (som Agda ) er tæt på Haskells [11] . Hej verden! på Idris ser sådan ud:

modul Hoved main : IO () main = putStrLn "Hej, verden!"

Forskellene mellem dette program og dets Haskell-ækvivalent er det enkelte (i stedet for dobbelt) kolon i hovedfunktionssignaturen og fraværet af ordet "hvor" i modulerklæringen.

Som de fleste moderne funktionelle programmeringssprog understøtter sproget rekursive (defineret ved induktion) datatyper og parametrisk polymorfi . Sådanne typer kan defineres som i den traditionelle "Haskell98"-syntaks:

data Træ a = Node ( Træ a ) ( Træ a ) | blad a

og i den mere generelle GADT- syntaks:

data Træ : Type -> Type hvor Node : Træ a -> Træ a -> Træ et blad : a -> Træ a

Ved hjælp af afhængige typer er det muligt på stadiet af typekontrol at udføre beregninger, der involverer de værdier, der parametrerer typerne. Følgende kode definerer en liste med en statisk given længde, traditionelt kaldet en vektor :

data Vect : Nat -> Type -> Type where Nil : Vect 0 a (::) : ( x : a ) -> ( xs : Vect na ) -> Vect ( n + 1 ) a

Denne type kan bruges sådan:

total tilføjelse : Vect na -> Vect ma -> Vect ( n + m ) a tilføje Nil ys = ys tilføj ( x :: xs ) ys = x :: tilføj xs ys

Funktionen tilføjer en vektor af mtypeelementer atil en vektor af ntypeelementer a. Fordi den nøjagtige type af inputvektorerne afhænger af værdier, der er bestemt kendt på kompileringstidspunktet, vil den resulterende vektor indeholde nøjagtigt (n + m)elementer af typen a.

Ordet " total" påberåber sig et parse-fuldstændighedstjek mod , som for at undgå at gå ind i en uendelig løkke vil rapportere en fejl, hvis funktionen ikke dækker alle mulige tilfælde af , eller ikke kan (automatisk) bevises.

Et andet eksempel: parvis tilføjelse af to vektorer parametriseret af deres længde:

totalt parTilføj : Antal a => Vect na -> Vect na -> Vect na parAdd Nul Nul = Nul parAdd ( x :: xs ) ( y :: ys ) = x + y :: parAdd xs ys

Numbetyder, at typen atilhører typeklassen Num . Funktionen passerer med succes typekontrollen, det tilfælde, hvor en af ​​vektorerne vil have værdien nul, mens den anden vil være et tal, kan ikke ske. Typesystemet kontrollerer på kompileringstidspunktet, at længden af ​​begge vektorer passer. Dette forenkler teksten til funktionen, som ikke længere er nødvendig for at håndtere dette specielle tilfælde.

Automatisk korrektur

Afhængige typer er kraftige nok til at beskrive de fleste af programmernes egenskaber, så et Idris-program kan bevise invarianter på kompileringstidspunktet. Dette gør sproget til et interaktivt korrektursystem .

Idris understøtter to måder at arbejde med det automatiske bevissystem: ved at skrive successive opkald til taktik ( Coq -stil , mens sættet af tilgængelige taktikker ikke er så rigt som i Coq, men kan udvides med standard metaprogrammeringsværktøjer ) eller ved trin- for- -trinssikker udvikling ( Epigram og Agda stil ).

Noter

  1. Udgivelse 0.5.1 . Arkiveret fra originalen den 1. april 2022. Hentet 1. april 2022.
  2. 1 2 3 Idris, et sprog med afhængige typer . Hentet 26. oktober 2014. Arkiveret fra originalen 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?, s. 5.
  7. Mena, 2014 , Ch. 13. Stærke typer til at beskrive tilbud § Introduktion af Idris, s. 305.
  8. ↑ Kompilere på tværs af platforme til funktionelle sprog . Hentet 18. maj 2017. Arkiveret fra originalen 14. maj 2015.
  9. Ofte stillede spørgsmål . Hentet 19. juli 2015. Arkiveret fra originalen 21. juli 2015.
  10. Kvantitativ typeteoris syntaks og semantik . Hentet 25. maj 2020. Arkiveret fra originalen 9. november 2020.
  11. Mena, 2014 , Ch. 13. Stærke typer til beskrivelse af tilbud § Afhængig maskinskrivning, s. 304.

Litteratur

  • Alejandro Serrano Mena. Ch. 13. Stærke typer til at beskrive tilbud. // Begyndelse Haskell. En projektbaseret tilgang. - Apress , 2014. - 402 s. - ISBN 978-1-4302-6250-3 .
  • Bruce Tate, Fred Daoud, Jack Moffitt, Ian Dees. Idris // Syv flere sprog på syv uger. Sprog, der former fremtiden. - Den pragmatiske bogreol, 2014. - S. 243-275. — 319 s. — ISBN 978-1-94122-215-7 .
  • Edwin Brady. Typedrevet udvikling med Idris. - Manning Publications , 2017. - 480 s. — ISBN 9781617293023 .

Links