问题 哪些低级任务可以在JVM上完成,但不能在java中表达?


哪些有用的(用于性能或其他方面)构造是有效的字节码,但在Java中无法表达?


7467
2018-03-09 03:12


起源



答案:


  1. 你可以抛出任何对象,而不仅仅是异常。
  2. 您可以在返回类型上重载。
  3. 您可以抛出任何异常而不会在抛出中声明它。

6
2018-03-15 00:26





JVM字节码是一个 面向堆栈的编程语言因此,大多数堆栈管理指令在Java中没有意义,例如, dupswap等等任意的 goto当然,在Java中也无法表达。

就像是 JSR 292 建议支持动态类型语言,我认为Java不打算成为这种语言。

我认为这里需要解决一些问题:你的问题似乎至少部分是由绩效问题推动的。实际上,字节码是JIT编译成汇编的。是否有一个超级神奇的字节码指令真是没有实际意义。


3
2018-03-09 03:14



一切都可以合理地留给JIT吗?也许就像保证堆栈分配一样? - mike g


答案:


  1. 你可以抛出任何对象,而不仅仅是异常。
  2. 您可以在返回类型上重载。
  3. 您可以抛出任何异常而不会在抛出中声明它。

6
2018-03-15 00:26





JVM字节码是一个 面向堆栈的编程语言因此,大多数堆栈管理指令在Java中没有意义,例如, dupswap等等任意的 goto当然,在Java中也无法表达。

就像是 JSR 292 建议支持动态类型语言,我认为Java不打算成为这种语言。

我认为这里需要解决一些问题:你的问题似乎至少部分是由绩效问题推动的。实际上,字节码是JIT编译成汇编的。是否有一个超级神奇的字节码指令真是没有实际意义。


3
2018-03-09 03:14



一切都可以合理地留给JIT吗?也许就像保证堆栈分配一样? - mike g


我已经读过字节码方法签名支持多个调度 返回类型而Java只允许调度相同名称的方法 参数类型


2
2018-03-09 03:18



通过相同的标记,您可以获取具有相同名称但不同类型的字段。 - polygenelubricants


反之亦然。

例如,Java的内部类的可见性不能用字节码表示。 JVM只知道受包受保护,受保护,公共和私有的可见性。因此,Java编译器必须使用hack:它生成合成包装器方法(包可见),以将内部类的私有字段和方法暴露给外部类。


1
2018-03-09 03:41



内部类的可见性使用INNERCLASS / OUTERCLASS属性以字节码表示。 - Jevgeni Kabanov