我最近开始学习Java,而不能只是理解语言的一个特征。
当我写下面的代码我没有得到任何错误(和理智我不应该!):
byte b = 10 * 2
然而,当我在下面的代码输入,编译器会引发错误:
int i = 10;
byte b = i * 2
当编译器可以执行检查上10 * 2
,以确保它是小于的范围byte
,为什么不能也进行一个检查i * 2
,看看它是否是不足的范围byte
?
它是否得到的东西做位的较低级别的代表,或者说相关的记忆?
我不是Java的任何具体的利好,但任何现代编译器会进行不断折叠,以“倍”这完全是常量表达式。即,10 * 2倍至20所以编译器把它当作如果您键入byte b = 20;
这是不是真的实用的编译器,试图优化变量。即使在您提供的例子是比较简单的看,知道i
是10
,如果一个编译器将尝试以优化并了解i
了,那就要维护它自己的符号表,将基本上是一个解释。由于Java是一个预编译的语言,这违背了目的。
阐述:
有一个编译器和解释器之间的差异。编译器需要在源代码作为输入,并写入在幕后机器代码。当这台机器的代码被执行,操作/执行/执行计算。Java是编译型语言,所以它的编译器是不是做大量的计算,它只是编写可以在Java虚拟机上运行的机器代码。Python的,另一方面,是一种解释型语言。当你运行一个Python程序,它不会尝试做任何类型转换为i * 2
后才它实际工作中求值i * 2
。
现在,有时编译器试图耍小聪明,并且已经建立了“优化”。这意味着,而不是写机器代码,做一些操作,他们写更少的指令的机器代码,因为它知道它是什么(所以编译器做了一些计算,以实现这一目标)。在你的榜样,而不是存储10号写的机器指令,存储号码2,乘他们,然后将结果存储,编译器可以多10个和2个,并且只写一个机器指令来存储结果。
当我们引入变量,它变得更难编译器优化,并找出该变量是什么。实际的编译程序(Java编译器)将要记住,我是拿着10号,现在的变量。如果我们要优化只知道我们能分配I * 2的byte
,这将意味着,编译器会一定要记得上关的机会,它被分配到一个字节在以后的表达每一个整数变量-在这一点上它是不是真的值得的优化,编译器花费额外的计算(额外的工作来编译)并没有真正给予任何好处。符号表(如上所述)基本上是记住变量和它们的值是什么表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句