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

时间: 2024-08-26 13:27:27

perl源码分析的相关文章

HTTP服务器的本质:tinyhttpd源码分析及拓展

已经有一个月没有更新博客了,一方面是因为平时太忙了,另一方面是想积攒一些干货进行分享.最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhttpd源码分析的成果.tinyhttpd是一个非常轻量型的http服务器,c代码500行左右,可以帮助我们了解http服务器运行的实质.在分析之前,我们先说一下http报文. 一.http请求 http请求由三部分组成,分别是:起始行.消息报头.请求正文 Request Line<CRLF> Hea

cJSON源码分析

cJSON源码分析 简介 由于C语言汇总,没有直接的字典,字符串数组等数据结构,所以要借助结构体定义,处理json. JSON是一种轻量级的数据交换格式.JSON采用完全独立与语言的文本格式,易于人阅读和编写.同时也易于机器解析和生成.它是基于JavaScript,Programming Language,Standard ECMA-262 3rd Edition -December 1999的一个子集.JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(如C,C++,C+

OpenStack Kolla 源码分析 --Ansible

OpenStack Kolla 源码分析 –Ansible Kolla介绍 Kolla项目利用Docker.Docker-Compose.Ansible来完成部署OpenStack,目前Kolla已经能够完成一个all-in-one的开发环境的部署.从Kolla项目spec中的描述来看,主要是利用Docker容器的隔离性来达到OpenStack的原子升级.回退在升级.整个升级.回退的过程更容易控制影响范围,降低整个OpenStack的运维复杂度.Kolla 提供了生产级别的 OpenStack

QtCreator源码分析(一)——QtCreator源码简介

QtCreator源码分析(一)--QtCreator源码简介 一.QtCreator简介 QtCreator是设计精巧的插件式系统,QtCreator的核心是一个插件管理器,其所有功能都是使用插件完成.在启动时,QtCreator会首先加载一个名为coreplugin的插件,coreplugin插件提供了Qt Creator最基本的功能和扩展点,其余的插件都是直接或间接依赖于coreplugin插件提供的机制,一步步扩充QtCreator的功能,最终将其变成一个功能完整的IDE.针对QtCre

TeamTalk源码分析之login_server

login_server是TeamTalk的登录服务器,负责分配一个负载较小的MsgServer给客户端使用,按照新版TeamTalk完整部署教程来配置的话,login_server的服务端口就是8080,客户端登录服务器地址配置如下(这里是win版本客户端): 1.login_server启动流程 login_server的启动是从login_server.cpp中的main函数开始的,login_server.cpp所在工程路径为server\src\login_server.下表是logi

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

HashMap与TreeMap源码分析

1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Java这么久,也写过一些小项目,也使用过TreeMap无数次,但到现在才明白它的实现原理).因此本着"不要重复造轮子"的思想,就用这篇博客来记录分析TreeMap源码的过程,也顺便瞅一瞅HashMap. 2. 继承结构 (1) 继承结构 下面是HashMap与TreeMap的继承结构: pu

Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938395.html 前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化.在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线

Spark的Master和Worker集群启动的源码分析

基于spark1.3.1的源码进行分析 spark master启动源码分析 1.在start-master.sh调用master的main方法,main方法调用 def main(argStrings: Array[String]) { SignalLogger.register(log) val conf = new SparkConf val args = new MasterArguments(argStrings, conf) val (actorSystem, _, _, _) =