Compiler construction 动态语言与静态语言(这两种语言可以放在同一个地方吗)

Compiler construction 动态语言与静态语言(这两种语言可以放在同一个地方吗),compiler-construction,programming-languages,dynamic-languages,static-language,Compiler Construction,Programming Languages,Dynamic Languages,Static Language,编程语言分为“动态”和“静态”两大类。 -编程语言总是在其中一种语言中,而不是在两种语言中,我的意思是一种语言可以同时是动态的和静态的吗 C#4.0也是一种静态类型的语言。dynamic关键字基本上告诉编译器:现在不要担心这个问题。如果无法在运行时解析该类型,将引发异常 Objective-C是另一个例子。它是C的严格超集,C是静态类型的。但是“客观”的东西可以是完全动态的(所有对象都声明为typeid)。编译器对Objective-C对象执行一些静态类型检查,尽管它受到限制,因为许多标准方法返

编程语言分为“动态”和“静态”两大类。
-编程语言总是在其中一种语言中,而不是在两种语言中,我的意思是一种语言可以同时是动态的和静态的吗

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

Objective-C是另一个例子。它是C的严格超集,C是静态类型的。但是“客观”的东西可以是完全动态的(所有对象都声明为type
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! NSMutableArray*a=[NSMutableArray arrayWithObject:@“我是一个字符串”]; NSNumber*n=[a objectAtIndex:0]//给一个数字分配一个字符串!
尽管它可以在编译时标记为“
NSNumber*n=@”我是字符串“

是。有可能同时具有静态和动态

如果使用C#,那么我们就处于静态轨道上,而在VS2010(.NET 4.0)中,我们使用了一个新的
System.linq.Expression树API
。我们将代码的目标放在一个名为DLR(动态语言运行时)的框架上,DLR是CLR之上的一层

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

类似地,我们可以在CLR上使用iron python代码。我们只需要确保它们发出表达式树并针对DLR。

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

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

  • 哈斯克尔(GHC/GHCI/Hugs)
  • C++(G++/Ch)
  • F#
一些编译过的语言还可以在运行时(.NET)编译它们的代码

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

元构造(例如反射、运行时类型生成) 也可以在Java和.NET中使用

函数技术(如高阶函数、延拓) 也可以在静态类型语言中复制。参见Haskell或Scala

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

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

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