きっかけはRustでOSを書くというツイートを見たことから始まる。もとのツイートが探せない程度のツイート検索力なのはご容赦いただきたい。それを見たときにCでOSが書けるのはGCCがアセンブラとリンカを持っていてるからではないかと思ったわけだ。まぁ、実際にはリンカが重要で後は単にファイルフォーマットだと思うのだが。そこで、こいつらを全部Schemeで書いてしまえば、SchemeがC並みのことをできる、つまり現状ではほぼCの独占状態である低レベルプログラミングの一角をSchemeが崩すことができるとふと夢想した。
実際にこれらを実装するとなるとかなりの労力が必要になるので夢想するだけで終わらせようかなと思ったのだが、せっかくだし暇を見つけてできるところまでやってみようかなぁと思い立った。まず必要になりそうなのは以下だろうか?
- アセンブラ(とりあえずx86、x64で)
- リンカ(ELFとPE辺りで)
- libc相当の何か
- コンパイラ
とりあえず下調べしたところでは、Schemeで実装されたアセンブラは2つある。一つはx86用のsassyで、もう一つはindustriaに実験的に組み込まれているx86、x64用ライブラリ。どちらもELFを吐くことができる。個人的にはsassyがいいかなぁと思ったのだが、これをx64用に拡張するのは酷く面倒そうに見える。問題になるのはx86用のレジスタ等がハードコーディングされているので、いろいろ考えるとこの辺はルールベースで良しなに扱ってほしいところ。例えば、x86だけをサポートするようとかだとフラグ立てるよりは、組み込むルールを限定した方が変なバグを埋め込まない気がする。一番の問題は、僕がこの辺に明るくないことか。とりあえずNASMのソースを見つつ、Intelのマニュアルを見つつやるしかないだろう。
残念ながらSchemeで書かれたリンカは見つけられなかった。 リンカのことを扱った本があった気がするのだが、名前を思い出せない。LLVMのリンカ部分を読めばいいだろうか?一番の不安材料である(ここで挫折して放置する可能性が高い)。
libc相当はとりあえずLinux(気が向いたらWindowsも)限定にすればシステムコール上に構築すればいいだけなので、ひたすら地味な作業になるだけと踏んでいる。dietlibcのような小さい実装もあるし(読みやすいと踏んでいるだけ)。
コンパイラはCPS変換するものにしておけばcall/ccの実装が楽になる(はず)。マクロ展開は辛いところではあるが、 既に実装しているので何とかなると思いたい。最悪ポータブルなものを使ってしまってもいいわけだし。
全てをR6RSポータブルにすれば、ホスト処理系を(理論上は)限定する必要がなくなるはず。R7RSじゃないのは浮動少数点の扱いが弱いから。いずれ実装する必要があるとしても、楽できるところは楽したい。
さて、これ何かしら動くものができるのは何年後になるのかね?
No comments:
Post a Comment