闲得蛋疼想看看几种主流脚本语言的解释器是怎么工作的。我是最早看过陈儒那本讲Python解释器的书才萌生此想法。虽然此书行文风格我厌恶至极,但它确实给了我一些启示。上次京东做活动满200减50,于是买了Programming Perl的最新影印版,研究一下perl internal自然提上日程。
初一看Perl的代码简单不塂入目,满屏的宏定义,完全无法跟踪。官网上有一些解释internal的文章,但不是很系统地介绍,内容也相当有限。从零开始探索未知代码(及风格,惯例)真令人担心啊。平时只能业余看一下,我估计这个工作不会持续长久。姑且看看吧。
从使用者的角度去看内部实现,最简单的方式是将使用的场景与内部解释的场景对应起来。而最容易捕捉到对应的时候是出错的时候。比如:
# perl -e '@a +1 =3'
Can't modify addition (+) in scalar assignment at -e line 1, at EOF
可惜这只是编译错误,运行时的对应就不这么好捕捉了。在源代码里搜一搜这个字符串,无结果。估计这种话是格式化成的,只搜前两个单词,结果能找出点东西。最后的结果是,这句话是在Perl_op_lvalue_flags里报出来的。
这个函数的原型:
Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
跳了好几次才搞清楚,原来pTHX_OP多加了个无使用的参数。尼玛,这种让C语言看起来不像C语言的风格,我都无力吐槽了,