什么使编程语言具有动态性?

时间:2011-02-06 11:54:00

标签: programming-languages dynamic static

什么使编程语言被称为动态语言?我应该使用动态编程语言来解决哪些问题?静态编程语言和动态编程语言之间的主要区别是什么?

5 个答案:

答案 0 :(得分:29)

我认为这里没有黑白 - 动态和静态之间存在着完整的光谱。

让我们为频谱的每一侧采用两个极端的例子,并看看它在哪里。

Haskell是静态方向的极端。

  • 它有一个强大的类型系统,在编译时检查:如果你的程序编译它没有常见的错误,也没有那么常见的错误。
  • 编译后的表单与haskell程序(它是二进制文件)非常不同。因此,运行时反射和修改很难,除非你已经预见到了。与解释原始数据相比,结果可能更有效,因为编译器可以自由地进行时髦的优化。

因此,对于静态语言,我通常认为:需要相当冗长的编译时分析,类型系统会阻止我犯下愚蠢的错误,但也会阻止我做一些实际有效的事情,如果我想对程序进行任何操作在运行时,它会有点痛苦,因为程序的运行时表示(即其编译形式)与实际语言本身不同。如果我没有预料到,稍后修改一些东西可能会很痛苦。

Clojure是动态方向的极端。

  • 它也有一个类型系统,但在编译时没有类型检查。许多常见错误只能通过运行程序来发现。
  • Clojure程序基本上只是Clojure列表(数据结构),可以这样操作。因此,在进行运行时反射时,您实际上或多或少地处理Clojure程序,就像您键入它一样 - 运行时表单非常接近编程语言本身。因此,您可以在运行时基本上执行与“键入时间”相同的操作。因此,运行时性能可能会受到影响,因为编译器无法进行许多前期优化。

对于动态语言,我通常认为:简短的编译步骤(基本上只是阅读语法),快速和增量开发,几乎没有限制它允许我做什么,但不会阻止我犯愚蠢的错误。

正如其他帖子所指出的那样,其他语言试图采取更多的中间立场 - 例如像F#和C#这样的静态语言通过单独的API提供反射功能,当然也可以通过使用F#的REPL等聪明的工具来提供增量开发。动态语言有时提供可选的类型(如Racket,Strongtalk),并且通常看起来有更先进的测试框架来抵消编译时缺乏任何健全性检查。另外,键入提示虽然未在编译时检查,但它们是生成更高效代码的有用提示(例如Clojure)。

如果您正在寻找针对特定问题的正确工具,那么这肯定是您可以看到的维度之一 - 但本身不太可能以任何方式强制做出决定。考虑一下您正在考虑的语言的其他属性 - 它是功能性的还是OO或逻辑或......语言?它对我需要的东西有一个很好的框架吗?我是否需要稳定性和二进制向后兼容性,或者我可以在编译器中使用一些流失?我需要大量的工具吗?等等。

答案 1 :(得分:7)

动态语言在运行时执行许多任务,静态语言可以在编译时执行此操作。
有问题的任务通常是以下一个或多个:类型系统,方法调度和代码生成。

这也几乎解答了有关其使用的问题。

答案 2 :(得分:6)

正在使用很多的不同定义,但一个可能存在差异:

  • 动态语言通常使用动态输入。
  • static 语言通常使用 static 输入。

某些语言很难归类为静态或动态类型。例如,C#传统上被认为是静态类型语言,但C#4.0引入了一种名为dynamic的静态类型,其行为在某种程度上更像是动态类型而非静态类型。

答案 3 :(得分:4)

  

什么使编程语言被称为动态语言。

动态语言通常被认为是在运行时提供灵活性的语言。请注意,这不一定与静态类型系统冲突。例如,F#最近在会议上被评为“最受欢迎的.NET动态语言”,即使它是静态类型的。许多人认为F#是一种动态语言,因为它提供了运行时功能,如元循环评估,读取 - 评估 - 打印 - 循环(REPL)和动态类型(各种)。此外,类型推断意味着F#代码不会像大多数静态类型语言(例如C,C ++,Java,C#2,Scala)那样充满类型声明。

  

我应该为动态语言解决哪些问题。

通常,如果时间和空间不是很重要,您可能总是希望使用具有运行时灵活性和运行时编译等功能的语言。

答案 4 :(得分:3)

这个主题很好地解决了这个问题:

Static/Dynamic vs Strong/Weak