token.c和perly.y
=================================================
不清楚,为什么,网上到处都是这个怎么用那个怎么用的文章,为什么大家不来一起分析一下,一些开源工程的代码呢?
这些开源的代码中,最最有意思的,就是编译器的代码了。
那是人类智慧的结晶,是人与计算机交互的基点。
当然,编译器这东西,是谁也不可能说:我搞通了。反正我是搞不通。
想想C语言本身,还那多错误,都没有更正;想想C++标准里,到处是自相矛盾,描述不清的文字,所以,来谈谈有什么不可呢?
无知不重要,重要的是要让别人也知道你很无知。
好了,下面,我们来一起分析一下Perl内核。
==============================================
以前看过GCC,看GCC虽然很难,但GCC绝对是严格按编译器理论来实现的。所以也不难。
但PERL,(内心挣扎中,是不是要写下去),我到现在还没搞清楚。是怎么回事。
我们一点点来吧。
首先,准备东西:
1. 下到perl原码。
2. 把这个perl原码,改成VC++可以编译和调试的工程。
3. 如果你有原码分析的工具,可能更好,但我没有。
4. 打到lex和yacc. 前面,我专门写了一个文章,perl没有lex,手工实现了一个token.c,但有yacc:perly.y
在这两个文件中,能打断点的地方,都打上。
5. 如果,能到网上找到PERL语言的规范就TM好的。但我没打到,我也没有。或是找到perl的.l和.y,也好,但我也没找到。有找到的同仁,一定发给我啊。
6. 写个perl脚本,最好能跑起来:
#!/usr/bin/perl
my $x=5;
sub increment_my_x {
$x++;
}
increment_my_x;
print $x; # prints 6
然后,开始调试。
----------------------------RunPerl------------------
perlib.cpp -- 注,这个cpp是被我改过的,原来是.c
EXTERN_C DllExport int
RunPerl(int argc, char **argv, char **env)
{
int exitstatus;
PerlInterpreter *my_perl, *new_perl = NULL;
啊,解释器来了。
看看吧:
perl.h
typedef struct interpreter PerlInterpreter;
# define PERLVAR(prefix,var,type) type prefix##var;
struct interpreter {
# include "intrpvar.h"
};
好了,我们要去intrpvar.h去看看
不要忘了看注释
/*
=head1 Per-Interpreter Variables
*/
里面东西当然很多,
我们看看第一句吧:
PERLVAR(I, stack_sp, SV **) /* top of the stack */
这个宏的意思是,
# define PERLVAR(prefix,var,type) type prefix##var;
就是定义一个SV**类型的, 名字叫 Istack_sp 的变量。
其它的也是一样。
================
好,再回头。这里你要打开Local窗。
if (!(my_perl = perl_alloc()))
return (1);
perl_construct(my_perl);
PL_perl_destruct_level = 0;
这里是建立perl栈对象,以及初始化吧?
不想看了。
往前走。
---------------------
exitstatus = perl_parse(my_perl, xs_init, argc, argv, env);
啊,这句话就是解析了。
后面都是回收资源的话,我们不看了。
-------------------
因为,事先我们打了无数的断点,在token.c和perly.y上。对吧。肯定是跑不了的。
如果一般的程序,有了lex和yacc,很好分析,但perl让人觉得无从下手。
走着看吧。
好了,进入parser了。
进入yacc了。
但必须要进入到lex才好分析。还早得呢。明天再分析