昨天在网上查资料,偶然发现一个简单的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语言的实现就是类似的思路。