Glasgow Haskell-compiler - Glasgow Haskell Compiler

De Glasgow Haskell-compiler
Oorspronkelijke auteur(s) Kevin Hammond
Ontwikkelaar(s) Het Glasgow Haskell-team
Eerste uitgave december 1992 ( 1992-12 )
Stabiele vrijlating
9.0.1  Bewerk dit op Wikidata / 4 februari 2021 ; 7 maanden geleden ( 4 februari 2021 )
Opslagplaats
Geschreven in Haskell en C
Besturingssysteem Linux , OS X 10.7 Lion en later, iOS , Windows 2000 en later, FreeBSD , Solaris 10 en later
Platform x86 , x86-64 , ARM
Beschikbaar in Engels
Type Compiler
Vergunning Nieuwe BSD-licentie
Website www .haskell .org /ghc /

De Glasgow Haskell Compiler ( GHC ) is een open source native code compiler voor de functionele programmeertaal taal Haskell . Het biedt een platformonafhankelijke omgeving voor het schrijven en testen van Haskell-code en het ondersteunt tal van extensies, bibliotheken en optimalisaties die het proces van het genereren en uitvoeren van code stroomlijnen. GHC is de meest gebruikte Haskell-compiler. De hoofdontwikkelaars zijn Simon Peyton Jones en Simon Marlow .

Geschiedenis

GHC begon oorspronkelijk in 1989 als een prototype, geschreven in LML (Lazy ML) door Kevin Hammond aan de Universiteit van Glasgow . Later dat jaar werd het prototype volledig herschreven in Haskell, met uitzondering van de parser , door Cordelia Hall, Will Partaine en Simon Peyton Jones. De eerste beta release was op 1 april 1991 en latere versies toegevoegd strengheid analysator alsmede taaluitbreidingen zoals monadische I / O , veranderlijk arrays, unboxed gegevenstypen gelijktijdige en parallelle programmeermodellen (zoals software transactionele geheugen en data parallellisme ) en een profiler .

Peyton Jones, evenals Marlow, verhuisden later naar Microsoft Research in Cambridge, Engeland , waar ze primair verantwoordelijk bleven voor de ontwikkeling van GHC. GHC bevat ook code van meer dan driehonderd andere bijdragers. Sinds 2009 worden bijdragen van derden aan GHC gefinancierd door de Industrial Haskell Group.

architectuur

GHC zelf is geschreven in Haskell , maar het runtime-systeem voor Haskell, essentieel om programma's uit te voeren, is geschreven in C en C-- .

De front-end van GHC -met de lexer , parser en typechecker -is ontworpen om zoveel mogelijk informatie over de brontaal te bewaren tot nadat de type-inferentie is voltooid, met als doel gebruikers duidelijke foutmeldingen te geven. Na typecontrole wordt de Haskell-code ontsuikerd in een getypte tussentaal die bekend staat als "Core" (gebaseerd op System F , uitgebreid met leten caseuitdrukkingen). Kern is uitgebreid ter ondersteuning algemene algebraïsche datatypes in zijn systeemtype en is nu gebaseerd op een uitbreiding Variant F zogenaamde System F C .

In de traditie van typegestuurde compilatie, is de vereenvoudiging van GHC, of ​​"middle end", waar de meeste van de in GHC geïmplementeerde optimalisaties worden uitgevoerd, gestructureerd als een reeks bron-naar-bron- transformaties op Core-code. De analyses en transformaties die in deze compilerfase worden uitgevoerd, omvatten vraaganalyse (een generalisatie van striktheidsanalyse ), toepassing van door de gebruiker gedefinieerde herschrijfregels (inclusief een set regels die zijn opgenomen in de standaardbibliotheken van GHC die foldr/build- fusie uitvoeren ), ontvouwen (genaamd " inlining " in meer traditionele compilers), let-floating , een analyse die bepaalt welke functieargumenten kunnen worden uitgepakt, analyse van geconstrueerde productresultaten , specialisatie van overbelaste functies, evenals een reeks eenvoudigere lokale transformaties zoals constant vouwen en bètareductie .

