ひとり勉強会

ひとり楽しく勉強会

ほげめも

しょっちゅう頭が混乱するのでめも関数 に関して は、f を i 番目の引数で偏微分した関数。各点での軸方向の傾き は、。各点での傾きベクトル。 は、f が特に時間と位置と他の何かと…に関する関数の場合に意味があって、 みたいな位置に関する偏微分の組 た…

1.6.2 Systems with Rigid Constraints

剛体制約のある系(ある点とある点の距離は固定、みたいな制約がある系)の場合ラグランジアンはどうすればいいか。ちょうど自由度の分だけ次元のある一般座標系考えて、それで系を表現してやれば、この場合も L = T - V でおーけー。なぜか。例えば、下向き…

1.6 How to Find Lagrangians

ラグランジアンの見つけ方。前回は、実際に物理的に実現される運動が満たさなければならない方程式「オイラー・ラグランジュ方程式」を、ラグランジアンから導出しました。今回は、じゃあそもそもそのラグランジアンてどう用意するのかという話。どんな場合…

SICM読書会(3)

まとめ

はい。おしまいです。YARVソースコード勉強会第一部完です。さて次は何をやろうかなー。。。 Parrotを読む会 JRubyを読む会 とかいう前に、サボりすぎのSICM勉強会をなんとかしないとですねえ。うーん。

ブロッキング

スレッド実行中にI/Oなどシステム関係の操作で処理がブロックするときは、グローバルロックを解除します。YARVのスレッドモデルでは、そうしないと他のスレッドまで一斉に止まってしまうので。これは、ブロックする処理を実装した関数へのポインタを rb_thre…

スレッド切り替え

1個だけ実行するスレッドを、グローバルなMutexのロックという形で明示的に管理しているので、スレッドの切り替えの部分でもロックの取得/解放を明示的に実装することになります。これをやるのが rb_thread_schedule @ thread.c 関数。 void rb_thread_sche…

スレッド初期化

メインスレッド VMのメインスレッドに関する情報は、Init_VM 関数(2006-10-27 - ひとり勉強会)で記録されます。 Thread.new Thread.new による新規スレッド起動の流れを見ていきます。まず、Threadクラスの定義は Init_Thread @ thread.c です。 void Init…

スレッド概要

YARV のスレッドモデルの概略をつかむのには、yarv-dev や ruby-dev のささださんの投稿を参考にしました。 http://www.atdot.net/~ko1/w3ml/w3ml.cgi/yarv-dev/msg/631 [ruby-dev:30202] Re: YARV の thread について 今のところは、model 2、つまり「一つ…

YARVソースコード勉強会 (15)

コンパイラ編(PPT or PDF)に引き続き、VM編のまとめスライドを作りました。 第11回〜第15回まとめ PowerPoint 第11回〜第15回まとめ PDF というわけで、最終回です。今日はマルチスレッド周りのソースを読んでいきます。

この前のScheme or YARVが面白かったので、なんとなく楽しくなって、Toy Lispを作ってらっしゃる日記を検索して見て回ったりしてました。 リスト 2007-03-14 - HaskellでLispを書く日記 - haskell ではHaskellでLisp。ちゃんとしたS式パーザがとてもコンパク…

まとめ

途中から全然YARVソースコード勉強会じゃなくなってしまいましたが、今日はここまでです。 ささださんが書かれていたとおり、ほんとに簡単にできちゃうんですね。これはかなり楽しかったです。もう少しマジメに作ってみるともっと楽しいかもしれません。今回…

おまけ: Scheme on YARV

これで今日のYARV勉強会はおしまいです。って、これではやけに短くなってしまったので、おまけとして、るびま で触れられていた 本当は、今回何か簡単な言語のコンパイラを作ろうと思っていたのですが、間に合いませんでした。誰か Scheme あたりで挑戦して…

insns.def

insns.defでの命令定義はグループ別にまとまっていて、上から順に 変数の操作 (getlocal, ...) 値の操作 (putnil, ...) スタック操作 (pop, dup, ...) メソッドや別名定義関係 (definemethod, alias, ...) クラス/モジュール定義 (defineclass, ...) メソッ…

YARVソースコード勉強会 (14)

