More Related Content
Similar to V6 Interpreter (Nagoya Geek Bar 2011-05-02) (20)
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
- 3. 自作コンパイラ
• 4年くらい掛けて独自言語コンパイラのセルフ
ホスティングに到達
– セルフホスティングする前はC#で書いた
• ある程度できてから、独自言語でコンパイラ
を書き直そうとして挫折
• 2年くらい放置した後、C#から独自言語にトラ
ンスレートすれば良いと気付いた
• こういう遊びを広めたい!
- 4. 最初の失敗
独自言語
C#
コンパイラ
のソース コンパイラ
(C#)
独自言語
サンプル
コンパイラ EXE
(独自言語)
のEXE
コンパイラ書き直し • あれもこれも!
(独自言語)
• セカンドシステム症候群
- 5. トランスレート
タイムスタンプ以外
独自言語コンパイラ C# 完全一致!
のソース(C#) コンパイラ
独自言語
コンパイラ
のEXE
C#から独自言語への
トランスレータ
独自言語 独自言語
独自言語コンパイラ コンパイラ コンパイラ
のソース(独自言語) のEXE のEXE
セルフホスティング
- 6. OS遊び
• 2年ほどFreeBSDをメインにしていたけど、巨
大過ぎて内部には手が付けられなかった
• MINIXがシンプルで良いと思ったので、PEか
らa.outに変換するツールを作って、VC++で
吐いたEXEを変換して動かしてみた
– カーネルもVC++でビルドできるようにはなったけ
ど、アセンブリをACKからMASMに書き換える際
に間違えたらしく、うまく動かなかった
– カーネルハックには到達できず挫折
- 7. UNIX V6
• 1975年頃の古いUNIX
– コンパイラ+カーネルのセットとしてはMINIXより
も遥かにコンパクトで手頃だと思った
• 解説書のLions本は持っていたけど、どこから
読めば良いのかよく分からず放置
• そんなとき読書会が始まった!
– PDP-11のアセンブリが読めなくて脱落寸前
• 慣れるため、simh(エミュレータ)でV6を動か
して、ハローワールドを書いて遊んだりした
- 10. F#
• とにかく構文が簡潔
– セミコロンやブロックのブレースが不要
• REPL標準装備
• クラスを作らずにコードをベタ書きできる
– C#だと必ずクラスで囲まなければいけない
class Test { static void Main() { … } }
• モジュールをopenすれば接頭辞が不要
– C#だとstaticメソッド呼び出しにクラス名が必要
– VB.NETでもできるけど
- 13. 移植戦略
• ccを今のC言語で書き直すのは、頑張れば
できると思った
• しかしasはフルアセンブラ
• さてどうしよう・・・?
1. アセンブリを解読しながら高級言語に翻訳
2. 文法を真似て互換アセンブラを開発
3. インタプリタを作って動かす ← 採用
- 17. C++
• POSIX前提にInterix上で開発
– NetBSD, FreeBSD, Mac OS Xで動作確認
• C++0xとかboostはなし
– 依存ライブラリなしに、OSデフォルトのコンパイラ
でサクっとビルドできるようにしたい
– FreeBSDはGPL3避けのためgcc-4.2系で更新
を停止している(clang待ち)
• STLを使った10年くらい前のスタイルで開発
– STLすら使えない環境は・・・ごめんなさい
- 19. システムコール
• cc/asを動かすのに必要なものだけ実装
– 標準出力/ファイル入出力/fork/exec
• 標準出力のシステムコールで出力した文字を
テキストボックスに表示するだけ
– トレースでV6のprintf()がデフォルトでバッファリン
グせずに一文字ずつ出力しているのがわかる
• Silverlight上でのファイルはRAMディスク
– 実態は単なるフルパスのハッシュテーブル
- 20. fork/exec (1)
• これが一番厄介だった
• Silverlight、POSIX、Win32それぞれ別実装
• POSIXではforkは実際にフォーク(プロセス
のコピー)、execはVM内でのシミュレート
• SilverlightとWin32はネイティブプロセスには
触れずに完全にVM内でのシミュレート
– 原理的には実装を同じにできる
– そうなっていないのは、Silverlightでの実装が稚
拙で、Win32を実装したとき改良したため
- 21. fork/exec (2)
• V6のforkは子プロセスは _fork:
mov r5,-
r5,-(sp)
コピー後そのまま実行し、 mov sp,r5
親プロセスは命令を1つ sys fork
子
親 br 1f
飛ばして続行 bec 2f
• Lions本読書会で教えて 1:
jmp cerror
もらった mov r0,_par_uid
clr r0
– 教えてくれた方は、この仕 2:
組みを解読するのにとて mov (sp)+,r5
rts pc
も苦労したとのこと
- 23. fork/exec (4)
プロセス
• Silverlightではcc/asに特 VM(親)
化した小細工で実装
• 子はすぐexecして親はそ
sys fork sys exec
れをwaitするパターン
• execでVMのインスタンス VM(子)
を作り、exit後にfork時点 PC += 2 sys exit
にロールバックして続行 sys wait
• シングルスレッド実行のた
めwaitは素通り
- 24. fork/exec (5)
プロセス
• Win32にはネイティブの VM(親)
forkはないため、VMのイ
ンスタンスをコピーして擬
似的にforkを再現 sys fork VM(子)
• execはVMのメモリイメー sys exec
ジを書き換えて再現
PC += 2 sys exit
• シングルスレッド実行の
ため、Silverlightと同じよ sys wait
うにwaitは素通り
• Silverlightの改良モデル
- 25. オチ
• 読書会の参加者から既存のユーザーモード
シミュレータが存在すると教えてもらった
– apout
http://puszcza.gnu.org.ua/software/apout/
• 存在を知っていたら、作らなかったと思う
• せっかく作ったので、ユーザーモードとカーネ
ルモードの特定の遷移をモデル化して抽出す
るなど、学習に特化した方向で発展させたい
- 26. 最後に
• V6関係は手探りだったけど、状況がわかって
かなり開けてきた感じ
• まごろくさんのV7の説明を聞いて、基本的な
部分はほとんど同じだと感じた
– 読書会でV6のバグじゃないかと指摘された部分
がV7で直されていたりして面白い
– BSD派なのでV6からBSDを追いたいかも
• コンパイラ・OS自作にフィードバックしたい
– あれ、自然言語処理はいつになったら・・・