什么使编程语言被称为动态语言?我应该使用动态编程语言来解决哪些问题?静态编程语言和动态编程语言之间的主要区别是什么?
答案 0 :(得分:29)
我认为这里没有黑白 - 动态和静态之间存在着完整的光谱。
让我们为频谱的每一侧采用两个极端的例子,并看看它在哪里。
Haskell是静态方向的极端。
因此,对于静态语言,我通常认为:需要相当冗长的编译时分析,类型系统会阻止我犯下愚蠢的错误,但也会阻止我做一些实际有效的事情,如果我想对程序进行任何操作在运行时,它会有点痛苦,因为程序的运行时表示(即其编译形式)与实际语言本身不同。如果我没有预料到,稍后修改一些东西可能会很痛苦。
Clojure是动态方向的极端。
对于动态语言,我通常认为:简短的编译步骤(基本上只是阅读语法),快速和增量开发,几乎没有限制它允许我做什么,但不会阻止我犯愚蠢的错误。
正如其他帖子所指出的那样,其他语言试图采取更多的中间立场 - 例如像F#和C#这样的静态语言通过单独的API提供反射功能,当然也可以通过使用F#的REPL等聪明的工具来提供增量开发。动态语言有时提供可选的类型(如Racket,Strongtalk),并且通常看起来有更先进的测试框架来抵消编译时缺乏任何健全性检查。另外,键入提示虽然未在编译时检查,但它们是生成更高效代码的有用提示(例如Clojure)。
如果您正在寻找针对特定问题的正确工具,那么这肯定是您可以看到的维度之一 - 但本身不太可能以任何方式强制做出决定。考虑一下您正在考虑的语言的其他属性 - 它是功能性的还是OO或逻辑或......语言?它对我需要的东西有一个很好的框架吗?我是否需要稳定性和二进制向后兼容性,或者我可以在编译器中使用一些流失?我需要大量的工具吗?等等。
答案 1 :(得分:7)
动态语言在运行时执行许多任务,静态语言可以在编译时执行此操作。
有问题的任务通常是以下一个或多个:类型系统,方法调度和代码生成。
这也几乎解答了有关其使用的问题。
答案 2 :(得分:6)
正在使用很多的不同定义,但一个可能存在差异:
某些语言很难归类为静态或动态类型。例如,C#传统上被认为是静态类型语言,但C#4.0引入了一种名为dynamic
的静态类型,其行为在某种程度上更像是动态类型而非静态类型。
答案 3 :(得分:4)
什么使编程语言被称为动态语言。
动态语言通常被认为是在运行时提供灵活性的语言。请注意,这不一定与静态类型系统冲突。例如,F#最近在会议上被评为“最受欢迎的.NET动态语言”,即使它是静态类型的。许多人认为F#是一种动态语言,因为它提供了运行时功能,如元循环评估,读取 - 评估 - 打印 - 循环(REPL)和动态类型(各种)。此外,类型推断意味着F#代码不会像大多数静态类型语言(例如C,C ++,Java,C#2,Scala)那样充满类型声明。
我应该为动态语言解决哪些问题。
通常,如果时间和空间不是很重要,您可能总是希望使用具有运行时灵活性和运行时编译等功能的语言。
答案 4 :(得分:3)
这个主题很好地解决了这个问题: