PHP扩展语言: Zephir

什么是Zephir

Zephir 是由 Phalcon 团队打造的专门用于PHP扩展开发的领域特定语言。由于 Phalcon是PHP扩展级框架,是完全使用C开发的,随着功能越来越多、代码越来 越复杂,这给社区带来了巨大的维护代价,直接导致新功能、bug fix进展都很 缓慢。在这样一个大背景下,Zephir出世了!

为什么使用Zephir?

互联网发展迅猛,业务增长飞快,所以如今的PHP应用必须在稳定性、性能和功 能上取得一个平衡,以应付日益增长的业务量。所有PHP应 用都会基于一套通用的组件开发。这些组件可能是某些类库或框架,也可能是他们的 集成。框架一旦安装好了,很少会需要修改,作为应用的基础,他们必须功能丰 富并且速度不凡。

要开发出性能好且健壮的类库是比较复杂的,因为它们的实现一般是高度抽象的。 假设基础库不常修改,那我们可以创建扩展来提供要同的功能,但是得益于先编 译后执行的优势,在性能和资源利用上都会得到极大的提升。

使用Zephir,你就可以实现在PHP语言呈面可用的面向对象类库/框架/应用, 提升性能的同时改善和用户体验。

如果你是一个PHP程序员...

PHP是开发WEB应用最流行的语言。动态类型和解释执行带来的灵活度让开发PHP 变得非常高效。

从版本4开始,到现在的版本5,到之后的版本7,PHP都是基于Zend引擎实现的。 这是一个虚拟机负责执行转换成字节码的PHP代码。Zend引擎存在于所有PHP分发 版本中,使用Zephir,你可以创建基于Zend引擎的PHP扩展。

PHP是Zephir的宿主,所以它们之间很类似。但是,它们之间还是有很大区别, Zephir仍然有自己的特性。例如,Zephir更加严谨,跟PHP对比,它是编译型语 言,开发效率相对会低一些。

如果你是一个C程序员...

C是有史以来最强大和最流行的编程语言。事实上,PHP就是用C写成了,这也就 是PHP扩展可以在C中直接使用。C让你能自由管理内存,使用底层变量,甚至直 接内嵌汇编片断。

但是,跟PHP、Zephir相对,使用C语言开发大型应用会花费更长的时间,而且如 果你不是很精通的话,有些错误是很难发现的。

Zephir在设计的时候就考虑到了编程安全,所以经没有实现如指针、手动内存管 理这些功能。如果你是一个C程序员,你会发现和C相比Zephir虽没有那么强大但 更友好。

编译和解释

编译过程通常会降低开发效率;在运行你代码之前,你需要更多的耐心来编译你 的代码。而解释过程倾向于牺牲执行效率来换取开发效率。

在某些情况下,解释执行和编译后再执行的速度是没有太大差距的。

编译型是一次编译多次运行,而解释型是每次运行都需要解释。开发者可以自己 决定应用的哪部分使用Zephir,哪部分不使用。

静态类型 VS 动态类型

通常来说,在静态类型语言中,变量在它的生命周期内绑定到指定的类型。它的 类型是不能更改的,它仅接受类型兼容的值和操作。C/C++就是这样实现的:

int a = 0;
a = "hello"; // not allowed

在动态类型语言中,类型是绑定到值的,而不是绑定到变量。因此,一个变量可 能开始指向某个类型的值,之后又指定另一个类型的值。Javascript/PHP就是典 理的动态类型语言:

var a = 0;
a = "hello"; // allowed

语言特性

语法类似于PHP、Hack语言,编写简单,避免了指针、内存管理等的烦恼。一段简单的示例如下:

namespace Test;

/**
 * MyTest (test/mytest.zep)
 */
class MyTest
{
    public function someMethod()
    {
        /* Variables must be declared */
        var myArray;
        int i = 0, length;

        /* Create an array */
        let myArray = ["hello", 0, 100.25, false, null];

        /* Count the array into a 'int' variable */
        let length = count(myArray);

        /* Print value types */
        while i < length {
            echo typeof myArray[i], "\n";
            let i++;
        }

        return myArray;
    }
}

和PHP语法很像吧?实际上,zephir会把上面那段代码翻译成C后再编译成PHP扩 展。