Skip to content

Latest commit

 

History

History
96 lines (83 loc) · 4.75 KB

A little lesson learned from Java.md

File metadata and controls

96 lines (83 loc) · 4.75 KB
title date author tags keywords categories reward reward_title reward_wechat reward_alipay source_url
[译]A little lesson learned from Java
2011-11-12 23:21:00 -0800
Andrey Breslav
官方动态
false
Have a nice Kotlin!

关于好书,语言设计和JIT编译的一篇文章,其中一个bug变成了另一个而不是后面的... </ em> 最近我开始看一本优秀的书 “Java™拼图” Joshua Bloch和Neal Gafter提供了Java的“陷阱,陷阱和角落案例”,即使您认为他们做的事情真的没有的程序。我的想法是看Kotlin排除或修复了多少益智游戏。我看过前24个项目,其中15个在Kotlin修复,超过60%。 一些益智游戏无法解决,与世界其他地区的兼容性没有严重的影响。例如,关于IEEE-745浮点数的大多数棘手的事情。但是其他一些,虽然在Kotlin尚未修复,但可能会被修复。一个特别的例子是Puzzler 26“In the Loop”:

{% raw %}

{% endraw %}
/**
* Bloch, Joshua; Gafter, Neal (2005-06-24).
* Java™ Puzzlers: Traps, Pitfalls, and Corner Cases (p. 57).
* Pearson Education (USA). Kindle Edition.
*/
public class InTheLoop {
    public static final int END = Integer.MAX_VALUE;
    public static final int START = END - 100;
 
    public static void main(String[] args) {
        int count = 0;
        for (int i = START; i <= END; i++)
            count++;
        System.out.println(count);
    }
}

{% raw %}

{% endraw %}

不要再进一步阅读,直到你确定这个程序打印出来为止。<img alt =“:)”class =“wp-smiley”data-recalc-dims =“1”src =“https://i2.wp.com/blog .jetbrains.com / kotlin / wp-includes / images / smilies / simple-smile.png?w = 640&amp; ssl = 1“style =”height:1em; max-height:1em“ </ span>
因为变量'i'的类型为 int </ strong>,并且ANY int </ strong>小于或等于Integer.MAX_INT,此程序不会打印任何东西,只需循环即可。 现在,如果我写在Kotlin:

{% raw %}

{% endraw %}
val end = Integer.MAX_VALUE
val start = end - 100
var count = 0
for (i in start..end)
  count++
println(count)

{% raw %}

{% endraw %}

它不循环。并打印“101”,这是迭代范围的大小... 这是你想的那一点:“他没有说这个难题还没有被Kotlin固定吗?”是的,我做了。 这个Kotlin程序应该永远循环。而且没有。叹。我已经打开了“新问题”对话框 跟踪器 当我太好奇了,看看编译器发出的代码。你知道吗?我没发现什么坏事用Java编写(我今天是你诚实的反编译器),它看起来像这样:

{% raw %}

{% endraw %}
    int end = Integer.MAX_VALUE;
    int start = end - 100;
    int count = 0;
    for (int i = start; i <= end; i++)
       count++;
    System.out.println("count = " + count);

{% raw %}

{% endraw %}

并且此终止并打印“101”。那是我真的很困惑的地方 经过一些实验,我发现使变量'end' final </ strong>使得程序永远循环。 “它必须是JIT”,而且我是对的,当使用“java -Xint”运行时,此代码永远循环,Kotlin代码也循环使用。 怎么来的?那我运行一个64位的JVM。最有可能的是,JIT优化器使循环变量为64位,因为寄存器是这么大的,或者这样的东西,它不会溢出,只是变成Integer.MAX_VALUE + 1。 叹。我关闭了我们的“新问题”对话框,并打开了HotSpot的一个...(有些技术性阻止我现在完成报告过程,但是我会在星期一做)。 现在,我们可以从这个</ strong>中学到什么教训?我不认为我可以从JIT错误中学到很多东西。错误发生 - 这是这里的教训,我想。 但最初的益智游戏呢?我在高中教帕斯卡,一件我非常喜欢这种语言的是 </ strong>循环,总是在这里终止。我们在Kotlin中不能拥有相同的,因为通常 </ strong>使用可能具有任意逻辑的迭代器。但是我们可以做的是保证一系列数字上的迭代总是终止</ strong>。 BTW,如果一个范围只是一个数字的列表,循环将终止,对吗?所以 IS </ strong> a 错误 在Kotlin编译器毕竟。 <img alt =“:)”class =“wp-smiley”data-recalc-dims =“1”src =“https://i2.wp.com/blog.jetbrains.com/kotlin/wp-includes/images /smilies/simple-smile.png?w=640&ssl=1“style =”height:1em; max-height:1em;“/>