任何人都可以解释有关动态或静态语言的C C ++ Java

时间:2011-03-06 00:27:24

标签: java c++ c dynamic-languages static-language

任何人都可以解释有关动态类型或静态类型语言的C C ++ Java。

我在某处读到C C ++和Java都是静态语言。但我记得还有其他意见。很困惑。

谢谢!

4 个答案:

答案 0 :(得分:6)

还有什么其他意见?毫无疑问,C,C ++和Java都是静态类型语言,C ++和Java具有一些动态类型的特性。还有另一个问题:强类型与弱类型,主要与隐式转换和重载有关。网上有很多关于这些问题的深入讨论;您可能希望从http://en.wikipedia.org/wiki/Type_system

开始

答案 1 :(得分:1)

这是一个频谱。 C没有任何动态类型功能,虽然它允许你使用void *和强制转换来自己做一些技巧。 C ++和Java在类方法上有动态调度,因此在C ++和Java中有些情况下,您不知道在运行时直到对象实际调用哪个方法。 Java包含一个反射API,它实际上允许您在运行时检查和修改类型,因此它比C ++更具动态性。然后有像Python和Ruby这样的语言几乎完全是动态的 - 在编译时几乎没有任何东西被检查,并且你有像“鸭子打字”这样的功能,你不关心实际的类型,只要它支持你关心的操作。

答案 2 :(得分:1)

在hlovdal回答之后,我会再次引用本杰明·皮尔斯的问题。我参考并扩展了他的“类型和编程语言”的第1章。

Java是安全语言(即阻止运行时类型错误),主要是静态类型检查。但是,由于继承(更准确地说,是子类型),变量的类型可以比指向值的类型更通用。 此外,该语言还允许验证对象是否具有某种类型,以及在运行时向下转换对象 - 在此类操作期间,在运行时检查类型。因此,每个对象都有一个指向其类型的运行时表示的指针。

C是一种静态类型检查的不安全语言。运行时不存在类型。 C ++仍然是一种使用静态类型检查的不安全语言,但它也为满足某些条件的类提供了有限的运行时类型识别 - 即具有一些虚拟方法(如Java中的所有对象)。

编辑 :“静态输入”是一个明确定义的概念。为了表明这一点,我将(松散地)定义三个可能与“静态类型”相关的属性。

  1. 在执行程序之前,它是类型检查的:Java,C和C ++都满足这个标准。
  2. 如果程序类型检查,我们可以保证它在运行时它不会有某个类的错误:C和C ++没有这个标准,Java传递它(虽然这是唯一可能的,因为失败的强制类型被明确排除在此之外一类错误)。
  3. 运行时不存在语言定义的类型表示。这个属性对于Java和C ++都是失败的,并且表征了像C和Pascal这样的语言。
  4. 如果你说一个语言是“静态类型”的话,如果它具有我上面提到的所有三个属性,那么Java,C和C ++都不是静态类型的。

答案 3 :(得分:0)

关于静态/强类型的不同意见我刚刚在阅读完这个问题之后偶然发现了old slashdot comment

  

我最喜欢的定义是“强壮   打字“来自Shriram   Krishnamurthi的Programming Languages: Application and Interpretation(第205页):

     

那么什么是“强打字”?尽我们所知,这是毫无意义的   短语,人们经常在一个地方使用它   荒谬的时尚。

     

Benjamin Pierce(类型和作者的作者)   编程语言)写了一些东西   类似(见Mark Jason Dominus quoting Pierce on "__ typing"):

     

我花了几周时间,大约一年前,试图解决这个问题   术语“强类型”   “静态打字”,“安全”等等   发现它非常困难。身为你的   消息指出,这些的用法   术语是如此多样化以呈现它们   几乎没用。