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

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

要回复问题请先登录注册