免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3221 | 回复: 4
打印 上一主题 下一主题

perl 5解释器是基于虚拟机的吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-27 19:53 |只看该作者 |倒序浏览
看过lua的部分源代码,lua解释器的工作原理大体如下:
(1) 解释器由编译器和虚拟机两个模块构成
(2) 编译器将LUA程序翻译成虚拟机指令
(3) 虚拟机解释这些虚拟机指令的含义
LUA解释器提供了一个选项可以观察LUA程序的中间表示,对于如下程序:

  1. function add(a, b, c)
  2.      return a + b + c
  3. end
复制代码

可以使用luac -l列出它的虚拟机指令:

  1. ADD t a b
  2. ADD t t c
  3. RETURN t
复制代码


perl 5解释器是基于虚拟机的吗?如果是的话,我如何观察perl程序的中间表示?谢谢。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2008-12-27 21:05 |只看该作者
原帖由 pugs 于 2008-12-27 19:53 发表
perl 5解释器是基于虚拟机的吗?

是的。
如果是的话,我如何观察perl程序的中间表示?

可以用 Perl 自带的一些模块,例如 B::*, 如

  1. $ perl -MO=Terse t.pl
  2. LISTOP (0x8225f28) leave [1]
  3.     OP (0x8193070) enter
  4.     COP (0x8225ef0) nextstate
  5.     LISTOP (0x819ee90) print
  6.         OP (0x82851e8) pushmark
  7.         UNOP (0x819ee70) entersub [2]
  8.             UNOP (0x819ee50) null [142]
  9.                 OP (0x819a280) pushmark
  10.                 SVOP (0x819ee30) const [4] IV (0x81976a0) 10
  11.                 UNOP (0x819a298) null [17]
  12.                     PADOP (0x819a1f0) gv  GV (0x8227da8) *factorial
  13.         SVOP (0x82851c8) const [5] PV (0x8227d88) "\n"
  14. t.pl syntax OK
复制代码


或按照执行顺序

  1. perl -MO=Terse,exec t.pl
  2. OP (0x8193078) enter
  3. COP (0x819a548) nextstate
  4. OP (0x819d780) pushmark
  5. OP (0x820cf08) pushmark
  6. SVOP (0x819a2b8) const [4] IV (0x81976a8) 10
  7. PADOP (0x820cf20) gv  GV (0x8227da0) *factorial
  8. UNOP (0x819a028) entersub [2]
  9. SVOP (0x819d798) const [5] PV (0x8227d80) "\n"
  10. LISTOP (0x819d7b8) print
  11. LISTOP (0x819a580) leave [1]
  12. t.pl syntax OK
复制代码


  1. $ cat t.pl
  2. use strict;
  3. use warnings;

  4. print factorial(10), "\n";

  5. sub factorial {
  6.         my $n = shift;

  7.         return 1 if $n <= 1;
  8.        
  9.         return $n * factorial(--$n);
  10. }
复制代码


参见 http://www.faqs.org/docs/perl5int/

[ 本帖最后由 MMMIX 于 2008-12-27 21:07 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-12-27 22:52 |只看该作者

回复 #2 MMMIX 的帖子


正是我需要的,谢谢!:wink:

论坛徽章:
0
4 [报告]
发表于 2008-12-27 23:07 |只看该作者
see also Concise

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2008-12-28 10:25 |只看该作者
原帖由 lokchungk 于 2008-12-27 23:07 发表
see also Concise

是 B::Concise,这个其实 B:: 下的一组模块中的一个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP