【问题标题】:Language to learn metaprogramming [closed]学习元编程的语言[关闭]
【发布时间】:2011-02-22 08:33:43
【问题描述】:

在您看来,学习和使用元编程最好的语言是什么(就简单性、可读性和代码优雅而言)?

我认为元编程是“编码的未来”。并不是说代码会消失,但我们可以看到这种情况会出现在新技术上。

【问题讨论】:

  • 您可能希望将此作为社区 wiki 问题,以避免在主观和争论的基础上结束。
  • 现在是社区维基。
  • +1 好问题。真的很遗憾这被关闭了,因为关于这个主题有很多话要说。 Lisp (1960) 是所有元编程语言之母。 Scheme 是一个易于学习的 Lisp。 MetaLanguage(ML,1970 年代)系列语言专为元编程而设计,现代衍生产品(OCaml、Haskell、F#)对它有很好的支持。查看可让您以 .NET 和 LLVM 等虚拟机为目标的语言。正则表达式是元编程有用性的一个引人注目的实际示例。
  • @JonHarrop :我很少遇到任何关于 Haskell 或 F# 元编程的(好的/广泛的)文章。大多数情况下,它实际上是在谈论 notcool Template Haskell 是如何(完全没有关于 F# 中的 MP):/
  • @Noein:我在 F# youtu.be/WI9bNWzTkxs 做了一个关于元编程的讲座,网上有几十个用 F# 编写的元程序示例 blogs.msdn.com/b/ashleyf/archive/2010/09/24/fscheme-0-0-0.aspx gist.github.com/markusl/1140246 codegoeshere.blogspot.co.uk/2009/03/… 等。

标签: programming-languages metaprogramming


【解决方案1】:

首先——我不同意你关于“元编程是‘编码的未来’”的说法。这是一个很棒的工具,但并不是每个人都喜欢它(例如,Java 设计者有意将宏从语言中排除了——不是我喜欢 Java,但人们确实有理由反对元编程)。

无论如何... 我可以想到两种不同的元编程方式:在语法层面和在运行时。

对于语法元编程,我认为 Scheme 是一个不错的选择(如果您没有提到简单性等,我建议使用 Common Lisp)。 对于运行时元编程,我想 Prolog 和 Smalltalk 都非常有趣。 (您可以动态添加、更改和删除事实到 Prolog 数据库;并且您可以动态更改 Smalltalk 对象)。你可能也可以在 Ruby 中进行运行时元编程,但我不懂 Ruby。

所以——Scheme 中有几种不同的元编程方法(不同的宏系统)。我建议你看一些基本的 Scheme 书籍,然后再阅读两个不同的宏系统。

一些不错的 Scheme 书籍:

Scheme 实现彼此之间非常不同,因此您也将大量使用您的 Scheme 实现手册。

了解 Scheme 宏的一些地方:

如果您决定使用比 Scheme 更大、更混乱的语言,请尝试 Common Lisp。推荐三本书:

  • 首先,Peter seibel 的“Practical Common Lisp”。这将使您开始使用 Common Lisp 和宏;
  • 第二个,“On Lisp”,作者 Paul Graham。然后,您将了解到宏比您之前想象的更强大,并且会学到非常好的技术;
  • 第三,Doug Hoyte 的“Let Over Lambda”。一本高级书籍,最好在 Graham 的 On Lisp 之后阅读。

对于 Prolog,您可以阅读 Clocksin 和 Mellish 的“Prolog 编程”(获取最新版本!),然后继续阅读 Covington、Vellino 和 Nute 的“Prolog 深度编程”。见第 6 章。

有很多不错的 Smalltalk 书籍。我喜欢 Simon Lewis 的“The Art and Science of Smalltalk”。 还有一个关于 Smalltalk 的非常好的 free tutorial/primer by Canol Gokel(但它并没有教元编程)。

【讨论】:

  • 我喜欢你讨论这个话题的方式。此外,考虑到企业应用程序和概念集、实现和可维护性(在团队中工作),我理解语法元编程技术(如您所描述的)是运行时更好的选择。
  • @Erup:不要使用您的团队现在将使用的语言来研究概念。学习概念以学习概念,使用任何最有帮助的工具,然后在理解概念后选择你的语言。例如,如果您非常擅长模板,则可以在 C++ 中进行元编程,但通过 C++ 学习元编程将是……不平凡的。
  • 感谢@JUST 我的正确意见,学习这些概念是我想要的。当我说“在团队中工作”时,我指的是使用易于使用的技术的想法。所有团队都必须学习!
【解决方案2】:

元编程是什么意思?元编程是一组概念,而不是一种特定的技术。

请参阅this answer,其中我列出了各种概念和相关语言。总结如下:

  • 使用宏进行元编程 --> Lisp
  • 使用 DSL 进行元编程 --> 内部 DSL 有多种语言,外部 DSL 更棘手
  • 反射 --> Smalltalk,Ruby
  • 注解 --> Java
  • 字节码或 AST 转换 --> Groovy

有关详细信息,请参阅完整答案。一般来说,我认为一个好的 OO 多面手是 Ruby。否则,任何类似 Lisp 的软件都可以完成这项工作:它就像你手中的腻子。但这取决于你想做什么......

【讨论】:

  • 思考企业应用程序和概念集,不仅仅是一种技术,而是元编程可以完成的所有事情。我的意思是,使用易于使用和学习的技术。 Ruby 被认为是一个不错的选择。
  • 正如@Jay 所列出的,在我看来,语法元编程技术在企业环境中看起来更好。在运行时进行操作有时是不合适的(比如 Ruby?)。
【解决方案3】:

Lisp 几乎是各种元编程技术的首选语言。在可用的现代 Lisp 中,我会推荐 Clojure 作为更易于访问的 Lisp,如果您想要功能强大且立即有用的东西,它可以访问一个非常庞大的库(Java 领域的任何东西)。

对于元编程的其他方法,几乎​​任何函数式语言都可以解决问题。 Haskell 是学习技术和函数式编程的一个不错的选择,但不是我所说的最实用的语言来做实际工作。 Erlang 更实用,但不太适合元编程。 OCaml 是另一种可能的选择,但在实用性方面也受到了一些影响。然而,它在许多方面都比 Haskell 更易于访问。

在脚本语言世界中,Ruby 是一种将元编程作为一种流行技术的语言。它的方法有点像 Lisp,但语法更传统。然而,它缺乏 Lisps 的全部功能和灵活性,但另一方面,除了上面的 Clojure 之外,它还有更直接的实用性。

【讨论】:

    【解决方案4】:

    Ruby 具有非常强大和灵活的元编程功能。

    【讨论】:

    • Ruby 一直被誉为一种元语言,但它没有结构良好的元编程框架——它只是利用了它的动态特性,就像 Python 一样。恕我直言,学习元编程值得回顾元类和自反语言,即使常见做法是使用基于散列的动态语言。
    【解决方案5】:

    我推荐几种学习元编程的语言。

    第一个是Prolog。 Prolog 程序是一个数据库。 Prolog“代码”,即子句,是数据的一部分。该程序可以读取它们,包括它们的内容。它还可以生成新代码作为数据结构并对其进行断言,从而在运行时改变自身。所有这些都没有使用术语扩展,这是 Prolog 的智能宏系统。一些 Prolog AI 书籍首先在 Prolog 中实现元解释器,然后根据需要对其进行更改。

    第二个是,如前所述,Lisp,尤其是 CLOS(通用列表对象系统),其中包括用于元 OOP 的命令。

    最后,Python 为运行时元编程提供了一种不错且不太晦涩的机制,即元类(创建类的类)。

    【讨论】:

      【解决方案6】:

      我很惊讶没有人提到机器学习。 ML 代表元语言。所以...是的... CaML 是一个标准实现。 (OCaML,我正确的 OPINIO 提到的是 CaML 的 OO 版本,它可能添加了使元编程不那么明显的功能......)

      除此之外,我是 Scheme 的忠实拥护者,但几乎任何函数式编程语言都适用于此...总是有 Little Lisper,呃,对不起,Little Schemer...

      【讨论】:

      • 使用 OCaml 编程的人往往会非常非常快地放弃 O 部分,只留下 Caml。我认为任何认真的 OCaml 程序员都不会以任何频率使用它的面向对象部分。
      【解决方案7】:

      不知道我们是否对“元编程”有相同的定义,但肯定没有一种最好的语言可以学习。我建议您更深入地了解函数式编程。选择哪种语言取决于您的背景和工作环境。目前我会选择 F#,但 Haskel 应该也是一个不错的选择。

      干杯, 阿奇姆

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 2013-10-21
        • 2011-10-01
        • 2013-01-24
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        相关资源
        最近更新 更多