Ein Compiler zum Generieren von JavaScript -Code von Haskell.
Es hat sogar eine Website und eine Mailingliste.
Sie haben drei Optionen zum Eile: Installieren von Hackage, aus Github oder aus einem der vorgefertigten Binärpakete. In den ersten beiden Fällen müssen Sie in $PATH Regel ~/.cabal/bin add Cabals Bin -Bin -Verzeichnis hinzufügen, wenn Sie dies noch nicht getan haben. Bei der Installation vom Mac-, tragbaren Windows- oder generischen Linux-Paket können Sie Ihrem $PATH path/to/haste-compiler/bin hinzufügen. Das Debian -Paket sowie das Windows -Installationsprogramm und das optionale Installationsskript im Generic Linux -Paket kümmern sich automatisch darum.
Oder Sie können die neueste stabile Version von Hackage installieren:
$ cabal install haste-compiler
$ haste-boot
Das Gebäude aus Github Source ist ebenso einfach. Nachdem Sie die Quelle überprüft haben, cd zum Quellbaum und ausführen:
$ cabal install
$ haste-boot --force --local
Alternativ können Sie auch mit Stack aus Github Source erstellen:
$ stack install
$ haste-boot --force --local
Weitere Informationen zu Erstellungsanforderungen und -verfahren für die verschiedenen Plattformen finden Sie unter doc/building.md .
Wenn Sie Probleme mit dem von haste-boot installierten haste-cabal haben, können Sie versuchen, es von Grund auf neu aufzubauen und dann die Flagge --no-haste-cabal Flagge zu übergeben, um haste-boot zu erhalten:
$ git clone https://github.com/valderman/cabal.git
$ cd cabal && git checkout haste-cabal
$ cd Cabal && cabal install
$ cd ../cabal-install && cabal install
Bei der Installation von Eile von Github sollten Sie wahrscheinlich zuerst die Testsuite ausführen, um zu überprüfen, ob alles funktioniert. Um dies zu tun, führen ./runtests.sh in dem Eile -Root -Verzeichnis aus. Sie dürfen auch nur einen bestimmten Test durch Ausführen durchführen ./runtests.sh NameOfTest Die Testsuite verwendet standardmäßig den nodejs -Interpreter. Dies kann jedoch geändert werden, indem die JS Umgebungsvariable als solche festgelegt wird: JS=other-js-interpreter ./runtests.sh . Andere JavaScript -Dolmetscher können funktionieren oder nicht. runtests.sh wird bei der Installation von Hackage nicht heruntergeladen. Sie müssten es von Github herunterladen.
Um den beim Kompilieren verwendeten Patched --opt-minify Clossure-Compiler zu erstellen, wird die Verschlussquelle abgerufen, patches/closure-argument-removal.patch anwenden und erstellen Sie sie so, wie Sie es normalerweise tun würden. Dies ist jedoch normalerweise nicht erforderlich, da haste-boot beim Lauf einen vorkompilierten Verschluss Binär biegt.
Weitere detailliertere Build -Anweisungen finden Sie unter doc/building.md .
Eile wurde getestet, um auf Windows- und OSX -Plattformen zu arbeiten, wurde jedoch hauptsächlich auf GNU/Linux entwickelt. Wenn Sie auf einer GNU/Linux -Plattform ausgeführt werden, werden Sie wahrscheinlich weniger Fehler erhalten.
Um Ihr Haskell -Programm zu einem JavaScript -Blob zu kompilieren, der bereit ist, in ein HTML -Dokument aufgenommen zu werden oder mit einem Befehlszeilen -Interpreter auszuführen:
$ hastec myprog.hs
Dies entspricht dem Aufruf von GHC -Make MyProg.HS; Main.main wird angerufen, sobald der JS -Blob das Laden beendet hat.
Sie können die gleichen Flaggen an Hastec übergeben, wie Sie normalerweise an GHC übergehen würden:
$ hastec -O2 -fglasgow-exts myprog.hs
Eile hat auch seine eigenen Argumente für Befehlszeilen. Rufen Sie es mit --help auf, um mehr über sie zu lesen. Insbesondere --opt-all - --opt-minify , --start und --with-js sollten ziemlich interessant sein.
Wenn Sie möchten, dass Ihr Paket sowohl mit Eile als auch mit GHC kompiliert wird, möchten Sie möglicherweise die CPP -Erweiterung für die bedingte Zusammenstellung verwenden. Haste definiert das Präprozessorsymbol __HASTE__ in allen Modulen, die es zusammenstellt. Dieses Symbol kann auch verwendet werden, um zwischen Eile -Versionen zu unterscheiden, da es als eine ganzzahlige Darstellung der aktuellen Eile -Version definiert ist. Sein Format ist MAJOR*10 000 + MINOR*100 + MICRO . Version 1.2.3 wäre somit als 10203 und 0,4,3 als 403 dargestellt.
Eile kommt auch mit Wrappern für Cabal und GHC-PKG namens Ease-Cabal bzw. Eile-PKG. Sie können sie verwenden, um Pakete genauso zu installieren, wie Sie es mit Vanilla GHC und Cabal tun würden:
$ haste-cabal install mtl
Schließlich können Sie mit dem JavaScript-Code mit dem Haste.Foreign Modul in der gebündelten haste-lib -Bibliothek interagieren. Weitere Informationen dazu finden Sie unter doc/js-externals.txt . Diese Bibliothek enthält auch alle Arten von Funktionen für DOM -Manipulation, Ereignisbehandlung, präventive Multitasking, Canvas -Grafiken, native JS -String -Manipulation usw.
Weitere Informationen darüber, wie Eile funktioniert, finden Sie im Eile -Bericht, obwohl sich Teile von Eile möglicherweise ziemlich verändert haben.
Sie sollten sich auch den Dokumentation und/oder den Quellcode für haste-lib ansehen, der sich im Verzeichnis der libraries/haste-lib Verzeichnis befindet, und die kleinen Programme im examples , um loszulegen.
Wenn Sie Programme schreiben, möchten Sie wahrscheinlich ein natives JavaScript in Ihrem Programm verwenden. Bindungen an native Bibliotheken beispielsweise. Der bevorzugte Weg, dies zu tun, ist das Haste.Foreign -Modul:
{-# LANGUAGE OverloadedStrings #-}
import Haste.Foreign
addTwo :: Int -> Int -> IO Int
addTwo = ffi "(function(x, y) {return x + y;})"
Die ffi -Funktion ist etwas sicherer als der GHC -FFI, da sie einige Typ -Invarianten für Werte erzwingt, die von JS zurückgegeben werden, und bequemer ist. In Bezug auf die Leistung ist es ungefähr so schnell wie der GHC-FFI, mit Ausnahme komplexer Typen (Listen, Datensätze usw.), wo es schneller ist.
Wenn Sie sich nicht wohl fühlen, wenn Sie Ihre gesamte Legacy JavaScript -Code -Basis herauswerfen, können Sie ausgewählte Funktionen aus Ihrem Eile -Programm exportieren und sie von JavaScript anrufen:
lustig.hs:
{-# LANGUAGE OverloadedStrings #-}
import Haste.Foreign
import Haste.Prim (toJSStr)
fun :: Int -> String -> IO String
fun n s = return $ "The number is " ++ show n ++ " and the string is " ++ s
main = do
export "fun" fun
Legacy.js:
function mymain() {
console.log(Haste.fun(42, "hello"));
}
... dann kompilieren mit:
$ hastec '--start=$HASTE_MAIN(); mymain();' --with-js=legacy.js fun.hs
fun.hs exportiert den fun wenn seine main ausgeführt wird. Unser JavaScript muss offensichtlich danach laufen, also erstellen wir unsere "echte" Hauptfunktion in legacy.js . Schließlich sagen wir dem Compiler, das Programm zu starten, indem wir die main von Haste zuerst ausführen (der $HASTE_MAIN wird durch den Namen, den der Compiler für die main wählt, ersetzt) und dann unseren eigenen mymain auszuführen.
Die Mechanik der Haste.Foreign wird in diesem Artikel ausführlich beschrieben.
Wenn Sie das Framework aus der Hierarchie von Haste.App -Modul verwenden, können Sie einfach Webanwendungen schreiben, die mit einem Server kommunizieren, ohne eine einzige Zeile von Ajax/Websockets/was auch immer schreiben zu müssen. Das Beste von allen: Es ist völlig sicher.
Im Wesentlichen schreiben Sie Ihre Webanwendung als einzelnes Programm - keine erzwungene Trennung Ihres Clients und Servercode. Anschließend kompilieren Sie Ihr Programm einmal mit Eile und einmal mit GHC, und die beiden Compiler generieren den Client- bzw. Servercode auf magische Weise.
Sie müssen dieselben Bibliotheken sowohl mit Eile als auch mit Vanille -GHC installieren lassen (es sei denn, Sie verwenden eine bedingte Zusammenstellung, um dies zu umgehen). haste-compiler wird mit ganz haste-lib gebündelt, sodass Sie sich nur damit befassen müssen, wenn Sie Bibliotheken von Drittanbietern verwenden. Sie benötigen auch einen Webserver, um Ihre HTML- und JS -Dateien zu bedienen. Die von der native Compilation -Pass generierte Binärdehnung kommuniziert nur mit dem Kundenteil mit Websockets und serviert keine eigenen Dateien.
Beispiele für Eile.App in Aktion sind in examples/haste-app und examples/chatbox verfügbar.
Weitere Informationen darüber, wie genau dies funktioniert, finden Sie in diesem Papier.
Sie können Ihre eigenen Dokumente für Eile-Lib erstellen, indem Sie wie bei jedem anderen Paket cabal haddock im Eile Base-Verzeichnis leiten.
Oder Sie können sich nur die Online -Dokumente ansehen.
Eile kann Standard -Haskell -Bibliotheken verwenden. Einige primitive Operationen werden jedoch immer noch nicht implementiert, was bedeutet, dass Sie eine Code verwenden, die Sie verwenden, eine Compiler -Warnung und dann zur Laufzeit mit einem wütenden Fehler sterben. Einige Bibliotheken sind auch vom externen C -Code angewiesen. Wenn Sie eine solche Bibliothek verwenden möchten, müssen Sie die C -Bits selbst in JavaScript (möglicherweise mit EMSCIPTEN) portieren und sie mit --with-js in Ihr Programm verknüpfen.
Nicht alle GHC -Primops werden implementiert. Wenn Sie auf einen nicht implementierten Primop stoßen, melden Sie ihn bitte zusammen mit einem kleinen Testfall, der das Problem demonstriert.
Vorlage Haskell ist noch gebrochen.
Der generierte Code ist nicht mit den ADVANCED_OPTIMIZATIONS des Vanilleschließers kompatibel, da die Function.length nicht garantiert wird. haste-boot bündelt eine mit Kompatibilität gepatisierte Version des Verschlusses, die diese Eigenschaft bewahrt. Das Aufrufen hastec mit der Option --opt-minify verwendet diese Patched-Version, um den generierten Code mit erweiterten Optimierungen zu minimieren.