我们如何在JVM上拥有动态类型语言?

2022-09-04 20:12:06

我们有 ,它们是动态类型化的,并运行在 。我知道这些语言编译成字节码。JythonJRubyGroovyJVM

其他语言,如支持类型推断,很明显编译器为我们推断类型。Scala

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

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

动态类型如何与静态语言配合使用?


答案 1

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

是的,它确实是这个意思。

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

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

动态类型如何与静态语言配合使用?

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

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


答案 2

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

Java也增加了对动态语言的越来越多的原生支持。Sun很好地概述了这意味着什么,以及它如何帮助动态语言在JVM上表现良好并感到宾至如归


推荐