首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >元编程有什么用?

元编程有什么用?
EN

Stack Overflow用户
提问于 2010-08-12 13:40:23
回答 10查看 19.6K关注 0票数 77

我读过:

  • 维基百科
  • 代码生成与元编程
  • 元编程艺术
  • 元编程: c2.com

我承认在元编程/代码生成背后的目的有些混乱。

有谁有使用元编程/代码生成的具体例子吗?更好的解释是,为什么它比另一种选择更好。

编辑蒂索会被视为元编程吗?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-08-12 13:56:26

想象一个制造汽车的家伙。说这和使用电脑是一样的。

在某种程度上,他意识到他总是在做同样的事情,或多或少。

所以他建了工厂来制造汽车,而且情况要好得多。他现在在编程!

然而,在某种程度上,他再次意识到自己总是在做同样的事情。

现在他决定建造制造汽车的工厂。那是元编程。

元编程功能非常强大,但是系统中的一个故障使得所有的优势都变成了巨大的困难。所以掌握它并使用它..。或者离我远点!

票数 120
EN

Stack Overflow用户

发布于 2010-08-12 15:24:26

我认为元编程是“编写(或修改)其他程序的程序”。(另一个答案是“制造工厂的工厂”,很好的比喻)。

人们发现它的各种用途:定制应用程序,生成样板代码,为特殊情况优化程序,实现DSL,插入代码来处理正交设计问题(“方面”)。

值得注意的是,已经发明了许多不同的机制来实现这一点:文本模板、宏、预处理条件、泛型、C++-模板、方面、反射、.通常,这些机制中的一些是以某些语言构建的,而另一些机制则构建为其他语言,而大多数语言根本就没有元编程支持。这种分散分布的功能意味着您可能能够在一种语言中进行某种类型的元编程,但有局限性,但无法在另一种语言中执行这些类型的编程。这是令人恼火的:-}

我一直在关注的一个观察是,我们可以构建通用的元编程机器,它可以与任何形式的程序变换语言一起工作。程序转换是一种参数化模式:“如果您看到此语法,请用该语法替换它”。

一个转换本身通常并不令人印象深刻,但几十个或数百个可以对代码进行引人注目的更改。因为(复杂的)程序转换实际上可以模拟图灵机器,它们可以执行任意代码更改,包括所有你发现散乱的技术。

接受语言定义的工具。语言特定的转换和生成另一个用于应用这些转换的转换是元元编程工具:一个编写“编写程序的程序”的程序。

其价值在于,您可以应用这种工具对任意代码进行各种各样的更改。而且,你不需要语言设计委员会来意识到你想要一种特殊的元编程支持,赶快提供它,这样你就可以继续你今天的工作了。

一个有趣的教训是,这类机器需要强大的程序分析(符号表、控制和数据流分析等)。支持帮助它专注于代码中的问题所在,这样元编程机器就可以在这一点上做一些事情(这方面的一个非常弱的例子是点切规范,即“在类似这样的地方进行更改”)。

OP要求提供元编程应用的具体示例。我们使用了"meta"-metaprogramming工具(DMS软件重组工具包)在大型代码基础上自动执行以下活动:

  • 语言迁移
  • 实现测试覆盖率和分析器
  • 克隆检测的实现
  • 大规模建筑再造
  • 工厂控制代码生成
  • 嵌入式网络控制器的SOAization
  • 大型机软件体系结构提取
  • 阵列计算中矢量SIMD指令的生成
  • 代码的逆向工程回到概念

跨多种语言,包括Java,C#,C++,PHP,.

“任择议定书”还问,“为什么这比其他办法要好呢?”答案与规模、时间和准确性有关。

对于大型应用程序来说,代码库的庞大意味着您没有足够的资源或时间手工进行这样的分析或更改。

对于代码生成或优化任务,您可能可以手工完成,但是工具可以更快、更准确地完成。

从本质上讲,这些工具做的是人类根本无法做到的事情。

值得注意的是,这些工具没有创造性;您仍然需要人类来决定让他们做什么,例如,决定任务是什么(示例见上面的列表),并确定如何定义分析/转换以达到效果。你还需要元程序员。然而,当一个元程序员使用正确的知识支持这样一个工具时,生成的代码似乎是由一个令人难以置信的快速、创造性的专家编码器构建的。

票数 22
EN

Stack Overflow用户

发布于 2010-08-12 13:53:46

我最近(过去的6个月)代码生成的具体示例:

  1. 我有一个SQL脚本,它生成并执行其他SQL脚本。生成脚本对一些具有时间戳字段的表运行查询,当我设计脚本时,不可能知道要选择哪个时间窗口。因此,主脚本完成了它的工作,并确定了子脚本中需要的时间范围。然后,通过将它们的代码写入文件(并用占位符代替实际的开始和结束时间)来生成下标。最后,它执行下标。现在,我已经在一些情况下使用了这个技巧(虽然通常比这个复杂),在这种情况下,子步骤的结构依赖于前面步骤的结果。
  2. 我曾经在数据库中得到一个从XSD到表列的电子表格映射元素。可以使用宏和VBA从电子表格生成XSL片段和完成查询。这些片段和查询被复制并粘贴到执行它们并处理结果的系统中(大多数情况下没有任何需要更改)。这不是一个很好的解决方案,但它确实使一项非常乏味的工作变得不那么乏味了,而且所产生的代码可能比我用一周或两周的时间手工编写的代码看起来更加一致。

因此,元编程示例列表:您在C++中看到的最酷的元编程示例是什么?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3468246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档