Может ли JSweet эффективно переносить библиотеки Java для использования в кросс-сборных проектах Scala.js? - PullRequest
0 голосов
/ 26 июня 2018

В поисках способов сделать библиотеки Java доступными для сторон JavaScript и JVM в Scala.js кросс-построенных проектов, пожалуйста, рассмотрите следующий эксперимент:

Представьте, чтоПроект Scala.js нуждается в расширенных математических возможностях, таких как Разложение по сингулярным значениям .Хотя в мире JavaScript есть Numeric.js , а в мире JVM есть много вариантов, JAMA , что немаловажно, среди них, на момент постановки этого вопроса не существовало перекрестного решения Scala.js.

Какие у нас есть варианты?

  1. Пишите заново или переносите библиотеку матриц для Scala.js.
  2. Оберните фасады Numeric.js и JAMA в общий ScalaИнтерфейс .js.
  3. Напишите фасады для Numeric.js, затем скомпилируйте его с помощью Nashorn для поддержки JVM.
  4. Транспортируйте JAMA в JavaScript с помощью JSweet и модные фасады Scala.js.

Этот вопрос отражает вариант 4.

После восстановления JAMA для транспортера JSweet , опубликовав перенесенный JavaScript как Модуль CommonJS через npm и запись фасадов Scala.js для модуля CommonJS, код Scala теперь может обращаться к Jama на стороне JVM и к его порту на стороне JS.

К сожалению,Базовая структура данных на стороне JVM имеет тип: double [] [], Array [Array [Double]] в синтаксисе Scala, но JSweet преобразует его в тип массива JavaScript, js.Array [js.Array [Double]] в ScalaСинтаксис .js.

Теперь, с точки зрения кросс-сборки Scala.js, существуют две идентично названные, эквивалентно функциональные, но совершенно разные и отдельные библиотеки.

Из синтаксиса Scala мы можем построить3D-матрица идентичности на стороне JS выглядит следующим образом:

new Matrix(
  js.Array[js.Array[Double]](
    new js.Array[Double](1.0, 0.0, 0.0),
    new js.Array[Double](0.0, 1.0, 0.0),
    new js.Array[Double](0.0, 0.0, 1.0)
   )
 )

На стороне JVM мы пишем:

new Matrix(
  Array[Array[Double]](
    new Array[Double](1.0, 0.0, 0.0),
    new Array[Double](0.0, 1.0, 0.0),
    new Array[Double](0.0, 0.0, 1.0)
  )
)

Как мы могли бы объединить эти две реализации?

Есть ли хитрость для приравнивания js.Array и Array?

Вы бы предложили совершенно другой подход, чтобы сделать библиотеки Java доступными для кросс-собранных проектов Scala.js?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Рецепт для переноса библиотек Java в Scala.js:

  1. Заготовка исходного кода Java.
  2. Удаление IO и других несовместимых функций JSweet.
  3. Компиляцияэто с JSweet в качестве модуля Node.js.
  4. Вручную сверните файл package.json и опубликуйте вывод транспортера JSweet на npm.
  5. Добавьте ScalaJS-bundler в кросс-скомпилированный проект Scala.js;включите модуль CommonJS из пятого шага.
  6. Включите версию Java в зависимости JVM build.sbt.
  7. Напишите фасад Scala.js для модуля CommonJS.
  8. Напишите оболочку для фасада Scala.js с точным интерфейсом из исходной библиотеки Java.Добавьте любой IO и другие несовместимые функции JSweet, если Scala.js поддерживает это.
0 голосов
/ 26 июня 2018

Позвольте мне начать с простого вопроса:

Есть ли хитрость для приравнивания js.Array и Array?

Нет, такого "трюка" нет,Эти структуры данных принципиально отличаются .Длина js.Array является переменной и может быть исправлена ​​с помощью дополнительных свойств.Array - массив с фиксированной длиной в Java.Если бы был какой-либо способ приравнять их, Scala.js сделал бы это для вас, как это делает для Double и number.

Один относительно простой способ объединить API - это перестроить API JAMA в коде Scala.js, где каждый класс является оберткой для фасадного JS-класса, поступающего из скомпилированной библиотеки JSweet.Это позволяет API-интерфейсу уровня Scala JAMA быть в точности эквивалентным между Scala / JVM и Scala.js.Для репликации API требуется некоторое количество написания кода, но по крайней мере основную часть методов не нужно переписывать.

Совершенно другой подход, очень радикальный и требующий безумного количества человеко-часов, будетразветвите компилятор JSweet для создания файлов Scala.js IR (.sjsir) вместо файлов .js.Таким образом, вы можете связать сгенерированные JSweet файлы .sjsir для JAMA вместе с сгенерированными Scala.js файлами .sjsir для вашего приложения.Это даст максимальную производительность, так как оптимизатор Scala.js сможет оптимизировать через границу приложения / библиотеки.

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