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

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

WBOY
WBOYOriginal
2016-06-17 08:31:011223Durchsuche

能解释执行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 源码~
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn