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

有帮助吗?

解决方案

区别 静止的动态语言 是相当模糊的,因为它可以指许多不同的(或多或少合适的)标准。我将尝试针对每种情况进行回答:

解释/编译

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

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

一些编译语言还可以在运行时编译其代码(.NET)。

静态/动态类型

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

元结构(例如反射、运行时类型生成)

也可用于 Java 和 .NET。

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

也可以用静态类型语言复制。请参阅 Haskell 或 Scala。

其他提示

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

Objective-C是另一个例子。它是C的严格超集,C是静态类型的。但是“目标”是指stuff可以是完全动态的(所有对象都声明为 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 = @“我在编译时是一个字符串”

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

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

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

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

  

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top