概述
invokedynamic是直到Java 7才引入的bytecode指令,当初设计该指令时,是为了方便JVM动态语言的实现,比如Groovy、JRuby、Jython等,而其真正被Java界关注到则是从Java 8开始,因为Java 8引入了Lambda Expression以及Method Reference这两大特性,其实现便是基于invokedynamic指令完成的。
虽然Groovy 3 Alpha版本就已经支持Java 8的Lambda、Method Reference以及Constructor Reference全部语法,但从bytecode层面来看,其本质上依然是Closure及Method Pointer,换言之,只是语法上的兼容,但性能上并没有提升。而Groovy的性能常为人诟病,所以Groovy 2引入了静态编译,其编译出来的bytecode跟Java的相近,所以其性能逼近Java。为了延续静态编译的性能优势,Groovy核心团队决定在Groovy 3 Beta版本中实现Lambda、Method Reference以及Constructor Reference的Native版本,其语法不变,但生成的bytecode与Java的相似,这便是”Native”的由来。
println "Hello, world!" |