Programming languages 泛型编程与元编程

Programming languages 泛型编程与元编程,programming-languages,metaprogramming,generic-programming,Programming Languages,Metaprogramming,Generic Programming,到底有什么区别?这些术语似乎可以互换使用,但在阅读维基百科中Objective-c的条目时,我发现: 除了C的程序设计风格 程序设计,C++直接支持 面向对象的某些形式 编程、泛型编程和 元编程 C++。显然它们是不同的?泛型编程通常指的是可以处理多种类型的函数。例如,一个排序函数,它可以对可比数据集合进行排序,而不是一个排序函数对整数数组进行排序,另一个排序函数对字符串向量进行排序 元编程是指以编程方式检查、修改或创建类、模块或函数。广义的元编程是指编写生成其他程序的程序。例如,C++中的模

到底有什么区别?这些术语似乎可以互换使用,但在阅读维基百科中Objective-c的条目时,我发现:

除了C的程序设计风格 程序设计,C++直接支持 面向对象的某些形式 编程、泛型编程和 元编程


<参考> C++。显然它们是不同的?

泛型编程通常指的是可以处理多种类型的函数。例如,一个排序函数,它可以对可比数据集合进行排序,而不是一个排序函数对整数数组进行排序,另一个排序函数对字符串向量进行排序


元编程是指以编程方式检查、修改或创建类、模块或函数。

广义的元编程是指编写生成其他程序的程序。例如,C++中的模板只有在实例化时才生成实际代码。可以将模板解释为一个程序,该程序将类型作为输入,并生成实际的函数/类作为输出。预处理器是另一种元编程。另一个虚构的元编程示例:读取XML并根据XML生成一些SQL脚本的程序。同样,一般来说,元程序是生成另一个程序的程序,而泛型编程是关于参数化(通常使用其他类型)类型(包括函数)


在考虑了对该答案的评论后编辑

我大致将元编程定义为“编写程序来编写程序”,将通用编程定义为“使用语言功能来编写函数、类等,这些函数、类根据参数或成员的数据类型进行参数化”


此标准,C++模板对于通用编程(思维>代码>向量<代码>,<代码>列表< /代码>,<代码>排序< /代码>…)和元编程(思维增强和精神)都是有用的。此外,我认为C++中的泛型编程(即编译时多态)是通过元编程(即模板代码生成代码)来完成的。

最好是看其他语言,因为在C++中,一个特性支持泛型编程和元编程。(模板非常强大)

在Scheme/Lisp中,可以更改代码的语法。人们可能知道Scheme是“有很多括号的前缀语言”,但它也有非常强大的元编程技术(Hygenic宏)。特别是,可以创建try/catch,甚至可以对语法进行操作(例如,如果您不想再编写前缀代码,这里有一个前缀到中缀的转换器:)。这是通过元编程实现的,元编程是编写代码的代码。这对于尝试新的编程模式非常有用(AMB操作符在非确定性编程中扮演着重要角色。我希望AMB在未来5年左右将成为主流…)

在Java/C中,可以通过泛型进行泛型编程。您可以编写一个泛型类来支持许多其他类的类型。例如,在Java中,可以使用Vector创建整数向量。或者向量,如果您希望它特定于您自己的类

当事情变得奇怪时,C++模板是为泛型编程设计的。但是,由于一些技巧,C++模板本身就是图灵完成的。使用这些技巧,可以通过元编程向C++语言添加新的特性。这很复杂,但很有效。这里有一个例子,通过模板将多个调度添加到C++。更典型的例子是编译时的斐波那契:

  • 编程:编写一个程序来创建、转换、过滤、聚合和处理数据
  • 元编程:编写一个程序来创建、转换、过滤、聚合和操纵程序
  • 通用编程:编写一个程序,创建、转换、过滤、聚合和以其他方式操作数据,但只对数据结构进行最低限度的假设,从而最大限度地跨各种数据类型重用

在其他几个答案中已经提到,这种区别在C++中可能会混淆,因为泛型编程和(静态/编译时)元编程都是用模板完成的。为了进一步混淆,C++中的泛型编程实际上使用元编程是高效的,即模板专用化从通用的程序生成专门的(快速)程序。 还要注意的是,每个Lisp程序员都知道,代码和数据是同一件事,所以实际上没有“元编程”这样的东西,它只是编程而已。同样,这在C++中有点难以理解,因为实际上你使用两种完全不同的编程语言来编程(C++,一个命令,程序,面向对象语言在C族)和元编程(模板,一个纯粹的功能性的“意外””。语言介于纯lambda演算和Haskell之间,语法难看,因为它实际上从未打算成为一种编程语言。)


许多其他语言在编程和元编程中使用相同的语言(例如Lisp、Template Haskell、Converge、Smalltalk、Newspeak、Ruby、Ioke、Seph)。

通用编程是元代码的一种非常简单的形式,尽管通常不是在运行时。它更像是C语言中的预处理器,在大多数用例和基本实现中,它更多地涉及到模板编程

您会发现,在类型化语言中,您经常会创建一些实现,其中只有类型不同。在Java这样的语言中,这可能特别痛苦,因为每个类和接口都定义了一个新类型

您可以通过将这些类转换为字符串文字,然后用要插值的变量替换类名来生成这些类

在运行时使用泛型的地方,它有点像d