为什么动态语言的“动态”部分如此之好?

时间:2009-11-13 22:59:39

标签: dynamic-languages

Jon Skeet发布了this blog post,其中他声称他将会问为什么语言的动态部分如此优秀。所以我以为我先发制人地问他:是什么让他们这么好?

5 个答案:

答案 0 :(得分:8)

编程语言中两种根本不同的类型方法是静态类型动态类型。它们实现了截然不同的编程范例,它们各有各的利弊。

我强烈推荐Chris Smith的优秀文章What to Know Before Debating Type Systems,以获得更多有关该主题的背景信息。

从那篇文章:

  

静态类型系统是一种机制,通过该机制,编译器检查源代码并将标签(称为“类型”)分配给语法片段,然后使用它们来推断有关程序行为的信息。动态类型系统是一种机制,通过该机制,编译器生成代码以跟踪程序使用的数据类型(巧合地,也称为“类型”)。当然,在这两个系统中使用相同的“类型”一词并非完全巧合;然而,最好将其理解为具有某种微弱的历史意义。试图找到一个世界观,其中“类型”在两个系统中实际上意味着相同的东西,会产生很大的混乱。它没有。解决问题的更好方法是认识到:

     
      
  • 很多时候,程序员都试图解决同样的问题   静态和动态类型。
  •   
  • 然而,静态类型不仅限于动态解决的问题   类型。
  •   
  • 动态类型也不限于可以解决的问题   静态类型。
  •   
  • 这两种技术的核心完全不同。
  •   

答案 1 :(得分:4)

主要的是你避免了许多冗余,这些冗余来自于让程序员“声明”这个,那个,以及另一个。通过类型推理可以获得类似的优势(例如boo就可以获得),但不是那么便宜和灵活。正如我在the past写的那样......:

  

完整的类型检查或推断   需要分析整体   程序,这可能是相当的   不切实际 - 并停止范罗伊   和哈里迪,他们的杰作   “概念,技术和模型   计算机编程“,完全打电话”   开放式编程“。引用一篇文章   从2004年开始:“”我喜欢   Van Roy和Haridi的解释,p。   104-106他们的书,虽然我可能或   可能不同意他们的结论   (基本上就是那个   内在差异很小 - 他们   指向Oz和Alice可互操作   没有和有静态的语言   分别打字),所有的点   他们做得很好。最重要的是,   我相信,动态打字的方式   允许真正的模块化(更难   静态类型,因为类型规则   必须跨模块强制执行   边界)和“探索性的   在计算模型中计算   集成了几个编程   范式“。

     

“推荐动态打字”,他们   总结,“当程序必须如此   尽可能灵活“。我推荐   阅读敏捷宣言   理解为什么最大的灵活性   在大多数现实世界中至关重要   应用程序编程 - 和   因此,为什么,在现实世界中   而不是更多的学术   Van Roy博士和Hadidi博士   搬进去,动态打字一般   更好,而不是这么小的问题   因为他们有所作为。   不过,他们至少表现得更多   投入的意识,投入3   关于的优秀网页   它,优点和缺点,几乎任何   我见过的另一本书 - 大多数书   已明确界定和预先形成   优先顺序是这样或那样的,所以   讨论很少是平衡的   那个;)。

答案 2 :(得分:2)

我首先建议阅读Steve Yegge's post on Is Weak Typing Strong Enough,然后是his post on Dynamic Languages Strike Back。这至少应该让你开始!

答案 3 :(得分:1)

让我们做一些优势/劣势比较:

动态语言:

  • 可以在最小的代码影响下更改类型决策。
  • 可以单独编写/编译代码。我不需要实现甚至是编写代码的类型的正式描述。
  • 必须依靠单元测试来查找任何类型错误。
  • 语言更简洁。减少打字。
  • 可以在运行时修改类型。
  • 编辑和继续更容易实现。

静态语言:

  • 编译器会告知所有类型错误。
  • 编辑可以更加丰富地提供Intellisense等提示。
  • 更严格的语法可能令人沮丧。
  • 通常需要更多输入。
  • 如果编译器提前知道类型,则可以做更好的优化。

为了使事情复杂化一些,请考虑C#等语言部分动态(无论如何感觉)使用var构造或Haskell等静态类型但由于类型推断而感觉动态的语言。

答案 4 :(得分:-1)

动态编程语言基本上在运行时执行其他语言在编译时执行的操作。这包括程序的扩展,添加新代码,扩展对象和定义,或者修改类型系统,所有这些都在程序执行期间而不是编译。

http://en.wikipedia.org/wiki/Dynamic_programming_language

以下是一些常见的例子

http://en.wikipedia.org/wiki/Category:Dynamic_programming_languages

回答你原来的问题:

它们很慢,你需要使用基本的文本编辑器来编写它们 - 没有智能感知或代码提示,它们往往是编写和维护的大麻烦。但最着名的一个(javascript)几乎运行在世界上的每一个浏览器上 - 我猜这是件好事。让我们称之为“广泛的兼容性”。我认为您可能会为大多数操作系统获得动态语言解释器,但对于大多数操作系统来说,您肯定无法获得非动态语言的编译器。