标签: jvm-languages

在JVM中运行时在Scala中使用递归

通过搜索此站点和Web上的其他位置,JVM不支持尾调用优化.因此,这是否意味着如果要在JVM上运行,则不应写入可能在非常大的输入列表上运行的尾递归Scala代码(如下所示)?

// Get the nth element in a list    
def nth[T](n : Int, list : List[T]) : T = list match {
            case Nil => throw new IllegalArgumentException
            case _ if n == 0 => throw new IllegalArgumentException
            case _ :: tail if n == 1 => list.head
            case _ :: tail  => nth(n - 1, tail)
}
Run Code Online (Sandbox Code Playgroud)

Martin Odersky的Scala示例包含以下段落,似乎表明存在适合递归的情况或其他环境:

原则上,尾调用总是可以重用调用函数的堆栈帧.但是,某些运行时环境(例如Java VM)缺少基本条件,以使堆栈帧重用用于尾调用.因此,生产质量Scala实现只需要重新使用直接尾递归函数的堆栈帧,其最后一个操作是对自身的调用.其他尾调用也可以进行优化,但不应该在实现中依赖于此.

任何人都能解释一下这段中间两句话是什么意思吗?

谢谢!

optimization jvm scala tail-recursion jvm-languages

11
推荐指数
2
解决办法
1335
查看次数

Scala可以在没有企业支持的情

我想知道如果Scala没有明确的企业支持,是否会获得应得的收益(我在想Sun/Oracle,但我想它可能是其他人,比如谷歌).

由于Sun最近决定不在JDK7中包含闭包,他们难道不能将他们的重量放在Scala那些希望拥有更具表现力的语言的Java替代品上吗?毕竟,在我看来,他们应该最关心的是JVM,而不是Java 本身.有人认为这可能吗?

java scala jvm-languages

10
推荐指数
3
解决办法
1533
查看次数

生成'Hello,World!' 使用Java ASM库的类

我已经开始乱用我正在研究的编译器项目的ASM API.但是,我发现文档对很多地方的新手来说并不清楚,我认为有一个很好的例子,可以生成一个只打印"Hello,World!"的类.这将是一个很好的例子.

目前,我可以使用main()(使用ClassWriter,ClassVisitor和MethodVisitor类)生成一个类,但我似乎无法弄清楚如何生成main的主体.任何人都可以给我一个在ASM中生成类文件的示例:

  • 包含一个main()
  • 在main()中创建一个本地String变量,其值为"Hello,World!"
  • 打印变量

java bytecode compilation jvm-languages java-bytecode-asm

10
推荐指数
2
解决办法
1万
查看次数

Google Go for Java平台?

JVM提供了出色的性能 - 一方面是它.另一方面,Golang听起来像一个新的范例,而且非常富有成效.如果我们能够将两个世界中最好的--JVM性能和golang生产力 - 汇集在一起​​,我们可以获得很多好处.有谁知道在java中提供golang实现的任何项目?

java jvm jvm-languages go

10
推荐指数
2
解决办法
9428
查看次数

Groovy中的任何方法如何工作?

我遇到了这段代码:

n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }
Run Code Online (Sandbox Code Playgroud)

它用于打印树形结构.像这样:

    *
   ***
  *****
 *******
    *
Run Code Online (Sandbox Code Playgroud)

(for n= 4)

  1. 代码是如何[*n..1,n]产生的[4, 3, 2, 1, 4]

  2. any方法如何在这里工作?该文件没有帮助我很多.什么是预测可以传递给any(如Doc的提到)?

any在这种情况下使用什么以及如何处理它?

groovy jvm-languages

9
推荐指数
1
解决办法
8215
查看次数

对于JVM上的原语,Kotlin的具体类型是否不正确?

如果Kotlin函数调用为原语提供了原因,Int那么"传递的"类就是盒装基元的类,而不是未装箱的版本.

inline fun <reified T> reify() = T::class

@Test fun reified_type_doesnt_match_for_primitive() {
    assertNotEquals(Int::class, reify<Int>())
    assertNotEquals(Int::class.java, reify<Int>().java)
    assertNotEquals<Any>(Int::class, reify<Int?>())

    val nullableInt: Int? = 42
    assertNotEquals(nullableInt!!.javaClass.kotlin, reify<Int>())

    assertEquals<Any>(java.lang.Integer::class.java, reify<Int>().java)
}

@Test fun reified_type_matches_for_class() {
    assertEquals(String::class, reify<String>())
}
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?

jvm-languages kotlin

9
推荐指数
1
解决办法
898
查看次数

Scala REPL中的递归重载语义--JVM语言

使用Scala的命令行REPL:

def foo(x: Int): Unit = {}
def foo(x: String): Unit = {println(foo(2))}
Run Code Online (Sandbox Code Playgroud)

error: type mismatch;
found: Int(2)
required: String
Run Code Online (Sandbox Code Playgroud)

看来你无法在REPL中定义重载的递归方法.我认为这是Scala REPL中的一个错误并提交了它,但它几乎立即关闭了"wontfix:我没有看到任何方式这可以支持解释器的语义,因为这两个方法必须编译一起." 他建议将方法放在一个封闭的对象中.

是否有JVM语言实现或Scala专家可以解释原因?我可以看到,如果这些方法相互调用,那将是一个问题,但在这种情况下?

或者,如果这个问题太大而且您认为我需要更多必备知识,那么是否有人有关于语言实现的书籍或网站的任何良好链接,特别是在JVM上?(我知道约翰罗斯的博客,以及编程语言语用学一书......但这就是它.:)

recursion jvm scala jvm-languages

8
推荐指数
2
解决办法
701
查看次数

在Java世界(JVM上的脚本语言)和方法中,您首选的脚本语言是什么?

在Java世界(JVM上的脚本语言)和方法中,您首选的脚本语言是什么?您何时更喜欢脚本语言而不是Java(在什么情况下例如用于原型设计)?您是将它用于大型项目还是仅用于个人项目?

java scripting-language jvm-languages

8
推荐指数
2
解决办法
589
查看次数

为什么Java开发人员应该学习其他JVM语言?

我是一名java开发人员,我想知道,学习Scala或Groovy等语言的主要好处是什么?

java jvm jvm-languages

7
推荐指数
2
解决办法
731
查看次数

当你说"这种语言在JVM上运行"时,它真正意味着什么?

我最近听过很多关于Scala,Clojure等应该在JVM上运行的内容.这是否意味着这些语言正在实现下面的Java API?在JVM下运行语言意味着什么?

谢谢.

java language-agnostic jvm clojure jvm-languages

7
推荐指数
2
解决办法
286
查看次数