dot言語Rのオブジェクト指向について調べていて、S3はlistだという表現が比喩なのかlistを使って実装されているのか気になった。ついでにS4クラスなどの実装も軽く調べておく。R本体コードのダウンロードhttps://cran.r-project.org/から普通にダウンロードする。githubにホストされているわけではなさそうなのでブラウザで見るだけ、というのは難しそう。doxygenでコールグラフを生成する今回は.Rファイルがインタプリタで評価され、Cの関数が呼び出されるまでの流れを知れば理解したことと考えて作業していく。ソースを眺めていると、RのオブジェクトはSEXPという型のポインタで管理されていることが分かる。関数の呼び出しを見ると全てSEXP型だったりするので変数の命名を分かっておくと便利。\"class\"などとして検索すると、Rmain.cのRf_mainloopが実行されるが、defineマクロでmainloopから定義されている。src/main.cでmainloopは定義されていて、setup_Rmainloopとrun_Rmainloopを実行する。...src/names.cのR_FunTabという配列で組み込みのキーワード類とCの実装は対応付けられている(例えばclass(a)<-だとR_do_set_class)ことが分かる。do_set_classなどの関数がmainから順序だって呼び出されることでRは実行されると考えられる。(R_FunTab[PRIMOFFSET(x)].cfun)とある。表現は正しくないかもしれないが、このマクロを呼び出す関数とmainまでのコールグラフを見れば良いだろう。これ以降は手作業だとつらそうなので以前使ったことのあるdoxygenで可視化して作業する。R_FunTab[PRIMOFFSET(x)].cfun}に書き換える。Doxyfileを書いてdoxygenを実行するとdoxygen/htmlの中にdotファイルが生成される。tak0kadaの何でもノート)。グラフ用のライブラリとしてigraphとnetworkxが有名らしい。networkxは全体がpython実装、igraphは半分がcで実装されている。networkxの方が実行速度が遅そうだったがドキュメントが良かったので実行してみた。解析コードpydotplusにバグがあるのでpydotplus.__file__でディレクトリを確認したらhttps://github.com/CantemoInternal/pydot/commit/8adab7bac6d42dee0bd7caebca4f2870741d104aを参考にpydotplus/parser.pyを修正する。作成したjsonファイルをhttps://github.com/tak0kada/playground/tree/master/R_callgraphアップロードした)テスト用の小さいソースコードでは1秒もかからなかったが、Rのソースコードは大きいため遅い。グラフの可視化もこのサイズのネットワークだと厳しい。(Doxygenの方でコールグラフの深さを制限したらもう少し改善するかも)結局mainloopからPRIMFUNまでは最短たったの2ホップで、mainloop→setup_Rmainloop→eval→PRIMFUNと呼ばれることが明らかになった。'PRIMFUN']PRIMFUNはevalかbcEvalのあとに呼ばれること、mainloopとPRIMFUNの間ではevalが直接呼ばれる場合とREPL経由で呼ばれる場合、その他の場合に分けられることが分かる。調べるには大きいコードで構造体の意味などをコードだけで把握するのは今の自分には厳しい。Internalsは公式のドキュメントなのでこちらに目を通す。メモはてなブログをはじめよう!kuyataさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。