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 然后,开始调试。 ----------------------------RunPerl------------------ perlib.cpp -- 注,这个cpp是被我改过的,原来是.c EXTERN_C DllExport int 啊,解释器来了。 看看吧: perl.h typedef struct interpreter PerlInterpreter; #? define PERLVAR(prefix,var,type) type prefix##var; 好了,我们要去intrpvar.h去看看 不要忘了看注释 /* 里面东西当然很多, 我们看看第一句吧: 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())) 这里是建立perl栈对象,以及初始化吧? 不想看了。 往前走。 --------------------- ? exitstatus = perl_parse(my_perl,xs_init,argc,argv,env); 啊,这句话就是解析了。 后面都是回收资源的话,我们不看了。 ------------------- 因为,事先我们打了无数的断点,在token.c和perly.y上。对吧。肯定是跑不了的。 如果一般的程序,有了lex和yacc,很好分析,但perl让人觉得无从下手。 走着看吧。 好了,进入parser了。 进入yacc了。 但必须要进入到lex才好分析。还早得呢。明天再分析 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |