首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSweet可以明显地移植Scala.js库以供跨构建的Scala.js项目使用吗?

JSweet可以明显地移植Scala.js库以供跨构建的Scala.js项目使用吗?
EN

Stack Overflow用户
提问于 2018-06-26 02:14:20
回答 2查看 352关注 0票数 2

在寻找使JavaScript库对Scala.js 交叉建造项目的交叉建造和JVM都可访问的方法时,请考虑以下实验:

假设Scala.js项目需要高级矩阵数学功能(如奇异值分解 )。虽然JavaScript世界有Numeric.js,而JVM世界有许多选项,但JAMA (尤其是其中的一个选项)在提出这个问题时不存在跨构建Scala.js解决方案。

我们有什么选择?

  1. 为Scala.js重新编写或移植矩阵库。
  2. 将Numeric.js外观和JAMA封装到一个公共的Scala.js接口中。
  3. 为Numeric.js编写外观,然后使用纳什恩编译它以获得JVM支持。
  4. 通过JSweet将JAMA传输到JSweet,并采用适当的Scala.js外观。

这个问题反映了备选案文4。

在修复用于JSweet转发器的JAMA、将已转换的JavaScript发布为通过npm实现CommonJS模块并为CommonJS模块编写Scala.js正面之后,Scala代码现在可以访问JVM端的Jama,并在JS端访问Jama的一个端口。

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

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

通过Scala语法,我们可以在JS端构造3D标识矩阵,如下所示:

代码语言:javascript
复制
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方面,我们编写:

代码语言:javascript
复制
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和数组等同起来的窍门?

您会建议一种完全不同的方法让跨构建的Scala.js项目可以访问Java库吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-26 09:53:09

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

有没有把js.Array和数组等同起来的窍门?

不,没有这样的“诡计”。这些数据结构是从根本上不同的。js.Array的长度是可变的,可以用额外的属性进行修补。Array是Java的固定长度数组。如果有任何方法将它们等同,Scala.js就会这样做,就像对Doublenumber一样。

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

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

票数 2
EN

Stack Overflow用户

发布于 2018-07-01 04:14:59

将Java库移植到Scala.js的方法:

  1. 获取Java源代码。
  2. 去掉IO和其他JSweet不兼容的功能。
  3. 用JSweet作为Node.js模块编译它。
  4. 手动滚动一个package.json文件,并在npm上发布JSweet转换程序输出。
  5. 将添加到交叉编译的Scala.js项目中,包括步骤5中的CommonJS模块。
  6. 将Java包含在build.sbt的JVM依赖项中。
  7. 为Scala.js模块编写一个CommonJS外观。
  8. 使用原始Scala.js库的确切接口为Java编写一个包装器。如果JSweet支持IO和其他不兼容的功能,则添加任何IO和其他不兼容功能。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51033981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档