我想将我的一些scala代码移植到c中,并从我当前的项目中调用此移植的代码。但是我没有找到任何有关如何做到这一点的文件。如果从sbt开始这将是可能的,那将是非常好的,因为那是我目前的构建系统。scala c集成
目前我已经heared有关SNA,但没有证件
我不是找一个自动斯卡拉C编译器之类的东西。我只是不知道如何编写scala和c之间的接口0
我想将我的一些scala代码移植到c中,并从我当前的项目中调用此移植的代码。但是我没有找到任何有关如何做到这一点的文件。如果从sbt开始这将是可能的,那将是非常好的,因为那是我目前的构建系统。scala c集成
目前我已经heared有关SNA,但没有证件
我不是找一个自动斯卡拉C编译器之类的东西。我只是不知道如何编写scala和c之间的接口0
Scala和C是根本不同的编程语言。你不能指望从斯卡拉到C的自动转换器。
如果你想从C代码调用Scala代码或反之亦然,你应该使用Java Native Interface (JNI)。在这种情况下,您将有一个正在运行的JVM执行您的Scala代码,并且JVM会将您的C代码加载为动态本机库,并允许它通过JNI与您的Java/Scala代码进行交互。尽管这并不容易或简单;你必须阅读并尝试很多。
我怀疑你会找到一个仅用于编译C代码的解决方案。即使你找到了一个编译C代码的sbt插件,如果它做得很好,我也会感到惊讶。与编译Scala相比,编译本地库非常不同。
对于编译您的C或C++库,我推荐CMake或Automake。这两个都不是完美的,但都做得很好,允许你基本上声明“将这些.c或.cpp文件编译为.so”。 Automake在开源项目中更受欢迎,但CMake比较简单一些。如果这是必需的,CMake在Windows上编译也有很好的支持。
对于从Scala访问您的本地库,我推荐使用JNA。它允许您从任何JVM语言(包括Scala)访问本机代码。而且它没有JNI所要求的胶合层或代码生成。
我已经从Java移植到斯卡拉the JNA example。有几件事要注意。
puts
代替printf
。你可能想为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编译器。发布了关于将Scala编译为LLVM的recent paper,这与Scala对C编译器的效果基本相同。
所以你想调用Scala的C或C代码的Scala代码? – 2011-06-08 22:36:04
就我而言,我想我回答了你的问题。另外两个人也这样做了,但你没有把这些标记为答案。真奇怪。 – Madoc 2011-06-17 12:10:32