编程语言分为两大类“动态”和“静态”。- 编程语言是否总是存在于其中一个而不是两者中,我的意思是一种语言可以同时是动态的和静态的吗?
5 回答
C# 4.0 是一种静态类型语言,也支持动态解析。dynamic
关键字基本上告诉编译器:暂时不要担心这个。如果它无法在运行时解析类型,则会引发异常。
静态语言和动态语言的区别非常模糊,因为它可以引用许多不同的(或多或少合适的)标准。我将尝试回答每种情况:
解释/编译
这不取决于语言本身,而仅取决于所使用的实现。因此,语言可以通过解释器和编译器来执行。例子
- Haskell (GHC / GHCI / 拥抱)
- C++ (G++ / Ch)
- F#
一些编译语言还可以在运行时(.NET)编译它们的代码。
静态/动态类型
静态和动态类型(鸭子类型)可以结合在一种语言中。请参阅 C#'s dynamic
,VB with Option Explicit/Strict off或Boo。结构类型可用于在没有显式类型层次结构的情况下制定严格类型。多态基类型 ( System.Object
) 也支持某种动态行为,尽管类型是静态给出的。
元构造(例如反射、运行时类型生成)
也可以在 Java 和 .NET 中使用。
函数技术(例如高阶函数、延续)
也可以在静态类型语言中复制。请参阅 Haskell 或 Scala。
Objective-C 是另一个例子。它是 C 的严格超集,C 是静态类型的。但是“客观”的东西可以是完全动态的(所有对象都声明为 type id
)。编译器会对 Objective-C 对象进行一些静态类型检查,尽管它受到限制,因为许多标准方法返回id
. 例如,NSArray
集合返回类型为 的对象id
,因此编译器无法捕获:
NSMutableArray *a = [NSMutableArray arrayWithObject:@"我是一个字符串"]; NSNumber *n = [a objectAtIndex:0]; //将字符串分配给数字!
尽管它可以NSNumber *n = @"I am a string"
在编译时标记 , 。
是的。可以同时拥有静态和动态。
如果有人使用 C#,那么我们就在静态轨道上,而我们System.linq.Expression tree API
在 VS 2010 (.NET 4.0) 中使用新的运动。我们将我们的代码定位到称为 DLR(动态语言运行时)的框架,它位于 CLR 之上的一层。
甚至我们创建的代码expression class
也可以被 IronPython 等其他动态语言使用。
同样,我们可以在 CLR 上使用 Iron Python 代码。我们只需要确保它们发出表达式树并针对 DLR。
一种语言可以同时是动态的和静态的吗?
动态和静态以相当模糊的方式指代许多不同的事物。特别是,语言可以是静态或动态类型的,这意味着类型检查要么在编译时在某种程度上强制执行,要么完全推迟到运行时。但是人们通常将一种语言称为“动态”,因为它具有 REPL,因此可以交互地评估定义和表达式。事实上,F# 是一种静态类型语言,在一项调查中被评为最佳动态语言。动态也可以指进行内省/反思的能力。
所以我想一种语言可以同时是动态的和静态的。特别是,通过静态类型检查和支持交互式评估。