他人の空似自作物置場
mrubyのバイトコードをパースして表示、既に対応フォーマットは過去の物なので参考にしかならない
プログラム名:parse_mruby2 用途:mrubyのバイトコードをパースして表示 使い方: ・parse_mruby.exeにmrbcでコンパイルしたファイルをドラッグ&ドロップします ・パースした結果が表示されます 免責事項: これに同梱されたプログラムその他が原因で発生したいかなる損害も当方は一切関知しません。 また、全てのプログラムがウイルスではないという証明も、ウイルスに感染していないという証明もありません。 自己責任でお使いください。 Q&A: Q:そもそも動かないんだが A:2013/11/25の時点のソースコードから読み上げて実装されております。 それ以降環境でmrbcしたファイルには対応していない可能性があります。 Q:example.rbとmrbファイルは何? A:mrubyのバージョン差により動かないことが予想されるので こちらでそれっぽいコンパイル済みmrbファイルと それを作成するのに使ったrbファイルを用意しました。 雰囲気だけ楽しみたい方はそちらをお使いください。 Q:表示の意味が分からないんだが A:http://resemblances.click3.org/?p=1594 を参照のうえ、気合いで。 ダメならソースを読むなどすればいいと思います。 Q:Error: unknown opがずらずらと表示されるんだけど A:全オペコードを網羅しようとして途中で飽きたため 未対応のオペコードはみんなそんな表示になります。 あきらめるか、自力で実装してください。 Q:デフォルト引数の部分にTODOとか表示されてるんですが A:未実装です、あきらめるか自力で(ry Q:これ何の意味があるの A:意味なんてありません。 が、mrubyバイトコード理解の一助にはなるかもしれません。 Q:boost入れてないからコンパイルできねぇ A:仕様です、比較的入れやすいライブラリなので 頑張って入れてください。 Q:その他バグをみつけた or 動作しない or 要望がある A:確認次第対応可能であれば対応します。 公開しても問題が無いメールアドレスにて 下部に記載されたアドレスまでメールをどうぞ。 メールアドレス:sweetie(あっと)click3.org ライセンス: ・本ライセンスにおいて、全ての条項は「変更の有無を問わず、明示暗示を問わず、商業慈善を問わず、 個人法人を問わず、保持使用を問わず、有料無料を問わず、全体一部を問わず、コピー派生を問わず 実行ファイルソースファイルを問わず、故意錯誤を問わず」と装飾されている物として扱う。 ・著作権者は本ソフトウェアに関する一切の保障義務をもたない。 ・上記条項唯一の例外として、本ライセンスに違反した場合を除いて著作権者から 本ソフトウェアに関する一切の法的措置を受ける事が無い事のみ保証される。 ・著作権者やその他保持者がこのライセンスの範囲で行う活動に支障が無い範囲であれば何を行っても構わない。 ・上記条項の”何を行っても構わない”には本ソフトウェアの製作者を偽っての再配布も含まれる。 ・全ての権利の行使において、著作権者への連絡、著作権者やライセンス条項の記載、 適用ライセンスなどの制限は一切存在しない。 著作権者名:sweetie 面倒な人向けライセンス解説: 作者やライセンスの記載義務すらありません。 再配布や改造など申告なし記述なしで好きにできます。 スペシャルサンクス: Matz mrubyの作者様 技術情報(と、どうでもいい話): version0002対応版であり、それ以外には未対応。 parse_mrubyという名前で0001対応版もある、興味のある方はurl書き換えからどうぞ。 ちなみにバージョンを上げる条件は不明、フォーマット設計ミスのバグ修正では 下位互換性が破壊されたが特にバージョンが上がったりはしなかった。 おそらく機能追加などバグ修正を除く設計上の変更で上がるのではないかと思われる。 まぁ真実はMatzだけが知る。 ちなみに0001と0002の差はirepセクションが全部収めた1次配列だったのが irep自身がコード中で使用する子のirepを配列で持つ入れ子形式に変更されている。 コンパイラーバージョンが0000なあたり、フォーマットバージョンも0000あるかもしれない。 最初は逆コンパイルを目的としていたが、予想より機械語が低レイヤーだったので諦めたという経緯がある。 そのあたりから目的が消失してやる気がみるみる減っていき、可読化という目的すら途中で放棄した ので、オペコード未対応があふれている。 メソッドなどの引数は最初からレジスタに積まれているらしい。 デフォルト引数は初期化コードがバイトコード先頭にあって 引数の数により開始する場所を変えることで実現している。 ので、その辺を解析すればTODOを埋めることは可能、だが面倒くさくてやっていない。 バイトコード本体はたいして解析していないが、そんなでも無駄な処理はいろいろ目につく つまり高速化の余地がたくさんあるということなので、やる気がある人は見てみるとよい。 とはいえ、自分の目から見るにVC++やgccなんかが吐く機械語でもよくあるパターンに見えたので 何かふかーい理由によりそうなっている可能性もある。 コンパイル済みでCRCもあってる=>Validということなのか、エラー処理が足らず簡単にクラッシュできる。 もし、リモートからコンパイル済み形式を受け取って実行とか考えてるならやめたほうがいい。 とはいえ、組み込み用途とか実行速度とか考えればしょうがないことなので、バグではないのだと思う。 意外と簡単なフォーマットだなと思ったのは、普段アーカイバとか弄りまわしているからなのか。 ちなみに、このコード実装中にバグを二件発見して報告した、こんなんでも役に立つものだ。 その際話しかけてもいないのにMatzさんからtwitterのリプライをもらったりもした、twitterコワイ。 実装作業と呼べることは一日で終わり、そのまま埃かぶっていたのを もったいないからと引っ張り出してきて、ブログもそのために書いたものだったりする。 0002対応作業は追加で多分2時間ぐらい?
- Readme.txt
example.mrb
- example.rb
parse_mruby.exe
- parse_mruby.sln
- parse_mruby/parse_mruby.cpp
- parse_mruby/parse_mruby.vcxproj