我相信我在某些时候读过,由于在Dalvik VM上运行Android,JVM(Clojure,Jython,JRuby等)的动态语言很难在Dalvik上获得良好的性能(因此在Android上).如果我没记错的话,理由是在引擎盖下,为了实现动态类型,对java字节码进行了相当多的调整,并且字节码 - > dalvik转换不会轻易地解决这个问题.
如果我想为Android开发,我应该避免使用动态JVM语言吗?
编辑:我想我应该提供更多的上下文.我正在考虑使用Clojure为Android开发应用程序.我考虑使用Clojure有几个原因:
我想学习FP
我真的不在乎学习Java
Clojure似乎有一些非常有趣的语言概念(例如STM).
但是,当我尝试在Clojure中为Android编写应用程序时,我发现存在一个令人无法接受的性能问题.但是我发现一篇博文说,动态类型语言(例如Clojure)会因为获得动态类型所需的字节码操作而出现问题.所以我有点寻找独立的确认,这是真的,或者不是.我应该知道的最好是假设在这个特定的问题中,所有动态类型的JVM语言都可以被视为相同.我想我确实提出了一个相当广泛的问题所以我想我不应该对人们不太了解我的要求感到惊讶.
我正在开发一个标准的Android应用程序(在java中),但是想在clojure中实现一些非UI"业务逻辑".这样做是否有任何缺点,或者我应该注意哪些问题会使这个想法变得糟糕?
我做了一个简单的测试 - 在Android应用程序的一个简单的clojure库中调用函数,这似乎没有任何明显的问题.
我已经看到关于加载clojure.jar的时间问题的评论,但在我的情况下,clojure没有处理UI.
我不清楚是否还有其他内存或性能问题我应该关注.
2017年1月16日更新
尝试使用一些稍微复杂的clojure库时遇到了一些问题,特别是依赖于core.async的库.
使用标准的clojure 1.8作为依赖,我试图:
new ClassDefinedInClojure()
Run Code Online (Sandbox Code Playgroud)
ClassDefinedInClojure是AOT生成的java类,但我得到了:
java.lang.VerifyError: Rejecting class clojure.core.memoize.RetryingDelay because it failed compile-time verification
Run Code Online (Sandbox Code Playgroud)
我认为这是此处确定的同一问题的结果:
http://dev.clojure.org/jira/browse/CLJ-1472
但是,即使在我使用补丁(http://dev.clojure.org/jira/secure/attachment/15351/clj-1472-2.patch)重建clojure 1.8之后问题仍然存在.
我知道clojure的android特定版本https://github.com/clojure-android/clojure,但老实说不清楚这与正常的clojure有何不同以及为什么需要它.我尝试使用它作为标准clojure库的替代品,但有同样的问题.
关于我原来的问题,这很有用 - http://blog.ndk.io/state-of-coa.html
我计划在Android上进行Peer to Peer照片共享的项目.我的教授希望我使用除Java或C/C++之外的其他语言来做到这一点.是否有任何Erlang,Haskell,Ocaml,Scala,Go有助于构建具有以下功能的Android应用程序?