任何人都可以解释有关动态类型或静态类型语言的 C C++ Java。
我在某处读到 C C++ 和 Java 都是静态语言。但我记得对这些还有其他意见。很迷茫。
谢谢!
任何人都可以解释有关动态类型或静态类型语言的 C C++ Java。
我在某处读到 C C++ 和 Java 都是静态语言。但我记得对这些还有其他意见。很迷茫。
谢谢!
还有什么意见?毫无疑问,C、C++ 和 Java 都是静态类型语言,而 C++ 和 Java 具有一些动态类型的特性。还有另一个问题:强类型与弱类型,这主要与隐式转换和重载有关。网上有很多关于这些问题的深入讨论;您可能想从http://en.wikipedia.org/wiki/Type_system开始
这是一个频谱。C 没有任何动态类型功能,尽管它允许您自己使用void *
和强制转换来做一些诡计。C++ 和 Java 对类方法具有动态分派,因此在 C++ 和 Java 中存在一些情况,直到运行时您才知道对象上实际调用了哪个方法。Java 包含一个反射 API,实际上可以让您在运行时检查和修改类型,因此它比 C++ 更动态一些。然后是像 Python 和 Ruby 这样的语言,它们几乎是完全动态的——在编译时几乎没有检查任何东西,而且你有像“鸭子类型”这样的特性,只要它支持,你就不太关心实际类型。您关心的操作。
在 hlovdal 的回答之后,我将再次引用 Benjamin Pierce 的话,对这个问题有一些积极的看法。我参考并扩展了他的“类型和编程语言”的第 1 章。
Java 是一种安全的语言(即防止运行时类型错误),主要具有静态类型检查。然而,由于继承(更准确地说,子类型化),变量的类型可以比指向值的类型更通用。此外,该语言还允许验证对象是否具有特定类型,并在运行时向下转换对象 - 在此类操作期间,类型在运行时检查。因此,每个对象都有一个指向其类型的运行时表示的指针。
C 是具有静态类型检查的不安全语言。类型在运行时不存在。C++ 仍然是一种具有静态类型检查的不安全语言,但它还为满足特定条件的类提供有限的运行时类型识别 - 即具有一些虚拟方法(如 Java 中的所有对象)。
编辑:“静态类型”不是一个定义明确的概念。为了证明这一点,我将(粗略地)定义三个可能与“静态类型”相关的属性。
如果你说一种语言是“静态类型的”,如果它具有我上面提到的所有三个属性,那么 Java、C 和 C++ 都不是静态类型的。
关于静态/强类型的不同意见,我在阅读这个问题后偶然发现了这个旧的 slashdot 评论:
我最喜欢的“强类型”定义来自 Shriram Krishnamurthi 的编程语言:应用程序和解释(第 205 页):
那么什么是“强类型”?据我们所知,这是一个毫无意义的短语,人们经常以荒谬的方式使用它。
Benjamin Pierce(Types and Programming Languages 的作者)写过类似的东西(参见Mark Jason Dominus 在 " _ _ typing"上引用 Pierce):
我花了几个星期,大约一年前,试图理清“强类型”、“静态类型”、“安全”等术语,发现它非常困难。正如您的消息所指出的那样,这些术语的用法如此多样,以至于使它们几乎毫无用处。