perl源码分析
来源:互联网 发布:海马玩安卓模拟器 mac 编辑:程序博客网 时间:2024/04/29 15:37
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源码分析
- perl版ping源码
- perl实例分析教程
- perl常用数据分析
- 用perl分析html
- Perl Class::Accessor 分析
- perl增量分析日志
- perl 分析binlog
- 日志分析笔记-PERL
- perl 分析mysql binlog
- 编译perl源码到mipsel。
- perl源码 vs编译 用于源码调试
- 使用perl分析html文件
- 【Perl】分析command的利器
- PERL原码分析2
- Perl原码分析3
- perl的INC设置分析
- 源码分析
- [projecteuler]Multiples of 3 and 5
- Android获取Manifest中<meta-data>元素的值
- ActiveX 暴漏你所有信息的可怕的插件!
- 初学者VIM配置
- 用户互动功能,微信商城系统
- perl源码分析
- 版本控制基础知识
- YUV的基础
- 第8周作业1——类与对象练习之TV
- Android设置loading的属性
- JAVA 虚函数、抽象函数、抽象类、接口
- 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
- nsdictionary to jsonString
- 一次痛彻心扉的经历,抵得上千百次的告诫