Java 我们如何在JVM上拥有一种动态类型的语言?
我们有Java 我们如何在JVM上拥有一种动态类型的语言?,java,dynamic,static,jvm,jruby,Java,Dynamic,Static,Jvm,Jruby,我们有Jython,JRuby,Groovy,它们是动态键入的,并在JVM上运行。我知道这些语言编译成字节码 其他语言,如Scala,支持类型推断,很明显编译器会为我们推断类型 但是Java是一种静态语言,它编译成字节码,这是否意味着字节码支持动态类型 例如,在Java中,我们需要在编译时声明变量类型,并且永远不能更改它。但是对于Python我们不必声明类型,但是我们可以在运行时为同一变量分配任何类型的值 动态类型是如何在静态语言上工作的?您混淆了语言和体系结构。一般来说,架构对类型一无所知。动
Jython
,JRuby
,Groovy
,它们是动态键入的,并在JVM
上运行。我知道这些语言编译成字节码
其他语言,如Scala,支持类型推断,很明显编译器会为我们推断类型
但是Java
是一种静态语言,它编译成字节码,这是否意味着字节码支持动态类型
例如,在Java
中,我们需要在编译时声明变量类型,并且永远不能更改它。但是对于Python
我们不必声明类型,但是我们可以在运行时为同一变量分配任何类型的值
动态类型是如何在静态语言上工作的?您混淆了语言和体系结构。一般来说,架构对类型一无所知。动态类型是指对象携带类型信息。您可以将动态类型化语言想象为Java,它只包含类型“Object”和大量的“instanceof”检查
但是Java是一种静态语言,它编译成字节码,这是否意味着字节码支持动态类型 是的,就是这个意思 您可以看到Java不是一种完全静态类型化的语言。无论何时将对象从类型强制转换为子类型,JVM都会执行动态(运行时)类型检查,以检查该对象是否确实是该子类型的实例。使用
instanceof
是动态类型检查的另一个示例
当您使用反射API时,甚至当您使用泛型时,动态类型检查也在幕后使用
动态类型如何在静态语言上工作
如果它是一种纯粹的静态类型检查语言,那么它就不是。例如,Pascal是一种具有(纯)静态类型的强类型语言。但大多数现代编程语言至少支持某种级别的运行时类型检查。许多动态类型语言要么有可选的静态类型,要么有使用类型推断来提取类型相关错误的开发人员工具
顺便说一句,语言既可以是静态类型,也可以使用类型推断。类型推断应该被视为显式类型声明的替代品,而不是静态类型的替代品。正如其他人所指出的,动态语言只是意味着一些(通常是全部)类型检查完全在运行时完成。您甚至可以在非常静态类型化(甚至几乎非类型化(x86机器代码))的环境中构建非常动态的语言
Java还为动态语言添加了越来越多的本机支持。Sun发布。Java是一种静态语言,其类型系统是静态的。我不明白您是如何得出Java是静态的结论的,因此字节码支持动态的。字节码只是在虚拟机上本机运行的东西。PS:Python使用duck类型。如果你对它的工作原理感兴趣,可以查阅一下。关于你的最后一段:JVM与Java语言不同。C是一种纯静态类型检查语言,但大多数这些语言包括Java,都是基于C构建的。就可以做什么而言,底层语言的特性并不重要,它们只影响可能最有效的内容。它涉及大量链接的
if
语句。