интеграция с Scala - PullRequest
       24

интеграция с Scala

8 голосов
/ 09 июня 2011

Я хотел бы перенести часть своего кода scala на c и вызвать этот перенесенный код из моего текущего проекта.Но я не нашел никакой документации о том, как это сделать.Было бы замечательно, если бы это было возможно только из sbt, потому что это моя текущая система сборки.

В настоящее время я слышал о SNA, но без документации

Я не ищу автоматического скалас компилятором или чем-то в этом роде.Я просто не знаю, как написать интерфейс между Scala и C

Ответы [ 3 ]

18 голосов
/ 10 июня 2011

Я сомневаюсь, что вы найдете sbt-only решение для компиляции C-кода.Даже если бы вы нашли плагин sbt, который компилировал код на C, я был бы очень удивлен, если бы он сделал это хорошо.Компиляция собственных библиотек слишком сильно отличается от компиляции Scala.

Для компиляции вашей библиотеки C или C ++ я рекомендую CMake или Automake .Ни то, ни другое не является идеальным, но оба хорошо справляются с задачей, позволяя вам в основном объявить «скомпилировать эти .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))
    }
  }
}

Кстати, забавно, что вы упомянули, что не хотите, чтобы ScalaC компилятор.Была опубликована недавняя статья о компиляции Scala для LLVM, которая в значительной степени имела бы тот же эффект, что и компилятор Scala to C.

13 голосов
/ 09 июня 2011

Scala и C - это принципиально разные языки программирования.Вы не можете ожидать автоматического преобразования из Scala в C.

Если вы хотите вызывать Scala-код из кода C или наоборот, вам следует использовать собственный интерфейс Java (JNI) ,В этом случае у вас будет запущенная JVM, выполняющая ваш код Scala, и эта JVM загрузит ваш код C как динамическую собственную библиотеку и позволит ему взаимодействовать с вашим кодом Java / Scala через JNI.Это не легко или просто, хотя;Вы должны много читать и пробовать.

0 голосов
/ 09 июня 2011

Насколько я знаю, в настоящее время нет способа экспортировать код scala в C. Но вы можете написать это самостоятельно;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...