模板引擎(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没有英文文档,一直就没有使用过,可能会遗漏一些新功能。
4、C++ API
基本的API几个软件都差不多,我觉得CTemplate更完善一些,特别喜欢它的调试功能。
总体来说,我对CT++还是有些难舍,但是综合考虑之后还是决定转到CTemplate上。
有关模板引擎,我推荐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上。