一、前言
元编程很有意思,只是很多人可能一直都没关注过它的名字而已,比如C++中的模板、rust中的宏等等,这些其实都算是元编程的一种实现。
这么一看,元编程这个词似乎也就没有那么的高大上了。
它的核心概念其实:编程语言的编程语言。
这听起来很抽象,但理解起来并不复杂,意思就是:我们通过一些编程语法来生成编程语言本身。
比如C++中的模板,不就是通过模板这一语言来生成的C++代码本身吗?
二、用途
不过本文也只是见到介绍一下元编程的概念与用途,并不会介绍某种语言是如何去实现元编程。
它的第一个、也是最常见的用途,便是生成代码。
以C++中的模板举例:
template<typename T>
T fun(T a,T b){
return a+b;
}
上面的代码就是一个用来生成代码的代码。它本身并不会被C++编译器编译进最终的可执行文件中。
只要你填入相关的类型:
fun<int>(10,20);
fun<double>(1.1,2.2);
那么编译器就会根据上面的模板为我们生成相应的两份代码:
int fun(int a,int b){
return a+b;
}
double fun(double a,double b){
return a+b;
}
通过这种方式可以减少我们程序员的工作量,自然也就降低了出错的风险。
除此之外还有反射,不过C++目前似乎并不支持,它在Java中是一个很常见的概念,其用途是运行程序在运行是过程中来检查某个对象的字段、方法等等,这同样用到了元编程的概念。
然后还有元数据,C++可能体会不到,但在rust中你却能够体会的很真切:在代码中写的注释信息,可以直接被编译成文档、测试用例,可用于代码分析等等领域。
还有一些语言中出现的注解,也可以被认为是元编程的一种用途,比如rust可以在函数前面写一些配置信息,控制其在指定平台进行编译。
python、java可以通过一些配置信息,来控制函数、类的实现,如果你写的代码不符合该注解信息的规范,编译器就会直接报错之类的。