HaskellからJavaScriptコードを生成するコンパイラ。
ウェブサイトとメーリングリストもあります。
急いでいるための3つのオプションがあります。ハッキング、Githubからのインストール、または事前に構築されたバイナリパッケージの1つです。最初の2つのケースでは、まだ行っていない場合は、 $PATHにCabal's Bin Directory(通常は~/.cabal/binを追加する必要があります。 Mac、ポータブルウィンドウ、または一般的なLinuxパッケージからインストールする場合、 path/to/haste-compiler/bin $PATHに追加することをお勧めします。 DebianパッケージとWindowsインストーラーと、一般的なLinuxパッケージに含まれるオプションのインストールスクリプトは、これを自動的に処理します。
または、ハッケージから最新の安定バージョンをインストールできます。
$ 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-cabal haste-bootによってインストールされているのに問題がある場合は、ゼロから構築してから、 --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からHasteをインストールするときは、おそらくすべてが機能していることを確認するために、最初にテストスイートを実行する必要があります。そのために、Haste Rootディレクトリで./runtests.shを実行します。また、 ./runtests.sh NameOfTestを実行して、特定のテストのみを実行することもできます。テストスイートはデフォルトでnodejsインタープリターを使用しますが、これはJS環境変数を設定することで変更される場合があります: JS=other-js-interpreter ./runtests.sh 。他のJavaScript通訳者は機能する場合と機能しない場合があります。 runtests.shは、ハッキングからインストールするときにダウンロードされません。 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を呼び出すことと同等です - myprog.hsを作成します。 Main.Mainは、JS Blobが読み込みが終了するとすぐに呼び出されます。
あなたは通常GHCに通うのと同じフラグをハステックに渡すことができます:
$ hastec -O2 -fglasgow-exts myprog.hs
Hasteには、独自のコマンドライン引数もあります。それらの詳細を読むために、それを--helpてください。特に、 --opt-all 、 --opt-minify 、 --start 、および--with-jsかなり興味深いはずです。
パッケージをHasteとたとえばGHCの両方でコンパイルしたい場合は、CPP拡張機能を条件付きコンピレーションに使用することをお勧めします。 Hasteは、コンパイルするすべてのモジュールでプリプロセッサ記号__HASTE__を定義します。このシンボルは、現在のハステバージョンの整数表現として定義されているため、Hasteバージョンを区別するためにも使用できます。その形式はMAJOR*10 000 + MINOR*100 + MICROです。したがって、バージョン1.2.3は10203、0.4.3として403として表されます。
Hasteには、それぞれHaste-CabalとHaste-PKGという名前のCabalとGHC-PKGのラッパーが付属しています。それらを使用して、Vanilla GHCとCabalと同じようにパッケージをインストールできます。
$ haste-cabal install mtl
最後に、バンドルされたhaste-libライブラリのHaste.Foreignモジュールを使用してJavaScriptコードと対話できます。詳細については、 doc/js-externals.txt参照してください。このライブラリには、DOM操作、イベント処理、先制マルチタスク、キャンバスグラフィックス、ネイティブJSストリング操作などのあらゆる種類の機能も含まれています。
Hasteの仕組みの詳細については、Haste Reportを参照してください。ただし、Hasteの一部がかなり変わった可能性があることに注意してください。
また、開始するために、 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関数は、JSから返された値にいくつかのタイプの不変剤を強制するという点で、GHC FFIよりも少し安全です。パフォーマンスに関しては、複雑なタイプ(リスト、レコードなど)を除いて、GHC FFIとほぼ同じくらい速くなります。
Legacy JavaScriptコードベース全体を捨てるのが快適でない場合は、Hasteプログラムから選択した機能をエクスポートして、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
fun.hs 、 main関数が実行されると、機能のfunをエクスポートします。 JavaScriptは明らかにその後実行する必要があるため、 legacy.jsで「実際の」メイン関数を作成します。最後に、Hasteのmain関数を最初に実行してプログラムを開始するようコンパイラに指示します( $HASTE_MAIN CompilerがHaste mainに選択した名前に置き換えられ、次に自分のmymainを実行します。
Haste.Foreignのメカニズムについては、この論文で詳しく説明しています。
Haste.App Module Hierarchyのフレームワークを使用して、Ajax/Websocketsなどの単一行を記述せずにサーバーと通信するWebアプリケーションを簡単に記述できます。何よりも:それは完全に安全です。
本質的に、Webアプリケーションを単一のプログラムとして記述します - クライアントとサーバーコードの強制的な分離はありません。その後、Hasteを使用してGHCを使用してプログラムをコンパイルし、2つのコンパイラがそれぞれ魔法のようにクライアントとサーバーコードを生成します。
HasteとVanilla GHCの両方で同じライブラリをインストールする必要があります(条件付きコンパイルを使用してこれを回避しない限り)。 haste-compilerはhaste-libのすべてがバンドルされているため、サードパーティの図書館を使用している場合にのみ、これに関心がある必要があります。また、HTMLおよびJSファイルを提供するために、Webサーバーも必要です。ネイティブコンパイルパスによって生成されたバイナリは、WebSocketsを使用してクライアントパーツとのみ通信し、単独でファイルを提供しません。
haste.appの例の例はexamples/haste-appおよびexamples/chatboxで入手できます。
これが正確にどのように機能するかの詳細については、このペーパーを参照してください。
他のパッケージと同様に、Haste Base Directoryでcabal haddock実行することにより、Haste-Lib用の独自のドキュメントセットを作成できます。
または、オンラインドキュメントを見ることができます。
Hasteは標準のHaskellライブラリを使用できます。ただし、いくつかの原始操作はまだ実装されていません。これは、それらを使用するコードがコンパイラ警告を与え、怒りのエラーで実行時に死亡することを意味します。一部のライブラリは、外部Cコードにも依存します - そのようなライブラリを使用する場合は、cビットをJavaScriptに自分で移植する必要があります(おそらくEmscriptenを使用) --with-jsを使用してプログラムにリンクする必要があります。
すべてのGHC Primopsが実装されているわけではありません。実装されていないPrimopに遭遇した場合は、問題を示す小さなテストケースと一緒に報告してください。
テンプレートHaskellはまだ壊れています。
生成されたコードは、 Function.lengthを保持することは保証されていないため、Vanilla閉鎖コンパイラのADVANCED_OPTIMIZATIONSと互換性がありません。 haste-boot 、このプロパティを保存する閉鎖の互換性のあるパッチ付きバージョンをバンドルします。 --opt-minifyオプションを使用してhastecを呼び出すと、このパッチされたバージョンを使用して、高度な最適化を伴う生成されたコードを削除します。