首页 / 软件开发 / JAVA / 冒号和他的学生们(连载10)——超级范式
冒号和他的学生们(连载10)——超级范式2011-06-29 BlogJava 郑晖超级范式智能繁衍:机器人生产机器人 ——题记引号忽然想起一事,问道:“有一本名为《C++模版元编程》的书,既然提到了模板,想来也属于泛型编程吧?”冒号答道:“模板元编程即Template Metaprogramming,与GP密切相关但自成一派,隶属于另一种编程范式——元编程(Metaprogramming),简称MP。这里的前缀‘meta-’常译作‘元’,其实就是‘超级’、‘行而上’的意思。比如,元数据(Metadata)是关于数据的数据,元对象(Metaobject)是关于对象的对象,依此类推,元编程自然是关于程序的程序,或者说是编写、操纵程序的程序。”叹号皱着眉:“听着有点绕。”冒号投影出另一段代码——C++(元编程):template <int N>
struct factorial
{
enum { value = N * factorial<N - 1>::value };
};
template <> // 特化(specialization)
struct factorial<0> // 递归中止
{
enum { value = 1 };
};
void main()
{
cout << factorial<5>::value << endl; // 等价于cout << 120 << endl;
}“以上用模板元编程实现了阶乘运算。”冒号讲解道,“与前面三种基本范式的阶乘实现有着根本的不同:这里阶乘的值是在编译时而非运行时计算出来的。换句话说,这段代码以模板形式通过编译器生成了新的代码,并在编译期间获得执行。”叹号不解:“这又说明什么呢?”冒号并不直接回答:“假设你需要批量处理用户文档,其格式结构预先给定,但既不像CSV(逗号分隔)那么简单,也不像XML那么标准,并且用户随时可能改变格式标准,请问如何设计这段程序?”叹号略一思索,便回答:“三大模块:阅读器读出输入文档,解析器按照格式标准去解析,处理器对解析结果进行处理。”“显然关键在解析器,如果你是从头做起,那么问题至少有四。”冒号扳着指头数:“第一、费时写解析器代码;第二、费时调试解析器代码;第三、如果用户更改格式标准,你得重复做上两件事;第四、如果这段程序是大型程序的一部分,任何改动都可能意味着软件的重新编译、连接、测试、打包、部署等等。如果因为你的缘故公司不得不频频发布补丁包的话,你的饭碗恐怕是朝不保夕了。”还是句号机灵:“既然谈到了元编程,一定是利用元编程,根据不同的格式标准自动生成相应的解析器代码。不过——此法虽一劳永逸,但难度似乎不小啊。”