@@ -22,7 +22,7 @@ tags: Asterius, WebAssembly
2222GHCのHEAD<small >(開発中のバージョン)</small >を都度フォークして、現在活発に開発中です。
2323Template Haskellと、GHC標準におけるIOを行う関数(の大半)を除いた、すべての機能が利用できるようになっています。
2424現状のWebAssemblyを実用する上で必要不可欠であろう、FFIもサポートされています。
25- つまり、JavaScriptからWebAssemblyにコンパイルされたHaskellの関数を読んだり 、HaskellからJavaScriptの関数を呼ぶことができます!
25+ つまり、JavaScriptからWebAssemblyにコンパイルされたHaskellの関数を呼んだり 、HaskellからJavaScriptの関数を呼ぶことができます!
2626何かしらのIO処理を行う場合は、基本的にこのFFIを使ってJavaScriptの関数を呼ぶことになります。
2727
2828加えて、` ahc-cabal ` という名前のコマンドで、cabalパッケージを利用することもできます。
@@ -50,7 +50,7 @@ Asteriusは、GHCをフォークしていくつかの機能を追加して作ら
5050詳細な違いは[ About the custom GHC fork] ( https://tweag.github.io/asterius/custom-ghc/ ) にまとまっています。近い将来GHC本体に取り込まれそうな修正ばかりではないかと。
5151
5252それからこれは、ブラウザーでHaskellを動かすことができるという点でAsteriusの競合に当たる、GHCJSと比較した場合の話ですが、FFIを利用して、JavaScriptから** 直接** Haskellを呼ぶことができるようになっているのも、優れた点と言えるでしょう。
53- GHCJSは[ こちらのドキュメント曰く] ( https://github.com/ghcjs/ghcjs/blob/3959a9321a2d3e2ad4b8d4c9cc436fcfece99237/doc/foreign-function-interface.md#calling-haskell-from-javascript ) 、JavaScriptからHaskellを呼ぶ機能は備えてはいるものの、簡単ではないため、ドキュメントも書かれておらず、推奨されてません 。
53+ GHCJSは[ こちらのドキュメント曰く] ( https://github.com/ghcjs/ghcjs/blob/3959a9321a2d3e2ad4b8d4c9cc436fcfece99237/doc/foreign-function-interface.md#calling-haskell-from-javascript ) 、JavaScriptからHaskellを呼ぶ機能は備えてはいるものの、簡単ではないためドキュメントも書かれておらず、推奨されていません 。
5454これでは状況によってはかなり使いづらいでしょう。
5555今回私が試したように、コアとなる処理だけをHaskellの関数として書いて、それをJavaScriptから呼び出すということができないのです。
5656
@@ -60,16 +60,17 @@ GHCJSは[こちらのドキュメント曰く](https://github.com/ghcjs/ghcjs/bl
6060foreign export javascript " func" func :: Int -> Int -> Int
6161```
6262
63- ただし、 実際に今回試してみたところ、 Asterius ではまだバグがあったりしたので 、 この用途では依然使いにくいという状況ではありますが...( 詳細は後で触れます)。
63+ ただし、 実際に今回試してみたところ、 Asterius ではまだバグがあったので 、 この用途では依然使いにくいという状況ではありますが...( 詳細は後で触れます)。
6464
6565# 👎Asteriusのイマイチなところ
6666
6767Asterius は、 やっぱりまだまだ開発中で、 バグが多いです。
6868今回の目的もバグのために果たせませんでした😢。
69- 先ほども触れたとおり、 特に未完成なのが、 `IO `とTemplate Haskell です。
69+
70+ 先ほども触れたとおり、 特に未完成なのが、 IO とTemplate Haskell です。
7071GHC なら使えるはずの`IO `な関数の多くが使えませんし、 Template Haskell に至っては一切利用できません。
7172
72- ` IO `については 、 現状、< small>( `putStrLn` などのよく使われる)</ small> 一部を除き、 FFI < small>( `foreign import javascript`)</ small> を使ってJavaScript の関数経由でよばなけれなりません。
73+ IO については 、 現状、< small>( `putStrLn` などのよく使われる)</ small> 一部を除き、 FFI < small>( `foreign import javascript`)</ small> を使ってJavaScript の関数経由でよばなけれなりません。
7374これは、 入出力関連のAPI を一切持たないという現状のWebAssembly の事情を考えれば、 致し方ない仕様だとも言えます。
7475[WASI ](https:// github. com/ WebAssembly / WASI )の策定によってこの辺の事情が変わるまでの間に、 すべて`foreign import javascript`で賄うというのも、 なかなか面倒なことでしょうし。
7576
@@ -87,7 +88,7 @@ Template Haskellに関しては、現在[こちらのブランチ](https://githu
8788Asterius のドキュメント「 [IR types and transformation passes](https:// tweag. github. io/ asterius/ ir/ )」 をざっくり要約してみると、 Asterius は以下のような流れで動くそうです。
8889実際には`ahc- link`というコマンドがこれらの手順をまとめて実行するので、 ユーザーの皆さんはあまり意識する必要はないでしょう。
8990
90- 1 . [フロントエンドプラグイン](https:// downloads. haskell. org/~ ghc/ latest/ docs/ html/ users_guide/ extending_ghc. html# frontend- plugins)という仕組みでラップしたGHC < small>( のフォーク)</ small> を使い、 GHC が生成した 、 Cmm という中間言語で書かれたソースを 、 `AsteriusModule `という独自のオブジェクトに変換します。
91+ 1 . [フロントエンドプラグイン](https:// downloads. haskell. org/~ ghc/ latest/ docs/ html/ users_guide/ extending_ghc. html# frontend- plugins)という仕組みでラップしたGHC < small>( のフォーク)</ small> を使い、 GHC が生成した Cmm という中間言語で書かれたコードを 、 `AsteriusModule `という独自のオブジェクトに変換します。
91921 . `ahc- ld`という専用のリンカーで、 WASM 向けにリンクします。
92931 . 最後に、 `ahc- dist`というコマンドで、 リンクしたモジュールを実行できる状態にします。
9394 - [binaryen](https:// github. com/ WebAssembly / binaryen)か、 [wasm- toolkit](https:// github. com/ tweag/ asterius/ tree/ master/ wasm- toolkit)というHaskell でWASM を書く言語内DSL を利用して、 `ahc- ld`がリンクしたモジュールを検証し、 `. wasm`ファイルに変換して、
@@ -128,6 +129,6 @@ template-haskellパッケージに間接的に依存しているだけで依存
128129# ✅おわりに
129130
130131今回Asterius を試したことで、 ブラウザー上でHaskell を動かす、 もう一つの可能性を知ることができました。
131- とは言え、 バグが多かったり依存関係から` IO `や Template Haskell を抜き出さなければならなかったりで、 まだまだ実用的とは言い難いでしょう。
132+ とは言え、 バグが多かったり依存関係から IO や Template Haskell を抜き出さなければならなかったりで、 まだまだ実用的とは言い難いでしょう。
132133しかし、 今回報告したバグが直れば、 ブラウザーによる処理のコアに当たる部分をHaskell で書く、 という応用が利きそうです。
133- 例えば Pandoc など Haskell 製アプリケーションを 、 ブラウザーから操作する 、 なんてアプリケーション作りが捗りそうですね!
134+ 例えば Pandoc など Haskell 製アプリケーションをブラウザーから操作する 、 なんてアプリケーション作りが捗りそうですね!
0 commit comments