【问题标题】:Are there real world applications that use metaprogramming?是否存在使用元编程的现实世界应用程序?
【发布时间】:2023-03-27 08:09:01
【问题描述】:

我们都知道元编程是代码 == 数据(或编写程序的程序)的概念。

但是有没有使用它的应用程序以及使用它的优点是什么?

这个问题可以关闭,但我没有看到任何相关问题。

【问题讨论】:

    标签: metaprogramming


    【解决方案1】:

    IDE 充满了元编程:

    • 代码完成
    • 代码生成
    • 自动重构

    元编程通常用于解决 Java 的局限性:

    • 代码生成以解决冗长问题(例如 getter/setter)
    • 代码生成以解决复杂性(例如,从 WYSIWIG 编辑器生成 Swing 代码)
    • 编译时间/加载时间/运行时字节码重写以解决缺少的功能(AOP、Kilim)
    • 根据注解生成代码(Hibernate)

    框架是另一个例子:

    • 在 Ruby on Rails 中生成模型、视图、控制器、助手、测试套件
    • 在 Ruby on Rails 中生成生成器(元循环元编程 FTW!)

    在 Ruby 中,如果没有元编程,您几乎什么都做不了。即使只是简单地定义一个方法,实际上也是在运行生成代码的代码。

    即使您只有一个简单的 shell 脚本来设置您的基本项目结构,这也是元编程。

    【讨论】:

    • 非常好,Office 中的宏也算元编程吗?
    【解决方案2】:

    由于作为数据的代码是 Lisp 的关键概念之一,最好的办法是看到用这些编写的项目的实际应用。

    this link 上,您可以看到一篇关于真实世界应用程序的文章,该应用程序部分使用 Clojure(一种 Lisp 方言)编写。

    事情不是写程序来编写程序,只是因为你可以,而是在真正需要时为你的语言添加新功能。试想一下,如果您可以简单地将 new 关键字添加到 Java 或 C#...

    【讨论】:

    • 我明白,但是我看到一个 ruby​​ 人在日志文件中保存了一些 ruby​​ 代码,然后再次执行它,他解释说他将使用这种方法来构建音乐生成器应用程序或其他东西,所以我开始想知道元编程可以在哪里使用或在现实生活中的应用程序中使用
    • 如果您曾经在现实生活中的应用程序中使用过反射,那么您就进行了元编程。您所说的可能是代码生成。它只是元编程技术之一,并不是最好的(尽管它可能非常适合音乐生成器的特定问题)
    • “最好的”一个?这些只是操纵代码的技术。没有“最好”。为正确的工作使用正确的工具。
    • @Ira:我的立场是正确的。我应该写的,而不是总是最好的。
    【解决方案3】:

    如果您以独立于语言的方式实现元编程,您将获得一个程序分析和转换系统。这正是将(任意)程序视为数据的工具。这些可用于对任意程序进行任意转换。

    这也意味着您不受编译器人员碰巧放入您的语言中的特定元编程功能的限制。例如,虽然 C++ 有模板,但它没有“反射”。但是即使基础语言没有,程序转换系统也可以提供反射。特别是,拥有程序转换引擎意味着永远不必说“对不起,你的语言不支持元编程(很好),所以除了手动编写代码之外我无能为力”

    请参阅我们的DMS Software Reengineering Toolkit,了解此类程序转换系统。它已被用于构建测试覆盖率和分析工具、代码生成工具、重塑大型 C++ 应用程序架构的工具、将应用程序从一种语言迁移到另一种语言的工具……这一切都非常实用。使用 DMS 完成的大多数任务,手工完成是完全不切实际的。

    【讨论】:

      【解决方案4】:

      不是真实世界的应用程序,而是关于 ruby​​ 元编程的讨论:

      Google TechTalks 2006 年 8 月 3 日 Code Generation in Action(Manning,2003 年 7 月)一书的作者 Jack Herrington 将讨论使用 Ruby 的代码生成技术。他将在一次关于 Ruby 作为一种工具的位置以及它的发展方向的对话中介绍自己动手和现成的解决方案。

      一个真实的例子是 Django 的模型元类。它是类的类,模型从该类继承并负责为模型实例配备所有属性和方法。

      【讨论】:

      • 我知道 ruby​​ 具有元编程能力,而且 C# Compiler as a service 将向语言添加元编程,但我真的认为它在现实世界的应用程序中使用
      【解决方案5】:

      动态语言中的任何 ORM 都是实际元编程的即时示例。例如。看看 SQLAlchemy 或 Django 的 ORM 如何在运行时动态地为它在数据库中发现的表创建类。

      Java 世界中使用@annotations 来修改类行为的 ORM 和其他工具也会进行一些元编程。

      【讨论】:

        【解决方案6】:

        C++ 元编程允许您编写将在编译时转换的代码。

        我知道一些很好的例子(谷歌):

        • Blitz++,一个用于编写高效代码操作数组的库
        • 英特尔阵列构建模块
        • CGAL
        • Boost::spirit, Boost::graph

        【讨论】:

          【解决方案7】:

          许多编译器和解释器在内部使用元编程技术实现 - 作为代码重写通道链。

          已经提到了 ORM、项目模板、IDE 中的 GUI 代码生成。

          领域特定语言被广泛使用,实现它们的最佳方式是使用元编程。

          像 Autoconf 这样的东西显然是元编程的例子。

          实际上,人们不太可能找到不会从一种或另一种形式的元编程中受益的软件开发领域。

          【讨论】:

            猜你喜欢
            • 2011-04-05
            • 1970-01-01
            • 1970-01-01
            • 2020-11-05
            • 2011-07-03
            • 1970-01-01
            • 1970-01-01
            • 2011-11-14
            • 1970-01-01
            相关资源
            最近更新 更多