Maison  >  Article  >  développement back-end  >  我想用c语言写一个php解释器(简单的就行)该从何做起,都要经历哪些步骤呢?

我想用c语言写一个php解释器(简单的就行)该从何做起,都要经历哪些步骤呢?

WBOY
WBOYoriginal
2016-06-17 08:31:011177parcourir

能解释执行php程序,比如:

<span class="cp"><?php </span>
<span class="k">echo</span> <span class="s2">"hello world .."</span><span class="p">;</span>
<span class="cp">?></span><span class="x"></span>
</span>

回复内容:

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 源码~
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn