Skip to content

Commit c1605fe

Browse files
committed
細かい表現の修正、読点の位置の調整など
型としての`IO`と入出力機能全般を指してのIOの区別がなんか微妙になってしまったけど、まぁいいか。
1 parent 2a8da20 commit c1605fe

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

preprocessed-site/posts/2019/asterius.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ tags: Asterius, WebAssembly
2222
GHCのHEAD<small>(開発中のバージョン)</small>を都度フォークして、現在活発に開発中です。
2323
Template 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
6060
foreign export javascript "func" func :: Int -> Int -> Int
6161
```
6262

63-
ただし実際に今回試してみたところAsteriusではまだバグがあったりしたのでこの用途では依然使いにくいという状況ではありますが...(詳細は後で触れます)。
63+
ただし実際に今回試してみたところAsteriusではまだバグがあったのでこの用途では依然使いにくいという状況ではありますが...(詳細は後で触れます)。
6464

6565
# 👎Asteriusのイマイチなところ
6666

6767
Asteriusやっぱりまだまだ開発中でバグが多いです
6868
今回の目的もバグのために果たせませんでした😢。
69-
先ほども触れたとおり特に未完成なのが`IO`とTemplate Haskellです
69+
70+
先ほども触れたとおり特に未完成なのがIOTemplate Haskellです
7071
GHCなら使えるはずの`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
8788
Asteriusのドキュメント[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`という独自のオブジェクトに変換します
9192
1. `ahc-ld`という専用のリンカーでWASM向けにリンクします
9293
1. 最後に`ahc-dist`というコマンドでリンクしたモジュールを実行できる状態にします
9394
- [binaryen](https://github.com/WebAssembly/binaryen)か[wasm-toolkit](https://github.com/tweag/asterius/tree/master/wasm-toolkit)というHaskellWASMを書く言語内DSLを利用して`ahc-ld`がリンクしたモジュールを検証し`.wasm`ファイルに変換して
@@ -128,6 +129,6 @@ template-haskellパッケージに間接的に依存しているだけで依存
128129
# ✅おわりに
129130

130131
今回Asteriusを試したことでブラウザー上でHaskellを動かすもう一つの可能性を知ることができました
131-
とは言えバグが多かったり依存関係から`IO`やTemplate Haskellを抜き出さなければならなかったりでまだまだ実用的とは言い難いでしょう
132+
とは言えバグが多かったり依存関係からIOTemplate Haskellを抜き出さなければならなかったりでまだまだ実用的とは言い難いでしょう
132133
しかし今回報告したバグが直ればブラウザーによる処理のコアに当たる部分をHaskellで書くという応用が利きそうです
133-
例えばPandocなどHaskell製アプリケーションをブラウザーから操作するなんてアプリケーション作りが捗りそうですね
134+
例えばPandocなどHaskell製アプリケーションをブラウザーから操作するなんてアプリケーション作りが捗りそうですね

0 commit comments

Comments
 (0)