• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
つくっておぼえる!仮想マシン〜直前で実装編〜
 

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

on

  • 3,050 views

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

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

Statistics

Views

Total Views
3,050
Views on SlideShare
2,629
Embed Views
421

Actions

Likes
1
Downloads
4
Comments
0

6 Embeds 421

http://d.hatena.ne.jp 281
http://orangeclover.hatenablog.com 110
https://si0.twimg.com 18
https://twimg0-a.akamaihd.net 6
https://twitter.com 5
http://paper.li 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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