Haskell (programovací jazyk) - Haskell (programming language)

Haskell
Logo Haskell
Paradigma Čistě funkční
Navrhl Lennart Augustsson , Dave Barton, Brian Boutel, Warren Burton, Joseph Fasel, Kevin Hammond, Ralf Hinze, Paul Hudak , John Hughes , Thomas Johnsson, Mark Jones, Simon Peyton Jones , John Launchbury , Erik Meijer , John Peterson, Alastair Reid, Colin Runciman, Philip Wadler
Poprvé se objevil 1990 ; Před 31 lety ( 1990 )
Stabilní uvolnění
Haskell 2010 / červenec 2010 ; Před 11 lety ( 2010-07 )
Náhled vydání
Haskell 2020 oznámen
Kázeň při psaní Odvozené , statické , silné
OS Cross-platform
Rozšíření názvu souboru .hs, .lhs
webová stránka www .haskell .org
Hlavní implementace
GHC , Hugs , NHC, JHC, Yhc , UHC
Nářečí
Helium , Gofer
Ovlivněn
Clean , FP , Gofer , Hope and Hope + , Id , ISWIM , KRC , Lisp , Miranda , ML and Standard ML , Orwell , SASL , Scheme , SISAL
Ovlivněn
Agda , Bluespec , C ++ 11 / Concepts , C# / LINQ , CAL, Cayenne , Clean , Clojure , CoffeeScript , Curry , Elm , Epigram , Escher , F# , Frege , Hack , Idris , Isabelle , Java / Generics , LiveScript , Mercury , Ωmega , PureScript , Python , Raku , Rust , Scala , Swift , dřevo , Visual Basic 9.0

Haskell ( / h æ s k əl / ) je general-purpose , staticky napsaný , čistě funkční programovací jazyk s typem závěr a líné vyhodnocení . Haskell, navržený pro výuku, výzkum a průmyslové aplikace, je průkopníkem řady pokročilých funkcí programovacího jazyka, jako jsou třídy typů , které umožňují přetížení operátorů bezpečného typu . Hlavní implementací Haskell je Glasgow Haskell Compiler (GHC). Pojmenována je podle logika Haskella Curryho .

Haskellova sémantika je historicky založena na programovacím jazyce Miranda , který sloužil ke soustředění úsilí původní pracovní skupiny Haskell. Poslední formální specifikace jazyka byla provedena v červenci 2010, zatímco vývoj GHC rozšířil Haskell prostřednictvím jazykových rozšíření. Další formální specifikace byla plánována na rok 2020.

Haskell se používá v akademické sféře a průmyslu. V květnu 2021 byl Haskell 28. nejpopulárnějším programovacím jazykem, pokud jde o vyhledávání tutoriálů na Googlu, a v úložišti zdrojového kódu GitHub tvořil méně než 1% aktivních uživatelů.

Dějiny

