MLton

MLton (uttalas " millton " [1] ) är en plattformsoberoende kompilator som optimerar hela programmet för programmeringsspråket Standard ML (SML). Liksom de flesta andra implementeringar av Standard ML är den skriven i själva Standard ML (med undantag för runtime - systemet skrivet i C ) och distribueras med öppen källkod under en BSD-liknande licens .

Egenskaper

Ger mycket hög prestanda för standard ML- program : på små program släpar den bara något efter C / C++ i hastighet [2] ; på större, på grund av fullständig programoptimering baserad på en global analys av programmets kontrollflöde , kan det överträffa dem. Genererar fristående körbara filer av kompakt storlek. Prestanda i MLton tillhandahålls även med stor användning av SML - abstraktionsmekanismer ( parametrisk polymorfism , högre ordningsfunktioner , funktorer ), vilket gör att språket kan användas både för snabb prototyping och storskalig programmering utan att programmeraren behöver slå till en balans mellan abstraktion och effektivitet. Ökningen av kodhastighet i jämförelse med andra SML-implementationer på olika tester sträcker sig från flera gånger till flera storleksordningar [3] .

Den åtföljs av mycket rik dokumentation, inklusive beskrivningar av knep med icke-trivial användning av språket. På projektets hemsida kan du hitta en nästan komplett lista med länkar till befintlig vetenskaplig och utbildningslitteratur om Standard ML [4] . Överensstämmer ganska strikt med språkdefinitionen och Core Library- specifikationen . Det finns fyra avvikelser från definitionen, som författarna inte planerar att korrigera, utan snarare klassificerar som korrigering av defekter i själva definitionen.

Har en tunn och snabb FFI som ger full tvåvägsinteraktion med C-språket (upp till ömsesidig rekursion ); samt NLFFI ( No-Longer-Foreign Function Interface ) bindningsgeneratorn , låter dig bädda in C-huvudfiler direkt i ett SML-projekt och använda direkta C-funktionsanrop i program på SML [5] .

Stöder många inbyggda plattformar ( x86 , IA-64 , AMD64 , SPARC , ARM , PowerPC / PowerPC64, DEC Alpha , HPPA , S390 ) och olika operativsystem, inklusive olika Unix-liknande system (Debian, Fedora, *BSD) . Under Windows kräver Cygwin eller MinGW (från och med 2014), en inbyggd port ingår i utvecklarnas planer. Har ytterligare back-ends i C , C-- , LLVM ; tidigare inkluderade en back-end till bytecode , men dess stöd avbröts, eftersom det inte blev populärt.

Implementering

MLton ger effektivitet och kompakthet i programmen på grund av:

Metoden för optimering som tillämpas i MLton skiljer sig slående från den traditionella [2] . Konventionella språkkompilatorer med stöd för enheter av högre ordning utför optimeringar direkt på den AST som erhålls efter grammatikanalys och typinferens , varefter de utför stängningskonvertering lågnivåoptimeringar. I MLton ser arbetsflödet ut så här på ett förenklat sätt. Först utförs defunctorization och monomorphization , som ett resultat av vilket koden presenteras på ett mellanspråk med ett avsevärt förenklat typsystem jämfört med SML , men med stöd för högre ordningsfunktioner . Detta följs av defunktionalisering och kod i ett första ordningens mellanspråk som endast består av toppnivådefinitioner ( SSA ). Och först då, på den resulterande platta koden , tillämpas mer traditionella optimeringar (ersätter svansrekursion med platt iteration, konstant fortplantning , borttagning av död kod , val av representation, etc.), såväl som platt stängningsrepresentation . En sådan kedja ger en vinst för både användare av kompilatorn och dess utvecklare:

Totalt använder MLton åtta mellanspråk [8] , inklusive de som bryter mot säkerheten för prestandas skull (till skillnad från till exempel TILT-kompilatorn [9] , som inte äventyrar säkerheten förrän själva maskinkoden), och flera dussin pass.

Tillägg

MLton erbjuder ett antal icke-standardiserade bibliotek:

och mycket mer [11] .

Det finns experimentella tillägg till själva MLton:

Historia, filosofi, utvecklare

I april 1997 utvecklade Stephen Weeks en  defunktorizer för SML/NJ , som omedelbart visade en hastighetsökning på 2 till 6 gånger . I augusti samma år utvecklades en optimeringskompilator, som vid den tiden hette . I oktober implementerades en monomorphizer. Under de följande och ett halvt åren blev den en helt oberoende kompilator och döptes om till MLton, vars första release ägde rum i mars 1999 . År 2005 visade MLton utmärkt programprestanda [3] . smlcsmlc

