看板 PHP
作者 Neisseria (Neisseria)
標題 [教學] 用 Zephir 寫 PHP extension
時間 Wed Dec  7 23:16:44 2016


Zephir 是一個新的編譯語言,語法上大抵為 PHP-like (但不相容於 PHP)
這個語言的功能就是簡化撰寫 PHP extension 的過程

由於 Zephir 編譯器會將 Zephir 程式碼轉為 C 程式碼
再將此 C 程式碼轉為 PHP extension (.so 或 .dll)
所以,使用者不需要撰寫 C

筆者實作了兩個 toy extension,repo 如下
https://github.com/cwchentw/doubler-in-zephir
GitHub - cwchentw/doubler-in-zephir
Contribute to doubler-in-zephir development by creating an account on GitHub. ...

 
https://github.com/cwchentw/matrix-in-zephir
GitHub - cwchentw/matrix-in-zephir
Contribute to matrix-in-zephir development by creating an account on GitHub. ...

 

由於 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
GitHub - phalcon/zephir: Zephir is a compiled high level language aimed to the creation of C-extensions for PHP
zephir - Zephir is a compiled high level language aimed to the creation of C-extensions for PHP ...

 
$ 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 目前的一些問題,讓筆者不是很推這個語言
這個語言畢竟還很年輕,或許未來還會有些變化也說不定

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 175.180.193.126
※ 文章代碼(AID): #1OI2VZsx (PHP)
※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1481123811.A.DBB.html
※ 編輯: Neisseria (175.180.193.126), 12/07/2016 23:20:44
※ 編輯: Neisseria (175.180.193.126), 12/08/2016 07:42:06

--