hp12c
19 October 2013

Rubiniusユニバースも視覚化してみる

(追記:2014年3月3日) Gvizについてのまとめ頁を作りました。

Gvizの目次 - Rubyの世界からGraphvizの世界にこんにちは!


前の記事でRubyのクラスツリーをGraphvizを使って視覚化した。

RubyユニバースをGraphvizで視覚化する

そうしたら今度はRubiniusでどうなるのかも見てみたくなったので以下の辺りを参考にRubiniusをインストールしてやってみることにした。

Ruby - Rubinius 2.0.0-dev をインストールする with rbenv - Qiita [キータ]

Installing Rubinius 2.0.0-dev with rbenv

例外クラスとモジュールを除いたRubyのクラスツリーをRubiniusで書いてみる。

どういうわけかgvizコマンドが使えるようにならないのでrubyで実行できるよう修正する。前回のコードをGraphのブロックで囲えばいい(必要色数が増えたのでcolorschemeをpurd6からpurd7に変えている)。

# ruby_tree.rb
 require 'gviz'
 
 classes = ObjectSpace.each_object(Class)
 .reject { |k| "#{k}".match /Gem|Thor|Gviz/ }
 
+Graph do
 global layout:'fdp'
 nodes style:'filled', colorscheme:'purd7'
 
 classes.each do |klass|
 tree, mods = klass.ancestors.group_by { |anc| anc.is_a? Class }
 .map { |_, k| k.reverse }
 next if tree.include?(Exception) && tree[-1] != Exception
 tree = tree.map.with_index { |k, i| [k, i] }
 tree.each_cons(2) do |(a, ai), (b, bi)|
 a_id, b_id = [a, b].map(&:to_id)
 route a_id => b_id
 node a_id, label:a, color:7-ai, fillcolor:7-ai
 node b_id, label:b, color:7-bi, fillcolor:7-bi
 end
 end
 
 save :ruby_tree, :png
+end

Rubyを切り替えてヴァージョンを確認して実行してみる。

% rbenv local rbx-2.0.0
% ruby -v
rubinius 2.1.1n292 (2.1.0 9f9da9ed 2013年10月19日 JI) [x86_64-darwin12.5.0]
% ruby ruby_tree.rb

うわっ。


alt noshadow (クリックで拡大)

クラスの数がなんかぜんぜん違う。一部を拡大して見てみる。

alt noshadow (クリックで拡大)

おびただしい数のRubinius関連クラスが見える。これらはRubyの組み込みクラスを補完するクラス群なのだろう。

参考:My first impression of Rubinius internals - Pat Shaughnessy

Rubinius関連クラス群を除外して描画してみる。

require 'gviz'
 
 classes = ObjectSpace.each_object(Class)
+ .reject { |k| "#{k}".match /Gem|Thor|Gviz|Rubinius/ }
 
 Graph do
 global layout:'fdp'
 nodes style:'filled', colorscheme:'purd6'
 
 classes.each do |klass|
 tree, mods = klass.ancestors.group_by { |anc| anc.is_a? Class }
 .map { |_, k| k.reverse }
 next if tree.include?(Exception) && tree[-1] != Exception
 tree = tree.map.with_index { |k, i| [k, i] }
 tree.each_cons(2) do |(a, ai), (b, bi)|
 a_id, b_id = [a, b].map(&:to_id)
 route a_id => b_id
 node a_id, label:a, color:6-ai, fillcolor:6-ai
 node b_id, label:b, color:6-bi, fillcolor:6-bi
 end
 end
 
 save :ruby_tree, :png
 end

alt noshadow (クリックで拡大)

大分スッキリした。これでCRubyにおけるクラスツリーに近づいてきた。対応するCRubyのグラフを貼って見比べてみる。


alt noshadow (クリックで拡大)

RubiniusにはCRubyにはないクラスが依然含まれていてContinuation(継続)なんてものも見える。Rubiniusは単一実装で1.8系と1.9系をカバーするようだからそうなんだろう(インストール時に–enable-versionという設定項目がある)。

参考:Inside the Rubinius 2.0 Preview Release - Rubinius


(追記:2013年10月20日) JRubyも視覚化しました。

JRubyユニバースも視覚化してみる


関連記事:

Rubiniusユニバースも視覚化してみる

JRubyユニバースも視覚化してみる

Rubyのソースディレクトリも視覚化してみる

Yet Another Ruby Graphviz Interfaceを作ったからみんなで大量のグラフを作って遊ぼうよ!



Please enable JavaScript to view the comments powered by Disqus. blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS


AltStyle によって変換されたページ (->オリジナル) /