從Haskell生成JavaScript代碼的編譯器。
它甚至有一個網站和一個郵件列表。
您有三個匆忙的選擇:從駭客,github或一種預先構建的二進制軟件包之一安裝。在前兩種情況下,如果尚未這樣做,則需要添加添加Cabal的bin目錄,通常~/.cabal/bin $PATH從Mac,Portable Windows或Generic Linux軟件包安裝時,您可能需要在$PATH中添加path/to/haste-compiler/bin 。 Debian軟件包以及Windows安裝程序和通用Linux軟件包中包含的可選安裝腳本會自動處理此功能。
或者,您可以從Hackage安裝最新的穩定版本:
$ cabal install haste-compiler
$ haste-boot
從github源建造同樣容易。檢查源後, cd到源樹並運行:
$ cabal install
$ haste-boot --force --local
另外,您也可以使用stack從github源構建:
$ stack install
$ haste-boot --force --local
有關各種平台的構建要求和程序的更多信息,請參見doc/building.md 。
如果您在haste-boot安裝的haste-cabal Haste-Coot)上遇到問題,則可以嘗試從頭開始構建它,然後將其傳遞--no-haste-cabal國旗haste-boot :
$ git clone https://github.com/valderman/cabal.git
$ cd cabal && git checkout haste-cabal
$ cd Cabal && cabal install
$ cd ../cabal-install && cabal install
從Github急速安裝時,您可能應該先運行測試套件,以驗證所有內容是否有效。為此,在急速根目錄中執行./runtests.sh 。您也可以通過執行./runtests.sh NameOfTest來運行特定的測試。默認情況下,測試套件使用nodejs解釋器,但是可以通過設置JS環境變量進行修改: JS=other-js-interpreter ./runtests.sh 。其他JavaScript口譯員可能會或可能行不通。 runtests.sh從hackage安裝時未下載。您必須從Github下載它。
要構建使用--opt-minify編譯時使用的修補閉合編譯器,請獲取閉合源,應用patches/closure-argument-removal.patch並像往常一樣構建它。但是,這通常不是必需的,因為haste-boot在運行時會獲取預編譯的閉合二進制。
有關更詳細的構建說明,請參見doc/building.md 。
HASTE已經過測試以在Windows和OSX平台上工作,但主要是在GNU/Linux上開發的。因此,在GNU/Linux平台上運行可能會使您更少的錯誤。
將您的Haskell程序編譯到準備中的JavaScript Blob中,準備包含在HTML文檔中或使用命令行解釋器運行:
$ hastec myprog.hs
這等同於調用GHC -make myprog.hs; JS BLOB完成加載後,Main.main將立即被召喚。
您可以將相同的旗幟傳遞給HASTEC,就像您通常傳遞給GHC:
$ hastec -O2 -fglasgow-exts myprog.hs
Haste還擁有自己的一組命令行參數。用它來調用--help來閱讀有關它們的更多信息。特別是--opt-all , --opt-minify , --start和--with-js應該相當有趣。
如果您希望包裝與Haste和GHC一起編譯,則可能需要使用CPP擴展程序進行有條件的編譯。急速在其編譯的所有模塊中定義了預處理器符號__HASTE__ 。該符號也可以用來區分急速版本,因為它被定義為當前急速版本的整數表示。它的格式為MAJOR*10 000 + MINOR*100 + MICRO 。因此,1.2.3版將表示為10203,為0.4.3為403。
Haste還配備了Cabal和GHC-PKG的包裝紙,分別名為Haste-Cabal和Haste-Pkg。您可以像使用Vanilla GHC和Cabal一樣使用它們來安裝包裹:
$ haste-cabal install mtl
最後,您可以使用Haste.Foreign模塊在捆綁的haste-lib庫中與JavaScript代碼進行交互。有關此信息的更多信息,請參見doc/js-externals.txt 。該庫還包含各種功能,用於DOM操縱,事件處理,先發製人多任務處理,帆布圖形,本機JS字符串操縱等。
有關急速工作的更多信息,請參閱急速報告,儘管要當心急速的部分可能發生了很大變化。
您還應該查看位於libraries/haste-lib目錄中的haste-lib文檔和/或源代碼,以及examples目錄中的小程序。
編寫程序時,您可能需要在程序中使用一些本機JavaScript;例如,與本地庫的綁定。這樣做的首選方法是Haste.Foreign外國模塊:
{-# LANGUAGE OverloadedStrings #-}
import Haste.Foreign
addTwo :: Int -> Int -> IO Int
addTwo = ffi "(function(x, y) {return x + y;})"
ffi函數比GHC FFI更安全,因為它在從JS返回的值上執行某種類型的不變性,並且更方便。從性能角度來看,它大致與GHC FFI的速度大致一樣快,除了複雜類型(列表,記錄等),它是一個數量級的順序。
如果您不願意丟棄整個舊的JavaScript代碼庫,則可以從急速程序中導出選定的功能,並從JavaScript致電:
fun.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"));
}
...然後編譯:
$ hastec '--start=$HASTE_MAIN(); mymain();' --with-js=legacy.js fun.hs
當運行其main函數時, fun.hs將導出功能fun 。我們的JavaScript顯然需要在此之後運行,因此我們在legacy.js中創建了“真實”的主要功能。最後,我們告訴編譯器首先執行Haste的main功能( $HASTE_MAIN將被編譯器選擇為Haste main選擇的任何名稱所取代),然後執行我們自己的mymain 。
本文詳細介紹了Haste.Foreign的機制。
使用Haste.App模塊層次結構中的框架,您可以輕鬆編寫與服務器通信的Web應用程序,而無需編寫AJAX/Websockets/whitch的單行。最重要的是:它完全是安全的。
從本質上講,您將Web應用程序寫為一個程序 - 不再有強制分離客戶端和服務器代碼。然後,您一旦使用急速進行編譯,然後使用GHC來編譯程序,兩個編譯器將分別神奇地生成客戶端和服務器代碼。
您將需要與Haste和Vanilla GHC同時安裝相同的庫(除非您使用條件彙編來解決此問題)。 haste-compiler捆綁在一起,所有haste-lib都捆綁在一起,因此,如果您使用第三方圖書館,您只需要擔心這一點。您還需要一個Web服務器,以服務您的HTML和JS文件;本機彙編通行證生成的二進製文件僅使用Websocket與客戶部件進行通信,並且不會單獨使用任何文件。
haste.app in Action的示例可以在examples/haste-app和examples/chatbox中獲得。
有關此操作方式的更多信息,請參見本文。
您可以與其他任何包裝一樣,在急速基本目錄中運行cabal haddock為急速lib構建自己的文檔。
或者,您可以查看在線文檔。
Haste能夠使用標準的Haskell庫。但是,某些原始操作仍未實施,這意味著任何使用它們的代碼都會給您發出編譯器警告,然後在運行時死亡,並以憤怒的錯誤。一些庫還取決於外部C代碼 - 如果您想使用此類庫,則需要將C位移植到JavaScript自己(也許使用Emscripten),並使用--with-js將它們鏈接到您的程序中。
並非所有GHC序列都已實施;如果您遇到未完成的PRIMOP,請與一個小的測試用例一起報告,以證明問題。
模板Haskell仍然破裂。
生成的代碼與香草閉合編譯器的ADVANCED_OPTIMIZATIONS不兼容,因為它不能保證保留Function.length 。 haste-boot捆綁了兼容性的封閉式修補版本,該版本確實保留了此屬性。使用--opt-minify選項調用hastec將使用此修補版本來縮小具有高級優化的生成代碼。