首页 > 代码库 > perl源码分析

perl源码分析

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才好分析。还早得呢。明天再分析


perl源码分析