De achterkant van de compiler transformeert Core-code in een interne representatie van C--, via een tussentaal STG (afkorting van "Spineless Tagless G-machine"). De C-code kan dan een van de volgende drie routes volgen: het wordt ofwel afgedrukt als C-code voor compilatie met GCC , direct omgezet in native machinecode (de traditionele " codegeneratie "-fase), of geconverteerd naar LLVM IR voor compilatie met LLVM . In alle drie de gevallen wordt de resulterende native code uiteindelijk gekoppeld aan het GHC runtime-systeem om een ​​uitvoerbaar bestand te produceren.

Taal

GHC voldoet aan de taalnormen, zowel Haskell 98 als Haskell 2010 . Het ondersteunt ook veel optionele uitbreidingen van de Haskell-standaard: bijvoorbeeld de software-transactional memory (STM)-bibliotheek, die Composable Memory Transactions mogelijk maakt .

Uitbreidingen naar Haskell

Een aantal uitbreidingen van Haskell zijn voorgesteld. Deze extensies bieden functies die niet worden beschreven in de taalspecificatie, of ze herdefiniëren bestaande constructies. Als zodanig wordt elke extensie mogelijk niet door alle Haskell-implementaties ondersteund. Er is een voortdurende inspanning om extensies te beschrijven en de extensies te selecteren die in toekomstige versies van de taalspecificatie zullen worden opgenomen.

De extensies die worden ondersteund door de Glasgow Haskell Compiler zijn onder meer:

  • Typen en bewerkingen zonder box. Deze vertegenwoordigen de primitieve datatypes van de onderliggende hardware, zonder de indirecte verwijzing naar de heap of de mogelijkheid van uitgestelde evaluatie. Numeriek intensieve code kan aanzienlijk sneller zijn wanneer gecodeerd met deze typen.
  • De mogelijkheid om een strikte evaluatie op te geven voor een waarde, patroonbinding of gegevenstypeveld.
  • Handigere syntaxis voor het werken met modules, patronen, lijstbegrippen , operators, records en tupels.
  • Syntactische suiker voor computergebruik met pijlen en recursief gedefinieerde monadische waarden. Beide concepten breiden de monadische do- notatie uit die in de standaard Haskell wordt gegeven.
  • Een aanzienlijk krachtiger systeem van typen en typeklassen, hieronder beschreven.
  • Sjabloon Haskell , een systeem voor metaprogrammering tijdens het compileren . Een programmeur kan expressies schrijven die Haskell-code produceren in de vorm van een abstracte syntaxisboom . Deze expressies worden tijdens het compileren gecontroleerd en geëvalueerd; de gegenereerde code wordt dan opgenomen alsof deze rechtstreeks door de programmeur is geschreven. Samen met het vermogen om over definities na te denken , biedt dit een krachtig hulpmiddel voor verdere uitbreidingen van de taal.
  • Quasi-citaat, waarmee de gebruiker nieuwe concrete syntaxis voor uitdrukkingen en patronen kan definiëren. Quasi-citaten zijn handig wanneer een metaprogramma geschreven in Haskell code manipuleert die is geschreven in een andere taal dan Haskell.
  • Generieke typeklassen, die functies uitsluitend specificeren in termen van de algebraïsche structuur van de typen waarop ze werken.
  • Parallelle evaluatie van expressies met behulp van meerdere CPU-kernen. Dit vereist geen expliciete spawning-threads. De verdeling van het werk gebeurt impliciet, op basis van aantekeningen van de programmeur.
  • Compilerpragma 's voor het aansturen van optimalisaties zoals inline-uitbreiding en het specialiseren van functies voor bepaalde typen.
  • Aanpasbare herschrijfregels. De programmeur kan regels geven die beschrijven hoe een uitdrukking moet worden vervangen door een equivalente maar efficiënter geëvalueerde uitdrukking. Deze worden gebruikt binnen kerngegevensstructuurbibliotheken om verbeterde prestaties te bieden in code op applicatieniveau.
  • Dot-syntaxis opnemen. Biedt syntactische suiker voor toegang tot de velden van een (mogelijk genest) record dat vergelijkbaar is met de syntaxis van veel andere programmeertalen.

