Rubiniusユニバースも視覚化してみる
(追記:2014-3-3) Gvizについてのまとめ頁を作りました。
前の記事でRubyのクラスツリーをGraphvizを使って視覚化した。
そうしたら今度はRubiniusでどうなるのかも見てみたくなったので以下の辺りを参考にRubiniusをインストールしてやってみることにした。
Ruby - Rubinius 2.0.0-dev をインストールする with rbenv - Qiita [キータ]
例外クラスとモジュールを除いた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
うわっ。
クラスの数がなんかぜんぜん違う。一部を拡大して見てみる。
おびただしい数の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
大分スッキリした。これでCRubyにおけるクラスツリーに近づいてきた。対応するCRubyのグラフを貼って見比べてみる。
RubiniusにはCRubyにはないクラスが依然含まれていてContinuation
(継続)なんてものも見える。Rubiniusは単一実装で1.8系と1.9系をカバーするようだからそうなんだろう(インストール時に–enable-versionという設定項目がある)。
(追記:2013-10-20) JRubyも視覚化しました。
関連記事:
Yet Another Ruby Graphviz Interfaceを作ったからみんなで大量のグラフを作って遊ぼうよ!
blog comments powered by Disqus