つくっておぼえる!仮想マシン〜直前で実装編〜

4,009 views

Published on

第7回 カーネル/VM探検隊で発表した、ErlangとHaskellでMIPSアーキテクチャのVMを作ったお話です。

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,009
On SlideShare
0
From Embeds
0
Number of Embeds
595
Actions
Shares
0
Downloads
10
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

つくっておぼえる!仮想マシン〜直前で実装編〜

  1. 1. つくっておぼえる!仮想マシン ∼直前で実装編∼ 筑波大学 情報科学類 2年 えりっく(@siritori) 筑波大学情報科学類 1年 いおりん(@iorivur)
  2. 2. つくっておぼえる!仮想マシン ∼直前で実装編∼ VM  in  Erlang 筑波大学 情報科学類 2年 えりっく(@siritori)Haskell   VM  in   筑波大学情報科学類 1年 いおりん(@iorivur)
  3. 3. じこしょうかい•  えりっく –  ちゃんと筑波大学に通っています –  あ、単位も全部来ました –  趣味はマッサージとしりとり –  最近はTwitterに流れるつぶやきのリアルタイ ムな話題推定技術の研究とかしてる –  Erlangでサーバ書いて遊んでる(よばれた通知とか) –  興味あるもの : Erlang, 自然言語処理, 機械学 習, (比較的)低レイヤなもの
  4. 4. じこしょうかい•  いおりん –  Verilogでカメラを制御して受験を生き抜いた –  Arch Linux / Debian GNU/Linux使い –  sgi O2やcobalt qubeなどにNetBSDを入れ てpkgsrcしてあそんでる。 –  高校ではロボットをつくってました
  5. 5. 第6回のとき...『つくっておぼえる!仮想マシン∼妄想編∼』 という名前で発表 本人は当時のスライドを紛失(何話したっけ?)当時言ってた要約 : MIPSアーキテクチャVMを Erlangで実装する
  6. 6. 2012. 4/3ごろ
  7. 7. 2012. 4/3ごろ あ、作ってない。作って発表するか・ω・あとつくばの活きのいい学生誘って来ました
  8. 8. というわけで実装してみました•  昨日頑張りました(つくばACハッカソン)•  RISCでも時間の制約には勝てなかった•  @siritori 「約束通りErlangで書くー」•  @iorivur 「じゃあぼくHaskellで書くー」•  ※ふたりとも手続き型言語では意地でも書かない•  関数型言語の抽象化のエッセンスを学びつつ、MIPS アーキテクチャも知りたい><•  というわがままなテーマです
  9. 9. あーらん Erlang•  (」・ω・)」あー!(/・ω・)/らんー!•  アクターモデルな並列指向言語•  純粋でない関数型言語(な見た目)•  隣の勉強会のHaskellerたちからしたら虫酸が走る•  電話交換機とかのバックエンドで使われてた•  OTPというすごいフレームワークを触るためのlang
  10. 10. いーらんぐ   って言うな(´;ω;) あーらん Erlang•  (」・ω・)」あー!(/・ω・)/らんー!•  アクターモデルな並列指向言語•  純粋でない関数型言語(な見た目)•  隣の勉強会のHaskellerたちからしたら虫酸が走る•  電話交換機とかのバックエンドで使われてた•  OTPというすごいフレームワークを触るためのlang
  11. 11. リポジトリとか•  RECRIO(れくりお)ってコードネームでな んとなく開発開始(RECRIOを入れ替えると)•  githubにおきました(ついさっき) –  http://github.com/siritori/recrio•  「こういう書き方はあんまよくない」とか あったら教えて下さい><
  12. 12. できてるところ•  32bitのバイナリいぢるユーティリティ書いた•  「何番地に∼というデータをおく」というのを 受け取って配置してからプログラムカウンタを 設定して動作する•  例外処理するためにメッセージ送信ができるよ うにしといた(退避とかはまだ)•  メモリアクセスとか算術命令とか分岐命令の一 部ができてる
  13. 13. できてないところ•  やっぱりカーネル/VM探検隊だとELFローダも 書けてないのに発表するのは心苦しいです•  例外飛んでから処理に飛んでいくところ(MIPS の例外処理の理解が怪しいので教えて下さい)•  コプロセッサあたりの実装(́・ω:;.:...•  ErlangのくせにOTP使ってないとかErlangじゃ ないですよねごめんなさい
  14. 14. ふええ><っち•  前にも話した気がするけどErlangにはバ イナリデータのパターンマッチング構文が ある(通信系だから?)•  ABBCCCCCみたいなビット列があったら、 <<A:3, B:2, C:5>> = Data とかでマッチ できる•  いやなんかこうこういう構文あったら命令 フェッチしたくなるじゃない?
  15. 15. ふええ><っちexec(<<16#08:6, Rs:5, Rt:5, SignExtImm:16>>) -> なんとかかんとか↑addi命令の場合(OpCodeが0x08なI型命令)こんな感じで以下の命令が実装してあります(`・ω・́)add, addi, addiu, addu, and, andi, or, ori, xor, xori, sll, srl, sllv, sra, srav, sw, lw, slt, slti, lui, j, beq, bne, break, jal, jalr
  16. 16. ふええ><っちexec(<<16#08:6, Rs:5, Rt:5, SignExtImm:16>>) -> なんとかかんとか↑addi命令の場合(OpCodeが0x08なI型命令)こんな感じで以下の命令が実装してあります(`・ω・́)add, addi, addiu, addu, and, andi, or, 今日起きてから実装 ori, xor, xori, sll, srl, sllv, sra, srav, sw, lw, slt, slti, lui, j, beq, bne, break, jal, jalr
  17. 17. 記憶領域やレジスタの話•  レジスタとメモリ : ETS (Erlang Term Storage)•  メモリアクセスが4の倍数だけでよかった•  プログラムカウンタや原因レジスタ、EXPレジ スタ、メモリテーブルへの参照をぜ∼んぶ Contextとして持ち回るような設計に(並列実行 への布石)
  18. 18. 命令の実装•  名状しがたい高階関数のようなものを使って できるだけうまいこと抽象化しながら実装•  すべての割り込みはメッセージ送信! self() ! {invalid_address, XXXX}•  外部からの割り込みもメッセージ送信
  19. 19. 感想•  数値の演算がC言語の10倍くらい遅いと言われ るErlangだけど、バイナリの操作はすごく簡単 だった(○ ω ○)•  このMIPSのVMを複数立ち上げるのも朝飯前だ し、MIPSがWeb上で遊べるサービスとか作れ そう•  競技プログラミングの採点システムとかになっ たらいいね(*́・ω・)(・ω・`*) 速度面...•  MIPSアーキテクチャのいい勉強になった
  20. 20. はすける Haskell•  (」・ω・)」はすー!(/・ω・)/けるー!•  純粋な関数型言語•  やたら型にうるさいのでコンパイルに大体の問題が 片付く(らしい)•  手続き的なものは「みんな、Monadになる。」
  21. 21. できてるところ•  インタラクティブにMIPSアセンブリを叩けるUI書いた•  叩いたアセンブリが機械語に変換されてメモリに書かれ ていく•  メモリアクセスの一部とか算術命令ができてる•  メモリから自動で読み込んで走るモードにおちる
  22. 22. できてないところ•  例外、コプロセッサ命令、ジャンプ命令•  綺麗なレジスタダンプ•  わかりやすくて親切なUI•  一般的なアセンブリシンタックス入力
  23. 23. 実装•  システムの内部状態をすべて再帰でとりま わす->再帰がそのままクロックのようなイ メージ•  関数のパターンマッチやcase文で命令を デコード
  24. 24. デモとか

×