【问题标题】:Does CodenameOne support other JVM languages besides Java?CodenameOne 是否支持除 Java 之外的其他 JVM 语言?
【发布时间】:2016-04-02 20:09:55
【问题描述】:

CodenameOne 支持将 Java 代码编译为原生 iOS 二进制文件。它是否支持其他基于 JVM 的语言,例如 Clojure 或 Jruby ?

【问题讨论】:

  • 嗯,来自您提供的链接:“[..] 将 Java 字节码转换为 C 代码。”我假设它们的意思是 JVM 字节码,这反过来意味着它支持所有编译成字节码的语言。虽然我不确定如何处理运行时编译(clojure)之类的事情。既然它是开源的:你为什么不试试呢? (注意:我完全没有关于代号的经验)
  • Ivar,@DanielJour,预编译 Clojure 并不难,例如在 Leiningen project.clj 文件中使用 Leiningen 的 uberjar 参数和 :aot 选项。然而,在很快浏览了链接页面和其他一些页面后,如果在 CodenameOne 中使用大量惯用的 Clojure 代码很容易,我会感到惊讶。如果您使用 Clojure 的 Java 互操作功能来生成 Java 类,它可能会相当容易地工作(尽管完全使用 Clojure 的 Java 互操作并不总是那么容易)。
  • @Mars 我知道,我更多的是考虑 REPL 中的交互式开发。从下面的答案我猜这将很难实现(见*warn-on-reflection*
  • 对于 REPL,您可以编写避免反射的代码,同时提供与 REPL 的已知“固定”子集类似的功能。例如。如果语言 X 支持函数调用 A、B 和 C,你可以有一个调用 A、B 和 C (等)的大字符串 switch case。这段特定的代码可以作为构建过程的一部分动态生成。请注意,也可以更改 VM 本身以支持反射,如果存在这样的好补丁,我们可能会接受它。它应该很容易添加。

标签: ios clojure jvm jruby codenameone


【解决方案1】:

不是开箱即用,但确实有可能。过去 Steve ported Mirah 是在 Codename One 上运行的 Ruby 子集。这是我们使用旧虚拟机但也应该与新虚拟机一起使用的时候。

不久前,一位社区成员也可以移植 Haxe,但我不确定它在哪里结束。

移植 JVM 语言时的主要争论点是 Codename One 不支持反射,因此生成反射代码的鸭子类型语言实现将是“有问题的”。

避免反射的原因很简单,代码大小会大幅增长,从而抵消了较小的手工编码 VM 的许多优势。在 AOT 环境中优化反射代码也相当困难,因此与 JIT 相比,它的性能会很差。

很多反射的使用可以提前被字节码操作取代,这样 VM 可以像标准 Java 代码一样工作,即使它不是。

我们通常喜欢在 Codename One 之上运行其他语言的想法,并希望在您遇到问题时提供帮助。我们自己不在这些事情上投入时间的主要原因是为了保持专注。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多