像 PHP 这类动态语言,开发效率方面快则快矣,但后期的维护成本非常高。PHP 的 Zend 虚拟机本身性能比较差(现在支持 jit 了,但效果有限)。PHP 的垃圾回收使用的引用计数法。为了解决循环引用的问题,不得周期性的停止运行扫描可疑对象(也就是所谓的 stop the world)。如果使用 fpm,那必然伴随着资源的反复申请与销毁;如果使用 swoole 这一类的常驻组件,那要留心内存泄漏的问题。此外,如果 PHP 程序员想更进一步,则需要学习 c 扩展等知识。PHP 社区很多关键的功能都需要 c 语言。c 语言跟 PHP 又差别太大,一般程序员很难完成这一步跨越。
而 Go 语言则几乎囊括了 PHP 的优点而且基本没有对应的缺点。Go虽然也有GC,早期也有 stop the world 的问题,但现在已经不是什么问题。Go语言虽然的强类型的静态语言,但支持类型推导,写起来也不比 PHP 更麻烦。做为一个基础平台,Go没有虚拟机的解释运行开销,可以最大程度利用CPU,这是PHP很难望其项背的。Go语言本身实现了自举,其本身源码是Go代码加上少量汇编。如果程序员有心深入学习,比PHP程序员学 c 语言要容易多了。
那 Go 语言就没有缺点吗?肯定有。在 2018 年的时候,Go 社区还没说要支持泛型,所以在有些场景下需要写很多重复的代码。这确实是一个劣势。但 Go 内置的 map 和 slice 支持声明类型,再辅之以接口和 interface{},基本可以应该常规业务。这个我在文章里已有分析。现在是 2021 年了,再过半年,Go1.18就会支持泛型,到时候 Go 语言就没有什么硬伤了。
要说起并发和网络编程,很少有语言可以跟 Go 语言 PK,PHP则更是不入流。Swoole 的高性能也仅仅是沾了常驻内存的光。只要是常驻内存的方案,比如 amphp 或者 php-pm,性能都甩 php-fpm 几条街,不是它们有多优秀,而是 php-fpm 太慢了。这些性能跟 Go 相比还是差太远。无论这些方案多么精巧,都摆脱不了 Zend 虚拟机的限制:jit 不行、gc 不行。