2011-06-08 93 views
7

我想将我的一些scala代码移植到c中,并从我当前的项目中调用此移植的代码。但是我没有找到任何有关如何做到这一点的文件。如果从sbt开始这将是可能的,那将是非常好的,因为那是我目前的构建系统。scala c集成

目前我已经heared有关SNA,但没有证件

我不是找一个自动斯卡拉C编译器之类的东西。我只是不知道如何编写scala和c之间的接口0

+4

所以你想调用Scala的C或C代码的Scala代码? – 2011-06-08 22:36:04

+0

就我而言,我想我回答了你的问题。另外两个人也这样做了,但你没有把这些标记为答案。真奇怪。 – Madoc 2011-06-17 12:10:32

回答

13

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

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

1

据我所知,目前还没有办法将scala代码导出为C.但是您可以自行编写该代码;)

+0

可能将字节码编译为本地代码。 – ziggystar 2011-06-09 11:41:02

+0

我知道有一个项目在LLVM上运行scala。这可能是未来的可能性... – Fabian 2011-06-10 08:39:00

17

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

对于编译您的C或C++库,我推荐CMakeAutomake。这两个都不是完美的,但都做得很好,允许你基本上声明“将这些.c或.cpp文件编译为.so”。 Automake在开源项目中更受欢迎,但CMake比较简单一些。如果这是必需的,CMake在Windows上编译也有很好的支持。

对于从Scala访问您的本地库,我推荐使用JNA。它允许您从任何JVM语言(包括Scala)访问本机代码。而且它没有JNI所要求的胶合层或代码生成。

我已经从Java移植到斯卡拉the JNA example。有几件事要注意。

  1. Java可变参数与Scala可变参数不同。如果你想调用一个可变参数的C函数,你必须用Java代替Scala编写接口。但是,如果使用Scala编写的话,您将使用该界面。
    • 我想要的例子,在Scala中严格保持,所以在我的例子
  2. 我做了相当多的直线端口使用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编译器的效果基本相同。