#はじめに
Chicken SchemeのようにCへコンパイルする処理系ならば、Clang → LLVM → emscripten → javascriptが可能なはずと実験作業の私的メモ。
間違いやもっと良い方法があるなどの指摘は大歓迎。
#インストール
まずclang版chickenのインストール。
言語処理系としては珍しく問題もなく普通にコンパイル可能。
https://wiki.call-cc.org/chickenista-guide
$ wget https://code.call-cc.org/releases/5.1.0/chicken-5.1.0.tar.gz
$ tar xvf chicken-5.1.0.tar.gz
$ cd chicken-5.1.0
$ make PLATFORM=linux PREFIX=$HOME/chicken/chicken-5.1.0-llvm C_COMPILER=clang #システム用と混ぜないためにPREFIXを指定。
$ make PLATFORM=linux PREFIX=$HOME/chicken/chicken-5.1.0-llvm C_COMPILER=clang install
Clang版のインストール後確認ハロワ。
$ $HOME/chicken/chicken-5.1.0-llvm/bin/csc -version
$ mkdir $HOME/tmp && cd $HOME/tmp #適当な作業ディレクトリに移動
$ echo '(print "Hello World.")' > hello.scm
$ $HOME/chicken/chicken-5.1.0-llvm/bin/csc hello.scm
$ ./hello
Libraryであるeggのインストール。cscバイナリを指定すればPREFIX指定などは不要。
$ $HOME/chicken/chicken-5.1.0-llvm/bin/chicken-install utf8
#Cへのコンパイル
ここを参考にCへのコンパイルをします。ただし必要ファイルに変更があるようです。また最適化をかけないと実行に失敗します。
https://wiki.call-cc.org/man/5/Deployment#distributing-compiled-c-files
$ cd $HOME/chicken-5.1.0 #解凍してビルドしたディレクトリに移動。pushdの方が便利。
$ cp chicken-syntax.c chicken.h extras.c modules.c build-version.c eval.c internal.c runtime.c chicken-config.h expand.c library.c $HOME/tmp
$ cd $HOME/tmp
$ $HOME/chicken/chicken-5.1.0-llvm/bin/csc -t hello.scm
#Javascriptへのコンパイル
#最適化しないとnodeでエラーが出ます。
$ emcc hello.c -I$HOME/chicken/chicken-5.1.0-llvm/include/chicken/ -DHAVE_CHICKEN_CONFIG_H -DSEARCH_EXE_PATH build-version.c eval.c expand.c internal.c library.c modules.c runtime.c chicken-syntax.c -s WASM=0 -Wno-implicit-function-declaration -Wno-c99-extensions -O2 -o hello.html
$ node --stack-size=65500 hello.js #--stack-sizeを指定しないとnodeでエラーが出ます。
#気が向いたらのTodo
文体。
emscriptenのインストール手順。
emscripten関連のFFI。
eval機能削除等の小型化。
最適化関連の実験。
#未検証の技術的な疑問点と現時点の予想メモ
気が向いたらそのうち検証する
csc -tによる生成Cコードの処理系依存;おそらく古めのC標準とLLVM準拠と予想
r5rsへの互換性準拠チェック;そこそこ動くと予想、何かチェック用ライブラリありませんか?
ChickenとCとjavascriptのFFI部分;ChickenとCは苦労しないと予想、Javascipt関連は苦労するのではないか
同期処理などemscriptenの特殊性関連;おそらくマニュアル等に記載があるので普通に調べる