From fa5446f14e0c57037432911745944da11f570945 Mon Sep 17 00:00:00 2001 From: ayumin Date: Thu, 8 Sep 2011 17:09:30 +0000 Subject: * template/yarvarch.ja: Change encoding from Shift-JIS to UTF-8 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33230 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- template/yarvarch.ja | 402 +++++++++++++++++++++++++-------------------------- 1 file changed, 201 insertions(+), 201 deletions(-) (limited to 'template') diff --git a/template/yarvarch.ja b/template/yarvarch.ja index c332c20811..bb90f0c0d2 100644 --- a/template/yarvarch.ja +++ b/template/yarvarch.ja @@ -1,17 +1,17 @@ -#title YARVアーキテクチャ -#set author 日本 Ruby の会 ささだこういち +#title YARV繧「繝シ繧ュ繝繧ッ繝√Ε +#set author 譌・譛ャ Ruby 縺ョ莨 縺輔&縺縺薙≧縺縺。 -- 2005-03-03(Thu) 00:31:12 +0900 いろいろと書き直し +- 2005-03-03(Thu) 00:31:12 +0900 縺繧阪>繧阪→譖ク縺咲峩縺 ---- -* これは? +* 縺薙l縺ッシ -[[YARV: Yet Another RubyVM|http://www.atdot.net/yarv]] の 設計メモです。 +[[YARV: Yet Another RubyVM|http://www.atdot.net/yarv]] 縺ョ 險ュ險医Γ繝「縺ァ縺吶 -YARV は、Ruby プログラムのための次の機能を提供します。 +YARV 縺ッ縲ヽuby 繝励Ο繧ー繝ゥ繝縺ョ縺溘a縺ョ谺。縺ョ讖溯ス繧呈署萓帙@縺セ縺吶 - Compiler - VM Generator @@ -22,72 +22,72 @@ YARV - (experimental) AOT Compiler -現在の YARV は Ruby インタプリタの拡張ライブラリとして実装しています。こ -れにより、Ruby インタプリタの必要な機能(パーサ、オブジェクト管理、既存 -の拡張ライブラリ)などがほぼそのまま利用できます。 +迴セ蝨ィ縺ョ YARV 縺ッ Ruby 繧、繝ウ繧ソ繝励Μ繧ソ縺ョ諡。蠑オ繝ゥ繧、繝悶Λ繝ェ縺ィ縺励※螳溯」縺励※縺縺セ縺吶ゅ% +繧後↓繧医j縲ヽuby 繧、繝ウ繧ソ繝励Μ繧ソ縺ョ蠢隕√↑讖溯スシ医ヱ繝シ繧オ縲√が繝悶ず繧ァ繧ッ繝育ョ。逅縲∵里蟄 +縺ョ諡。蠑オ繝ゥ繧、繝悶Λ繝ェシ峨↑縺ゥ縺後⊇縺シ縺昴ョ縺セ縺セ蛻ゥ逕ィ縺ァ縺阪∪縺吶 -ただし、いくつかのパッチを Ruby インタプリタに当てなければなりません。 +縺溘□縺励√>縺上▽縺九ョ繝代ャ繝√r Ruby 繧、繝ウ繧ソ繝励Μ繧ソ縺ォ蠖薙※縺ェ縺代l縺ー縺ェ繧翫∪縺帙s縲 -今後は、Ruby 本体のインタプリタ部分(eval.c)を置き換えることを目指して -開発を継続する予定です。 +莉雁セ後ッ縲ヽuby 譛ャ菴薙ョ繧、繝ウ繧ソ繝励Μ繧ソ驛ィ蛻シeval.cシ峨r鄂ョ縺肴鋤縺医k縺薙→繧堤岼謖縺励※ +髢狗匱繧堤カ咏カ壹☆繧倶コ亥ョ壹〒縺吶 * Compiler (compile.h, compile.c) -コンパイラは、Ruby インタプリタのパーサによって生成された構文木(RNode -データによる木)を YARV 命令列に変換します。YARV 命令については後述しま -す。 +繧ウ繝ウ繝代う繝ゥ縺ッ縲ヽuby 繧、繝ウ繧ソ繝励Μ繧ソ縺ョ繝代シ繧オ縺ォ繧医▲縺ヲ逕滓舌&繧後◆讒区枚譛ィシRNode +繝繝シ繧ソ縺ォ繧医k譛ィシ峨r YARV 蜻ス莉、蛻励↓螟画鋤縺励∪縺吶YARV 蜻ス莉、縺ォ縺、縺縺ヲ縺ッ蠕瑚ソー縺励∪ +縺吶 -とくに難しいことはしていませんが、スコープなどの開始時にローカル変数の初 -期化などを行い、あとは構文木を辿り変換していきます。 +縺ィ縺上↓髮」縺励>縺薙→縺ッ縺励※縺縺セ縺帙s縺後√せ繧ウ繝シ繝励↑縺ゥ縺ョ髢句ァ区凾縺ォ繝ュ繝シ繧ォ繝ォ螟画焚縺ョ蛻 +譛溷喧縺ェ縺ゥ繧定。後>縲√≠縺ィ縺ッ讒区枚譛ィ繧定セソ繧雁、画鋤縺励※縺縺阪∪縺吶 -変換中は Ruby の Array オブジェクトに YARV 命令オブジェクト、およびオペ -ランドを格納していき、最後に実行できる形に変換します。コンパイラでは、コ -ンパイル中に生成するメモリ領域の管理が問題になることがありますが、YARV -の場合、Ruby インタプリタがすべて面倒をみてくれるのでこの部分は非常に楽 -に作ることができました(ガーベージコレクタによって自動的にメモリ管理をし -てくれるため)。 +螟画鋤荳ュ縺ッ Ruby 縺ョ Array 繧ェ繝悶ず繧ァ繧ッ繝医↓ YARV 蜻ス莉、繧ェ繝悶ず繧ァ繧ッ繝医√♀繧医ウ繧ェ繝 +繝ゥ繝ウ繝峨r譬シ邏阪@縺ヲ縺縺阪∵怙蠕後↓螳溯。後〒縺阪k蠖「縺ォ螟画鋤縺励∪縺吶ゅさ繝ウ繝代う繝ゥ縺ァ縺ッ縲√さ +繝ウ繝代う繝ォ荳ュ縺ォ逕滓舌☆繧九Γ繝「繝ェ鬆伜沺縺ョ邂。逅縺悟撫鬘後↓縺ェ繧九%縺ィ縺後≠繧翫∪縺吶′縲〆ARV +縺ョ蝣エ蜷医ヽuby 繧、繝ウ繧ソ繝励Μ繧ソ縺後☆縺ケ縺ヲ髱「蛟偵r縺ソ縺ヲ縺上l繧九ョ縺ァ縺薙ョ驛ィ蛻縺ッ髱槫クク縺ォ讌ス +縺ォ菴懊k縺薙→縺後〒縺阪∪縺励◆シ医ぎ繝シ繝吶シ繧ク繧ウ繝ャ繧ッ繧ソ縺ォ繧医▲縺ヲ閾ェ蜍慕噪縺ォ繝。繝「繝ェ邂。逅繧偵@ +縺ヲ縺上l繧九◆繧シ峨 -YARV 命令は、命令を示す識別子、オペランドなど、すべて 1 word (マシンで -表現できる自然な値。C 言語ではポインタのサイズ。Ruby インタプリタ用語で -は VALUE のサイズ)で表現されます。そのため、YARV 命令はいわゆる「バイト -コード」ではありません。そのため、YARV の説明などでは「命令列」という用 -語を使っています。 +YARV 蜻ス莉、縺ッ縲∝多莉、繧堤、コ縺呵ュ伜挨蟄舌√が繝壹Λ繝ウ繝峨↑縺ゥ縲√☆縺ケ縺ヲ 1 word シ医槭す繝ウ縺ァ +陦ィ迴セ縺ァ縺阪k閾ェ辟カ縺ェ蛟、縲C 險隱槭〒縺ッ繝昴う繝ウ繧ソ縺ョ繧オ繧、繧コ縲3uby 繧、繝ウ繧ソ繝励Μ繧ソ逕ィ隱槭〒 +縺ッ VALUE 縺ョ繧オ繧、繧コシ峨〒陦ィ迴セ縺輔l縺セ縺吶ゅ◎縺ョ縺溘a縲〆ARV 蜻ス莉、縺ッ縺繧上f繧九後ヰ繧、繝 +繧ウ繝シ繝峨阪〒縺ッ縺ゅj縺セ縺帙s縲ゅ◎縺ョ縺溘a縲〆ARV 縺ョ隱ャ譏弱↑縺ゥ縺ァ縺ッ縲悟多莉、蛻励阪→縺縺逕ィ +隱槭r菴ソ縺」縺ヲ縺縺セ縺吶 -1 word であるため、メモリの利用効率は多少悪くなりますが、アクセス速度な -どを考慮すると、本方式が一番いいと考えております。たとえばオペランドをコ -ンスタントプールに格納し、インデックスのみをオペランドで示すことも可能で -すが、間接アクセスになってしまうので性能に影響が出るため、却下しました。 +1 word 縺ァ縺ゅk縺溘a縲√Γ繝「繝ェ縺ョ蛻ゥ逕ィ蜉ケ邇縺ッ螟壼ー第が縺上↑繧翫∪縺吶′縲√い繧ッ繧サ繧ケ騾溷コヲ縺ェ +縺ゥ繧定諷ョ縺吶k縺ィ縲∵悽譁ケ蠑上′荳逡ェ縺縺縺ィ閠縺医※縺翫j縺セ縺吶ゅ◆縺ィ縺医ー繧ェ繝壹Λ繝ウ繝峨r繧ウ +繝ウ繧ケ繧ソ繝ウ繝医励シ繝ォ縺ォ譬シ邏阪@縲√う繝ウ繝繝繧ッ繧ケ縺ョ縺ソ繧偵が繝壹Λ繝ウ繝峨〒遉コ縺吶%縺ィ繧ょ庄閭ス縺ァ +縺吶′縲髢捺磁繧「繧ッ繧サ繧ケ縺ォ縺ェ縺」縺ヲ縺励∪縺縺ョ縺ァ諤ァ閭ス縺ォ蠖ア髻ソ縺悟コ繧九◆繧√∝唆荳九@縺セ縺励◆縲 * VM Generator (rb/insns2vm.rb, insns.def) -rb/insns2vm.rb というスクリプトは、insns.def というファイルを読み込み、 -VM のために必要なファイルを生成します。具体的には、命令を実行する部分を -生成しますが、ほかにもコンパイルに必要な情報、最適化に必要な情報、やアセ -ンブラ、逆アセンブラに必要な情報を示すファイルも生成します。 +rb/insns2vm.rb 縺ィ縺縺繧ケ繧ッ繝ェ繝励ヨ縺ッ縲(nsns.def 縺ィ縺縺繝輔ぃ繧、繝ォ繧定ェュ縺ソ霎シ縺ソ縲 +VM 縺ョ縺溘a縺ォ蠢隕√↑繝輔ぃ繧、繝ォ繧堤函謌舌@縺セ縺吶ょキ菴鍋噪縺ォ縺ッ縲∝多莉、繧貞ョ溯。後☆繧矩Κ蛻繧 +逕滓舌@縺セ縺吶′縲√⊇縺九↓繧ゅさ繝ウ繝代う繝ォ縺ォ蠢隕√↑諠蝣ア縲∵怙驕ゥ蛹悶↓蠢隕√↑諠蝣ア縲√d繧「繧サ +繝ウ繝悶Λ縲騾繧「繧サ繝ウ繝悶Λ縺ォ蠢隕√↑諠蝣ア繧堤、コ縺吶ヵ繧。繧、繝ォ繧ら函謌舌@縺セ縺吶 -** 命令記述 +** 蜻ス莉、險倩ソー -insns.def には、各命令がどのような命令であるかを記述します。具体的には次 -の情報を記述します。 +insns.def 縺ォ縺ッ縲∝推蜻ス莉、縺後←縺ョ繧医≧縺ェ蜻ス莉、縺ァ縺ゅk縺九r險倩ソー縺励∪縺吶ょキ菴鍋噪縺ォ縺ッ谺。 +縺ョ諠蝣ア繧定ィ倩ソー縺励∪縺吶 -- 命令の名前 -- その命令のカテゴリ、コメント(英語、日本語) -- オペランドの名前 -- その命令実行前にスタックからポップする値 -- その命令実行後にスタックにプッシュする値 -- その命令のロジック(C 言語で記述) +- 蜻ス莉、縺ョ蜷榊燕 +- 縺昴ョ蜻ス莉、縺ョ繧ォ繝繧エ繝ェ縲√さ繝。繝ウ繝茨シ郁恭隱槭∵律譛ャ隱橸シ +- 繧ェ繝壹Λ繝ウ繝峨ョ蜷榊燕 +- 縺昴ョ蜻ス莉、螳溯。悟燕縺ォ繧ケ繧ソ繝繧ッ縺九i繝昴ャ繝励☆繧句、 +- 縺昴ョ蜻ス莉、螳溯。悟セ後↓繧ケ繧ソ繝繧ッ縺ォ繝励ャ繧キ繝・縺吶k蛟、 +- 縺昴ョ蜻ス莉、縺ョ繝ュ繧ク繝繧ッシC 險隱槭〒險倩ソーシ -たとえば、スタックに self をおく putself という命令は次のように記述しま -す。 +縺溘→縺医ー縲√せ繧ソ繝繧ッ縺ォ self 繧偵♀縺 putself 縺ィ縺縺蜻ス莉、縺ッ谺。縺ョ繧医≧縺ォ險倩ソー縺励∪ +縺吶 #code /** @c put @e put self. - @j self を置く。 + @j self 繧堤スョ縺上 */ DEFINE_INSN putself @@ -99,36 +99,36 @@ putself } #end -この場合、オペランドと、スタックからポップする値は無いことになります。命 -令終了後、self をスタックトップに置きたいわけですが、それは val という、 -スタックにプッシュする値として宣言しておいた変数に代入しておくことで、こ -れを変換するとスタックトップに置く C プログラムが生成されます。 +縺薙ョ蝣エ蜷医√が繝壹Λ繝ウ繝峨→縲√せ繧ソ繝繧ッ縺九i繝昴ャ繝励☆繧句、縺ッ辟。縺縺薙→縺ォ縺ェ繧翫∪縺吶ょ多 +莉、邨ゆコ蠕後《elf 繧偵せ繧ソ繝繧ッ繝医ャ繝励↓鄂ョ縺阪◆縺繧上¢縺ァ縺吶′縲√◎繧後ッ val 縺ィ縺縺縲 +繧ケ繧ソ繝繧ッ縺ォ繝励ャ繧キ繝・縺吶k蛟、縺ィ縺励※螳」險縺励※縺翫>縺溷、画焚縺ォ莉」蜈・縺励※縺翫¥縺薙→縺ァ縲√% +繧後r螟画鋤縺吶k縺ィ繧ケ繧ソ繝繧ッ繝医ャ繝励↓鄂ョ縺 C 繝励Ο繧ー繝ゥ繝縺檎函謌舌&繧後∪縺吶 -細かいフォーマットは insns.def の冒頭を参照してください。そんなに難しく -ないと思います。 +邏ー縺九>繝輔か繝シ繝槭ャ繝医ッ insns.def 縺ョ蜀帝ュ繧貞盾辣ァ縺励※縺上□縺輔>縲ゅ◎繧薙↑縺ォ髮」縺励¥ +縺ェ縺縺ィ諤昴>縺セ縺吶 -insnhelper.h というファイルに、命令ロジックを記述するために必要なマクロ -が定義されています。また、VM の内部構造に関する定義は vm.h というファイ -ルにあります。 +insnhelper.h 縺ィ縺縺繝輔ぃ繧、繝ォ縺ォ縲∝多莉、繝ュ繧ク繝繧ッ繧定ィ倩ソー縺吶k縺溘a縺ォ蠢隕√↑繝槭け繝ュ +縺悟ョ夂セゥ縺輔l縺ヲ縺縺セ縺吶ゅ∪縺溘〃M 縺ョ蜀驛ィ讒矩縺ォ髢「縺吶k螳夂セゥ縺ッ vm.h 縺ィ縺縺繝輔ぃ繧、 +繝ォ縺ォ縺ゅj縺セ縺吶 * VM (Virtual Machine, vm.h, vm.c) -VM は、実際にコンパイルした結果生成される YARV 命令列を実行します。まさ -に、この部分が YARV のキモになり、将来的には eval.c をこの VM で置き換え -たいと考えています。 +VM 縺ッ縲∝ョ滄圀縺ォ繧ウ繝ウ繝代う繝ォ縺励◆邨先棡逕滓舌&繧後k YARV 蜻ス莉、蛻励r螳溯。後@縺セ縺吶ゅ∪縺 +縺ォ縲√%縺ョ驛ィ蛻縺 YARV 縺ョ繧ュ繝「縺ォ縺ェ繧翫∝ー譚・逧縺ォ縺ッ eval.c 繧偵%縺ョ VM 縺ァ鄂ョ縺肴鋤縺 +縺溘>縺ィ閠縺医※縺縺セ縺吶 -現在の Ruby インタプリタで実行できるすべてのことが、この VM で実現できる -ように作っています(現段階ではまだ完全ではありませんが、そうなるべきです)。 +迴セ蝨ィ縺ョ Ruby 繧、繝ウ繧ソ繝励Μ繧ソ縺ァ螳溯。後〒縺阪k縺吶∋縺ヲ縺ョ縺薙→縺後√%縺ョ VM 縺ァ螳溽樟縺ァ縺阪k +繧医≧縺ォ菴懊▲縺ヲ縺縺セ縺呻シ育樟谿オ髫弱〒縺ッ縺セ縺螳悟ィ縺ァ縺ッ縺ゅj縺セ縺帙s縺後√◎縺縺ェ繧九∋縺阪〒縺呻シ峨 -VM は、単純なスタックマシンとして実装しています。スレッドひとつにスタッ -クひとつを保持します。スタックの領域はヒープから取得するので、柔軟な領域 -設定が可能です。 +VM 縺ッ縲∝腰邏斐↑繧ケ繧ソ繝繧ッ繝槭す繝ウ縺ィ縺励※螳溯」縺励※縺縺セ縺吶ゅせ繝ャ繝繝峨イ縺ィ縺、縺ォ繧ケ繧ソ繝 +繧ッ縺イ縺ィ縺、繧剃ソ晄戟縺励∪縺吶ゅせ繧ソ繝繧ッ縺ョ鬆伜沺縺ッ繝偵シ繝励°繧牙叙蠕励☆繧九ョ縺ァ縲∵沐霆溘↑鬆伜沺 +險ュ螳壹′蜿ッ閭ス縺ァ縺吶 -** レジスタ +** 繝ャ繧ク繧ケ繧ソ -VM は 5 つの仮想的なレジスタによって制御されます。 +VM 縺ッ 5 縺、縺ョ莉ョ諠ウ逧縺ェ繝ャ繧ク繧ケ繧ソ縺ォ繧医▲縺ヲ蛻カ蠕。縺輔l縺セ縺吶 - PC (Program Counter) - SP (Stack Pointer) @@ -136,77 +136,77 @@ VM - LFP (Local Frame Pointer) - DFP (Dynamic Frame Pointer) -PC は現在実行中の命令列の位置を示します。SP はスタックトップの位置を示し -ます。CFP、LFP、DFP はそれぞれフレームの情報を示します。詳細は後述します。 +PC 縺ッ迴セ蝨ィ螳溯。御クュ縺ョ蜻ス莉、蛻励ョ菴咲スョ繧堤、コ縺励∪縺吶4P 縺ッ繧ケ繧ソ繝繧ッ繝医ャ繝励ョ菴咲スョ繧堤、コ縺 +縺セ縺吶CFP縲´FP縲.FP 縺ッ縺昴l縺槭l繝輔Ξ繝シ繝縺ョ諠蝣ア繧堤、コ縺励∪縺吶りゥウ邏ー縺ッ蠕瑚ソー縺励∪縺吶 -** スタックフレーム +** 繧ケ繧ソ繝繧ッ繝輔Ξ繝シ繝 obsolete (update soon) -** フレームデザインについての補足 +** 繝輔Ξ繝シ繝繝繧カ繧、繝ウ縺ォ縺、縺縺ヲ縺ョ陬懆カウ -Lisp の処理系などをかんがえると、わざわざブロックローカルフレームとメソ -ッドローカルフレームのようなものを用意するのは奇異に見えるかもしれません。 -あるフレームを、入れ子構造にして、ローカル変数のアクセスはその入れ子を外 -側に辿れば必ずたどり着くことができるからです(つまり、lfp は必要ない)。 +Lisp 縺ョ蜃ヲ逅邉サ縺ェ縺ゥ繧偵°繧薙′縺医k縺ィ縲√o縺悶o縺悶ヶ繝ュ繝繧ッ繝ュ繝シ繧ォ繝ォ繝輔Ξ繝シ繝縺ィ繝。繧ス +繝繝峨Ο繝シ繧ォ繝ォ繝輔Ξ繝シ繝縺ョ繧医≧縺ェ繧ゅョ繧堤畑諢上☆繧九ョ縺ッ螂逡ー縺ォ隕九∴繧九°繧ゅ@繧後∪縺帙s縲 +縺ゅk繝輔Ξ繝シ繝繧偵∝・繧悟ュ先ァ矩縺ォ縺励※縲√Ο繝シ繧ォ繝ォ螟画焚縺ョ繧「繧ッ繧サ繧ケ縺ッ縺昴ョ蜈・繧悟ュ舌r螟 +蛛エ縺ォ霎ソ繧後ー蠢縺壹◆縺ゥ繧顔捩縺上%縺ィ縺後〒縺阪k縺九i縺ァ縺呻シ医▽縺セ繧翫〕fp 縺ッ蠢隕√↑縺シ峨 -しかし、Ruby ではいくつか状況が違います。まず、メソッドローカルな情報が -あること、具体的にはブロックとself(callee からみると reciever)です。こ -の情報をそれぞれのフレームにもたせるのは無駄です。 +縺励°縺励ヽuby 縺ァ縺ッ縺縺上▽縺狗憾豕√′驕輔>縺セ縺吶ゅ∪縺壹√Γ繧ス繝繝峨Ο繝シ繧ォ繝ォ縺ェ諠蝣ア縺 +縺ゅk縺薙→縲∝キ菴鍋噪縺ォ縺ッ繝悶Ο繝繧ッ縺ィselfシcallee 縺九i縺ソ繧九→ recieverシ峨〒縺吶ゅ% +縺ョ諠蝣ア繧偵◎繧後◇繧後ョ繝輔Ξ繝シ繝縺ォ繧ゅ◆縺帙k縺ョ縺ッ辟。鬧縺ァ縺吶 -また、Ruby2.0 からはブロックローカル変数はなくなります(ブロックローカル -引数は残るので、構造自体はあまり変わりません)。そのため、メソッドローカ -ル変数へのアクセスが頻発することが予想されます。 +縺セ縺溘ヽuby2.0 縺九i縺ッ繝悶Ο繝繧ッ繝ュ繝シ繧ォ繝ォ螟画焚縺ッ縺ェ縺上↑繧翫∪縺呻シ医ヶ繝ュ繝繧ッ繝ュ繝シ繧ォ繝ォ +蠑墓焚縺ッ谿九k縺ョ縺ァ縲∵ァ矩閾ェ菴薙ッ縺ゅ∪繧雁、峨o繧翫∪縺帙sシ峨ゅ◎縺ョ縺溘a縲√Γ繧ス繝繝峨Ο繝シ繧ォ +繝ォ螟画焚縺ク縺ョ繧「繧ッ繧サ繧ケ縺碁サ逋コ縺吶k縺薙→縺御コ域Φ縺輔l縺セ縺吶 -このとき、メソッドローカル変数へのアクセスのたびにフレーム(スコープ)の -リストをたどるのは無駄であると判断し、明示的にメソッドローカルスコープと -ブロックフレームを分離し、ブロックフレームからはメソッドローカルフレーム -が lfpレジスタによって容易にアクセスできるようにしました。 +縺薙ョ縺ィ縺阪√Γ繧ス繝繝峨Ο繝シ繧ォ繝ォ螟画焚縺ク縺ョ繧「繧ッ繧サ繧ケ縺ョ縺溘ウ縺ォ繝輔Ξ繝シ繝シ医せ繧ウ繝シ繝暦シ峨ョ +繝ェ繧ケ繝医r縺溘←繧九ョ縺ッ辟。鬧縺ァ縺ゅk縺ィ蛻、譁ュ縺励∵守、コ逧縺ォ繝。繧ス繝繝峨Ο繝シ繧ォ繝ォ繧ケ繧ウ繝シ繝励→ +繝悶Ο繝繧ッ繝輔Ξ繝シ繝繧貞髮「縺励√ヶ繝ュ繝繧ッ繝輔Ξ繝シ繝縺九i縺ッ繝。繧ス繝繝峨Ο繝シ繧ォ繝ォ繝輔Ξ繝シ繝 +縺 lfp繝ャ繧ク繧ケ繧ソ縺ォ繧医▲縺ヲ螳ケ譏薙↓繧「繧ッ繧サ繧ケ縺ァ縺阪k繧医≧縺ォ縺励∪縺励◆縲 -** メソッド呼び出しについて +** 繝。繧ス繝繝牙他縺ウ蜃コ縺励↓縺、縺縺ヲ -メソッド呼び出しは、YARV 命令列で記述されたメソッドか、C で記述されたメ -ソッドかによってディスパッチ手法が変わります。 +繝。繧ス繝繝牙他縺ウ蜃コ縺励ッ縲〆ARV 蜻ス莉、蛻励〒險倩ソー縺輔l縺溘Γ繧ス繝繝峨°縲, 縺ァ險倩ソー縺輔l縺溘Γ +繧ス繝繝峨°縺ォ繧医▲縺ヲ繝繧」繧ケ繝代ャ繝∵焔豕輔′螟峨o繧翫∪縺吶 -YARV 命令列であった場合、上述したスタックフレームを作成して命令を継続し -ます。とくに VM の関数を再帰呼び出すすることは行ないません。 +YARV 蜻ス莉、蛻励〒縺ゅ▲縺溷エ蜷医∽ク願ソー縺励◆繧ケ繧ソ繝繧ッ繝輔Ξ繝シ繝繧剃ス懈舌@縺ヲ蜻ス莉、繧堤カ咏カ壹@ +縺セ縺吶ゅ→縺上↓ VM 縺ョ髢「謨ー繧貞榊クー蜻シ縺ウ蜃コ縺吶☆繧九%縺ィ縺ッ陦後↑縺縺セ縺帙s縲 -C で記述されたメソッドだった場合、単純にその関数を呼び出します(ただし、 -バックトレースを正しく生成するためにメソッド呼び出しの情報を付加してから -行ないます)。 +C 縺ァ險倩ソー縺輔l縺溘Γ繧ス繝繝峨□縺」縺溷エ蜷医∝腰邏斐↓縺昴ョ髢「謨ー繧貞他縺ウ蜃コ縺励∪縺呻シ医◆縺縺励 +繝舌ャ繧ッ繝医Ξ繝シ繧ケ繧呈ュ」縺励¥逕滓舌☆繧九◆繧√↓繝。繧ス繝繝牙他縺ウ蜃コ縺励ョ諠蝣ア繧剃サ伜刈縺励※縺九i +陦後↑縺縺セ縺呻シ峨 -このため、VM 用スタックを別途用意したものの、プログラムによってはマシン -スタックを使い切ってしまう可能性があります(C -> Ruby -> C -> ... という -呼び出しが続いた場合)。これは、現在では避けられない仕様となっています。 +縺薙ョ縺溘a縲〃M 逕ィ繧ケ繧ソ繝繧ッ繧貞挨騾皮畑諢上@縺溘b縺ョ縺ョ縲√励Ο繧ー繝ゥ繝縺ォ繧医▲縺ヲ縺ッ繝槭す繝ウ +繧ケ繧ソ繝繧ッ繧剃スソ縺蛻縺」縺ヲ縺励∪縺蜿ッ閭ス諤ァ縺後≠繧翫∪縺呻シC -> Ruby -> C -> ... 縺ィ縺縺 +蜻シ縺ウ蜃コ縺励′邯壹>縺溷エ蜷茨シ峨ゅ%繧後ッ縲∫樟蝨ィ縺ァ縺ッ驕ソ縺代i繧後↑縺莉墓ァ倥→縺ェ縺」縺ヲ縺縺セ縺吶 -** 例外 +** 萓句、 -例外は、Java の JVM と同様に例外テーブルを用意することで実現します。例外 -が発生したら、当該フレームを、例外テーブルを検査します。そこで、例外が発 -生したときの PC の値に合致するエントリがあった場合、そのエントリに従って -動作します。もしエントリが見つからなかった場合、スタックを撒き戻してまた -同様にそのスコープの例外テーブルを検査します。 +萓句、悶ッ縲゛ava 縺ョ JVM 縺ィ蜷梧ァ倥↓萓句、悶ユ繝シ繝悶Ν繧堤畑諢上☆繧九%縺ィ縺ァ螳溽樟縺励∪縺吶ゆセ句、 +縺檎匱逕溘@縺溘i縲∝ス楢ゥイ繝輔Ξ繝シ繝繧偵∽セ句、悶ユ繝シ繝悶Ν繧呈、懈渊縺励∪縺吶ゅ◎縺薙〒縲∽セ句、悶′逋コ +逕溘@縺溘→縺阪ョ PC 縺ョ蛟、縺ォ蜷郁エ縺吶k繧ィ繝ウ繝医Μ縺後≠縺」縺溷エ蜷医√◎縺ョ繧ィ繝ウ繝医Μ縺ォ蠕薙▲縺ヲ +蜍穂ス懊@縺セ縺吶ゅb縺励お繝ウ繝医Μ縺瑚ヲ九▽縺九i縺ェ縺九▲縺溷エ蜷医√せ繧ソ繝繧ッ繧呈鋳縺肴綾縺励※縺セ縺 +蜷梧ァ倥↓縺昴ョ繧ケ繧ウ繝シ繝励ョ萓句、悶ユ繝シ繝悶Ν繧呈、懈渊縺励∪縺吶 -また、break、return(ブロック中)、retry なども同様の仕組みで実現します。 +縺セ縺溘|reak縲〉eturnシ医ヶ繝ュ繝繧ッ荳ュシ峨〉etry 縺ェ縺ゥ繧ょ酔讒倥ョ莉慕オ縺ソ縺ァ螳溽樟縺励∪縺吶 -*** 例外テーブル +*** 萓句、悶ユ繝シ繝悶Ν -例外テーブルエントリは具体的には次の情報が格納されています。 +萓句、悶ユ繝シ繝悶Ν繧ィ繝ウ繝医Μ縺ッ蜈キ菴鍋噪縺ォ縺ッ谺。縺ョ諠蝣ア縺梧シ邏阪&繧後※縺縺セ縺吶 -- 対象とする PC の範囲 -- 対象とする例外の種類 -- もし対象となったときにジャンプする先(種類による) -- もし対象となったときに起動するブロックの iseq +- 蟇セ雎。縺ィ縺吶k PC 縺ョ遽蝗イ +- 蟇セ雎。縺ィ縺吶k萓句、悶ョ遞ョ鬘 +- 繧ゅ@蟇セ雎。縺ィ縺ェ縺」縺溘→縺阪↓繧ク繝」繝ウ繝励☆繧句茨シ育ィョ鬘槭↓繧医kシ +- 繧ゅ@蟇セ雎。縺ィ縺ェ縺」縺溘→縺阪↓襍キ蜍輔☆繧九ヶ繝ュ繝繧ッ縺ョ iseq *** rescue -rescue 節はブロックとして実現しています。$! の値を唯一の引数として持ちま -す。 +rescue 遽縺ッ繝悶Ο繝繧ッ縺ィ縺励※螳溽樟縺励※縺縺セ縺吶$! 縺ョ蛟、繧貞髪荳縺ョ蠑墓焚縺ィ縺励※謖√■縺セ +縺吶 #code begin @@ -216,7 +216,7 @@ rescue C end #end -は、次のような Ruby スクリプトに変換されます。 +縺ッ縲∵ャ。縺ョ繧医≧縺ェ Ruby 繧ケ繧ッ繝ェ繝励ヨ縺ォ螟画鋤縺輔l縺セ縺吶 #code {|err| @@ -225,7 +225,7 @@ end when B === err when C === err else - raise # yarv の命令では throw + raise # yarv 縺ョ蜻ス莉、縺ァ縺ッ throw end } #end @@ -233,32 +233,32 @@ end *** ensure -正常系(例外が発生しなかった場合)と異常系(例外が発生したときなど)の2 -種類の命令列が生成されます。正常系では、ただの連続したコード領域としてコ -ンパイルされます。また、異常系ではブロックとして実装します。最後は必ず -throw 命令で締めることになります。 +豁」蟶ク邉サシ井セ句、悶′逋コ逕溘@縺ェ縺九▲縺溷エ蜷茨シ峨→逡ー蟶ク邉サシ井セ句、悶′逋コ逕溘@縺溘→縺阪↑縺ゥシ峨ョ2 +遞ョ鬘槭ョ蜻ス莉、蛻励′逕滓舌&繧後∪縺吶よュ」蟶ク邉サ縺ァ縺ッ縲√◆縺縺ョ騾」邯壹@縺溘さ繝シ繝蛾伜沺縺ィ縺励※繧ウ +繝ウ繝代う繝ォ縺輔l縺セ縺吶ゅ∪縺溘∫焚蟶ク邉サ縺ァ縺ッ繝悶Ο繝繧ッ縺ィ縺励※螳溯」縺励∪縺吶よ怙蠕後ッ蠢縺 +throw 蜻ス莉、縺ァ邱繧√k縺薙→縺ォ縺ェ繧翫∪縺吶 -*** break, return(ブロック中)、retry +*** break, returnシ医ヶ繝ュ繝繧ッ荳ュシ峨〉etry -break 文、ブロック中の return 文、retry 文は throw 命令としてコンパイル -されます。どこまで戻るかは、break をフックする例外テーブルのエントリが判 -断します。 +break 譁縲√ヶ繝ュ繝繧ッ荳ュ縺ョ return 譁縲〉etry 譁縺ッ throw 蜻ス莉、縺ィ縺励※繧ウ繝ウ繝代う繝ォ +縺輔l縺セ縺吶ゅ←縺薙∪縺ァ謌サ繧九°縺ッ縲|reak 繧偵ヵ繝繧ッ縺吶k萓句、悶ユ繝シ繝悶Ν縺ョ繧ィ繝ウ繝医Μ縺悟愛 +譁ュ縺励∪縺吶 -** 定数の検索 +** 螳壽焚縺ョ讀懃エ「 -定数という名前なのに、Ruby ではコンパイル時に決定しません。というか、い -つまでも再定義可能になっています。 +螳壽焚縺ィ縺縺蜷榊燕縺ェ縺ョ縺ォ縲ヽuby 縺ァ縺ッ繧ウ繝ウ繝代う繝ォ譎ゅ↓豎コ螳壹@縺セ縺帙s縲ゅ→縺縺縺九√> +縺、縺セ縺ァ繧ょ榊ョ夂セゥ蜿ッ閭ス縺ォ縺ェ縺」縺ヲ縺縺セ縺吶 -定数アクセスのためのRuby記述は次のようになります。 +螳壽焚繧「繧ッ繧サ繧ケ縺ョ縺溘a縺ョRuby險倩ソー縺ッ谺。縺ョ繧医≧縺ォ縺ェ繧翫∪縺吶 #code -Ruby表現: +Ruby陦ィ迴セ: expr::ID::...::ID #end -これは、yarv命令セットでは次のようになります。 +縺薙l縺ッ縲【arv蜻ス莉、繧サ繝繝医〒縺ッ谺。縺ョ繧医≧縺ォ縺ェ繧翫∪縺吶 #code (expr) @@ -268,161 +268,161 @@ getconstant ID #end -*** 定数検索パス +*** 螳壽焚讀懃エ「繝代せ -もし expr が nil だった場合、定数検索パスに従って定数を検索します。この -挙動は今後 Ruby 2.0 に向けて変更される場合があります。 +繧ゅ@ expr 縺 nil 縺縺」縺溷エ蜷医∝ョ壽焚讀懃エ「繝代せ縺ォ蠕薙▲縺ヲ螳壽焚繧呈、懃エ「縺励∪縺吶ゅ%縺ョ +謖吝虚縺ッ莉雁セ Ruby 2.0 縺ォ蜷代¢縺ヲ螟画峩縺輔l繧句エ蜷医′縺ゅj縺セ縺吶 -+ クラス、モジュールの動的ネスト関係(プログラムの字面上)をルートまで辿る -+ 継承関係をルート(Object)まで辿る ++ 繧ッ繝ゥ繧ケ縲√Δ繧ク繝・繝シ繝ォ縺ョ蜍慕噪繝阪せ繝磯未菫ゑシ医励Ο繧ー繝ゥ繝縺ョ蟄鈴擇荳奇シ峨r繝ォ繝シ繝医∪縺ァ霎ソ繧 ++ 邯呎価髢「菫ゅr繝ォ繝シ繝茨シObjectシ峨∪縺ァ霎ソ繧 -このため、クラス、モジュールの動的ネスト関係を保存しなければなりません。 -このために、thread_object には klass_nest_stack というものを用意しました。 -これは、現在のネストの情報を保存します。 +縺薙ョ縺溘a縲√け繝ゥ繧ケ縲√Δ繧ク繝・繝シ繝ォ縺ョ蜍慕噪繝阪せ繝磯未菫ゅr菫晏ュ倥@縺ェ縺代l縺ー縺ェ繧翫∪縺帙s縲 +縺薙ョ縺溘a縺ォ縲》hread_object 縺ォ縺ッ klass_nest_stack 縺ィ縺縺繧ゅョ繧堤畑諢上@縺セ縺励◆縲 +縺薙l縺ッ縲∫樟蝨ィ縺ョ繝阪せ繝医ョ諠蝣ア繧剃ソ晏ュ倥@縺セ縺吶 -メソッド定義時、その現在のネスト情報をメソッド定義時に(dupして)加える -ことで、そのメソッドの実行時、そのネスト情報を参照することが可能になりま -す。 +繝。繧ス繝繝牙ョ夂セゥ譎ゅ√◎縺ョ迴セ蝨ィ縺ョ繝阪せ繝域ュ蝣ア繧偵Γ繧ス繝繝牙ョ夂セゥ譎ゅ↓シdup縺励※シ牙刈縺医k +縺薙→縺ァ縲√◎縺ョ繝。繧ス繝繝峨ョ螳溯。梧凾縲√◎縺ョ繝阪せ繝域ュ蝣ア繧貞盾辣ァ縺吶k縺薙→縺悟庄閭ス縺ォ縺ェ繧翫∪ +縺吶 -トップレベルでは、その情報はないことになります。 +繝医ャ繝励Ξ繝吶Ν縺ァ縺ッ縲√◎縺ョ諠蝣ア縺ッ縺ェ縺縺薙→縺ォ縺ェ繧翫∪縺吶 -クラス/モジュール定義文実行時は、現在の情報そのものを参照することになり -ます。これは、クラススコープ突入時、その情報をクラス定義文にコピーします -(すでにコピーされていれば、これを行いません)。 +繧ッ繝ゥ繧ケ/繝「繧ク繝・繝シ繝ォ螳夂セゥ譁螳溯。梧凾縺ッ縲∫樟蝨ィ縺ョ諠蝣ア縺昴ョ繧ゅョ繧貞盾辣ァ縺吶k縺薙→縺ォ縺ェ繧 +縺セ縺吶ゅ%繧後ッ縲√け繝ゥ繧ケ繧ケ繧ウ繝シ繝礼ェ∝・譎ゅ√◎縺ョ諠蝣ア繧偵け繝ゥ繧ケ螳夂セゥ譁縺ォ繧ウ繝斐シ縺励∪縺 +シ医☆縺ァ縺ォ繧ウ繝斐シ縺輔l縺ヲ縺繧後ー縲√%繧後r陦後>縺セ縺帙sシ峨 -これにより、動的なネスト情報を統一的に扱うことができます。 +縺薙l縺ォ繧医j縲∝虚逧縺ェ繝阪せ繝域ュ蝣ア繧堤オア荳逧縺ォ謇ア縺縺薙→縺後〒縺阪∪縺吶 -** 最適化手法 +** 譛驕ゥ蛹匁焔豕 -YARV では高速化を目的としているので、さまざまな最適化手法を利用していま -す。詳細は割愛しますが、以下に述べる最適化などを行なっております。 +YARV 縺ァ縺ッ鬮倬溷喧繧堤岼逧縺ィ縺励※縺繧九ョ縺ァ縲√&縺セ縺悶∪縺ェ譛驕ゥ蛹匁焔豕輔r蛻ゥ逕ィ縺励※縺縺セ +縺吶りゥウ邏ー縺ッ蜑イ諢帙@縺セ縺吶′縲∽サ・荳九↓霑ー縺ケ繧区怙驕ゥ蛹悶↑縺ゥ繧定。後↑縺」縺ヲ縺翫j縺セ縺吶 *** threaded code -GCC の C 言語拡張である値としてのラベルを利用して direct threaded code -を実現しています。 +GCC 縺ョ C 險隱樊僑蠑オ縺ァ縺ゅk蛟、縺ィ縺励※縺ョ繝ゥ繝吶Ν繧貞茜逕ィ縺励※ direct threaded code +繧貞ョ溽樟縺励※縺縺セ縺吶 *** Peephole optimization -いくつかの簡単な最適化をしています。 +縺縺上▽縺九ョ邁。蜊倥↑譛驕ゥ蛹悶r縺励※縺縺セ縺吶 *** inline method cache -命令列の中にメソッド検索結果を埋め込みます。 +蜻ス莉、蛻励ョ荳ュ縺ォ繝。繧ス繝繝画、懃エ「邨先棡繧貞沂繧∬セシ縺ソ縺セ縺吶 *** inline constant cache -命令列の中に定数検索結果を埋め込みます。 +蜻ス莉、蛻励ョ荳ュ縺ォ螳壽焚讀懃エ「邨先棡繧貞沂繧∬セシ縺ソ縺セ縺吶 -*** ブロックと Proc オブジェクトの分離 +*** 繝悶Ο繝繧ッ縺ィ Proc 繧ェ繝悶ず繧ァ繧ッ繝医ョ蛻髮「 -ブロック付きメソッド呼び出しが行なわれたときにはすぐにはブロックを Proc -オブジェクトとして生成しません。これにより、必要ない Proc オブジェクトの -生成を抑えています。 +繝悶Ο繝繧ッ莉倥″繝。繧ス繝繝牙他縺ウ蜃コ縺励′陦後↑繧上l縺溘→縺阪↓縺ッ縺吶$縺ォ縺ッ繝悶Ο繝繧ッ繧 Proc +繧ェ繝悶ず繧ァ繧ッ繝医→縺励※逕滓舌@縺セ縺帙s縲ゅ%繧後↓繧医j縲∝ソ隕√↑縺 Proc 繧ェ繝悶ず繧ァ繧ッ繝医ョ +逕滓舌r謚代∴縺ヲ縺縺セ縺吶 -Proc メソッドは、実際に必要になった時点で作られ、そのときに環境(スコー -プ上に確保された変数など)をヒープに保存します。 +Proc 繝。繧ス繝繝峨ッ縲∝ョ滄圀縺ォ蠢隕√↓縺ェ縺」縺滓凾轤ケ縺ァ菴懊i繧後√◎縺ョ縺ィ縺阪↓迺ー蠅シ医せ繧ウ繝シ +繝嶺ク翫↓遒コ菫昴&繧後◆螟画焚縺ェ縺ゥシ峨r繝偵シ繝励↓菫晏ュ倥@縺セ縺吶 -*** 特化命令 +*** 迚ケ蛹門多莉、 -Fixnum 同士の加算などを正直に関数呼び出しによって行なうと、コストがかか -るので、これらのプリミティブな操作を行なうためのメソッド呼び出しは専用命 -令を用意しました。 +Fixnum 蜷悟」ォ縺ョ蜉邂励↑縺ゥ繧呈ュ」逶エ縺ォ髢「謨ー蜻シ縺ウ蜃コ縺励↓繧医▲縺ヲ陦後↑縺縺ィ縲√さ繧ケ繝医′縺九° +繧九ョ縺ァ縲√%繧後i縺ョ繝励Μ繝溘ユ繧」繝悶↑謫堺ス懊r陦後↑縺縺溘a縺ョ繝。繧ス繝繝牙他縺ウ蜃コ縺励ッ蟆ら畑蜻ス +莉、繧堤畑諢上@縺セ縺励◆縲 -*** 命令融合 +*** 蜻ス莉、陞榊粋 -複数の命令を 1 命令に変換します。融合命令は opt_insn_unif.def の記述によ -り自動的に生成されます。 +隍謨ー縺ョ蜻ス莉、繧 1 蜻ス莉、縺ォ螟画鋤縺励∪縺吶り檮蜷亥多莉、縺ッ opt_insn_unif.def 縺ョ險倩ソー縺ォ繧 +繧願ェ蜍慕噪縺ォ逕滓舌&繧後∪縺吶 -*** オペランド融合 +*** 繧ェ繝壹Λ繝ウ繝芽檮蜷 -複数のオペランドを含めた命令を生成します。融合命令は opt_operand.def の -記述によって自動的に生成されます。 +隍謨ー縺ョ繧ェ繝壹Λ繝ウ繝峨r蜷ォ繧√◆蜻ス莉、繧堤函謌舌@縺セ縺吶り檮蜷亥多莉、縺ッ opt_operand.def 縺ョ +險倩ソー縺ォ繧医▲縺ヲ閾ェ蜍慕噪縺ォ逕滓舌&繧後∪縺吶 *** stack caching -スタックトップを仮想レジスタに保持するようにします。現在は 2 個の仮想レ -ジスタを想定し、5状態のスタックキャッシングを行ないます。スタックキャッ -シングする命令は自動的に生成されます。 +繧ケ繧ソ繝繧ッ繝医ャ繝励r莉ョ諠ウ繝ャ繧ク繧ケ繧ソ縺ォ菫晄戟縺吶k繧医≧縺ォ縺励∪縺吶ら樟蝨ィ縺ッ 2 蛟九ョ莉ョ諠ウ繝ャ +繧ク繧ケ繧ソ繧呈Φ螳壹@縲5迥カ諷九ョ繧ケ繧ソ繝繧ッ繧ュ繝」繝繧キ繝ウ繧ー繧定。後↑縺縺セ縺吶ゅせ繧ソ繝繧ッ繧ュ繝」繝 +繧キ繝ウ繧ー縺吶k蜻ス莉、縺ッ閾ェ蜍慕噪縺ォ逕滓舌&繧後∪縺吶 *** JIT Compile -機械語を切り貼りします。非常に実験的なコードものしか作っておりません。ほ -とんどのプログラムは動きません。 +讖滓「ー隱槭r蛻繧願イシ繧翫@縺セ縺吶る撼蟶ク縺ォ螳滄ィ鍋噪縺ェ繧ウ繝シ繝峨b縺ョ縺励°菴懊▲縺ヲ縺翫j縺セ縺帙s縲ゅ⊇ +縺ィ繧薙←縺ョ繝励Ο繧ー繝ゥ繝縺ッ蜍輔″縺セ縺帙s縲 *** AOT Compile -YARV 命令列を C 言語に変換します。まだ十分な最適化を行なえておりませんが、 -それなりに動きます。rb/aotc.rb がコンパイラです。 +YARV 蜻ス莉、蛻励r C 險隱槭↓螟画鋤縺励∪縺吶ゅ∪縺蜊∝縺ェ譛驕ゥ蛹悶r陦後↑縺医※縺翫j縺セ縺帙s縺後 +縺昴l縺ェ繧翫↓蜍輔″縺セ縺吶Sb/aotc.rb 縺後さ繝ウ繝代う繝ゥ縺ァ縺吶 * Assembler (rb/yasm.rb) -YARV 命令列のアセンブラを用意しました。使い方は rb/yasm.rb を参照してく -ださい(まだ、例示してある生成手法のすべてをサポートしているわけではあり -ません)。 +YARV 蜻ス莉、蛻励ョ繧「繧サ繝ウ繝悶Λ繧堤畑諢上@縺セ縺励◆縲ゆスソ縺譁ケ縺ッ rb/yasm.rb 繧貞盾辣ァ縺励※縺 +縺縺輔>シ医∪縺縲∽セ狗、コ縺励※縺ゅk逕滓先焔豕輔ョ縺吶∋縺ヲ繧偵し繝昴シ繝医@縺ヲ縺繧九o縺代〒縺ッ縺ゅj +縺セ縺帙sシ峨 * Dis-Assembler (disasm.c) -YARV 命令列を示すオブジェクト YARVCore::InstructionSequence には disasm -メソッドがあります。これは、命令列を逆アセンブルした文字列を返します。 +YARV 蜻ス莉、蛻励r遉コ縺吶が繝悶ず繧ァ繧ッ繝 YARVCore::InstructionSequence 縺ォ縺ッ disasm +繝。繧ス繝繝峨′縺ゅj縺セ縺吶ゅ%繧後ッ縲∝多莉、蛻励r騾繧「繧サ繝ウ繝悶Ν縺励◆譁蟄怜励r霑斐@縺セ縺吶 -* YARV 命令セット +* YARV 蜻ス莉、繧サ繝繝 <%= d %> -* その他 +* 縺昴ョ莉 -** テスト +** 繝繧ケ繝 -test/test_* がテストケースです。一応、ミスなく動くはずです。逆にいうと、 -このテストに記述されている例ではきちんと動作するということです。 +test/test_* 縺後ユ繧ケ繝医こ繝シ繧ケ縺ァ縺吶ゆク蠢懊√Α繧ケ縺ェ縺丞虚縺上ッ縺壹〒縺吶る縺ォ縺縺縺ィ縲 +縺薙ョ繝繧ケ繝医↓險倩ソー縺輔l縺ヲ縺繧倶セ九〒縺ッ縺阪■繧薙→蜍穂ス懊☆繧九→縺縺縺薙→縺ァ縺吶 -** ベンチマーク +** 繝吶Φ繝√槭シ繧ッ -benchmark/bm_* にベンチマークプログラムがおいてあります。 +benchmark/bm_* 縺ォ繝吶Φ繝√槭シ繧ッ繝励Ο繧ー繝ゥ繝縺後♀縺縺ヲ縺ゅj縺セ縺吶 -** 今後の予定 +** 莉雁セ後ョ莠亥ョ -まだまだやらなければいけないこと、未実装部分がたくさんありますんでやって -いかなければなりません。一番大きな目標は eval.c を置き換えることでしょう -か。 +縺セ縺縺セ縺繧繧峨↑縺代l縺ー縺縺代↑縺縺薙→縲∵悴螳溯」驛ィ蛻縺後◆縺上&繧薙≠繧翫∪縺吶s縺ァ繧縺」縺ヲ +縺縺九↑縺代l縺ー縺ェ繧翫∪縺帙s縲ゆク逡ェ螟ァ縺阪↑逶ョ讓吶ッ eval.c 繧堤スョ縺肴鋤縺医k縺薙→縺ァ縺励g縺 +縺九 *** Verifier -YARV 命令列は、ミスがあっても動かしてしまうため危険である可能性がありま -す。そのため、スタックの利用状態をきちんと事前に検証するようなベリファイ -アを用意しなければならないと考えています。 +YARV 蜻ス莉、蛻励ッ縲√Α繧ケ縺後≠縺」縺ヲ繧ょ虚縺九@縺ヲ縺励∪縺縺溘a蜊ア髯コ縺ァ縺ゅk蜿ッ閭ス諤ァ縺後≠繧翫∪ +縺吶ゅ◎縺ョ縺溘a縲√せ繧ソ繝繧ッ縺ョ蛻ゥ逕ィ迥カ諷九r縺阪■繧薙→莠句燕縺ォ讀懆ィシ縺吶k繧医≧縺ェ繝吶Μ繝輔ぃ繧、 +繧「繧堤畑諢上@縺ェ縺代l縺ー縺ェ繧峨↑縺縺ィ閠縺医※縺縺セ縺吶 -*** Compiled File の構想 +*** Compiled File 縺ョ讒区Φ -Ruby プログラムをこの命令セットにシリアライズしたデータ構造をファイルに -出力できるようにしたいと考えています。これを利用して一度コンパイルした命 -令列をファイルに保存しておけば、次回ロード時にはコンパイルの手間、コスト -を省くことができます。 +Ruby 繝励Ο繧ー繝ゥ繝繧偵%縺ョ蜻ス莉、繧サ繝繝医↓繧キ繝ェ繧「繝ゥ繧、繧コ縺励◆繝繝シ繧ソ讒矩繧偵ヵ繧。繧、繝ォ縺ォ +蜃コ蜉帙〒縺阪k繧医≧縺ォ縺励◆縺縺ィ閠縺医※縺縺セ縺吶ゅ%繧後r蛻ゥ逕ィ縺励※荳蠎ヲ繧ウ繝ウ繝代う繝ォ縺励◆蜻ス +莉、蛻励r繝輔ぃ繧、繝ォ縺ォ菫晏ュ倥@縺ヲ縺翫¢縺ー縲∵ャ。蝗槭Ο繝シ繝画凾縺ォ縺ッ繧ウ繝ウ繝代う繝ォ縺ョ謇矩俣縲√さ繧ケ繝 +繧堤怐縺上%縺ィ縺後〒縺阪∪縺吶 -**** 全体構成 +**** 蜈ィ菴捺ァ区 -次のようなファイル構成を考えていますが、まだ未定です。 +谺。縺ョ繧医≧縺ェ繝輔ぃ繧、繝ォ讒区舌r閠縺医※縺縺セ縺吶′縲√∪縺譛ェ螳壹〒縺吶 #code u4 : 4 byte unsigned storage @@ -450,5 +450,5 @@ CompiledFile{ } #end -Java classfile のパクリ。 +Java classfile 縺ョ繝代け繝ェ縲 -- cgit v1.2.3