Typ systeemextensies

Een expressief statisch typesysteem is een van de belangrijkste bepalende kenmerken van Haskell. Dienovereenkomstig is veel van het werk bij het uitbreiden van de taal gericht op typen en typeklassen .

Glasgow Haskell Compiler ondersteunt een uitgebreid systeemtype basis van de theoretische System F C . Belangrijke uitbreidingen van het typesysteem zijn onder meer:

  • Willekeurige rang en impredicatief polymorfisme . In wezen kan een polymorfe functie of datatypeconstructor vereisen dat een van zijn argumenten zelf polymorf is.
  • Gegeneraliseerde algebraïsche gegevenstypen . Elke constructor van een polymorf datatype kan informatie coderen in het resulterende type. Een functie die met dit type overeenkomt, kan de informatie per constructortype gebruiken om meer specifieke bewerkingen op gegevens uit te voeren.
  • Existentiële typen . Deze kunnen worden gebruikt om sommige gegevens te "bundelen" samen met bewerkingen op die gegevens, op een zodanige manier dat de bewerkingen kunnen worden gebruikt zonder het specifieke type van de onderliggende gegevens bloot te leggen. Zo'n waarde lijkt erg op een object zoals gevonden in objectgeoriënteerde programmeertalen .
  • Gegevenstypen die eigenlijk geen waarden bevatten. Deze kunnen handig zijn om gegevens weer te geven in metaprogrammering op typeniveau .
  • Typefamilies : door de gebruiker gedefinieerde functies van typen tot typen. Terwijl parametrisch polymorfisme dezelfde structuur biedt voor elke type-instantiatie, bieden typefamilies ad- hocpolymorfisme met implementaties die kunnen verschillen tussen instantiaties. Use cases omvatten contentbewuste optimalisatie van containers en metaprogrammering op typeniveau.
  • Impliciete functieparameters die een dynamisch bereik hebben . Deze worden in typen weergegeven op vrijwel dezelfde manier als beperkingen voor typeklassen.
  • Lineaire typen (GHC 9.0)

Uitbreidingen met betrekking tot typeklassen zijn onder meer:

  • Een typeklasse kan op meer dan één type worden geparametriseerd. Een typeklasse kan dus niet alleen een reeks typen beschrijven, maar ook een n -aire relatie op typen.
  • Functionele afhankelijkheden , die delen van die relatie beperken om een ​​wiskundige functie op typen te zijn. Dat wil zeggen, de beperking specificeert dat een bepaalde typeklasseparameter volledig wordt bepaald zodra een andere set parameters is vastgesteld. Dit leidt het proces van type-inferentie in situaties waar er anders dubbelzinnigheid zou zijn.
  • Aanzienlijk versoepelde regels met betrekking tot de toegestane vorm van typeklasse-instanties. Wanneer deze volledig zijn ingeschakeld, wordt het typeklasse- systeem tijdens het compileren een Turing-complete taal voor logisch programmeren .
  • Typefamilies, zoals hierboven beschreven, kunnen ook worden geassocieerd met een typeklasse.
  • Het automatisch genereren van bepaalde typeklasse-instanties wordt op verschillende manieren uitgebreid. Nieuwe typeklassen voor generieke programmering en algemene recursiepatronen worden ondersteund. Bovendien, wanneer een nieuw type wordt gedeclareerd als isomorf met een bestaand type, kan elke typeklasse-instantie die is gedeclareerd voor het onderliggende type "gratis" worden opgeheven naar het nieuwe type.

Draagbaarheid

Er zijn versies van GHC beschikbaar voor verschillende platforms , waaronder Windows en de meeste varianten van Unix (zoals Linux , FreeBSD , OpenBSD en macOS ). GHC is ook geport naar verschillende processorarchitecturen .

Zie ook

Referenties

Externe links