#title YARV�A�[�L�e�N�`�� #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 �v���O�����̂��߂̎��̋@�\��񋟂��܂��B - Compiler - VM Generator - VM (Virtual Machine) - Assembler - Dis-Assembler - (experimental) JIT Compiler - (experimental) AOT Compiler ���݂� YARV �� Ruby �C���^�v���^�̊g�����C�u�����Ƃ��Ď������Ă��܂��B�� ��ɂ��ARuby �C���^�v���^�̕K�v�ȋ@�\�i�p�[�T�A�I�u�W�F�N�g�Ǘ��A���� �̊g�����C�u�����j�Ȃǂ��قڂ��̂܂ܗ��p�ł��܂��B �������A�����‚��̃p�b�`�� Ruby �C���^�v���^�ɓ��ĂȂ���΂Ȃ�܂���B ����́ARuby �{�̂̃C���^�v���^�����ieval.c�j��u�������邱�Ƃ�ڎw���� �J�����p������\��ł��B * Compiler (compile.h, compile.c) �R���p�C���́ARuby �C���^�v���^�̃p�[�T�ɂ���Đ������ꂽ�\���؁iRNode �f�[�^�ɂ��؁j�� YARV ���ߗ�ɕϊ����܂��BYARV ���߂ɂ‚��Ă͌�q���� ���B �Ƃ��ɓ�����Ƃ͂��Ă��܂��񂪁A�X�R�[�v�Ȃǂ̊J�n���Ƀ��[�J���ϐ��̏� �����Ȃǂ��s���A���Ƃ͍\���؂�H��ϊ����Ă����܂��B �ϊ����� Ruby �� Array �I�u�W�F�N�g�� YARV ���߃I�u�W�F�N�g�A����уI�y �����h���i�[���Ă����A�Ō�Ɏ��s�ł���`�ɕϊ����܂��B�R���p�C���ł́A�R ���p�C�����ɐ������郁�����̈�̊Ǘ������ɂȂ邱�Ƃ�����܂����AYARV �̏ꍇ�ARuby �C���^�v���^�����ׂĖʓ|���݂Ă����̂ł��̕����͔��Ɋy �ɍ�邱�Ƃ��ł��܂����i�K�[�x�[�W�R���N�^�ɂ���Ď����I�Ƀ������Ǘ����� �Ă���邽�߁j�B YARV ���߂́A���߂��������ʎq�A�I�y�����h�ȂǁA���ׂ� 1 word �i�}�V���� �\���ł��鎩�R�Ȓl�BC ����ł̓|�C���^�̃T�C�Y�BRuby �C���^�v���^�p��� �� VALUE �̃T�C�Y�j�ŕ\������܂��B���̂��߁AYARV ���߂͂�����u�o�C�g �R�[�h�v�ł͂���܂���B���̂��߁AYARV �̐����Ȃǂł́u���ߗ�v�Ƃ����p ����g���Ă��܂��B 1 word �ł��邽�߁A�������̗��p�����͑��������Ȃ�܂����A�A�N�Z�X���x�� �ǂ��l������ƁA�{��������Ԃ����ƍl���Ă���܂��B���Ƃ��΃I�y�����h���R ���X�^���g�v�[���Ɋi�[���A�C���f�b�N�X�݂̂��I�y�����h�Ŏ������Ƃ��”\�� �����A�ԐڃA�N�Z�X�ɂȂ��Ă��܂��̂Ő��\�ɉe�����o�邽�߁A�p�����܂����B * VM Generator (rb/insns2vm.rb, insns.def) rb/insns2vm.rb �Ƃ����X�N���v�g�́Ainsns.def �Ƃ����t�@�C����ǂݍ��݁A VM �̂��߂ɕK�v�ȃt�@�C���𐶐����܂��B��̓I�ɂ́A���߂����s���镔���� �������܂����A�ق��ɂ��R���p�C���ɕK�v�ȏ��A�œK���ɕK�v�ȏ��A��A�Z ���u���A�t�A�Z���u���ɕK�v�ȏ��������t�@�C�����������܂��B ** ���ߋL�q insns.def �ɂ́A�e���߂��ǂ̂悤�Ȗ��߂ł��邩���L�q���܂��B��̓I�ɂ͎� �̏����L�q���܂��B - ���߂̖��O - ���̖��߂̃J�e�S���A�R�����g�i�p��A���{��j - �I�y�����h�̖��O - ���̖��ߎ��s�O�ɃX�^�b�N����|�b�v����l - ���̖��ߎ��s��ɃX�^�b�N�Ƀv�b�V������l - ���̖��߂̃��W�b�N�iC ����ŋL�q�j ���Ƃ��΁A�X�^�b�N�� self ������ putself �Ƃ������߂͎��̂悤�ɋL�q���� ���B #code /** @c put @e put self. @j self ��u���B */ DEFINE_INSN putself () () (VALUE val) { val = GET_SELF(); } #end ���̏ꍇ�A�I�y�����h�ƁA�X�^�b�N����|�b�v����l�͖������ƂɂȂ�܂��B�� �ߏI����Aself ���X�^�b�N�g�b�v�ɒu�������킯�ł����A����� val �Ƃ����A �X�^�b�N�Ƀv�b�V������l�Ƃ��Đ錾���Ă������ϐ��ɑ�����Ă������ƂŁA�� ���ϊ�����ƃX�^�b�N�g�b�v�ɒu�� C �v���O��������������܂��B �ׂ����t�H�[�}�b�g�� insns.def �̖`�����Q�Ƃ��Ă��������B����Ȃɓ�� �Ȃ��Ǝv���܂��B insnhelper.h �Ƃ����t�@�C���ɁA���߃��W�b�N���L�q���邽�߂ɕK�v�ȃ}�N�� ����`����Ă��܂��B�܂��AVM �̓����\���Ɋւ����`�� vm.h �Ƃ����t�@�C ���ɂ���܂��B * VM (Virtual Machine, vm.h, vm.c) VM �́A���ۂɃR���p�C���������ʐ�������� YARV ���ߗ�����s���܂��B�܂� �ɁA���̕����� YARV �̃L���ɂȂ�A�����I�ɂ� eval.c ������ VM �Œu������ �����ƍl���Ă��܂��B ���݂� Ruby �C���^�v���^�Ŏ��s�ł��邷�ׂĂ̂��Ƃ��A���� VM �Ŏ����ł��� �悤�ɍ���Ă��܂��i���i�K�ł͂܂����S�ł͂���܂��񂪁A�����Ȃ�ׂ��ł��j�B VM �́A�P���ȃX�^�b�N�}�V���Ƃ��Ď������Ă��܂��B�X���b�h�ЂƂ‚ɃX�^�b �N�ЂƂ‚�ێ����܂��B�X�^�b�N�̗̈�̓q�[�v����擾����̂ŁA�_��ȗ̈� �ݒ肪�”\�ł��B ** ���W�X�^ VM �� 5 �‚̉��z�I�ȃ��W�X�^�ɂ���Đ��䂳��܂��B - PC (Program Counter) - SP (Stack Pointer) - CFP (Control Frame Pointer) - LFP (Local Frame Pointer) - DFP (Dynamic Frame Pointer) PC �͌��ݎ��s���̖��ߗ�̈ʒu�������܂��BSP �̓X�^�b�N�g�b�v�̈ʒu������ �܂��BCFP�ALFP�ADFP �͂��ꂼ��t���[���̏��������܂��B�ڍׂ͌�q���܂��B ** �X�^�b�N�t���[�� obsolete (update soon) ** �t���[���f�U�C���ɂ‚��Ă̕⑫ Lisp �̏����n�Ȃǂ����񂪂���ƁA�킴�킴�u���b�N���[�J���t���[���ƃ��\ �b�h���[�J���t���[���̂悤�Ȃ��̂�p�ӂ���̂͊�قɌ����邩������܂���B ����t���[�����A����q�\���ɂ��āA���[�J���ϐ��̃A�N�Z�X�͂��̓���q���O ���ɒH��ΕK�����ǂ蒅�����Ƃ��ł��邩��ł��i�‚܂�Alfp �͕K�v�Ȃ��j�B �������ARuby �ł͂����‚��󋵂��Ⴂ�܂��B�܂��A���\�b�h���[�J���ȏ�� ���邱�ƁA��̓I�ɂ̓u���b�N��self�icallee ����݂�� reciever�j�ł��B�� �̏������ꂼ��̃t���[���ɂ�������͖̂��ʂł��B �܂��ARuby2.0 ����̓u���b�N���[�J���ϐ��͂Ȃ��Ȃ�܂��i�u���b�N���[�J�� �����͎c��̂ŁA�\�����̂͂��܂�ς��܂���j�B���̂��߁A���\�b�h���[�J ���ϐ��ւ̃A�N�Z�X���p�����邱�Ƃ��\�z����܂��B ���̂Ƃ��A���\�b�h���[�J���ϐ��ւ̃A�N�Z�X�̂��тɃt���[���i�X�R�[�v�j�� ���X�g�����ǂ�͖̂��ʂł���Ɣ��f���A�����I�Ƀ��\�b�h���[�J���X�R�[�v�� �u���b�N�t���[���𕪗����A�u���b�N�t���[������̓��\�b�h���[�J���t���[�� �� lfp���W�X�^�ɂ���ėe�ՂɃA�N�Z�X�ł���悤�ɂ��܂����B ** ���\�b�h�Ăяo���ɂ‚��� ���\�b�h�Ăяo���́AYARV ���ߗ�ŋL�q���ꂽ���\�b�h���AC �ŋL�q���ꂽ�� �\�b�h���ɂ���ăf�B�X�p�b�`��@���ς��܂��B YARV ���ߗ�ł������ꍇ�A��q�����X�^�b�N�t���[�����쐬���Ė��߂��p���� �܂��B�Ƃ��� VM �̊֐����ċA�Ăяo�����邱�Ƃ͍s�Ȃ��܂���B C �ŋL�q���ꂽ���\�b�h�������ꍇ�A�P���ɂ��̊֐����Ăяo���܂��i�������A �o�b�N�g���[�X�𐳂����������邽�߂Ƀ��\�b�h�Ăяo���̏���t�����Ă��� �s�Ȃ��܂��j�B ���̂��߁AVM �p�X�^�b�N��ʓr�p�ӂ������̂́A�v���O�����ɂ���Ă̓}�V�� �X�^�b�N���g���؂��Ă��܂��”\��������܂��iC -> Ruby -> C -> ... �Ƃ��� �Ăяo�����������ꍇ�j�B����́A���݂ł͔������Ȃ��d�l�ƂȂ��Ă��܂��B ** ��O ��O�́AJava �� JVM �Ɠ��l�ɗ�O�e�[�u����p�ӂ��邱�ƂŎ������܂��B��O ������������A���Y�t���[�����A��O�e�[�u�����������܂��B�����ŁA��O���� �������Ƃ��� PC �̒l�ɍ��v����G���g�����������ꍇ�A���̃G���g���ɏ]���� ���삵�܂��B�����G���g�������‚���Ȃ������ꍇ�A�X�^�b�N���T���߂��Ă܂� ���l�ɂ��̃X�R�[�v�̗�O�e�[�u�����������܂��B �܂��Abreak�Areturn�i�u���b�N���j�Aretry �Ȃǂ����l�̎d�g�݂Ŏ������܂��B *** ��O�e�[�u�� ��O�e�[�u���G���g���͋�̓I�ɂ͎��̏�񂪊i�[����Ă��܂��B - �ΏۂƂ��� PC �͈̔� - �ΏۂƂ����O�̎�� - �����ΏۂƂȂ����Ƃ��ɃW�����v�����i��ނɂ��j - �����ΏۂƂȂ����Ƃ��ɋN������u���b�N�� iseq *** rescue rescue �߂̓u���b�N�Ƃ��Ď������Ă��܂��B$! �̒l��B��̈����Ƃ��Ď����� ���B #code begin rescue A rescue B rescue C end #end �́A���̂悤�� Ruby �X�N���v�g�ɕϊ�����܂��B #code {|err| case err when A === err when B === err when C === err else raise # yarv �̖��߂ł� throw end } #end *** ensure ����n�i��O���������Ȃ������ꍇ�j�ƈُ�n�i��O�����������Ƃ��Ȃǁj��2 ��ނ̖��ߗ񂪐�������܂��B����n�ł́A�����̘A�������R�[�h�̈�Ƃ��ăR ���p�C������܂��B�܂��A�ُ�n�ł̓u���b�N�Ƃ��Ď������܂��B�Ō�͕K�� throw ���߂Œ��߂邱�ƂɂȂ�܂��B *** break, return�i�u���b�N���j�Aretry break ���A�u���b�N���� return ���Aretry ���� throw ���߂Ƃ��ăR���p�C�� ����܂��B�ǂ��܂Ŗ߂邩�́Abreak ���t�b�N�����O�e�[�u���̃G���g������ �f���܂��B ** �萔�̌��� �萔�Ƃ������O�Ȃ̂ɁARuby �ł̓R���p�C�����Ɍ��肵�܂���B�Ƃ������A�� �‚܂ł��Ē�`�”\�ɂȂ��Ă��܂��B �萔�A�N�Z�X�̂��߂�Ruby�L�q�͎��̂悤�ɂȂ�܂��B #code Ruby�\��: expr::ID::...::ID #end ����́Ayarv���߃Z�b�g�ł͎��̂悤�ɂȂ�܂��B #code (expr) getconstant ID ... getconstant ID #end *** �萔�����p�X ���� expr �� nil �������ꍇ�A�萔�����p�X�ɏ]���Ē萔���������܂��B���� �����͍��� Ruby 2.0 �Ɍ����ĕύX�����ꍇ������܂��B + �N���X�A���W���[���̓��I�l�X�g�֌W�i�v���O�����̎��ʏ�j�����[�g�܂ŒH�� + �p���֌W�����[�g�iObject�j�܂ŒH�� ���̂��߁A�N���X�A���W���[���̓��I�l�X�g�֌W��ۑ����Ȃ���΂Ȃ�܂���B ���̂��߂ɁAthread_object �ɂ� klass_nest_stack �Ƃ������̂�p�ӂ��܂����B ����́A���݂̃l�X�g�̏���ۑ����܂��B ���\�b�h��`���A���̌��݂̃l�X�g�������\�b�h��`���Ɂidup���āj������ ���ƂŁA���̃��\�b�h�̎��s���A���̃l�X�g�����Q�Ƃ��邱�Ƃ��”\�ɂȂ�� ���B �g�b�v���x���ł́A���̏��͂Ȃ����ƂɂȂ�܂��B �N���X/���W���[����`�����s���́A���݂̏�񂻂̂��̂��Q�Ƃ��邱�ƂɂȂ� �܂��B����́A�N���X�X�R�[�v�˓����A���̏����N���X��`���ɃR�s�[���܂� �i���łɃR�s�[����Ă���΁A������s���܂���j�B ����ɂ��A���I�ȃl�X�g���𓝈�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 ���ߗ�̒��Ƀ��\�b�h�������ʂ𖄂ߍ��݂܂��B *** inline constant cache ���ߗ�̒��ɒ萔�������ʂ𖄂ߍ��݂܂��B *** �u���b�N�� Proc �I�u�W�F�N�g�̕��� �u���b�N�t�����\�b�h�Ăяo�����s�Ȃ�ꂽ�Ƃ��ɂ͂����ɂ̓u���b�N�� Proc �I�u�W�F�N�g�Ƃ��Đ������܂���B����ɂ��A�K�v�Ȃ� Proc �I�u�W�F�N�g�� ������}���Ă��܂��B Proc ���\�b�h�́A���ۂɕK�v�ɂȂ������_�ō���A���̂Ƃ��Ɋ‹��i�X�R�[ �v��Ɋm�ۂ��ꂽ�ϐ��Ȃǁj���q�[�v�ɕۑ����܂��B *** �������� Fixnum ���m�̉��Z�Ȃǂ𐳒��Ɋ֐��Ăяo���ɂ���čs�Ȃ��ƁA�R�X�g������ ��̂ŁA�����̃v���~�e�B�u�ȑ�����s�Ȃ����߂̃��\�b�h�Ăяo���͐�p�� �߂�p�ӂ��܂����B *** ���ߗZ�� �����̖��߂� 1 ���߂ɕϊ����܂��B�Z�����߂� opt_insn_unif.def �̋L�q�ɂ� �莩���I�ɐ�������܂��B *** �I�y�����h�Z�� �����̃I�y�����h���܂߂����߂𐶐����܂��B�Z�����߂� opt_operand.def �� �L�q�ɂ���Ď����I�ɐ�������܂��B *** stack caching �X�^�b�N�g�b�v�����z���W�X�^�ɕێ�����悤�ɂ��܂��B���݂� 2 �‚̉��z�� �W�X�^��z�肵�A5��Ԃ̃X�^�b�N�L���b�V���O���s�Ȃ��܂��B�X�^�b�N�L���b �V���O���閽�߂͎����I�ɐ�������܂��B *** JIT Compile �@�B���؂�\�肵�܂��B���Ɏ����I�ȃR�[�h���̂�������Ă���܂���B�� �Ƃ�ǂ̃v���O�����͓����܂���B *** AOT Compile YARV ���ߗ�� C ����ɕϊ����܂��B�܂��\���ȍœK�����s�Ȃ��Ă���܂��񂪁A ����Ȃ�ɓ����܂��Brb/aotc.rb ���R���p�C���ł��B * Assembler (rb/yasm.rb) YARV ���ߗ�̃A�Z���u����p�ӂ��܂����B�g������ rb/yasm.rb ���Q�Ƃ��Ă� �������i�܂��A�Ꭶ���Ă��鐶����@�̂��ׂĂ��T�|�[�g���Ă���킯�ł͂��� �܂���j�B * Dis-Assembler (disasm.c) YARV ���ߗ�������I�u�W�F�N�g YARVCore::InstructionSequence �ɂ� disasm ���\�b�h������܂��B����́A���ߗ���t�A�Z���u�������������Ԃ��܂��B * YARV ���߃Z�b�g <%= d %> * ���̑� ** �e�X�g test/test_* ���e�X�g�P�[�X�ł��B�ꉞ�A�~�X�Ȃ������͂��ł��B�t�ɂ����ƁA ���̃e�X�g�ɋL�q����Ă����ł͂�����Ɠ��삷��Ƃ������Ƃł��B ** �x���`�}�[�N benchmark/bm_* �Ƀx���`�}�[�N�v���O�����������Ă���܂��B ** ����̗\�� �܂��܂����Ȃ���΂����Ȃ����ƁA�������������������񂠂�܂���ł���� �����Ȃ���΂Ȃ�܂���B��ԑ傫�ȖڕW�� eval.c ��u�������邱�Ƃł��傤 ���B *** Verifier YARV ���ߗ�́A�~�X�������Ă��������Ă��܂����ߊ댯�ł���”\��������� ���B���̂��߁A�X�^�b�N�̗��p��Ԃ�������Ǝ��O�Ɍ��؂���悤�ȃx���t�@�C �A��p�ӂ��Ȃ���΂Ȃ�Ȃ��ƍl���Ă��܂��B *** Compiled File �̍\�z Ruby �v���O���������̖��߃Z�b�g�ɃV���A���C�Y�����f�[�^�\�����t�@�C���� �o�͂ł���悤�ɂ������ƍl���Ă��܂��B����𗘗p���Ĉ�x�R���p�C�������� �ߗ���t�@�C���ɕۑ����Ă����΁A���񃍁[�h���ɂ̓R���p�C���̎�ԁA�R�X�g ���Ȃ����Ƃ��ł��܂��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 �̃p�N���B