我有兴趣将Scala(或其他一些非Java JVM语言)集成到android平台中.我不是指用Scala编写一个Android应用程序,我早期就做过,但实际上是在构建android平台源代码树的构建过程中.我想这将是一个挂入makefile等问题.有没有人对此有所了解?
到目前为止我所拥有的: 平台源代码树来自git://android.git.kernel.org/platform/manifest.git以其处女形式构建,以"[下载并构建Google Android] [1]"为指导
还剩什么:
看起来我快到了!
过去的一些笔记
最新:我找到了编译Java源文件的位置!在definitions.mk中,请参阅'define transform-java-to-classes.jar'.最新的想法是编写一个transform-scala-to-classes定义,然后将它们存储在直接打包的类中.我将在transform-java-to-classes.jar中的这一步之前调用transform-scala-to-class.对eclipse和cygwin的支持现在将被删除,因为它会使代码混乱,因此会增加失败的可能性.
构建过程由运行build/core/main.mk的根Makefile开始构建/ core/main.mk包括build/core/config.mk,其中包括build/core/combo/javac.mk,它设置HOST_JAVAC,TARGET_JAVAC和COMMON_JAVAC.COMMON_JAVAC是"具有公共参数的Java编译器命令",通过它看,其他两个变量默认获取这些值,除非在特殊环境(openjdk或eclipse)中.COMMON_JAVAC不在此文件之外使用.另外两个仅用于build/core/definitions.mk.
build/core/java_library.mk(由config.mk包含)似乎只关心构建jar.这超出了我们关心的范围.与jar的任何交互预先假定类文件,这些类文件预先假定我们已经成功构建了我们的scala文件.
main.mk中有关于java版本的检查.我们将忽略这些并假设我们的scala版本是兼容的.现在(在combo/scalac.mk中)我使用的是javac.mk中使用的相同的--target arg.这应该存储在一个变量中.
main.mk还包括build/core/definitions.mk,它依次定义了一些有用的函数.我们关心的是all-java-files-under和all-subdir-java-files.后者在Android.mk文件中用于查找java文件.前者用于后者的实施.我会写Scala等价物.
为了弄清楚构建过程是如何工作的,我现在用-n和其他人运行make.我从stackoverflow文章"[用于调试makefile的工具] [2]"中得到了这个想法.我也在研究翻拍调试.
build/core/{config.mk,definitions.mk}告诉我们使用哪些make文件/命令来做什么.
作为在每个项目基础上攻击支持的可能方式,可能会将额外的代码添加到项目的Android.mk文件中.从platform/build/core/build-system.html我们读到"Android.mk是控制给定模块构建的makefile片段的标准名称.只有顶层目录应该有一个名为"Makefile"的文件." 您可以创建一个新目标,如"scala-build",并在最终make之前运行(make PackageName scala-build).也许还可以偷偷地将它隐藏在变量赋值中,从而减少了明确调用目标的需要.
另一种方式(远远更加hackish)是劫持用于javac的命令.这在build/core/combo/javac.mk中设置.您的项目的Android.mk必须包含LOCAL_SRC_FILES中的*.scala文件以及*.java文件.
我们正在开始一个基于大数据的分析项目,我们正在考虑采用scala(类型安全堆栈).我想知道各种scala API /项目可用于做hadoop,map reduce程序.
Scala是一种很棒的语言,但是我想知道如果它有自己的运行时怎么可以改进?
即因为JVM选择而做出的设计选择是什么?
主要问题:我将尾部调用优化(TCO)的最重要应用视为递归调用到循环的转换(在递归调用具有某种形式的情况下).更准确地说,当翻译成机器语言时,这通常会转换成某种跳跃系列.编译为本机代码(例如SBCL)的一些Common Lisp和Scheme编译器可以识别尾递归代码并执行此转换.基于JVM的Lisp(例如Clojure和ABCL)在执行此操作时遇到了麻烦.JVM作为一台可以防止或使其变得困难的机器是什么?我不明白.JVM显然没有循环问题.编译器必须弄清楚如何进行TCO,而不是编译它的机器.
相关问题:Clojure 可以将看似递归的代码转换成循环:如果程序员用关键字替换对函数的尾调用,它就好像它正在执行TCO一样recur.但是,如果有可能让编译器识别尾调用 - 例如SBCL和CCL那样做 - 那么为什么Clojure编译器不能确定它应该按照它处理的方式处理尾调用recur呢?
(对不起 - 这无疑是一个常见问题解答,我确信上面的评论显示了我的无知,但我找不到早期的问题是不成功的.)
在Clojure编程语言中,为什么这段代码会以绚丽的色彩传递?
(let [r (range 1e9)] [(first r) (last r)])
Run Code Online (Sandbox Code Playgroud)
虽然这个失败了:
(let [r (range 1e9)] [(last r) (first r)])
Run Code Online (Sandbox Code Playgroud)
我知道这是关于"失去理智"的建议,但请你解释一下吗?我还没能消化它.
更新:
真的很难找到正确的答案,两个答案是惊人的信息.
注意:代码片段来自"Clojure的喜悦".
functional-programming clojure jvm-languages lazy-evaluation
在Scala中,我可以像这样声明一个对象:
class Thing
object Thingy extends Thing
Run Code Online (Sandbox Code Playgroud)
我如何"Thingy"在Scala中获取(对象的名称)?
我听说Lift(Scala的Web框架)能够做到这一点.
I have a simple language that I am trying to write a compiler for (yes it is homework) to compile a simple language I shall describe if necessary to java vm code.
It currently works pretty well I've just hit a bump with logical AND's and OR's.
Each work fine in a single if/while condition, but if I try and chain them things go wrong, correct me if I am wrong but I believe that AND has precedence, but I …
自从Smalltalk开始以来,我已经成为一名Java程序员超过10年了.我认为下一个大型语言很可能是在无处不在的Java虚拟机上运行的.我想利用Scala(以及其他语言)中的一些特性 - case类层次结构,闭包,类型推断的语句,因为它将允许我编写更简洁明了(我希望)的代码.更接近Smalltalk!
所有在Java中都是第二天的东西:
antjars中XML,Spring等等)我担心玩一些宠物项目和实际上在工作场所愤怒地使用它之间的区别有点太多了.
(显然人们正在使用 Scala - 但是有人建立实际的,因为想要一个更好的词,企业应用程序?)
我一直在使用Ruby进行黑客攻击,但我没有做过任何大型或多线程的事情.我听说MRI只支持绿色线程,JRuby通过JVM支持本机线程.但是,我偶然发现了对博客和讨论组的评论,他们说"Rails不是线程安全的"或者Ruby本身不是线程安全的.例如,某人评论说require语句存在问题.这听起来有点基础.
我已经看到很多Java应用程序没有正确处理并发性,我不时对它们做噩梦:-)但至少你可以用Java编写线程安全的应用程序,如果你真的知道你在做什么(它是只是不容易).
这一切听起来都非常惊人,有人可以详细说明 - 究竟是什么问题以及如果是这样的话Rails如何设法工作?我可以编写多线程的Ruby代码,它可以在没有竞争条件和死锁的情况下正常工作吗?它是否可以在JRuby和MRI之间移植,或者我是否必须破解JVM特定代码才能正确利用JVM本机线程?
编辑:
我应该问两个问题,因为人们似乎只回答了rails线程的东西(这本身很好)和绿色线程与本机线程.我对关于线程安全的核心Ruby问题的关注还没有得到解决.在某些情况下,似乎至少存在一个(未解决的?)问题.
ruby multithreading ruby-on-rails jvm-languages thread-safety
JVM实现在哪里不同(许可除外)?每个JVM是否都为通用处理实现Type Erasure?
两者之间的区别在哪里:
.....使用Tail-Call-Optimization处理其中一个?