顯示廣告
隱藏 ✕
※ 本文為 dinos 轉寄自 ptt.cc 更新時間: 2016-12-09 17:16:22
看板 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

--
※ 看板: dinos 文章推薦值: 0 目前人氣: 0 累積人氣: 246 
作者 Neisseria 的最新發文:
  • +32 [問卦] 大家雙11都買了些什麼? - Gossiping 板
    作者: 111.249.46.37 (台灣) 2022-11-11 15:37:05
    安安。今天雙11 聽說雙11買東西會特別便宜 哥最近下訂了一批好便宜的 BND 聽說這東西好厲害的 放著就會長錢出來 大家雙11 都買了什麼?卦?
    58F 34推 2噓
  • +15 [新聞] 選情告急!民主黨不敢提經濟 - Gossiping 板
    作者: 111.249.1.168 (台灣) 2022-11-04 20:43:41
    美國期中選舉倒數最後一週,選情告急的民主黨全力衝刺,總統拜登與前總統歐巴馬,全 國輔選馬不停蹄,但超過半數選民最在乎的通膨經濟難題,民主黨卻絕口不提。對手共和 黨加緊猛攻,還傳出人氣不敗的前總統川普, …
    29F 15推
  • +27 [新聞] 程式語言Python受歡迎程度持續飆升 - Gossiping 板
    作者: 36.228.196.240 (台灣) 2022-08-10 18:10:05
    程式語言Python在熱門程式語言排行榜TIOBE Index中,目前制霸第一名且呈現勢不可擋 的成長趨勢,在本月又上漲2%,其市占達到15.42%的歷史新高,與去年同期相比成長了 3.56%。 TI …
    57F 30推 3噓
  • +42 [新聞] Google發表欲繼承C++的程式語言Carbon - Gossiping 板
    作者: 111.249.47.237 (台灣) 2022-07-22 18:42:44
    歷來不斷有新程式語言革新或試圖取代舊語言,像是Kotlin之於Java,或蘋果的Swift之 於Objective-C,以及微軟的TypeScript之於Javascript。Google本周在Cpp …
    84F 45推 3噓
  • +34 [問卦] 洗衣機的王者 - Gossiping 板
    作者: 114.25.211.178 (台灣) 2022-05-31 13:27:18
    各位年收入 300 萬的鄉民安安 電視機的王者是索尼 冷氣機的王者是日立 瓦斯爐的王者是櫻花 洗衣機的王者是?卦?
    70F 36推 2噓
點此顯示更多發文記錄
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