カンスウガタ?ケンロン?やっぱり新しいものをやろうと思ったら 旧来のものとの比較をしないとわかったことにならないらしいのでやらないとね!!!!!!!
わお、そういえば僕RubyとかJavaとかも使うしそっちについても考えてみなきゃ。
Ruby
Rubyランタイム?初めて聞いた? 僕の理解だとRubyというのは
という風に実行されてる気がするよ!確かRuby1.9からそうなっているんだ!
Rubyist Magazine - YARV Maniacs 【第 4 回】 命令セット (1) YARV 命令セットの初歩の初歩
わお、VMだ。VMの実行を知るためにはやっぱりVMの中間言語について知らないといけないよね、実行モデルもそうだ!!!
…なになに?1.9からマージされたYARVはスタックマシンで実行されてる?
そういえばメソッド呼び出しって結構複雑だな?どうやってメソッド呼び出しするんだ?
勿論GCについても調べないといけないな!
この辺りから始めてみよう。
スタックマシン
追記:
FIFOと書いていましたがLIFOの間違いでした。コメントにして指摘頂きました。
スタックはプログラミングしてる人ならば分かるよな!
Last-In-First-Outを実現するデータ構造だ!
JVMもスタックマシンだぞ。
え、そういえばなんでスタックなんて言うデータ構造を考えるんだ。x86-64とか最近のCPUは当たり前だがレジスタが沢山あってレジスタはすごく早くアクセスできると聞いたことがあるぞ。なんでレジスタモデルじゃないんだ!
なんかレジスタマシーンよりも古いモデルらしいぞ。やっぱ新しいレジスタマシーンを使う時には全部知らて比較しないとな!
メソッド呼び出し
Rubyのメソッド呼び出しは難しそうだ。なんせ動的にメソッドが作られたりするかもしれないし継承されて実装がどこにあるのかそもそも頑張って探さないといけないかもしれない。
Mix-inなんてしたら更に難しそうだ。
Rubyist Magazine - YARV Maniacs 【第 6 回】 YARV 命令セット (3) メソッドディスパッチ
中間言語YARVでのメソッド呼び出しについて上の参考文献を元に考えてみるぞ!
なになに? [1, 2].length
というメソッド呼び出しは下のように表現されるらしいぞ!
0000 duparray [1, 2]
0002 send :length, 0, nil, 0, <ic>
:length
はメソッド名だ。Lispのシンボルみたいだな!
上の資料を見てみるとメソッドを探してくる作業はかなり複雑だ。メソッドのテーブルを探して見つからなかったら親を探して見つけたらメソッドのvisibilityを確認してメソッドの引数の数を数えて云々かんぬん。
細かいことは抜きにしてまぁ分かった。のか…? メソッドキャッシュ…?インラインメソッドキャッシュ?
確かに毎回ハッシュの計算をすると遅いからな!キャッシュしたいよな!
プログラム言語 Ruby におけるメソッドキャッシング手法の検討
う、、、更にテーブルが増えるのか。さらにもっと多様性のこととかも考えないといけない。Procをオブジェクトを渡すときにもなんか特別な処理が入るっぽいぞ。
配列で渡したものを展開して引数として渡したり、そもそもレシーバが自明じゃないから調べたりするのもあるのか、、、。
ツラそうな話がこの資料にも書いてある。
Rubyist Magazine - YARV Maniacs 【第 3 回】 命令ディスパッチの高速化
このへんでかんべんしてやろう!
ゴミ集め
追記:間違いを指摘して頂きました
@blackenedgold @no_maddo 両方残っています。generational gc のうち、停止時間が長い major GC についてのみ、incremental GC(ちょっとづつ動かす)をやっています。
— _ko1 (@_ko1) 2015, 6月 17
以下には間違いが含まれています。すみませんでした。
keenさん、_ko1さんありがとうございます。
追記終わり
Incremental GCだったのは過去の話らしいぞ!今どきGenerational GCだよな!
Memory management tuning in Ruby, Koichi Sasada
若いオブジェクトは死にやすい、長く生きたオブジェクトは長く生きやすいという仮説に基づいて、GCを2つに分けているゴミ集めの総称だ!
RGenGCというのか!ただのGenerational GCとは違うみたいだな!
RGenGCとはRestricted Generatinal GCの略でライトバリア保護されたオブジェクトとそうでないオブジェクトを同じヒープ内に共存することを許容した新しいGCのアルゴリズムです。RGenGCを導入しても拡張ライブラリの互換性は100%保たれます。
な、なるほど分かった、かな…?多分分かった。うんうん。
お、新しいGCを使うんだったら古いGCについて調べないとな。
ちなみに一番最初にGCを実装したのはLispだったな!Lispのことも調べないとな!
これくらいで、、、
YARV
中間言語の表現も調べないとな!
こりゃだいぶハイレベルな中間表現だ。
これからCPUの歓声を聴ける人が行くべきところは大学院か精神病棟だな。
意味論・仕様
あばばばばばばb意味論とかやっぱ分かってないと不安でしょうがないよな!
Rubyの意味論はAplas2014で発表されている論文がある。
そういえばJS規格になったみたいな話を聞いたことがあるぞ。規格も読まないとな! その関連で中田先生がRubyのパーサの使用記述が大変だったみたいな講演を聞いたことがあるぞ!
ちょっと疲れてきた(汗
スレッド
あばばばb
Java
やっぱJavaとかVMを使った言語の代表例だしRubyの先行研究だ。しらべないわけにはいかないな!
なんかもう疲れてきたので難しそうな調べないといけない事を列挙してみるぞ!
- JVMの実行時最適化
- JVMのJIT
- GC オプションで実装を選べなかったりしなかったっけ
- Rubyとの型システム・分割コンパイルの仕組み
- Genericsどうやってコンパイルしてるの
- マルチスレッド
その他
なんかWikipediaを見てみるとRubyはPerlとSmallTalkに多大な影響を受けているらしいな!
やっぱ旧来のものとの比較をしないとな!
オブジェクト志向プログラミングをしていくんだったらSmallTalkは外せないよな!
Modula-2やSimulaやC++の変遷も調べないとな!
そういえば構造化プログラミングとかOOPの前の話もあるし歴史も重要だな!
プログラム危機とかもあったな!
動的型付け・静的型付けはどこから来たんだ?
というか手続き型プログラミングするんだったらFortranとかAdaとか偉大な先輩たちとの比較をしないとな!
Fortran書いたこと勿論あるよな!!!!!え、Fortranには色々バージョンが有るのかい?????
つーか関数型言語って新しいのか?LispってFortranの次じゃん!!!!!!!!
LCF-MLとか1978年じゃん!Cと同じ時期ですよ!?!?!?!?!?
新しさって何???ただ時系列で考えればいいの!?!?!??
まとめ
- 最近の言語の実装は非常の複雑
- 新しいものを学ぶのに旧来言語を学んでもいいけどさ、旧来って何さ
- 新しいものを学ぶのに古いものを知ってないといけないというのは簡単に破綻する
但し書き
この記事は結論のことを言いたいがためにRubyやJavaの実装の事を調べました。 これらの技術を貶めたり、批判するために書かれたものではありません。
また古い記事を参照している部分もあり、筆者も確認できていない部分があります。