博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

好好学习

  bilbo.cublog.cn

关于作者
姓名:你知道
职业:IT
年龄:每年大一岁
位置:地球
个性介绍:挺笨
Email: bilbo0214@163.com
|| << >> ||
我的分类


simple stack machine in perl
昨天在网上查资料,偶然发现一个简单的stack machine的c++实现
http://www.cis.rit.edu/~njs8030/coding/stackMachine.C,写的很简单,读了一下。

今天用perl写了一个功能相同的程序,代码如下:
#!perl -w

use strict;
use warnings;

my @funcstack = ();    # function stack
my @valuestack = ();   # value satck
my %funclist = (
    "dump" => \& dumpvaluestack,
    "+" => \&add,
    "-" => \&sub,
    "*" => \&mul,
    "/" => \&div,
);

# Computation stack:
#   (+ 3 (* 2 9)) = 21
push(@funcstack, "dump");
push(@funcstack, "+");
push(@funcstack, "*");
push(@valuestack, 3);
push(@valuestack, 2);
push(@valuestack, 9);

interpreter(\@funcstack, \@valuestack);

#----------------stack machine --------------------

sub interpreter {
    my ($funcStack_ref, $valueStack_ref) = @_;
    my $size = 0;
    my $funcname;
   
    $size = $#{$funcStack_ref} + 1;
    while ($size > 0)
    {
        $funcname = pop @{$funcStack_ref};
        $funclist{$funcname}->();
        $size = $#{$funcStack_ref} + 1;
    }
}

sub dumpvaluestack {
    print "Value Stack Dump", "\n";
    my $i;
    for ($i = $#valuestack; $i >= 0; $i--)
    {
        print "\t[$valuestack[$i]]", "\n";
    }
}

sub add {
    my ($arg1, $arg2);
   
    $arg2 = pop(@valuestack);
    $arg1 = pop(@valuestack);
    push(@valuestack, $arg1 + $arg2);
}

sub sub {
    my ($arg1, $arg2);
   
    $arg2 = pop(@valuestack);
    $arg1 = pop(@valuestack);
    push(@valuestack, $arg1 - $arg2);
}

sub mul {
    my ($arg1, $arg2);
   
    $arg2 = pop(@valuestack);
    $arg1 = pop(@valuestack);
    push(@valuestack, $arg1 * $arg2);
}

sub div {
    my ($arg1, $arg2);
   
    $arg2 = pop(@valuestack);
    $arg1 = pop(@valuestack);
    push(@valuestack, $arg1 / $arg2);
}

stack machine严格说是属于virtual machine的一种,这个版本没有设计虚拟机执行程序的格式,只是考虑了虚拟机本身(由函数栈和数据栈组成)。
如果以后有时间,再加上一些常用的指令,增加从文件读入文件执行的功能,这样就能称为一个真正的虚拟机。其实,forth语言的实现就是类似的思路。

发表于: 2007-10-14,修改于: 2007-10-14 23:36,已浏览657次,有评论0条 推荐 投诉


网友评论
 发表评论