我们如何通过JVM获得动态类型语言?

时间:2012-07-10 05:53:30

标签: java dynamic static jvm jruby

我们JythonJRubyGroovy是动态类型并在JVM上运行的。我知道这些语言编译为字节码。

Scala等其他语言支持类型推断,并且很明显编译器会为我们推断出类型。

Java是一种静态语言,它编译为字节码,这是否意味着字节码支持动态类型?

例如在Java中,我们需要在编译时声明变量类型,并且永远不能更改它。但是在Python的情况下,我们不必声明类型,但我们可以在运行时将任何类型的值赋给同一个变量。

动态类型如何在静态语言上工作?

3 个答案:

答案 0 :(得分:6)

正如其他人所指出的,动态语言只是意味着某些(通常是所有)类型检查完全在运行时完成。即使在非常静态类型(甚至几乎无类型(x86机器代码))的环境中,您也可以构建非常动态的语言。

Java也一直在为动态语言添加越来越多的原生支持。 Sun发布了a very good overview of what this means and how it helps dynamic languages perform well and feel at home on the JVM

答案 1 :(得分:4)

你混淆了语言和架构。通常,体系结构对类型一无所知。动态类型是对象携带类型信息的时候。您可以将动态类型语言视为Java,只使用“Object”类型,并在您的背后进行大量“instanceof”检查。

答案 2 :(得分:3)

  

但Java是一种静态语言,它编译为字节码,这是否意味着字节码支持动态类型?

是的,这意味着。

您认为Java不是完全静态类型的语言。无论何时将对象从类型转换为子类型,JVM都会执行动态(运行时)类型检查以检查该对象是否真的是子类型的实例。使用instanceof是动态类型检查的另一个例子。

使用反射API时,即使使用泛型,也会在幕后使用动态类型检查。

  

动态类型如何在静态语言上工作?

它是一种纯粹的静态类型检查语言,然后它没有。例如,Pascal是一种强类型语言,具有(纯粹)静态类型。但是大多数现代编程语言至少支持某种程度的运行时类型检查。许多动态类型语言都有可选的静态类型,或者使用类型推理来获取与类型相关的错误的开发人员工具。

顺便提一下,语言既可以是静态类型,也可以使用类型推理。类型推断应被视为显式类型声明的替代,而不是静态类型的替代。