parrot实现了一个PMC的结构,根据语言本身的需求,所以PMC结构中有两个最基本的成员,一个是data这个成员是存放你自己定义的数据结构体的,一个是VTABLE成员,他在parrot核心中可以看成一个虚方法。因为根据键入的不同的数据类型进入不同的PMC的VTABLE方法表中。 简单的举个例子 php-code %% %% 那么把他翻译到parrot下的代码是 首先先写个PMC(相当于自己做数据结构,加上操作这些数据结构的方法) #P开头的表示是parrot的PMC寄存器(Parrot有32个PMC寄存器,32个整形寄存器,32个字符串寄存器.细节如果想了解看document吧) 假想编译器生成的parrot汇编代码 %% new P0,.PhpArray #还没有人实现php到parrot的,这里只是个假设。 push P0,1 push P0,2 push P0,3 push P0,4 push P0,5 new P1,.PhpArray push P1,1 push P1,2 push P1,3 push P1,4 push P1,5 beq P0,P1,goto OK_BLOCK print "error" end OK_BLOCK: print "ok" %% 那么我们在来看一下perl的. perl-code %% #!/usr/bin/perl @array1 = qw(1 2 3 4 5 6); @array2 = qw(1 2 4 4 5); if (@array1 == @array2) { print "ok"; }else{ print "error"; } 假想编译器生成的parrot汇编代码 %% new P0,.PerlArray push P0,1 push P0,2 push P0,3 push P0,4 push P0,5 new P1,.PerlArray push P1,1 push P1,2 push P1,3 push P1,4 push P1,5 beq P0,P1,goto OK_BLOCK print "error" end OK_BLOCK: print "ok" %% 一些简单的解释 parrot汇编在语法上只是做格式的抽象,而其语义根据不同的PMC实现就不同了,比如说:相同格式的set指令,如果附加到PMC积存器上操作的话,那么实现的语义是不同的。(我也不确认这样做的好坏,但是确实是增加了学习的曲线,但是实现起来确实足够的灵活) 上面的php代码和perl代码实现上来看,我感觉实现多语言应该是没问题,但是在对象部分我还没有深入的看,所以也无法确定。 上面的PhpArray,PerlArray都是parrot的PMC,下面我简单的介绍以下他内部的动作。 先从语法层面上来看。 parrot设计者为每一种格式都实现一个指令,比如说set I0,1和set P0,1是不一样的内部指令。 所以当我们new一个PMC的时候那么就构造了一个parrot-PMC对象,他会完成一些初始化动作(PMC作者实现的数据初始化). 并把PMC-struct指针给了P0寄存器,那么以后所有操作P0就是对PhpArrayPMC的操作,使用的方法也是PhpArray的方法了(每个PMC需要实现一些方法)。 下面的指令如push,他操作的都是P0寄存器的,来看一下他内部的指令实现: #Parrot_set_p_i这个格式结实他实现的set_PMC_CON就是一个P寄存器和一个常量的格式对象的指令 内部指令实现的C代码 %% opcode_t * Parrot_set_p_i (opcode_t cur_opcode[], struct Parrot_Interp * interpreter) { interpreter->pmc_reg->registers[cur_opcode[1]]->vtable->set_integer_native(interpreter, interpreter->pmc_reg->registers[cur_opcode[1]], interpreter->int_reg->registers[cur_opcode[2]]); 通过cur_opcode[1]得到PMC寄存器的类型,这样就可以找到这个PMC的的VTABLE了。这样就可以使用这个PMC的的SET指令了。 return cur_opcode + 3; } %% 从上面来看就知道不同的数据结构以及操作数据结构的方法是挂在PMC结构上的,运行时通过虚的方法表VTABLE去定位具体的方法了。 所以实现多语言我目前认为是可能的。 在说说上面代码的语义,因为php和perl对比较方法的语义是不同的,所以说必须实现不同的PMC 因为perl的 '==' 操作符对数组的比较是比较数组的个数的,而php比较的是每个元素是否都相同。