您的位置:首页 > 其它

Perl的编译学习小结

2015-07-26 20:49 246 查看
看前辈们写的测试工具,前后总是有BEGIN 和 END 两个模块,而且在常用的Perl -d debug这些perl脚本的时候,这个Begin和END却没有看到运行过程。今天看了Perl 大骆驼书的编译和命令行接口 了解了。

Perl 的生命周期可以分为,编译 (代码生成 解析树重构阶段) 和执行 四个阶段组成。

1.在编译阶段 perl能够根据BEGIN 引导块进行的更加深入。 BEGIN 块一完成解析就交给解释器以FIFO的顺序进行运行。这样处理的还有use和no 声明,use和no 实际上试伪装的BEGIN块。任何CHECK INIT 和END块都由编译器安排延迟执行。

INIT 以FIFO

CHECK和END以LIFO的顺兴执行。

2.代码生成阶段(可选) 这个时候是把编译完成的程序转换成C源程序或者串行的Perl 字节码(一个代表内部的perl指令的值序列)

这个时候完成CHCEK块的工作。

3. 解析树重构阶段(可选)

要复活程序,必须重构解析树。这个阶段是发生了代码生成阶段并且生成了字节码的情况下 存在的。 perl必须从字节码重构解析树 才能运行。

4. 执行阶段。

解析器 拿来解析树(可能直接从编译阶段得到 或者间接从代码生成阶段或者冲解析树重构阶段得到) 并且运行。

这个阶段开始之前,在主程序运行之前,所有安排好的INIT会以FIFO的顺序执行。

当程序执行后。 会以LIFO的顺序执行END块。

再说一下BEGIN END INIT 和CHECK 多次定义这些块不会有任何问题,因为Perl会跟踪何时调用他们,并且不用通过名字调用。

BEGIN --- 如果在编译过程中碰到 则在编译文件的其他部分之前尽可能快的运行 FIFO

CHECK --- 编译完成之后,程序开始之前。 LIFO

INIT ---- 主流程开始之前 FIFO

END 程序运行之后 LIFO END块会尽可能晚的执行,当程序退出perl解释器,甚至因为一个没有捕获的die或者其他异常。在两种情况下会忽略END块(或者DESTORY) a y一个程序不是退出 而是以exec从一个程序变形到另外一个程序 或者一个进程被未捕获的信号杀死时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: