#title  YARVA[LeN`
#set author { Ruby ̉ 


- 2005-03-03(Thu) 00:31:12 +0900 낢Ə

----

* ́H

[[YARV: Yet Another RubyVM|http://www.atdot.net/yarv]]  ݌vłB


YARV ́ARuby vÔ߂̎̋@\񋟂܂B

- Compiler
- VM Generator
- VM (Virtual Machine)
- Assembler
- Dis-Assembler
- (experimental) JIT Compiler
- (experimental) AOT Compiler


݂ YARV  Ruby C^v^̊gCuƂĎĂ܂B
ɂARuby C^v^̕Kvȋ@\ip[TAIuWFNgǗA
̊gCujȂǂقڂ̂܂ܗpł܂B

A̃pb` Ruby C^v^ɓĂȂ΂Ȃ܂B

́ARuby {̂̃C^v^ieval.cju邱Ƃڎw
Jp\łB


* Compiler (compile.h, compile.c)

RpĆARuby C^v^̃p[TɂĐꂽ\؁iRNode 
f[^ɂ؁j YARV ߗɕϊ܂BYARV ߂ɂĂ͌q
B

ƂɓƂ͂Ă܂񂪁AXR[vȂǂ̊JnɃ[Jϐ̏
ȂǂsAƂ͍\؂HϊĂ܂B

ϊ Ruby  Array IuWFNg YARV ߃IuWFNgAуIy
hi[ĂAŌɎsł`ɕϊ܂BRpCł́AR
pCɐ郁̈̊ǗɂȂ邱Ƃ܂AYARV 
̏ꍇARuby C^v^ׂĖʓ|݂Ă̂ł͔̕Ɋy
ɍ邱Ƃł܂iK[x[WRN^ɂĎIɃǗ
Ă邽߁jB

YARV ߂́A߂ʎqAIyhȂǁAׂ 1 word i}V
\ł鎩RȒlBC ł̓|C^̃TCYBRuby C^v^p
 VALUE ̃TCYjŕ\܂B̂߁AYARV ߂͂uoCg
R[hvł͂܂B̂߁AYARV ̐Ȃǂł́uߗvƂp
gĂ܂B

1 word ł邽߁A̗p͑Ȃ܂AANZXx
ǂlƁA{ԂƍlĂ܂BƂ΃IyhR
X^gv[Ɋi[ACfbNX݂̂IyhŎƂ\
AԐڃANZXɂȂĂ܂̂Ő\ɉeo邽߁Ap܂B


* VM Generator (rb/insns2vm.rb, insns.def)

rb/insns2vm.rb ƂXNvǵAinsns.def Ƃt@Cǂݍ݁A
VM ̂߂ɕKvȃt@C𐶐܂B̓Iɂ́A߂s镔
܂AقɂRpCɕKvȏAœKɕKvȏAAZ
uAtAZuɕKvȏt@C܂B


** ߋLq

insns.def ɂ́Ae߂ǂ̂悤Ȗ߂ł邩Lq܂B̓Iɂ͎
̏Lq܂B

- ߂̖O
- ̖߂̃JeSARgipA{j
- Iyh̖O
- ̖ߎsOɃX^bN|bvl
- ̖ߎsɃX^bNɃvbVl
- ̖߂̃WbNiC ŋLqj

Ƃ΁AX^bN self  putself Ƃ߂͎̂悤ɋLq
B

#code
/**
  @c put
  @e put self.
  @j self uB
 */
DEFINE_INSN
putself
()
()
(VALUE val)
{
  val = GET_SELF();
}
#end

̏ꍇAIyhƁAX^bN|bvl͖ƂɂȂ܂B
ߏIAself X^bNgbvɒu킯łA val ƂA
X^bNɃvbVlƂĐ錾ĂϐɑĂƂŁA
ϊƃX^bNgbvɒu C vO܂B

ׂtH[}bg insns.def ̖`QƂĂBȂɓ
ȂƎv܂B

insnhelper.h Ƃt@CɁA߃WbNLq邽߂ɕKvȃ}N
`Ă܂B܂AVM ̓\Ɋւ` vm.h Ƃt@C
ɂ܂B


* VM (Virtual Machine, vm.h, vm.c)

VM ́AۂɃRpCʐ YARV ߗs܂B܂
ɁA̕ YARV ̃LɂȂAIɂ eval.c  VM Œu
ƍlĂ܂B

݂ Ruby C^v^Ŏsł邷ׂĂ̂ƂA VM Ŏł
悤ɍĂ܂iiKł͂܂Sł͂܂񂪁AȂׂłjB

VM ́APȃX^bN}VƂĎĂ܂BXbhЂƂɃX^b
NЂƂێ܂BX^bN̗̈̓q[v擾̂ŁA_ȗ̈
ݒ肪\łB


** WX^

VM  5 ̉zIȃWX^ɂĐ䂳܂B

- PC (Program Counter)
- SP (Stack Pointer)
- CFP (Control Frame Pointer)
- LFP (Local Frame Pointer)
- DFP (Dynamic Frame Pointer)

PC ͌ݎs̖ߗ̈ʒu܂BSP ̓X^bNgbv̈ʒu
܂BCFPALFPADFP ͂ꂼt[̏܂Bڍׂ͌q܂B


** X^bNt[

obsolete (update soon)


** t[fUCɂĂ̕⑫

Lisp ̏nȂǂ񂪂ƁA킴킴ubN[Jt[ƃ\
bh[Jt[̂悤Ȃ̂pӂ̂͊قɌ邩܂B
t[Aq\ɂāA[Jϐ̃ANZX͂̓qO
ɒHΕKǂ蒅Ƃł邩łi܂Alfp ͕KvȂjB

ARuby ł͂󋵂Ⴂ܂B܂A\bh[Jȏ
邱ƁA̓Iɂ̓ubNselficallee ݂ recieverjłB
̏ꂼ̃t[ɂ͖̂ʂłB

܂ARuby2.0 ̓ubN[Jϐ͂ȂȂ܂iubN[J
͎ĉŁA\̂͂܂ς܂jB̂߁A\bh[J
ϐւ̃ANZXp邱Ƃ\z܂B

̂ƂA\bh[Jϐւ̃ANZX̂тɃt[iXR[vj
Xgǂ͖̂ʂłƔfAIɃ\bh[JXR[v
ubNt[𕪗AubNt[̓\bh[Jt[
 lfpWX^ɂėeՂɃANZXł悤ɂ܂B


** \bhĂяoɂ

\bhĂяóAYARV ߗŋLqꂽ\bhAC ŋLqꂽ
\bhɂăfBXpb`@ς܂B

YARV ߗłꍇAqX^bNt[쐬Ė߂p
܂BƂ VM ̊֐ċAĂяo邱Ƃ͍sȂ܂B

C ŋLqꂽ\bhꍇAPɂ̊֐Ăяo܂iA
obNg[X𐳂邽߂Ƀ\bhĂяȍtĂ
sȂ܂jB

̂߁AVM pX^bNʓrpӂ̂́AvOɂĂ̓}V
X^bNg؂Ă܂\܂iC -> Ruby -> C -> ... Ƃ
ĂяoꍇjB́A݂ł͔ȂdlƂȂĂ܂B


** O

ÓAJava  JVM ƓlɗOe[upӂ邱ƂŎ܂BO
AYt[AOe[u܂BŁAO
Ƃ PC ̒lɍvGgꍇÃGgɏ]
삵܂BGgȂꍇAX^bNT߂Ă܂
lɂ̃XR[v̗Oe[u܂B

܂AbreakAreturniubNjAretry Ȃǂl̎dg݂Ŏ܂B

*** Oe[u

Oe[uGg͋̓Iɂ͎̏񂪊i[Ă܂B

- ΏۂƂ PC ͈̔
- ΏۂƂO̎
- ΏۂƂȂƂɃWviނɂj
- ΏۂƂȂƂɋNubN iseq


*** rescue

rescue ߂̓ubNƂĎĂ܂B$! ̒lB̈ƂĎ
B

#code
begin
rescue A
rescue B
rescue C
end
#end

́Â悤 Ruby XNvgɕϊ܂B

#code
{|err|
  case err
  when A === err
  when B === err
  when C === err
  else
    raise # yarv ̖߂ł throw
  end
}
#end


*** ensure

niOȂꍇjƈُniOƂȂǁj2
ނ̖ߗ񂪐܂Bnł́A̘AR[ḧƂăR
pC܂B܂Aُnł̓ubNƂĎ܂BŌ͕K 
throw ߂Œ߂邱ƂɂȂ܂B


*** break, returniubNjAretry

break AubN return Aretry  throw ߂ƂăRpC
܂Bǂ܂Ŗ߂邩́Abreak tbNOe[ũGg
f܂B


** 萔̌

萔ƂOȂ̂ɁARuby ł̓RpCɌ肵܂BƂA
܂łĒ`\ɂȂĂ܂B

萔ANZX̂߂RubyLq͎̂悤ɂȂ܂B

#code
Ruby\:
expr::ID::...::ID
#end

́Ayarv߃Zbgł͎̂悤ɂȂ܂B

#code
(expr)
getconstant ID
...
getconstant ID
#end


*** 萔pX

 expr  nil ꍇA萔pXɏ]Ē萔܂B
͍ Ruby 2.0 ɌĕύXꍇ܂B

+ NXAW[̓IlXg֌WivO̎ʏj[g܂ŒH
+ p֌W[giObjectj܂ŒH

̂߁ANXAW[̓IlXg֌WۑȂ΂Ȃ܂B
̂߂ɁAthread_object ɂ klass_nest_stack Ƃ̂pӂ܂B
́Ã݂lXg̏ۑ܂B

\bh`Ǎ݂̃lXg\bh`Ɂidupāj
ƂŁÃ\bh̎sÃlXgQƂ邱Ƃ\ɂȂ
B

gbvxł́Ȁ͂ȂƂɂȂ܂B

NX/W[`śȀ݂񂻂̂̂QƂ邱ƂɂȂ
܂B́ANXXR[v˓ȀNX`ɃRs[܂
iłɃRs[Ă΁As܂jB

ɂAIȃlXg𓝈IɈƂł܂B


** œK@

YARV ł͍ړIƂĂ̂ŁA܂܂ȍœK@𗘗pĂ
Bڍׂ͊܂AȉɏqׂœKȂǂsȂĂ܂B


*** threaded code

GCC  C głlƂẴx𗘗p direct threaded code 
Ă܂B


*** Peephole optimization

̊ȒPȍœKĂ܂B


*** inline method cache

ߗ̒Ƀ\bhʂ𖄂ߍ݂܂B


*** inline constant cache

ߗ̒ɒ萔ʂ𖄂ߍ݂܂B


*** ubN Proc IuWFNg̕

ubNt\bhĂяosȂꂽƂɂ͂ɂ̓ubN Proc 
IuWFNgƂĐ܂BɂAKvȂ Proc IuWFNg
}Ă܂B

Proc \bh́AۂɕKvɂȂ_ōÂƂɊiXR[
vɊmۂꂽϐȂǁjq[vɕۑ܂B


*** 

Fixnum m̉ZȂǂ𐳒Ɋ֐ĂяoɂčsȂƁARXg
̂ŁÃv~eBuȑsȂ߂̃\bhĂяo͐p
߂pӂ܂B


*** ߗZ

̖߂ 1 ߂ɕϊ܂BZ߂ opt_insn_unif.def ̋Lqɂ
莩Iɐ܂B


*** IyhZ

̃Iyh܂߂߂𐶐܂BZ߂ opt_operand.def 
LqɂĎIɐ܂B


*** stack caching

X^bNgbvzWX^ɕێ悤ɂ܂B݂ 2 ̉z
WX^z肵A5Ԃ̃X^bNLbVOsȂ܂BX^bNLb
VO閽߂͎Iɐ܂B


*** JIT Compile

@B؂\肵܂BɎIȃR[ĥĂ܂B
Ƃǂ̃vO͓܂B


*** AOT Compile

YARV ߗ C ɕϊ܂B܂\ȍœKsȂĂ܂񂪁A
Ȃɓ܂Brb/aotc.rb RpCłB


* Assembler (rb/yasm.rb)

YARV ߗ̃AZupӂ܂Bg rb/yasm.rb QƂĂ
i܂AᎦĂ鐶@ׂ̂ĂT|[gĂ킯ł͂
܂jB


* Dis-Assembler (disasm.c)

YARV ߗIuWFNg YARVCore::InstructionSequence ɂ disasm 
\bh܂B́AߗtAZuԂ܂B


* YARV ߃Zbg

<%= d %>

* ̑

** eXg

test/test_* eXgP[XłBꉞA~XȂ͂łBtɂƁA
̃eXgɋLqĂł͂Ɠ삷ƂƂłB


** x`}[N

benchmark/bm_* Ƀx`}[NvOĂ܂B


** ̗\

܂܂Ȃ΂ȂƁA񂠂܂ł
Ȃ΂Ȃ܂Bԑ傫ȖڕW eval.c u邱Ƃł傤
B


*** Verifier

YARV ߗ́A~XĂĂ܂ߊ댯ł\
B̂߁AX^bN̗pԂƎOɌ؂悤ȃxt@C
ApӂȂ΂ȂȂƍlĂ܂B


*** Compiled File ̍\z

Ruby vO̖߃ZbgɃVACYf[^\t@C
o͂ł悤ɂƍlĂ܂B𗘗pĈxRpC
ߗt@CɕۑĂ΁A񃍁[hɂ̓RpC̎ԁARXg
ȂƂł܂B


**** S̍\

̂悤ȃt@C\lĂ܂A܂łB

#code
u4 : 4 byte unsigned storage
u2 : 2 byte unsigned storage
u1 : 1 byte unsigned storage

every storages are little endian :-)

CompiledFile{
  u4 magic;

  u2 major;
  u2 minor;

  u4 character_code;

  u4 constants_pool_count;
  ConstantEntry constants_pool[constants_pool_count];

  u4 block_count;
  blockEntry blocks[block_count];

  u4 method_count;
  MethodEntry methods[method_count];
}
#end

Java classfile ̃pNB

