【问题标题】:Functional programming languages introspection函数式编程语言自省
【发布时间】:2010-09-07 17:12:48
【问题描述】:

我正在草拟一些东西的设计(函数的机器学习),它最好需要一种函数式编程语言,以及内省,特别是能够以某种易于处理的格式检查程序自己的代码的能力,最好还有能力让机器生成的代码在运行时编译,我想知道用什么语言编写它最好。Lisp当然具有强大的自省能力,但静态类型语言也有优势;我正在考虑的是:

F# - .Net 平台在这里有一个很好的故事,你可以在运行时读取字节码,也可以发出字节码并编译它;我认为从 F# 访问这些设施没有问题。

Haskell、Ocaml - 它们是否有类似的功能,无论是通过字节码还是解析树?

我还应该研究其他语言吗?

【问题讨论】:

  • 为什么需要自省?
  • 在阅读方面,这是必不可少的,因为预想系统的核心功能是分析人类编写的代码的能力。在编写方面,不是必需的,但很好,因为在机器生成的代码经常运行的情况下,编译它会使其运行得更快。
  • 好问题,我最近一直在想这个问题。我的日常工作是普通的 lisp,我已经做了一些事情来使用自省自动生成 graphviz 调用图,我一直想知道 haskell 是否有足够强大的功能让我做类似的事情。
  • @rwallace:这需要如何自省?
  • Jon:如果一个程序可以分析自己的代码,大多数人会称之为自省;您是否使用其他术语?

标签: haskell f# functional-programming ocaml introspection


【解决方案1】:

Haskell 的自省机制是Template Haskell,它支持编译时元编程,并且当与 e.g. llvm,提供运行时元编程工具。

【讨论】:

    【解决方案2】:

    Ocaml 有:

    • Camlp4 在 Ocaml 中操作 Ocaml 具体语法树。 Camlp4 的维护实现是Camlp5

    • MetaOCaml 用于全面多阶段编程。

    • Ocamljit 在运行时生成本机代码,但我认为它最近没有维护。

    • Ocaml-Java 为 Java 虚拟机编译 Ocaml 代码。不知道有没有很好的反射能力。

    【解决方案3】:

    不是真正的答案,但还要注意 F# Quotations 功能和 library,以获取更多 homoiconicity 内容。

    【讨论】:

      【解决方案4】:

      您可以查看Rackettyped variant(以前称为PLT 方案)。它保留了 Scheme 的大部分语法简单性,但提供了静态类型系统。由于 Racket 是一个 Scheme,因此元编程很适合课程,并且运行时可以通过 a JIT 发出本机代码。

      【讨论】:

        【解决方案5】:

        Haskell 方法更倾向于解析源代码。 Haskell 平台包含一个完整的源代码解析器,或者您可以使用 GHC API 以这种方式访问​​。

        【讨论】:

          【解决方案6】:

          我还会查看 Scala 或 Clojure,它们附带了为 Java 开发的所有库。如果图书馆不存在,您永远不必担心。但更重要的是,这些语言为您提供了与 Java 中相同的反射(或更强大的类型)。

          【讨论】:

            【解决方案7】:

            我正在草拟一些东西的设计(函数的机器学习),它最好需要一种函数式编程语言,以及内省,特别是能够以某种易于处理的格式检查程序自己的代码的能力,最好还有能力让机器生成的代码在运行时编译,我想知道用什么语言编写它最好。Lisp当然具有强大的自省能力,但静态类型语言也有优势;我正在考虑的是:

            你能不能像普通的解释器或编译器那样只解析源代码?为什么需要自省?

            F# - .Net 平台在这里有一个很好的故事,你可以在运行时读取字节码,也可以发出字节码并编译它;我认为从 F# 访问这些设施没有问题。

            F# 具有基本的引用机制,但您只能引用某些表达式而不能引用其他类型的代码,尤其是类型定义。此外,它的评估机制比正版编译慢几个数量级,因此基本上完全没用。您可以使用反射来分析类型定义,但同样,它非常初级。

            您可以读取字节码,但它已被编译,因此丢失了很多信息和结构。

            F# 也有词法分析和解析技术(最著名的是 fslex、fsyacc 和 FParsec),但它不如 OCaml 成熟。

            Haskell、Ocaml - 它们是否有类似的功能,无论是通过字节码还是解析树?

            Haskell 有 Template Haskell,但我从未听说有人使用它(放弃软件?)。

            OCaml 有它的 Camlp4 宏系统,有少数人使用它,但它是 poorly documented

            至于词法分析和解析,Haskell 有一些库(最著名的是 Parsec),OCaml 有 many libraries

            我还应该研究其他语言吗?

            像 Mathematica 这样的术语重写语言将是一个显而易见的选择,因为它们使操作代码变得微不足道。 Pure 语言可能很有趣。

            您还可以考虑使用 MetaOCaml 的运行时编译功能。

            【讨论】:

            • 嗯,是的,我一直希望避免编写自己的解析器和运行时,但事实证明这是必要的,所以我继续这样做。无论如何,感谢您的列表,但赞成。
            • 模板 Haskell 用于 yesod web 平台。我也在一些项目中使用过它。
            猜你喜欢
            • 1970-01-01
            • 2011-08-10
            • 1970-01-01
            • 2013-07-23
            • 2011-04-27
            • 2010-10-25
            • 2017-05-13
            • 1970-01-01
            • 2017-01-14
            相关资源
            最近更新 更多