[原创] 《rust实战》之BrainRust 02-跑起来不冒烟的rust

nemon   2024-8-8 18:20 楼主

上次(https://bbs.eeworld.com.cn/thread-1289538-1-1.html)解释了BF是啥,这次看看用rust如何先不出错的跑起来。

提个小插曲,windows下安装rust用这个:

rustup-init.exe (8.54 MB)
(下载次数: 0, 2024-8-4 01:25 上传)

这次安装rust环境的时候,网不太稳定,于是在visualStudio安装的时候点了一下暂停 。

完全不影响rust的安装,但是cargo build的时候,找不到msvc。

再启动rust安装,到了装visual studio的时候总提示有一个安装没完成,却没有其他可操作的地方。

只好运行了一下这个:

VisualStudioSetup.exe (3.82 MB)
(下载次数: 0, 2024-8-4 01:25 上传)

这样就把暂停的安装任务显示出来,然后继续安装,rust就能用了。

顺便附赠一个编辑器,记得要装rust-analyzer 和 Native Debug 两个扩展啊——

VSCodeUserSetup-x64-1.92.0.exe (95.68 MB)
(下载次数: 0, 2024-8-4 01:26 上传)

 

又扯远了,回来接着说BF在rust里的实现。

其实也很简单,基本上按上一篇的算法,用rust重写一遍就行了:

fn main() {
    let s_prog = String::from("++++++++[>+++++++++<-]>.>>++++++++++[<++++++++++>-]<+.+++++++..+++.>>++++[<+++++++++++>-]<.------------.<<<+++[>+++++<-]>.>.+++.------.--------.>+.");
    let length = s_prog.len();
    let mut i = 0;
    let mut memory: [u8; 32] = [0; 32];
    let mut position_in_memory = 0;
    let mut call_stack: [u32; 32] = [0; 32];
    let mut position_in_stack = 0;
    while i < length {
        let mut c = &s_prog[i..(i + 1)];
        match c {
            ">" => {
                position_in_memory += 1;
            }
            "<" => {
                position_in_memory -= 1;
            }
            "+" => {
                memory[position_in_memory] = memory[position_in_memory] + 1;
            }
            "-" => {
                memory[position_in_memory] -= 1;
            }
            "." => {
                let _ch = std::char::from_u32(memory[position_in_memory] as u32).unwrap();
                print!("{}", _ch);
            }
            "," => {
                let mut input = String::new();
                let _ =  std::io::stdin().read_line(&mut input).expect("无法读取输入");
                let char_input = input.chars().next().expect("没有输入字符");
                memory[position_in_memory] = char_input as u8  ; 
            }
            "[" => {
                if memory[position_in_memory] == 0 {
                    position_in_stack += 1;
                    call_stack[position_in_stack] = i as u32;
                    let mut count = 1;
                    while count > 0 {
                        i += 1;
                        c = &s_prog[i..(i + 1)];
                        match c {
                            "[" => {
                                count += 1;
                            }
                            "]" => {
                                count -= 1;
                            }
                            &_ => count = count,
                        }
                    }
                } else {
                    position_in_stack += 1;
                    call_stack[position_in_stack] = i as u32;
                }
            }
            "]" => {
                if memory[position_in_memory] != 0 {
                    i = call_stack[position_in_stack] as usize;
                } else {
                    position_in_stack -= 1;
                }
            }
            _ => println!("非法字符 {}", c),
        }
        i += 1;
    }
}

cargo build、cargo run之后,效果和python完全一样,输出 “Hello World!”

可以看出,逻辑完全是照抄之前的py代码,语法很像c,唯一比较大的区别是,在rust里如果要更改变量的值,一定要在声明的时候加上mut。

受此影响,存储单元数组和栈数组,以及程序指针、存储指针和栈指针都做了这个改造。

(突然觉得,应该用c来写第一部分,会更加明显一些。)

改写到此结束,下一篇,我们将演示在rust里,如何获取命令行参数,以及函数的使用。

 

本帖最后由 nemon 于 2024-8-8 18:20 编辑

回复评论

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