《手把手教你编写PHP编译器》--开篇

从今天开始,我打算写一个全新的教程,手把手去实现一个五脏俱全的PHP,教程风格类似于去年我写的手把手编写PHP协程扩展那样,但是会有一点不同,这个教程可能就不会那么直接上那么多代码了,重点是讲解实现的思路。

这个编译器语法会尽可能的和PHP保持一致。并且我希望它是一门静态强类型的语言,你可以在定义一个变量的时候,不声明类型,但是我们会进行类型推导。

教程的知识点我希望和龙书的尽可能吻合,但是也不会和它完全一样,毕竟这本书前面有太多讲解编译器前端的东西了,很多手写解析源代码的,这有一些算法,一旦拿出来讲,估计会起到劝退的效果。这门教程我希望更多的是讲解编译器的后端优化,这一点也和大多数的PHP源码分析教程不同,目前来看,因为PHP的原因,编译器后端的优化除了JIT似乎就没了,而且大多数是去讲解AST生成的。

至于后端的优化,会讲解原理,但是,真正的去实现的时候,我们不会自己去手写,这太费劲了,我们直接使用LLVM,然后开优化,读IR,来验证优化的思路。所以,这门教程,会讲解LLVM的中间表示。但是我们不会去手写LLVMIR,而是使用LLVMAPI来自动生成中间表示。

这门教程是使用C++来开发的,构建工具是CMake,编译器前端工具是flexbison,编译器后端工具是LLVM

之前我打算使用PHP来写这门教程。试坑之后,我发现有以下几点问题:

1、如果直接使用PHP-Parser来生成AST,那么我们实现的语法就会受很大的限制了

2、PHPLLVM的绑定没有看到比较好的。我有想过去写扩展对LLVM包一层,但是这工作量太大了。也想过用FFI来直接搞,但是怕PHP的FFI有问题。所以就干脆直接用C++来完成我们的这门教程了。

我不是一个专门研究编译器的人,这个教程主要是对自己的一个阶段性学习的总结。就和PHP协程扩展开发教程一样,边写边学习,算是对自己这一年的一个总结吧。