【问题标题】:Commercial usage and integrability of functional languages函数式语言的商业用途和可集成性
【发布时间】:2013-06-11 01:14:56
【问题描述】:

我对函数式语言有浓厚的兴趣,因为它们有很多优点,但我不知道它们是否真的在实践中使用,以及它们可以如何集成到主流的Java、C#或C++环境中。与不了解任何函数式语言的其他程序员一起工作的程序员可以将它与其他语言结合使用吗?当其他人不理解某个团队成员生成的代码时,这是一个问题,但是用 Scala 编写的 Java 字节码可以很容易地反编译为纯 Java。

我知道 Java 和 Clojure 以及 Java 和 Scala 之间的集成效果很好, 但是 C++ 等其他语言呢?

【问题讨论】:

  • 由 scalac 生成的 JVM 字节码可以反编译成 Java,但结果不会像任何可读或可维护的东西。
  • 您需要更具体。 “与其他语言结合”是什么意思?根据您的应用程序领域,有多种方法可以创建同时使用 C++ 和 Clojure 的软件。根据工作流程的设计,C++ 程序员可能不需要了解任何 Clojure。
  • 我的意思是 Scala/Clojure 和 Java 代码都可以编译成一个 .jar,但是 C++ 代码也可以与函数式编程语言的代码一起编译成一个可执行文件吗?在现实世界的项目场景中结合使用函数式语言和 Java 是否真的很丰富,或者可能的劣势超过了可能的收益?谢谢。
  • 对于 Clojure,您可以将 C++ 代码集成到 Java 中,如本教程 javaworld.com/javatips/jw-javatip17.html 中所述。然后使用 Java Interop 从 Clojure 调用这个 Java。

标签: functional-programming jvm-languages


【解决方案1】:

我对函数式语言有浓厚的兴趣,因为它们有很多优点,但我不知道它们是否真的在实践中使用

它们肯定是,尽管不如面向对象或过程语言那么多。

它们与主流 Java、C# 或 C++ 环境的集成程度如何。

“集成到另一个环境中”有三种不同的定义。我在这里按优先顺序列出它们。第一个比最后一个要理智得多。

  1. 一个常见的做法是在前端使用 Java 或 C#,然后在后端使用 Erlang 或 Scala 之类的。这意味着两个不同的团队使用两种不同的语言并做完全不同的事情。集成在产品层面,两个不同的部分通过网络协议或其他方式进行通信。

  2. 第二种集成是关于使用例如Scala 中的 Java 库,这种情况经常发生,即使使用其他语言也是如此。这要求调用语言能够调用库语言中的函数。

  3. 还有“集成”,即同一个团队使用 C++ 和 Scala 处理同一个程序,这既困难又罕见。

与其他不懂任何函数式语言的程序员一起工作的程序员能否将它与其他语言结合使用?

可以吗?当然。应该?当然不。为了使团队合作发挥作用,团队必须就他们所知道的语言达成一致。团队负责审查、帮助记录和修复代码错误,因此他们应该能够阅读代码。

当其他人不理解某个团队成员编写的代码时,这是一个问题,但是用 Scala 编写的 Java 字节码可以很容易地反编译为纯 Java。

不是以一种远程实用的方式阅读。由于 Scala 的工作方式如此不同,它的字节码看起来也很奇怪。

我知道 Java 和 Clojure 以及 Java 和 Scala 之间的集成效果很好,但是 C++ 等其他语言呢?

许多语言都提供 FFI(外来函数接口),这是一种从您的语言调用以其他语言编写的函数的方法。 Haskell 有一个用于 C 代码的 FFI,这意味着您可以将任何 C 库与您的 Haskell 代码一起使用。这取决于语言,很难给出任何一般性的答案。

It is apparently possible to call C/C++ from Java,因此按理说它也应该可以从 Scala 或 Clojure 中实现。

【讨论】:

    【解决方案2】:

    Haskell 有一个相当成熟的C foreign function interface。我只用它来调用 C 库,但反之亦然。

    【讨论】:

      【解决方案3】:

      与不了解任何函数式语言的其他程序员一起工作的程序员能否将它与其他语言结合使用?

      是的。这通常是通过“外部函数接口”实现的。根据您的语言实现,或多或少会支持以您的语言或从其他语言调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 1970-01-01
        相关资源
        最近更新 更多