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

18b*_*tes 11 java static jvm jruby dynamic

我们Jython,JRuby,Groovy这是动态类型和运行在JVM.我知道这些语言编译为字节码.

其他语言,如Scala支持类型推断,并清楚编译器为我们推断出类型.

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

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

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

Kar*_*elė 6

你混淆了语言和建筑。一般来说,架构对类型一无所知。动态类型是指对象携带类型信息。您可以将动态类型语言视为仅具有“Object”类型并在背后进行大量“instanceof”检查的 Java。


Ste*_*n C 6

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

是的,确实是这个意思。

您会看到 Java 不是一种完全静态类型的语言。每当您将对象从类型转换为子类型时,JVM 都会执行动态(运行时)类型检查以检查该对象是否确实是该子类型的实例。Usinginstanceof是动态类型检查的另一个例子。

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

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

如果它是一种纯粹的静态类型检查语言,那么它就不是。例如,Pascal 是一种具有(纯)静态类型的强类型语言。但是大多数现代编程语言至少支持某种级别的运行时类型检查。并且许多动态类型语言具有可选的静态类型,或者使用类型推断来获取与类型相关的错误的开发人员工具。

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


sbl*_*lom 6

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

Java还为动态语言添加了越来越多的原生支持.Sun发布了一个非常好的概述,说明了这意味着什么,以及它如何帮助动态语言在JVM上运行良好并有宾至如归的感觉.