例如,我想查找“print”或“foreach”运算符的源代码。我已经下载了 Perl 源代码,并希望查看此运算符的“真实”代码。
问问题
173 次
1 回答
10
Perl 将源代码编译成一个名为Opcode Tree的图形。同时,这个数据结构代表了你程序的语法和控制流。要了解操作码,您可能需要从Illustrated Perl Guts (illguts)开始。
要找出你的程序编译的 Ops,你可以这样称呼它:
perl -MO=Concise script.pl
– 获取其语法树中的操作码perl -MO=Concise,-exec script.pl
–-exec
选项改为按照执行顺序对操作进行排序。有时,这不那么令人困惑。perl -MO=Concise,foo script.pl
– 转储foo
子程序的操作。
典型的操作码如下所示:
4 <$> const[PV "007B"] s/FOLD ->5
^ ^ ^ ^ ^
| | | | The next op in execution order
| | | Flags for this op, documented e.g. in illguts. "s" is
| | | scalar context. After the slash, op-specific stuff
| | The actual name of the op, may list further arguments
| The optype ($: unop, 2: binop, @:listop) – not really useful
The op number
Ops 声明为PP(pp_const)
. 要搜索该声明,请使用ack
工具,它是一种智能的、grep
带有 Perl 正则表达式的递归工具。要在源代码的顶级目录中搜索所有 C 文件和头文件,我们执行以下操作:
$ ack 'pp_const' *.c *.h
输出(这里没有颜色):
op.c
29: * points to the pp_const() function and to an SV containing the constant
30: * value. When pp_const() is executed, its job is to push that SV onto the
pp_hot.c
40:PP(pp_const)
opcode.h
944: Perl_pp_const,
pp_proto.h
43:PERL_CALLCONV OP *Perl_pp_const(pTHX);
所以它在pp_hot.c
第 40 行声明。我倾向于vim pp_hot.c +40
去那里。然后我们看到定义:
PP(pp_const)
{
dVAR;
dSP;
XPUSHs(cSVOP_sv);
RETURN;
}
要理解这一点,您应该对Perl API有一点了解,并且可能会写一点 XS。
于 2013-11-10T11:26:07.670 回答