JSweet 能否有效地移植 Java 库以在交叉构建的 Scala.js 项目中使用?

2024-02-08

寻找使 Java 库可供 Scala.js 的 JavaScript 和 JVM 端访问的方法交叉构建 https://www.scala-js.org/doc/project/cross-build.html项目,请考虑以下实验:

想象一下 Scala.js 项目需要高级矩阵数学功能,例如奇异值分解 https://en.wikipedia.org/wiki/Singular-value_decomposition。尽管 JavaScript 世界有数值.js http://www.numericjs.comJVM 世界有很多选择,JAMA https://math.nist.gov/javanumerics/jama/其中最重要的是,在提出这个问题时,不存在跨构建 Scala.js 解决方案。

我们有什么选择?

  1. 为 Scala.js 重新编写或移植一个矩阵库。
  2. 将 Numeric.js 外观和 JAMA 包装到通用 Scala.js 接口中。
  3. 为 Numeric.js 编写外观,然后使用以下命令进行编译Nashorn http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html用于 JVM 支持。
  4. 将 JAMA 转换为 JavaScriptJSweet http://www.jsweet.org/和时尚合适的 Scala.js 外观。

该问题反映了选项 4。

修复后JAMA 的 JSweet 转译器 https://github.com/dragonfly-ai/JamaJS,将转译后的 JavaScript 发布为通过 npm 的 CommonJS 模块 https://www.npmjs.com/package/jama,并写作Scala.js 外观 https://github.com/dragonfly-ai/matrix对于 CommonJS 模块,Scala 代码现在可以在 JVM 端访问 Jama,并在 JS 端访问它的端口。

不幸的是,JVM 端的核心数据结构在 Scala 语法中具有类型:double[][]、Array[Array[Double]],但 JSweet 将其转换为 JavaScript 数组类型,js.Array[js.Array[Double] ] 在 Scala.js 语法中。

现在,从 Scala.js 交叉构建的角度来看,存在两个名称相同、功能相同、但完全不同且独立的库。

根据 Scala 语法,我们可以在 JS 端构造 3D 单位矩阵,如下所示:

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 项目访问?


让我从一个简单的问题开始:

有没有一个技巧可以将 js.Array 和 Array 等同起来?

不,不存在这样的“伎俩”。那些数据结构are根本不同。js.Array的长度是可变的,并且可以使用附加属性进行修补。Array是Java的定长数组。如果有任何方法可以将它们等同起来,Scala.js 会为你做到这一点,就像它所做的那样Double and number.

统一 API 的一种相对简单的方法是重建APIScala.js 代码中的 JAMA,其中每个类都是来自 JSweet 编译库的外观 JS 类的包装器。这使得 JAMA 的 Scala 级 API 在 Scala/JVM 和 Scala.js 之间完全等效。它确实需要编写一些代码来复制 API,但至少不需要重写方法的主体。

一种完全不同的方法,非常激进并且需要大量的工时,即分叉 JSweet 编译器来生成 Scala.js IR (.sjsir) 文件而不是 .js 文件。这样,您就可以将 JSweet 生成的 JAMA .sjsir 文件与 Scala.js 生成的应用程序 .sjsir 文件链接在一起。这将提供最大的性能,因为 Scala.js 优化器将能够跨应用程序/库边界进行优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSweet 能否有效地移植 Java 库以在交叉构建的 Scala.js 项目中使用? 的相关文章

随机推荐