从今天开始,我打算写一个全新的教程,手把手去实现一个五脏俱全的PHP
,教程风格类似于去年我写的手把手编写PHP
协程扩展那样,但是会有一点不同,这个教程可能就不会那么直接上那么多代码了,重点是讲解实现的思路。
这个编译器语法会尽可能的和PHP
保持一致。并且我希望它是一门静态强类型的语言,你可以在定义一个变量的时候,不声明类型,但是我们会进行类型推导。
教程的知识点我希望和龙书的尽可能吻合,但是也不会和它完全一样,毕竟这本书前面有太多讲解编译器前端的东西了,很多手写解析源代码的,这有一些算法,一旦拿出来讲,估计会起到劝退的效果。这门教程我希望更多的是讲解编译器的后端优化,这一点也和大多数的PHP
源码分析教程不同,目前来看,因为PHP
的原因,编译器后端的优化除了JIT
似乎就没了,而且大多数是去讲解AST
生成的。
至于后端的优化,会讲解原理,但是,真正的去实现的时候,我们不会自己去手写,这太费劲了,我们直接使用LLVM
,然后开优化,读IR
,来验证优化的思路。所以,这门教程,会讲解LLVM
的中间表示。但是我们不会去手写LLVM
的IR
,而是使用LLVM
的API
来自动生成中间表示。
这门教程是使用C++
来开发的,构建工具是CMake
,编译器前端工具是flex
和bison
,编译器后端工具是LLVM
。
之前我打算使用PHP
来写这门教程。试坑之后,我发现有以下几点问题:
1、如果直接使用PHP-Parser
来生成AST
,那么我们实现的语法就会受很大的限制了
2、PHP
对LLVM
的绑定没有看到比较好的。我有想过去写扩展对LLVM
包一层,但是这工作量太大了。也想过用FFI来直接搞,但是怕PHP的FFI有问题。所以就干脆直接用C++来完成我们的这门教程了。
我不是一个专门研究编译器的人,这个教程主要是对自己的一个阶段性学习的总结。就和PHP
协程扩展开发教程一样,边写边学习,算是对自己这一年的一个总结吧。