Redan från början har utvecklingen genomförts med betoning på prestanda genom global programoptimering. [13]

Utvecklarna av MLton dikterar läsningen av namnet på deras kompilator som " millton ", i analogi med ordet " mill " ( engelska  mill ) [1] vilket förmodligen skämtsamt betyder " malning ML-program ", vilket återspeglar användningen av aggressiv transformation och förfiningstekniker program.

MLton-projektet drivs av fyra personer:

Många andra människor gjorde också betydande bidrag [14] .

2013 var MLton-projektet en del av programmet Google Summer of Code [15] [16] .

MLton-utvecklarna är aktiva medlemmar i det efterträdande ML- rådet . År 2014 tilldelades två av dem utmärkelsen "NSF CISE Research Infrastructure (CRI)" [17] " för att ha placerat MLton för nästa generations språkforskning ".

Kritik och jämförelse med alternativ

MLton säkerställer prestanda för program på C / C++- nivå , oavsett vilken programmeringsstil som används .

Nackdelarna härrör direkt från tillämpningen av global analys och flera transformationssteg:

Jämförelse med OCaml

Både OCaml och MLton producerar höghastighetsprogram [19] som ofta konkurrerar med C- och C++-program, har porterats till många plattformar (även om listan inte är identisk) och kommer med omfattande dokumentation. Detta gör frågan om deras skillnader relevant [20] :

Också anmärkningsvärt här är några skillnader mellan kompilatorer, nära relaterade till skillnader mellan språken själva:

Se även

Anteckningar

  1. 1 2 "MLton" uttala . Hämtad 13 november 2014. Arkiverad från originalet 13 november 2014.
  2. 1 2 3 4 5 veckor - Helprogramsammanställning i MLton, 2006 .
  3. 12 MLton prestanda . Hämtad 13 november 2014. Arkiverad från originalet 13 november 2014.
  4. ↑ Hänvisar till . Hämtad 10 december 2014. Arkiverad från originalet 14 december 2014.
  5. No-Long-Foreign, 2001 .
  6. Inline . Hämtad 21 november 2014. Arkiverad från originalet 29 november 2014.
  7. Contify . Hämtad 13 november 2014. Arkiverad från originalet 13 november 2014.
  8. MLtons mellanspråk . Hämtad 13 november 2014. Arkiverad från originalet 13 november 2014.
  9. TILT (TIL-Two) kompilator Arkiverad från originalet den 9 maj 2008.
  10. MLRISC . Hämtad 18 november 2014. Arkiverad från originalet 23 september 2015.
  11. MLtons tillägg . Tillträdesdatum: 13 november 2014. Arkiverad från originalet 2 januari 2015.
  12. Multi-MLton . Hämtad 13 november 2014. Arkiverad från originalet 13 november 2014.
  13. MLton Historia . Hämtad 13 november 2014. Arkiverad från originalet 13 november 2014.
  14. MLton Credits . Hämtad 13 november 2014. Arkiverad från originalet 13 november 2014.
  15. Google Summer of Code 2013 (GSoC/GCI Archive) . Hämtad 14 september 2016. Arkiverad från originalet 23 juni 2016.
  16. MLton i Google Summer of Code 2013 (på MLton-sidan) . Hämtad 14 september 2016. Arkiverad från originalet 23 september 2016.
  17. MLton kompilatorsida .
  18. MLton Nackdelar . Hämtad 13 november 2014. Arkiverad från originalet 13 november 2014.
  19. Frukostposten. SML och OCaml: Så varför var OCaml snabbare?  (engelska) . Hämtad 16 september 2016. Arkiverad från originalet 21 september 2016.
  20. Jämförelse av MLton och OCaml . Hämtad 13 november 2014. Arkiverad från originalet 13 november 2014.
  21. The Caml Hump: ocamldefun (nedlänk) . Beräkna Statique des Applications de Modules Parametrar. Julien Signoles. JFLA 2003. (2010). Tillträdesdatum: 10 december 2014. Arkiverad från originalet den 4 november 2015.   — Defunctorizer för OCaml
  22. Chailloux, Manoury, Pagano, "Utvecklas med OCaml", 2007 .

Länkar