楼主:
Neisseria (Neisseria)
2016-12-07 23:16:44Zephir 是一个新的编译语言,语法上大抵为 PHP-like (但不相容于 PHP)
这个语言的功能就是简化撰写 PHP extension 的过程
由于 Zephir 编译器会将 Zephir 程式码转为 C 程式码
再将此 C 程式码转为 PHP extension (.so 或 .dll)
所以,使用者不需要撰写 C
笔者实作了两个 toy extension,repo 如下
https://github.com/cwchentw/doubler-in-zephir
https://github.com/cwchentw/matrix-in-zephir
由于 Zephir 的程式码很像 PHP,这里就不介绍语法
而会介绍使用 Zephir 的一些要点
如果要试写 Zephir,要找有支援的 editor
由于 Zephir 不相容于 PHP,使用 PHP editor 行不通
笔者是用 Atom,有基本的 syntax highlighting for Zephir
目前只能透过 Github repo 安装
在 Ubuntu/Debian 上,安装以下套件
$ sudo apt-get install build-essential git re2c \
php5 php5-json php5-dev libpcre3-dev
我自己是用 Debian,其他 OS 请自行变换套件
接着,下载 Zephir repo
$ git clone https://github.com/phalcon/zephir.git
$ cd zephir
$ ./install-nosudo
会安装 zephir 执行档到 ~/bin。只是要试用的话,不需要 global install
透过 zephir 可建立 Zephir 专案
$ zephir init utils
$ cd utils
$ tree
.
├── config.json
├── ext/
└── utils/
默认会有 config.json (设定档),ext/ 和 utils/ 资料夹
其中 ext/ 放的是一些自动生成的档案及最后的 PHP extension
最好不要在 ext/ 里面放自己的东西,有可能被洗掉
我们的 Zephir 程式码就是放在 utils/ 里面
要注意的是,Zephir 会将 utils/ 视为 namespace 的一部分
如果修改的话,设定档要做相对应的修改
我自己是用类似 Java 的习惯,将专案改为 com/example/matrix.zep
这里,namespace 就设成 com
以我们这个专案为例,程式码如下:
namespace Com\Example;
class Matrix
{
// Some part omitted
}
我们省略实作,请板友自行到 repo 看
要注意的是,每个 Zephir 档案要有一个 class,而且只能有一个 class
namespace 也要和专案结构一致,而且不能省略 namespace
这个限制刚好和 Java 有微妙的相似处
笔者用 Zephir 实作 PHP extension 时
一开始都很愉快,因为语法很像 PHP,所以写起来很快
后来,不熟 Zephir 的语法,开始会写错
Zephir 编译器跳出这个奇妙的错误讯息
Zephir\Exception: Cannot parse file:
/home/user/src/php_ex/matrix-in-zephir/com/example/matrix.zep
而且,不论我错在程式码的任何位置,错误讯息都一样
笔者本来一度想放弃,为了完成这篇教学文,耐著性子把专案写完
等笔者确定写对,编译成功后,还回头故意写错某些地方
结果很奇妙地又跳一样的错误讯息 Orz
[Update]
后来查到,好像是 Zephir 安装过程有误所造成的,可看 Zephir 的 issues
但小弟试了几次,还是弄不起来,后来就放弃了,不想浪费时间搞这个
本来笔者想试着结合 C shared library,结果发现相当困难
Zephir 要结合外部 C 语言,有两个方法
- cblock:官方文件完全没写相关说明,透过 stackoverflow 上的神人介绍
小弟才知道有这个东西,而且不知道如何结合 struct 等复杂结构
- optimizer:官方文件只有一页,而且说明相当简略
只能去挖 Zephir 本身的原始码,而原始码没有任何注解 = =...
笔者想了想,毕竟 Zephir 本身的设计,就是要让使用者不用碰 C 语言
就把 Zephir 当成是某个不能连结 C 的 DSL 就会比较寛心一点...
笔者对 Zephir 的探索到这里大概就结束了
虽然 Zephir 写很来很快很方便
但 Zephir 目前的一些问题,让笔者不是很推这个语言
这个语言毕竟还很年轻,或许未来还会有些变化也说不定