scala c整合

Arn*_*rne 8 c scala sbt

我想将一些我的scala代码移植到c并从当前项目中调用此移植代码.但我没有找到任何关于如何做到这一点的文件.如果只能从sbt获得这将是很好的,因为这是我当前的构建系统.

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

我不是在寻找自动scala到c编译器或类似的东西.我只是不知道如何编写scala和c之间的接口

lee*_*777 18

我怀疑你会找到一个仅用于编译C代码的解决方案.即使你发现了一个编译C代码的sbt插件,如果它做得很好,我会感到非常惊讶.与编译Scala相比,编译本机库太不一样了.

为了编译C或C++库,我建议使用CMakeAutomake.两者都不是完美的,但两者都很好地允许你基本上声明"将这些.c或.cpp文件编译成.so".Automake在开源项目中更受欢迎,但CMake相当简单.如果这是一个要求,CMake也对Windows上的编译提供了很好的支持.

要从Scala访问本机库,我建议使用JNA.它允许您从任何JVM语言(包括Scala)访问本机代码.它没有胶带层或JNI所需的代码生成.

我已经将JNA示例从Java 移植到Scala.有几点需要注意.

  1. Java varargs与Scala varargs不同.如果要调用可变参数C函数,则必须使用Java而不是Scala编写接口.但是你将使用与在Scala中编写时完全相同的界面.
    • 我希望该示例严格保留在Scala中,因此我使用的是puts代替printf示例
  2. 我做了一个直接的端口.你可能想为Scala-esque做一些事情.

和代码:

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))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你特别提到不想要Scala to C编译器,这很有趣.最近发表了一篇关于将Scala编译为LLVM的论文,它与Scala到C编译器的效果大致相同.


Mad*_*doc 13

Scala和C是根本不同的编程语言.您不能指望从Scala到C的自动转换器.

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