上次说用rust实现了BF解释器的功能(https://bbs.eeworld.com.cn/thread-1289923-1-1.html)。
但是这几天下雨啊,闲着也是闲着,不如再按OO改写一下。
如果说python的面向对象,能让你猜出OO大概是怎么实现的,那么rust就更明显了。
在rust里,class不是保留的关键字。一个类,是用struct来存储的,所以,考虑到我们这个BF解释器虚机用的私有变量,定义可以很简单:
struct VM {
pc:usize,//程序指针
memory: [u8; 32] ,//虚机内存
position_in_memory:usize,//内存指针
call_stack: [u32; 32],//记录[的位置的堆栈
position_in_stack:usize,//堆栈指针
s_prog: String,//BF程序字符串
}
对象不仅要有自己的变量,还要有能够处理这些数据的方法。在rust里,可以用给rust指定过程函数的方式来实现。
可以看出,每个“方法”都要接受&mut self作为第一个形参,而在运行的时候,实参就是对应的struct。
BF这个VM,有4个方法:init_vm用于初始化虚机变量,debug_vm用来打印虚机变量,set_prog用来读入程序,run_prog用来解释运行:
impl VM{
fn init_vm( &mut self) {
self.pc = 0;
self.memory = [0; 32];
self.position_in_memory = 0;
self.call_stack = [0; 32];
self.position_in_stack = 0;
}
fn debug_vm( &mut self) {
println!("VM vars: pc={:?},pm={:?},ps={:?}",
self.pc,self.position_in_memory,self.position_in_stack);
println!("memory:{:?}", self.memory);
println!("stack:{:?}", self.call_stack );
println!("length:{} ,prog:{}", self.s_prog.len(), self.s_prog);
}
fn set_prog(&mut self, prog:String){
self.s_prog = prog;
}
fn run_prog(&mut self){
…………
这次我就不贴完整的代码了,需要的同学请自行下载:
注意在完成的代码里,我把debug_vm和对应的调用部分都注释了,以便编译出可用的exe:
执行效果完全没有变化,就不赘述了。
这次用非常严谨的rust来做非常灵活的BF解释器就告一段落了。
在此感谢网友、主办方以及工作人员,没你们霍霍,我肯定懒得把rust看完。
顺便说一下,rust虽然各种限制,但是帮助提示还是非常详细的。建议把visual code装好,虽然错误多,但是提示和修改建议很详细啊,多改几回错就习惯了。
本帖最后由 nemon 于 2024-8-8 19:11 编辑