首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么使编程语言具有动态性?

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

Stack Overflow用户
提问于 2011-02-06 19:54:00
回答 5查看 19K关注 0票数 45

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-09 05:22:24

我不认为这里有非黑即白的东西--在动态和静态之间有一个完整的光谱。

让我们为光谱的每一边举两个极端的例子,看看这会把我们带到哪里。

Haskell在静态方向上是一个极端。

  • 它有一个强大的类型系统,可以在编译时进行检查:如果你的程序编译成功,它就不会出现常见和不常见的错误。haskell
  • 编译后的形式与haskell程序有很大的不同(它是二进制的)。因此,运行时反射和修改是很困难的,除非你已经预见到了。与解释原文相比,结果可能更高效,因为编译器可以自由地执行时髦的optimizations.

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

Clojure在动态方向上是一个极端。

  • 它也有一个类型系统,但在编译时没有类型检查。许多常见的错误只能通过运行program.
  • Clojure程序才能发现,本质上就是Clojure列表(数据结构),可以这样操作。因此,当进行运行时反射时,您实际上是在处理Clojure程序,或多或少与您输入的Clojure程序一样-运行时形式非常接近编程语言本身。所以你基本上可以在运行时做和在“输入时间”时一样的事情。因此,运行时性能可能会受到影响,因为编译器不能预先执行很多optimizations.

对于动态语言,我通常认为:很短的编译步骤(基本上只是阅读语法),如此快速和渐进的开发,实际上它允许我做的事情没有限制,但不会阻止我犯愚蠢的错误。

正如其他帖子所指出的那样,其他语言试图采取更多的中间立场--例如,像F#和C#这样的静态语言通过一个单独的API提供反射功能,当然也可以通过使用像F#的REPL这样的聪明工具来提供增量开发。动态语言有时提供可选的类型(如球拍、Strongtalk),而且通常,似乎有更高级的测试框架来弥补编译时缺乏任何健全检查的不足。此外,类型提示虽然在编译时不会被检查,但对于生成更有效的代码是有用的提示(例如Clojure)。

如果您正在寻找解决给定问题的正确工具,那么这肯定是您可以查看的维度之一-但它本身不太可能强制做出决定。考虑一下你正在考虑的语言的其他属性--是函数式的,还是面向对象的,还是逻辑的,或者……语言?对于我需要的东西,它有没有一个好的框架?我是否需要稳定性和二进制向后兼容性,或者我可以忍受编译器中的一些波动?我需要广泛的工具吗?等等。

票数 31
EN

Stack Overflow用户

发布于 2011-02-06 20:02:20

动态语言在运行时执行许多任务,而静态语言在编译时执行这些任务。

有问题的任务通常是一个或多个:类型系统、方法分派和代码生成。

这也很好地回答了关于它们使用的问题。

票数 8
EN

Stack Overflow用户

发布于 2011-02-06 20:02:13

在使用中有不同定义的lot,但一个可能的差异是:

  • 动态语言通常使用动态类型。
  • 静态语言通常使用静态类型。

有些语言很难归类为静态类型或动态类型。例如,C#传统上被认为是一种静态类型的语言,但是C# 4.0引入了一个名为dynamic的静态类型,它在某些方面更像动态类型而不是静态类型。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4913105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档