お久しぶりです。週一の勉強会だったはずなのにお久しぶりです。 [YARV] insnhelper.h insns.defはYARVの命令の実装なので、VMの内部状態をいろいろと操作します。VMは前々回見たようなデータ構造で表現されてるわけですが、これをもう少し抽象化して、簡潔…

まとめ

しばらく書いてなかったらひとり勉強会の書き方を忘れています(あせ。なんか変な感じ。 次回は、insns.def の内容を面白そうなところをつまみ食いしながら一気に眺めてみようと思います。あと読んでみたいのは、スレッド周りの実装くらいでしょうか。という…

th_eval_body:例外処理

改めて話を戻して、例外処理について。raise〜rescueやthrow〜catchの他にも、break/redo/next, returnなども同じ仕組みを使って実装されています。この辺りの処理は th_eval_body にまとまっています。基本的な流れとしては… exception_handler: cont_pc = …

th_eval_body:実行

th_set_top_stack で制御フレームの設定が終わったら、いよいよ実行開始。th_eval_body 関数です。 VALUE th_eval_body(yarv_thread_t *th) { ... TH_PUSH_TAG(th); if ((state = EXEC_TAG()) == 0) { vm_loop_start: result = th_eval(th, initial); if ((s…

YARVソースコード勉強会 (13)

一月ぶりのYARV勉強会になってしまいました。今日のリビジョンは r11982 です。いつのまにか yarv_iseq_t が rb_iseq_t になったり、yarv_control_frame_t が rb_control_frame_t になってました。おおお。

[SICM] まとめ

今日はここまで。次回は、そもそも「ラグランジアン」ってどうやって出してくるの?がテーマの1.6節に移ります。

[SICM] 1.5 The Euler-Lagrange Equations

オイラー・ラグランジュ方程式。 action(pathから実数値への関数)が最小になるようなpathが、現実に実現されうるpathなのでした。ところで「f(x)を最小にするようなxは、fの微分が0になるようなxである」のと同じで、pathについても、「action(path)を最小…

[SICM] 1.4 Computing Actions (承前)

最小作用の軌跡を探す 前回は、 ラグランジアンがわかってる 作用を最小にするpathもわかってる ときに、実際にそのpathを使って計算した作用が極小値になってることを確かめました。今回は ラグランジアンがわかってる 始点と終点の一般座標もわかってる と…

[SICM] SICM 勉強会 (2)

合宿と葬式と花粉症が一度に来たような忙しさ(比喩になってない)で思いっきりサボってしまいました。反省。大変お久しぶりですが、第2回SICMひとり勉強会です。今回は、ラグランジアンから実際のパスを求める手続きをもうちょい具体化するところです。

SICMのこと完っ璧に忘れてた!!!!!

まとめ

今日は、YARV仮想マシンの実行時のデータ構造についてと、実際にコードの実行に移るまでのそのセットアップについて見てみました。次回は、実際に仮想マシン語を実行する関数 th_eval_body の方に行く予定です。

実行開始

初期化後、Rubyソースのコンパイルが行われて、コンパイル結果の命令列データが yarvcore_eval_iseq 関数に渡されます。ここがVMによる実行の開始点です。 static VALUE yarvcore_eval_iseq(VALUE iseq) { return yarv_th_eval(GET_THREAD(), iseq); } 指定…

データ構造とその初期化

VM まず、YARV の仮想マシンを表すデータ構造があります。yarvcore.h で定義されている yarv_vm_t 構造体です。 typedef struct yarv_vm_struct { VALUE self; ...略... struct yarv_thread_struct *main_thread; struct yarv_thread_struct *running_thread…

YARV ソースコード勉強会 (12)

最近曜日の感覚がおかしくなってきた hzkr です。今日は、YARV の仮想マシンの実装の入り口をのぞきはじめます。

まとめ

というわけで、これでコンパイル処理は完成です。次回からはVMの実行部のコード読みに移ります。ではではー。

iseq_translate_direct_threaded_code @ compile.c

いよいよステップ5です。YARVの命令処理は「ダイレクトスレッデッドコード」という方式で高速化されています。これについては YARV Maniacs 【第 3 回】 が詳しくてしかもわかりやすいです。それまで他の解説読んでもスレッデッドコードの意味がわからなく…