【问题标题】:Translate JavaScript (d3) to Java将 JavaScript (d3) 翻译成 Java
【发布时间】:2013-11-22 08:29:04
【问题描述】:

是的,我知道,除了名称之外它们没有任何共同点 :-) 今天我在 JavaFX webengine 服务器环境中使用 d3。这很好用,但我对性能以及将对象转换为 JSObject 并返回并不满意。长话短说,我正在考虑移植 d3 以在 Java 中使用。

由于 JavaScript 使用 lambda 和 clojures,我不确定是否应该使用“中间件”——即将 JavaScript 转换为 Scala 并在我现有的 Java 应用程序中使用 Scale 类。由于我不熟悉 Java 8、Scala、Clojure 和 Groovy,所以我希望您问一下这是否会使移植更容易。哪一个是最好的选择——在相似的句法特征的意义上。

您认为像 d3 这样的项目需要付出什么努力?我预计 5 天左右会有结果。

【问题讨论】:

    标签: scala groovy clojure java-8


    【解决方案1】:

    Groovy 虽然可以选择statically compiled,但默认情况下是动态的,具有熟悉的括号语法。在这三者中,我认为 Groovy 与 Javascript 最相似。 Groovy 的元编程类似于 Javascript 的原型,Groovy 有 lambdas/closures。

    我不是 Javascript 大师,但是这个 JS 代码:

    function Person(personName) {
      var name = personName;
      this.getName = function() {
        return name;
      }
    }
    
    Person.prototype.upperName = function() {
      return this.getName().toUpperCase();
    }
    
    var person = new Person("john doe");
    
    console.log(person.upperName()); // prints JOHN DOE
    

    可以使用元编程、metaClass 和闭包在 Groovy 中编写:

    class Person {
      String name
    }
    
    Person.metaClass.upperName = {
      delegate.name.toUpperCase()
    }
    
    def person = new Person(name: "john doe")
    
    println person.upperName() // prints JOHN DOE
    

    【讨论】:

    • 我会接受这个作为正确答案,因为这最适合这个问题。但我会试试 c2,所以我赞成这个。
    【解决方案2】:

    我所有的建议都是从 clojure 的角度使用,据我所知你可以使用:

    • C2,“Clojure(Script) 中的声明性数据可视化”(它具有与 D3 类似的功能,但使用 Clojure Thinking 完成)。
    • Quil, "混合 processing.org 和 clojure"
    • Strokes: "让我们假设 d3 是用 ClojureScript 编写的"

    注意:ClojureScript 是针对 javascript 的 clojure,所以我认为 C2 和 Quil 是更好的选择,尽管 Strokes 更类似于用 clojure 编写的 D3

    【讨论】:

    • 非常感谢 C2 的提示,这看起来很有希望!
    • 很高兴听到这个消息,我也喜欢 C2,但我记得 C2 并非旨在支持 D3 那样的动画
    • 我会接受 groovy 作为正确答案,因为这最适合这个问题。但我会试试 c2,所以我赞成这个。
    【解决方案3】:

    您是否尝试过使用 Java 8/Nashorn?据说它比基于 Rhino 的实现快几倍。

    来自 Twitter 的 Sam Pullara 出面描述 它是多么的轻松 是让 Mustache.js 启动并运行(比 Rhino 高 20 倍),以及,John 来自 NetBeans 的 Ceccarelli 出面描述了 Nashorn 成为 Netbeans 不可或缺的一部分。 [Nashorn Blog]

    【讨论】:

    • 遗憾的是,Rhino / Nashorn 缺少 dom 实现,因此您必须使用类似 env.js 的东西,它已经过时了。或者重写整个事情并共享 Java 对象。这是我以前做过的,但不是很酷,也很难调试。
    • @KIC 对于 Rhino 和 Nashorn,您在 JavaFX 2 中都有 WebKit (WebView),因此您不需要模拟浏览器。事实上,我现在正在编写一个 AngularJS 桌面应用程序,它在 WebView 中运行。一个从 Java 调用 JS 的简单演示(反之亦然,在某些情况下,您需要将对象序列化为 JSON,因为它目前在 Java 8 中存在问题):demo
    • 请看我的问题,这正是我今天正在做的事情。
    • 是的,只是以为您在使用 Rhino 并且不知道 Nashorn 加速。
    【解决方案4】:

    如果您想在 JVM 上使用 javascript:Rhino

    Javascript 是动态类型的(并且有点弱类型)。 Clojure 在这方面大致相似,并且具有相当相似的概念,但是语法、控制结构和库 api 不同,因此会涉及一些工作。

    转换为 Scala / Java 8 可能需要更长的时间(如果您有复杂的逻辑和数据结构),因为它们是静态类型的强类型语言。尽管 java 确实具有与 JS 语言语法非常相似的优势。

    【讨论】:

    • 谢谢,在开始使用 JavaFX 之前我已经尝试过 Rhino,但并没有真正成功。