[原创] 《rust实战》之BrainRust 04-假装是面向对象的BrainRust

nemon   2024-8-4 01:43 楼主

上次说用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){
…………

这次我就不贴完整的代码了,需要的同学请自行下载:

main.rs (5.4 KB)
(下载次数: 0, 2024-8-8 19:05 上传)

注意在完成的代码里,我把debug_vm和对应的调用部分都注释了,以便编译出可用的exe:

rustbrain2.exe (165.5 KB)
(下载次数: 0, 2024-8-8 19:04 上传)

执行效果完全没有变化,就不赘述了。

这次用非常严谨的rust来做非常灵活的BF解释器就告一段落了。

在此感谢网友、主办方以及工作人员,没你们霍霍,我肯定懒得把rust看完。

顺便说一下,rust虽然各种限制,但是帮助提示还是非常详细的。建议把visual code装好,虽然错误多,但是提示和修改建议很详细啊,多改几回错就习惯了。

 

 

本帖最后由 nemon 于 2024-8-8 19:11 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复