Po vydání Mirandy společností Research Software Ltd. v roce 1985 rostl zájem o líné funkční jazyky. Do roku 1987 existovalo více než tucet nekomplikovaných , čistě funkčních programovacích jazyků. Miranda byla nejpoužívanější, ale byl to proprietární software . Na konferenci o funkčních programovacích jazycích a počítačové architektuře (FPCA '87) v Portlandu v Oregonu panovala silná shoda v tom, že bude vytvořen výbor pro definování otevřeného standardu pro tyto jazyky. Účelem výboru bylo konsolidovat stávající funkční jazyky do společného, ​​který bude sloužit jako základ pro budoucí výzkum designu funkčních jazyků.

Haskell 1.0 až 1.4

Typové třídy , které umožňují typově bezpečné přetížení operátorů , byly poprvé navrženy Philipem Wadlerem a Stephenem Blottem pro standardní ML, ale byly poprvé implementovány v Haskellu mezi lety 1987 a verzí 1.0.

První verze Haskell („Haskell 1.0“) byla definována v roce 1990. Úsilí výboru vyústilo v sérii definic jazyků (1.0, 1.1, 1.2, 1.3, 1.4).

Hierarchie tříd typů v předehře Haskell od GHC 7.10. Zahrnutí Foldable a Traversable (s odpovídajícími změnami typových podpisů některých funkcí) a Applicative jako meziproduktu mezi Functorem a Monadem jsou odchylky od standardu Haskell 2010.

Haskell 98

Na konci roku 1997 série vyvrcholila v Haskell 98 , určeném k určení stabilní, minimální, přenosné verze jazyka a doprovodné standardní knihovny pro výuku a jako základ pro budoucí rozšíření. Výbor výslovně uvítal vytváření rozšíření a variant Haskell 98 přidáním a začleněním experimentálních funkcí.

V únoru 1999 byla jazyková norma Haskell 98 původně vydána jako zpráva Haskell 98 . V lednu 2003 byla vydána revidovaná verze jako Haskell 98 Language and Libraries: The Revised Report . Jazyk se stále rychle vyvíjí, přičemž aktuální de facto standard představuje implementace Glasgow Haskell Compiler (GHC) .

Haskell 2010

Na začátku roku 2006 začal proces definování nástupce standardu Haskell 98, neformálně pojmenovaného Haskell Prime . Toto mělo být pokračujícím přírůstkovým procesem revize jazykové definice, což povede k nové revizi až jednou za rok. První revize s názvem Haskell 2010 byla oznámena v listopadu 2009 a zveřejněna v červenci 2010.

Haskell 2010 je inkrementální aktualizace jazyka, většinou obsahující několik dobře používaných a nekontroverzních funkcí, které byly dříve povoleny pomocí příznaků specifických pro překladače.

  • Názvy hierarchických modulů. Názvy modulů mohou obsahovat tečky oddělené sekvence velkých písmen, nikoli pouze jeden takový identifikátor. Díky tomu mohou být moduly pojmenovány hierarchicky (např. Data.ListMísto List), ačkoli technicky jsou moduly stále v jednom monolitickém oboru názvů. Toto rozšíření bylo specifikováno v dodatku k Haskell 98 a bylo v praxi všeobecně používáno.
  • Rozhraní cizích funkcí (FFI) umožňuje vazby na jiné programovací jazyky. Ve Zprávě jsou specifikovány pouze vazby na C , ale design umožňuje i jiné jazykové vazby. Aby to bylo možné podpořit, deklarace datových typů nesměly obsahovat žádné konstruktory, což umožňuje robustní typy nonce pro cizí data, která nemohla být vytvořena v Haskell. Toto rozšíření bylo také dříve specifikováno v dodatku ke zprávě Haskell 98 a široce používáno.
  • Takzvané n + k vzory (definice formuláře fact (n+1) = (n+1) * fact n) již nebyly povoleny. Tento syntaktický cukr měl zavádějící sémantiku, ve které kód vypadal, že používá (+)operátor, ale ve skutečnosti se rozhodl kódovat pomocí (-)a (>=).
  • Pravidla odvozování typů byla uvolněna, aby umožnilo více programům psát kontrolu.
  • Byly opraveny některé problémy se syntaxí (změny ve formální gramatice): byly přidány stráže vzorů , které umožňovaly shodu vzorů v rámci stráží; rozlišení fixace operátora bylo specifikováno jednodušším způsobem, který odrážel skutečnou praxi; byl řešen okrajový případ interakce lexikální syntaxe operátorů a komentářů jazyka a byla vylepšena interakce do-notace a if-then-else, aby se odstranily neočekávané chyby syntaxe.
  • LANGUAGE Pragma byl zadán. Do roku 2010 se široce používaly desítky rozšíření jazyka a GHC (mimo jiné překladače) poskytovalo LANGUAGEpragma specifikovat jednotlivá rozšíření se seznamem identifikátorů. Kompilátory Haskell 2010 jsou nutné k podpoře Haskell2010rozšíření a jsou vyzvány k podpoře několika dalších, které odpovídají rozšířením přidaným v Haskell 2010.

Funkce

Haskell nabízí líné hodnocení , lambda výrazy , párování vzorů , porozumění seznamu , typové třídy a polymorfismus typů . Je to čistě funkční jazyk , což znamená, že funkce obecně nemají žádné vedlejší účinky . Existuje odlišný konstrukt, který představuje vedlejší účinky, ortogonální k typu funkcí. Čistá funkce může vrátit vedlejší efekt, který je následně proveden, modelováním nečistých funkcí jiných jazyků.

Haskell má silný , statický typový systém založený na odvozování typu Hindley -Milner . Jeho hlavní inovací v této oblasti jsou typové třídy, původně koncipované jako principiální způsob, jak přidat přetížení do jazyka, ale od nalezení mnohem více využití.

Konstrukt, který představuje vedlejší efekty, je příkladem monady : obecného rámce, který může modelovat různé výpočty, jako je zpracování chyb, nedeterminismus , analýza a softwarová transakční paměť . Jsou definovány jako běžné datové typy, ale Haskell poskytuje pro jejich použití nějaký syntaktický cukr .

Haskell má otevřenou, publikovanou specifikaci a existuje několik implementací . Jejím hlavním implementace je Glasgow Haskell Compiler (GHC) je jak interpreter a nativní kód kompilátor , který běží na většině platforem. GHC je známý svým bohatým typovým systémem zahrnujícím nejnovější inovace, jako jsou generalizované algebraické datové typy a rodiny typů. The Computer Language Benchmarks Game také zdůrazňuje svou vysoce výkonnou implementaci souběžnosti a paralelismu .

V celém jazyce existuje aktivní a rostoucí komunita a v online balíčku Hackage úložiště balíčků je k dispozici více než 5400 open-source knihoven a nástrojů třetích stran .

Příklady kódu

A „Ahoj, světe!“ program v Haskellu (nezbytně nutný je pouze poslední řádek):

module Main (main) where          -- not needed in interpreter, is the default in a module file

main :: IO ()                     -- the compiler can infer this type definition
main = putStrLn "Hello, World!"

Faktoriál funkce v Haskellu, je definován v několika různými způsoby:

-- [[Type signature|Type annotation]] (optional, same for each implementation)
factorial :: (Integral a) => a -> a

-- Using recursion (with the "ifthenelse" expression)
factorial n = if n < 2
              then 1
              else n * factorial (n - 1)

-- Using recursion (with pattern matching)
factorial 0 = 1
factorial n = n * factorial (n - 1)

-- Using recursion (with guards)
factorial n
   | n < 2     = 1
   | otherwise = n * factorial (n - 1)

-- Using a list and the "product" function
factorial n = product [1..n]

-- Using fold (implements "product")
factorial n = foldl (*) 1 [1..n]

-- Point-free style
factorial = foldr (*) 1 . enumFromTo 1

Jelikož typ Integerlibovolnou přesnost , bude tento kód počítat hodnoty jako factorial 100000((456 574místné číslo) bez ztráty přesnosti.

Implementace algoritmu podobného rychlému třídění seznamů, kde je první prvek brán jako pivot:

-- Type annotation (optional, same for each implementation)
quickSort :: Ord a => [a] -> [a]

-- Using list comprehensions
quickSort []     = []                               -- The empty list is already sorted
quickSort (x:xs) = quickSort [a | a <- xs, a < x]   -- Sort the left part of the list
                   ++ [x] ++                        -- Insert pivot between two sorted parts
                   quickSort [a | a <- xs, a >= x]  -- Sort the right part of the list

-- Using filter
quickSort []     = []
quickSort (x:xs) = quickSort (filter (<x) xs)
                   ++ [x] ++
                   quickSort (filter (>=x) xs)

Implementace

Všechny uvedené implementace jsou distribuovány pod licencemi open source .

Mezi implementace, které plně nebo téměř odpovídají standardu Haskell 98, patří:

  • Glasgow Haskell Compiler (GHC) sestavuje do nativního kódu na mnoha různých procesorových architektur a na ANSI C , pomocí jednoho ze dvou zprostředkujících jazyků : C- , nebo v novějších verzích, LLVM (dříve Low Level Virtual Machine) bitcode. GHC se stal de facto standardním Haskellovým dialektem. Existují knihovny (např. Vazby na OpenGL ), které fungují pouze s GHC. GHC je také distribuován s platformou Haskell .
  • Jhc, kompilátor Haskell od Johna Meachama, klade důraz na rychlost a efektivitu generovaných programů a zkoumá nové transformace programů.
    • Ajhc je vidlička Jhc.
  • Utrecht Haskell Compiler (UHC) je implementace Haskell z Utrechtské univerzity . Podporuje téměř všechny funkce Haskell 98 a mnoho experimentálních rozšíření. Je implementován pomocí atributových gramatik a v současné době se používá převážně pro výzkum generovaných typů systémů a jazykových rozšíření.

Mezi implementace, které již nejsou aktivně udržovány, patří:

  • Gofer System ( Hugs ) uživatele Haskell je interpretem bajtového kódu . Kdysi to byla jedna z nejrozšířenějších implementací vedle kompilátoru GHC, ale nyní byla většinou nahrazena GHCi. Dodává se také s grafickou knihovnou.
  • HBC je raná implementace podporující Haskell 1.4. Implementoval jej Lennart Augustsson v Lazy ML a na jeho základě . Nějakou dobu nebyl aktivně vyvíjen.
  • nhc98 je kompilátor bytecode se zaměřením na minimalizaci využití paměti.
    • Kompilátor York Haskell ( Yhc ) byl vidličkou nhc98 s cílem být jednodušší, přenosnější a efektivnější a integrovat podporu pro Hat, stopovač Haskell. Měl také backend JavaScript , který uživatelům umožňoval spouštět programy Haskell ve webových prohlížečích .

Implementace, které nejsou plně kompatibilní s Haskell 98, a používají variantní jazyk Haskell, zahrnují:

  • Eta a Frege jsou dialekty Haskell zaměřené na Java Virtual Machine .
  • Gofer byl vzdělávací dialekt Haskella s funkcí nazvanou třídy konstruktérů , kterou vytvořil Mark Jones. Nahradil ho Hugs (Gofer System uživatele Haskell).
  • Helium, novější dialekt Haskell. Důraz je kladen na snazší učení prostřednictvím jasnějších chybových zpráv. Aktuálně postrádá plnou podporu pro třídy typů, takže je nekompatibilní s mnoha programy Haskell.

Pozoruhodné aplikace

  • Asistentka důkazu Agda je napsána v Haskellu.
  • Cabal je nástroj pro vytváření a balení knihoven a programů Haskell.
  • Darcs je systém kontroly revizí napsaný v Haskell s několika inovativními funkcemi, jako je například přesnější ovládání oprav, které se mají použít.
  • GHC je také často testovací stanicí pokročilých funkčních programovacích funkcí a optimalizací v jiných programovacích jazycích.
  • Git-Annex je nástroj pro správu (velkých) datových souborů pod kontrolou verzí Git . Poskytuje také distribuovaný systém synchronizace souborů (git-Annex assistant).
  • Linspire Linux si pro vývoj systémových nástrojů vybral Haskell.
  • Pandoc je nástroj pro převod jednoho formátu značek na jiný.
  • Pugs je překladač a tlumočník pro programovací jazyk Raku (dříve Perl 6).
  • Xmonad je správce oken pro X Window System , napsaný plně v Haskellu.

Průmysl

  • Bluespec SystemVerilog (BSV) je jazyk pro polovodičový design, který je rozšířením Haskell. Také nástroje Bluespec, Inc. jsou implementovány v Haskellu.
  • Cryptol , jazyk a řetězec nástrojů pro vývoj a ověřování kryptografických algoritmů, je implementován v Haskellu.
  • Facebook implementuje své anti-spamové programy v Haskellu a udržuje základní knihovnu pro přístup k datům jako software s otevřeným zdrojovým kódem .
  • Platforma blockchainu Cardano je implementována v Haskell.
  • GitHub implementoval v Haskellu Semantic , open-source knihovnu pro analýzu, odlišování a interpretaci nedůvěryhodného zdrojového kódu.
  • seL4 , první formálně ověřený mikrokernel , používal Haskell jako prototypovací jazyk pro vývojáře OS. Haskellův kód zároveň definoval spustitelnou specifikaci, s níž se měl odůvodnit, pro automatický překlad nástrojem pro dokazování vět. Haskellův kód tedy sloužil jako mezilehlý prototyp před konečným zdokonalením C.

Web

Mezi pozoruhodné webové rámce napsané pro Haskell patří:

Kritika

Jan-Willem Maessen v roce 2002 a Simon Peyton Jones v roce 2003 diskutovali o problémech spojených s líným hodnocením a zároveň uznávali jeho teoretické motivy. Kromě čistě praktických úvah, jako je zlepšený výkon, poznamenávají, že kromě přidání určité režie výkonu líné hodnocení ztěžuje programátorům úvahy o výkonu jejich kódu (zejména jeho využití prostoru).

Bastiaan Heeren, Daan Leijen a Arjan van IJzendoorn v roce 2003 také zaznamenali některé překážky pro studenty Haskell: „Subtilní syntaxe a propracovaný typový systém Haskell jsou dvojsečné meče - vysoce ceněné zkušenými programátory, ale také zdrojem frustrace mezi začátečníky , protože obecnost Haskella často vede k záhadným chybovým zprávám. “ Aby to vyřešili, vyvinuli vědci z Utrechtské univerzity pokročilý tlumočník s názvem Helium , který zlepšil uživatelskou přívětivost chybových zpráv omezením obecnosti některých funkcí Haskell a zejména odstraněním podpory pro třídy typů .

Ben Lippmeier navrhl Disciple jako dialekt Haskell s přísným standardem (líný s explicitní anotací) se systémem typu a účinku, aby vyřešil Haskellovy obtíže při uvažování o líném hodnocení a při používání tradičních datových struktur, jako jsou zaměnitelná pole. Tvrdí (str. 20), že „destruktivní aktualizace poskytuje programátorovi dva důležité a výkonné nástroje ... sadu efektivních datových struktur podobných poli pro správu sbírek objektů a ... schopnost vysílat novou hodnotu pro všechny části programu s minimálním zatížením programátora. “

Robert Harper , jeden z autorů Standard ML , uvedl své důvody, proč nevyužil Haskella k výuce úvodního programování. Mezi ně patří obtížnost uvažování o využívání zdrojů s ne-striktním hodnocením, že líné hodnocení komplikuje definici datových typů a induktivní uvažování a „méněcennost“ Haskellova (starého) třídního systému ve srovnání s ML modulovým systémem.

Haskellův nástroj pro vytváření, Cabal , byl historicky kritizován za špatné zacházení s více verzemi stejné knihovny, problém známý jako „Cabalské peklo“. Server Stackage a nástroj Stack build byly vytvořeny v reakci na tyto kritiky. Samotná Cabal má nyní mnohem propracovanější systém sestavování, silně inspirovaný Nixem , který se stal výchozím nastavením verze 3.0.

Související jazyky

Clean je blízký, o něco starší příbuzný Haskella. Jeho největší odchylka od Haskell je v použití typů jedinečnosti místo monád pro I/O a vedlejší efekty.

Byla vyvinuta řada jazyků inspirovaných Haskellem, ale s různými typy systémů, včetně:

Mezi další související jazyky patří:

  • Curry , funkční/logický programovací jazyk založený na Haskellu.

Pozoruhodné varianty Haskell zahrnují:

  • Generic Haskell , verze Haskell s podporou typového systému pro generické programování .
  • Hume , přísný funkční jazyk pro vestavěné systémy založený na procesech jako bezstavové automaty přes jakési n -tice jednoho prvku kanálů poštovní schránky, kde je stav udržován zpětnou vazbou do poštovních schránek, a popis mapování od výstupů do kanálů jako zapojení boxu s Jazyk výrazu a syntaxe podobný Haskellu.

Konference a workshopy

Komunita Haskell se pravidelně schází za účelem výzkumu a vývoje. Hlavní události jsou:

Počínaje rokem 2006 došlo k sérii organizovaných hackathonů , sérii Hac, zaměřené na vylepšení nástrojů a knihoven programovacího jazyka.

Reference

Další čtení

Zprávy
Učebnice
Návody
Dějiny

externí odkazy