动态语言与静态语言(这两种语言可以在同一个地方一起使用吗)

3

编程语言通常分为两类:“动态”和“静态”。这是否总是如此,一个编程语言只属于其中一种,而不同时属于两种?

一个编程语言通常只能被归为动态或静态中的一种,不能同时归为两种。

5个回答

4
区分静态语言和动态语言是相当模糊的,因为它可以涉及许多不同(或多或少合适)的标准。我将尝试回答每种情况:
解释/编译
这并不取决于语言本身,而只取决于所使用的实现。因此,语言可以通过解释器和编译器执行。例如:
Haskell(GHC / GHCI / Hugs) C++(G++ / Ch) F#
一些编译语言也有在运行时编译其代码的可能性(.NET)。
静态/动态类型
静态和动态类型(鸭子类型)可以在一种语言中结合使用。请参见C#的dynamic、VB的Option Explicit/Strict off或Boo。结构类型可以用于制定严格的类型而不需要显式类型层次结构。多态基类型(System.Object)也支持某种动态行为,尽管类型是静态给定的。
元构造(例如反射、运行时类型生成)
Java和.NET也可用。
函数技术(例如高阶函数、continuations)
在静态类型语言中也可以复制。请参见Haskell或Scala。

4

C# 4.0是一种静态类型语言,同时也支持动态解析dynamic关键字基本上告诉编译器:现在不用担心这个。如果它在运行时无法解析类型,则会抛出异常。


2

Objective-C是另一个例子。它是C语言的严格超集,而C语言是静态类型的。但是"objective"的部分可以完全动态(所有对象都声明为类型id)。编译器对Objective-C对象进行了一些静态类型检查,虽然它受限于许多标准方法返回id。例如,NSArray集合返回id类型的对象,因此编译器无法捕捉:

NSMutableArray *a = [NSMutableArray arrayWithObject:@"I am a string"];
NSNumber *n = [a objectAtIndex:0]; //将字符串赋给数字!

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


1

是的。可以同时拥有静态和动态。

如果使用C#,则我们处于静态轨道上,并且在VS 2010(.NET 4.0)中使用新的 System.linq.Expression tree API 时进行移动。 我们将我们的代码针对称为DLR(动态语言运行时)的框架,它位于CLR之上。

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

同样地,我们可以在CLR上使用iron python代码。 我们需要确保它们发出表达式树并针对DLR进行定位即可。


0
一个语言可以同时是动态和静态的吗?
动态和静态在很多方面都有不同的含义。特别是,语言可以是静态或动态类型的,这意味着类型检查在编译时要么在某种程度上强制执行,要么完全推迟到运行时。但人们通常将一种语言称为“动态的”,因为它具有REPL,因此可以交互地评估定义和表达式。事实上,F#是一种静态类型的语言,在一项调查中被评为最佳动态语言。动态还可以指支持内省/反射的能力。
因此,我认为一种语言可以同时是动态和静态的。特别是,通过同时进行静态类型检查和支持交互式评估。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接