【问题标题】:scala c integrationscala c集成
【发布时间】:2011-06-10 12:57:36
【问题描述】:

我想将我的一些 scala 代码移植到 c 并从我当前的项目中调用这个移植的代码。但我没有找到任何关于如何做到这一点的文档。如果仅从 sbt 就可以实现,那就太好了,因为那是我当前的构建系统。

目前我听说过 SNA,但没有文档

我不是在寻找自动 scala 到 c 编译器或类似的东西。只是不知道scala和c的接口怎么写

【问题讨论】:

  • 所以你想从 c 调用 scala 代码还是从 scala 调用 c 代码?
  • 就我而言,我想我回答了你的问题。另外两个人也这样做了,但是您没有将其中任何一个标记为答案。这很奇怪。

标签: c scala sbt


【解决方案1】:

我怀疑您是否会找到一个仅用于编译 C 代码的 sbt 解决方案。即使你找到了一个编译 C 代码的 sbt 插件,如果它做得好,我也会感到非常惊讶。与编译 Scala 相比,编译原生库实在是太不一样了。

为了编译你的 C 或 C++ 库,我推荐CMakeAutomake。两者都不是完美的,但两者都很好地允许您基本上声明“将这些 .c 或 .cpp 文件编译为 .so”。 Automake 在开源项目中更受欢迎,但 CMake 更简单一些。如果需要,CMake 还对在 Windows 上编译提供了良好的支持。

要从 Scala 访问您的本机库,我建议使用 JNA。它允许您从任何 JVM 语言(包括 Scala)访问本机代码。而且它不需要JNI 所需的粘合层或代码生成。

我已将 the JNA example 从 Java 移植到 Scala。有几点需要注意。

  1. Java 可变参数不同于 Scala 可变参数。如果要调用可变参数 C 函数,则必须用 Java 而不是 Scala 编写接口。但是您将完全像使用 Scala 编写的那样使用该接口。
    • 我希望示例严格保留在 Scala 中,因此我在示例中使用 puts 而不是 printf
  2. 我几乎做了一个直接的端口。您可能想为 Scala 风格做一些事情。

还有代码:

import com.sun.jna.{Library, Native, Platform}

trait CLibrary extends Library {
  def puts(s: String)
}

object CLibrary {
  def Instance = Native.loadLibrary(
    if (Platform.isWindows) "msvcrt" else "c",
    classOf[CLibrary]).asInstanceOf[CLibrary]
}

object HelloWorld {
  def main(args: Array[String]) {
    CLibrary.Instance.puts("Hello, World");
    for ((arg, i) <- args.zipWithIndex) {
      CLibrary.Instance.puts(
        "Argument %d: %s".format(i.asInstanceOf[AnyRef], arg))
    }
  }
}

顺便说一句,您特别提到不想要 Scala 到 C 编译器,这很有趣。有一个 recent paper 发布了关于将 Scala 编译为 LLVM,这与 Scala 到 C 编译器的效果大致相同。

【讨论】:

  • 我接受您的回答是正确的。但我对解决方案不太满意。我希望有一些与 java/java 应用程序的交付方式更好地集成的东西。编译绑定它们的不同目标然后在应用程序启动时加载正确的版本是我希望获得一些自动化的。我认为 SBT 和 CMake 是两个极其复杂的野兽,它们互相咬。
【解决方案2】:

Scala 和 C 是根本不同的编程语言。你不能指望有一个从 Scala 到 C 的自动转换器。

如果你想从 C 代码调用 Scala 代码,反之亦然,你应该使用Java Native Interface (JNI)。在这种情况下,您将有一个正在运行的 JVM 执行您的 Scala 代码,并且该 JVM 会将您的 C 代码作为动态本地库加载,并允许它通过 JNI 与您的 Java/Scala 代码交互。但这并不容易或直截了当。你必须阅读和尝试很多。

【讨论】:

    【解决方案3】:

    据我所知,目前无法将 scala 代码导出到 C。但您可以自己编写;)

    【讨论】:

    • 我知道有一个项目可以在 LLVM 上运行 scala。这可能是未来的一种可能性......
    猜你喜欢
    • 2013-07-28
    • 2015-01-31
    • 2011-10-21
    • 2023-03-12
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多