最近学习rust,想到写什么东西练练手。简单的都写过了,web相关的库不成熟,就连std::io都在alpha后变过几次了。只能选取不涉及io的,用到容器的来试试。想到了之前一直没实现的whitespace的解释器。这东西看起来有点复杂,我用php写了个原型,原本想做成lexer和parser的。实际写的时候,发现其命令其实很简单,只是只用了LF,space,Tab,所以需要排列来构造唯一的序列。其实设计还不错,本以为还会有a命令是b命令子串的情况。结果并没有这种情况。lexer还有点用,但是parser基本没用,开始还麻烦构造语法树,后来发现这个其实就是一种低级类似汇编级别的语言,根本不需要语法树,直接翻译就好了。
php实现解释之后,觉得这种翻译成二进制由vm执行也不错。结果用c写了个vm。写着写着发现,如果不是ws的字符有点怪,翻译成pop,push这种,其实就是一种虚拟机上的opcode。于是查了下虚拟机相关内容。用c实现了一个简单的,这次opcode由自己设计。
whitespace实现中,除了开始一些处理和调试外,后来明显没错误了,但是执行结果老是和他官方对不上。后来研究了一个实现,(ws资料和实现都非常少),发现算数操作和比较都需要把堆栈上的top元素pop出来,而我开始没pop。还有要注意的是输入输出的时候,stack存的是heap上的地址。

官网
wiki
项目