加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl源码分析

发布时间:2020-12-15 23:58:33 所属栏目:大数据 来源:网络整理
导读:token.c和perly.y ================================================= 不清楚,为什么,网上到处都是这个怎么用那个怎么用的文章,为什么大家不来一起分析一下,一些开源工程的代码呢? 这些开源的代码中,最最有意思的,就是编译器的代码了。 那是人类智慧

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读