模板引擎(Template engine)是實現模型和視圖分離的一個重要手段。如果你從未接觸過模板引擎可以看看
Wiki的介紹。模板引擎的流行最初是因為網站開發的需要,象比較重要的幾個模板引擎:SMARTY、Velocity、StringTemplate都是來源于網頁設計的。當然,除了網頁設計,模板引擎還可以應用于其他領域,而我主要將其應用與代碼生成器的設計中。
有關模板引擎,我推薦StringTemplate的作者Terence Parr 寫的一篇
英文論文。Terence Parr是一個大學教授,寫的文章自然學術性比較強,較難懂,但是很有參考價值。借助這篇文章的分析,我們可以發現當前模板引擎有著兩種不同的思路:一種是嚴格將模型和視圖分開的,設計模板系統時往往提供的模板語言比較簡單,避免在模板語言中加入運算符號等,另一種是提供強大的模板語言功能,模板語言具有類似高級語言的功能,如各種條件判斷語句,甚至數學運算能力。顯然從模板編寫者的角度看,后者具有更強大的功能,幾乎無所不能,但是安全性不如前者,模板的編寫者更容易利用系統漏洞做模板系統設計者沒有想到的事情。這個問題仁者見仁,智者見智,好在由很多的模板系統可以選擇。
絕大多數模板引擎都是支持Java、PHP、Python的,這當然和模板引擎的應用領域相關。我的代碼生成器是用C++寫的,而且必須支持Windows平臺,所以選擇的范圍就比較有限了,從網絡上搜索了一下,似乎只有
Teng、
CT++和
Google CTemplate可以使用了。我對3個系統進行了簡單的評估,并實際使用過CT++和CTemplate,現在總結一下自己的心得,希望對大家有一些幫助。
1、操作系統的支持
我的主要工作是在Windows上的,而模板引擎絕大多數是面向Unix/Linux的,這和我的需求有一定距離。當初曾經下載過Teng,但是折騰了半天也沒有能夠讓其在Visual Studio 2003下成功編譯,所以就放棄了,后來將CT++ 1.8簡單地處理了一下就可以跑了,很開心。而Google CTemplate更提供了完全的Windows支持,這對于我這樣的用戶當然是非常省心了。
2、軟件開發的活躍度
這些軟件都是開源的,軟件開發的活躍度當然是我關心的,有的工具剛開始用的時候很開心,但是后來開發者沒有興趣不玩了,而又沒有人接手,BUG也無法更新了,就比較苦了,典型的象TurboPower。Teng似乎已經很長時間不更新了,CT++一直在更新,但是開發者是俄羅斯人,全部文檔是俄文的,包括程序注釋,以前1.8還有英文文檔,從2.0以后就沒有了,雖然最近承諾2.4以后會報告英文文檔,但是我擔心他哪天不高興就不玩了,所以最后下定決心轉到CTemplate去了。CTemplate雖然是Google的,而且據說Google內部也在使用,但是在模板引擎領域的名氣卻不大,好像作者的熱情仍然很高,持續更新,而且可能很快要升級到1.0版本了,這給我很大的信心。
3、模板語言的功能
在我看來,模板語言的功能越強,提供的函數越多,它可能越受模板編寫者的歡迎,但是可能不符合模型和視圖嚴格分離的原則。Teng和CT++都屬于模板語言功能強的一類,象Teng甚至提供了大量的運算符,而CTemplate顯然是嚴格按照模型和視圖分離原則設計的,它甚至沒有提供if/else這樣在其他模板系統中都有的功能。如前所述,這個問題仁者見仁,智者見智,不爭論了。下面簡單地列個表比較一下。由于CT++ 2沒有英文文檔,一直就沒有使用過,可能會遺漏一些新功能。
|
Teng |
CT++ |
CTemplate |
變量 |
支持 |
支持 |
支持 |
函數 |
支持 |
支持 |
支持(Modifier) |
包含 |
支持 |
支持 |
支持 |
條件語句 |
支持 |
支持 |
不支持 |
循環 |
支持 |
支持 |
支持 |
計算 |
支持 |
不支持 |
不支持 |
賦值 |
支持 |
不支持 |
不支持 |
注釋 |
支持 |
支持 |
支持 |
安全性設計 |
不支持 |
不支持 |
支持 |
用戶定義函數 |
不支持 |
支持 |
支持 |
4、C++ API
基本的API幾個軟件都差不多,我覺得CTemplate更完善一些,特別喜歡它的調試功能。
總體來說,我對CT++還是有些難舍,但是綜合考慮之后還是決定轉到CTemplate上。
posted on 2008-09-17 21:42
zealsoft 閱讀(2680)
評論(2) 編輯 收藏 引用 所屬分類:
編譯器設計