低レベルなことがしたい
低レベルなことがしたい。もうちょっと具体的に言うと、DBMを書きたい。コンパイラを書きたい。ただ動くだけじゃなくて効率的な実装がしたい。CPUの歓声が聞きたい。そのためにもバイナリを簡単に扱える言語が良い。マシン語が透けて見える言語が良い。いっそインラインアセンブラが欲しい。システムコールがスムーズに出来る(≒ C をスムーズに呼べる)言語が良い。どんな言語が適任か。
因みにコンパイラはLLVMをバックエンドに使う予定。何の言語のコンパイラかは決めてない。SMLのサブセットかmini Camlかその辺?
まず考えられるのはダイレクトにマシン語が見えるアセンブラ。でも移植性が無いからボツ。じゃあ他には?
- LLVMアセンブラ
- C
- C++
- Java
- SML
- Haskell
- OCaml
- ATS
- Go
- D
- Rust
あたりかな?と思う。Common Lispはバイナリの扱いは案外いけるが流石に効率的な実装は難しい。ガチガチに型宣言つけていくくらいならそもそも静的型付けで型推論のある言語を使った方が良い。その意味ではHylasに期待したけど今はまだメンテナンス中。多分完成したら使う。
Nimrodなる言語もあるらしいがあまり聞かないのでスルー。
因みにこの中で自分が普通に書けるのはCとJava。OCamlもまあまあ。HaskellはRWH読んだっきりでアウトプットはしてない。C++とSMLはHello World + α程度。他はサンプルコード眺めてHello Worldしたかしてないかくらい。
LLVMアセンブラ
移植性のあるアセンブラ。アセンブラとは言ってもモジュールシステムもある、関数もある。一度学んでおくと便利な気はする。ただ、多少Cの呼び出しが面倒。メンテナンス性が悪そう。総合して悪くはない、程度かな。
C
Cの呼び出し易さにおいて他の追随を許さない言語。高級アセンブラの別名の通りマシン語も透けて見える。というか、書こうとしているDBMのプロトタイプはCで書かれている。だが、既にpicrinでCを書いているし、今回やりたいのとは違う気がするのでおやすみ。
C++
LLVM自体C++で書かれているしbetter Cな側面もあるし今回の目的に一番合致しそうな言語。ではあるんだけどあまり好きになれない。一度はやっておかなきゃいけないんだろうけど…。一旦保留で。
Java
安心と信頼のJava。30億のデバイスで走るJava。バイナリの扱いは上々だけど今回は使いたくない。理由は、必要上の理由ではなく論理的な理由でオブジェクトを作らなきゃいけない点。メモリ管理が出来ない点。ポインタを扱えない点。抽象性のための犠牲なんだろうけど今回は抽象性ではなく効率をとりたい。
ただ、後で習作としてDBMをJavaで書き直すのはありかもしれない。JavaというかMirahだろうけど。
SML
Standard ML。人工知能御三家のうち唯一静的型付けの言語。Haskellerがモナドモナドうるさい所為で隠れがちだがML系の言語は意外とバイナリの扱いも出来る気がする。記号処理に向いてるからとコンパイラを書こうとしたときにバイナリ扱えないと片手落ちだからかな。実際SML、OCaml、Haskellは全てセルフホストコンパイラがある。
SMLの中でも今回検討してるのはSML#とMLton。どちらもCとの相互呼出がある。しかも1行書くだけ。だが複雑な構造体とかはどうしようね。
SML#は分割コンパイルがあるしSML#自身LLVMバックエンドなのでLLVMバインディングもある。が、MLtonに比べて数倍遅く、まだ64bit対応もしてない。MLtonは速くて機能も豊富。だが分割コンパイルは無いっぽい?
一応コンパイラはこれらのどちらかで書くかな、と考えている。
Haskell
ML系の言語の中では一番人気でライブラリ豊富。言語自体はすごい好きなんだけどコミュニティが初心者をモナドで殴りにいく印象が強いのであまり好きになれない。あと参考コードとしてGHCのコードは読む気にはなれない。SMLで書いててつらくなったらトライしてみるかな。その時は(a)jhcを使うのかな?
OCaml
LLVMやるならOCamlらしい(?)。が、C書いててライブラリの豊富さに気付いてSML#やってCとの相互呼出に惹かれた身には少しもの足りなくなってきた。うーん。迷う。
ATS
元Depenent ML。低レベルなことが出来るMLらしい。しかし一々証明しながらプログラム書く気はしない。もうちょっと情報が欲しい。
Go
最近中々の人気を見せるGo。一応コンパイルの速いシステム記述言語との触れ込みだがWeb系で多い気がする。なんとなーく自分のやりたいことと違う方向向いてる言語な気がする。Goで書かれたDBMもあるけど。Cとの連携はトリッキーだがヘッダからラッパ自動生成してくれるのは気に入った。DBM書く候補には入れとく
D
やりたいこと的には多分一番合ってる言語。でもネタ言語感が拭えないのがなんとも。あと思ったよりCの呼び出しが面倒だった。一応心には留めておく。
Rust
まだまだ未熟な印象な言語。だがMozillaが本気で作ってるっぽいので期待も出来そう。メモリ管理も自分でやらせてくれるみたいだしDBMはこれでいこうかなと思ってる。でもCとの連携はつらそう。うーん。メモリモデルの関係上ヘッダから自動生成は出来ないのは分かるんだけどどうにかならんのですかね。
まあ、これだけつらつら書いておいてもCIMもpicrinもcl21も面倒看なきゃいけないしcl21-datacollectionsも復活させないといけないしちゃんと出来るんですかね。