动态语言与静态语言(这两个可以在同一个地方)

时间:2009-11-26 06:31:48

标签: compiler-construction programming-languages dynamic-languages static-language

编程语言分为2个主要类别“动态”& “静态的”。 - 编程语言总是存在于其中之一而不是两者中,我的意思是语言可以同时是动态和静态的吗?

5 个答案:

答案 0 :(得分:4)

C#4.0是一种静态类型语言supports dynamic resolutiondynamic关键字基本上告诉编译器:现在不要担心这个问题。如果在运行时无法解析类型,则抛出异常。

答案 1 :(得分:4)

static 动态语言的区别非常模糊,因为它可以引用许多不同的(或多或少合适的)标准。我将尝试回答每个案例:

口译/汇编

这不取决于语言本身,而只取决于所使用的实现。因此,语言可以通过解释器和编译器来执行。实例

  • Haskell(GHC / GHCI / Hugs)
  • C ++(G ++ / Ch)
  • F#

某些编译语言也可以在运行时(.NET)编译代码。

静态/动态类型

静态和动态类型(鸭子类型)可以用一种语言组合。请参阅C#的dynamic VB ,其中 Option Explicit / Strict off Boo 。结构类型可用于在没有显式类型层次结构的情况下制定严格类型。多态基类型(System.Object)也支持某种动态行为,尽管类型是静态给出的。

Meta构造(例如,反射,运行时类型生成)

也可以在Java和.NET中使用。

功能技术(例如,高阶函数,延续)

也可以使用静态类型语言进行复制。见Haskell或Scala。

答案 2 :(得分:2)

Objective-C是另一个例子。它是C的严格超集,C是静态类型的。但是“客观”的东西可以是完全动态的(所有对象都被声明为类型id)。编译器对Objective-C对象进行了一些静态类型检查,尽管它受到限制,因为许多标准方法返回id。例如,NSArray集合返回类型为id的对象,因此编译器无法捕获:

NSMutableArray *a = [NSMutableArray arrayWithObject:@"I am a string"];
NSNumber *n = [a objectAtIndex:0]; //assigning a string to a number!

虽然它可以在编译时标记NSNumber *n = @"I am a string"

答案 3 :(得分:1)

是。它可以同时具有静态和动态。

如果使用C#,那么我们处于静态轨道,我们在VS 2010(.NET 4.0)中使用新的System.linq.Expression tree API。我们将我们的代码定位到称为DLR(动态语言运行时)的框架,这是CLR之上的一层。

即使我们由expression class创建的代码也可以被其他动态语言(如IronPython等)使用。

同样,我们可以在CLR上使用铁python代码。我们需要确保它们发出表达树并且针对DLR。

答案 4 :(得分:0)

  

语言可以同时是动态和静态的吗?

动态和静态以非常模糊的方式引用许多不同的东西。特别是,语言可以是静态或动态类型的,这意味着类型检查要么在编译时强制执行,要么完全延迟到运行时。但人们经常将语言称为“动态”,因为它具有REPL,因此可以交互式地评估定义和表达式。实际上,F#是一种静态类型语言,在调查中被评为最佳动态语言。动态也可以指内省/反思的能力。

所以我认为一种语言可以同时是动态的和静态的。特别是,通过静态类型检查和支持交互式评估。