我想用c语言写一个php解释器(简单的就行)该从何做起,都要经历哪些步骤呢?
程序员文章站
2022-05-08 12:50:22
...
能解释执行php程序,比如:
如果是前者,去重用现有的解释器。
否则,转到 @vczh 的答案。 词法分析获得token->语法分析获得AST->AST转化为IR中间指令集->之后再vm上面运行IR中间指令。
大部分的解释型脚本语言都类似这样几个步骤吧。 其实如果你仅仅是运行的话, 生成AST,之后递归遍历AST也是可以的。我很早之前的alex1版本就是这么干的, 呵呵。 不过这样做的话,性能很差,而且GC很难做。好一点的方式就是如@vczh 所说的,搞个基于stack的vm来执行IR。 基于stack的vm相对于基于寄存器的vm来说要好实现些。 最简单的用正则去暴力匹配词法单元,然后构造抽象语法树,之后遍历节点翻译成C语言语法 请参见 Zend Engine 源码~
echo "hello world ..";
?>
回复内容:
1:词法分析器、语法分析器,得到语法树。
2:语义分析器,用来检查代码是不是有问题,譬如说1+null就不是一个合法的程序。
3:php有table,php由引用,为了解决循环引用,你就需要开发一个垃圾收集器。
4:设计一个动态类型语言的指令集,设计一个基于堆栈的VM(软件模拟这套指令级的CPU),这是最简单的做法,可以迅速模拟出运行的过程来。
然后你就得到结果了。
你是想在你的程序里使用 PHP 脚本语言还是真的想做个解释器?如果是前者,去重用现有的解释器。
否则,转到 @vczh 的答案。 词法分析获得token->语法分析获得AST->AST转化为IR中间指令集->之后再vm上面运行IR中间指令。
大部分的解释型脚本语言都类似这样几个步骤吧。 其实如果你仅仅是运行的话, 生成AST,之后递归遍历AST也是可以的。我很早之前的alex1版本就是这么干的, 呵呵。 不过这样做的话,性能很差,而且GC很难做。好一点的方式就是如@vczh 所说的,搞个基于stack的vm来执行IR。 基于stack的vm相对于基于寄存器的vm来说要好实现些。 最简单的用正则去暴力匹配词法单元,然后构造抽象语法树,之后遍历节点翻译成C语言语法 请参见 Zend Engine 源码~