【问题标题】:Why is the "Dynamic" part of Dynamic languages so good?为什么动态语言的“动态”部分这么好?
【发布时间】:2009-11-13 22:59:38
【问题描述】:

Jon Skeet 发布了this blog post,其中他说他将要问为什么语言的动态部分如此出色。所以我想我会先发制人地代表他问:是什么让他们这么好?

【问题讨论】:

  • 社区维基恕我直言
  • 只是为了在我的博文之前先发一点:REPL 和类型推断之类的东西往往与人们对动态语言的喜好混为一谈——但它们本质上并不是动态方面。跨度>
  • 补充一下 Jon Skeet 的评论,OCaml 和 Haskell 几乎是静态类型的,但它们是开箱即用的 REPL。 F# 是另一种具有 REPL 和类型推断的静态类型语言。

标签: dynamic-languages


【解决方案1】:

编程语言中两种根本不同的类型方法是静态类型动态类型。它们支持非常不同的编程范式,并且各有优缺点。

我强烈推荐 Chris Smith 的出色文章 What to Know Before Debating Type Systems,了解有关该主题的更多背景信息。

来自那篇文章:

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

  • 很多时候,程序员都试图用 静态和动态类型。
  • 尽管如此,静态类型并不局限于动态解决的问题 类型。
  • 动态类型也不限于可以通过以下方式解决的问题 静态类型。
  • 这两种技术的核心根本不是一回事。

【讨论】:

  • 链接+1。这是一篇非常有见地的文章(确实是强烈推荐阅读!)
  • 引起了激烈的争论。 John 是对的,许多我们等同于动态语言的东西都不是。
  • 在那个链接上,我看到了以下内容:“所有其他类型系统都基于的简单类型 lambda 演算证明程序在有限的时间内终止。确实,更有趣的问题是如何有效地扩展类型系统以能够描述不终止的程序!但是,找到无限循环并不属于大多数人与“类型”相关联的事物类别,因此令人惊讶。”。我相当肯定这是明显错误的,因为计算机是图灵机,我认为数学证明并非所有程序都可以证明不会停止。
  • @RCIX:你需要读完这篇文章。静态类型系统的全部意义在于约束程序的行为。如果程序通过类型系统约束,那么您可以确定某些行为是不可能的。缺点是可能存在不会通过类型约束但仍会以相同方式运行的程序,并且类型系统无法证明这一点。因此,类型系统的目的是拒绝某些有趣的程序,以便能够证明关于剩下的程序的某些陈述。
  • @RCIX:我不明白你的意思。您正在混合简单类型的 lambda 演算和图灵模型。 Church-Turing 论文仅适用于终止的算法;对于每个可计算函数,都有一个图灵机,反之则不然。停止问题与“简单类型的 lambda 演算证明程序在有限时间内终止”的陈述之间没有矛盾。详情请见en.wikipedia.org/wiki/…
【解决方案2】:

主要是避免让程序员“声明”这个、那个和另一个而产生的大量冗余。通过类型推断可以获得类似的优势(例如,boo 就是这样做的),但不是那么便宜和灵活。正如我在the past...中所写:

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

“推荐动态输入”,他们 得出结论,“当程序必须是 尽可能灵活”。我建议 阅读敏捷宣言 理解为什么最大的灵活性是 在大多数现实世界中至关重要 应用程序编程——和 因此,为什么,在所说的现实世界中 而不是在更学术的 圆圈 Van Roy 博士和 Hadidi 博士 搬进来,动态打字一般是 更可取,而不是这么小的问题 因为他们有所作为。 尽管如此,他们至少表现出更多 对问题的认识,投入3 优秀的讨论页面 它,优点和缺点,比几乎任何 我看过的其他书——大多数书 已经清楚地描绘和执行 以一种或另一种方式优先,所以 讨论很少如此平衡 那样;)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      动态语言:

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

      静态语言:

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

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

      【讨论】:

      • 有趣的点。然而,已经很好地证明了 tereseness 并不 在数学上 100% 总是等于 tereseness,但在大多数情况下确实如此。另外,您应该阅读steve.yegge.googlepages.com/is-weak-typing-strong-enough
      • 简洁不是动态类型语言的内在特性。与 OCaml、Haskell、SML 和 Scala 相比,PHP、经典的 ASP、JavaScript 和 Objective-C 是非常臃肿的语言。就其价值而言,我通常发现我的 F# 与同等的 Python 相当甚至更简洁。
      • "var" 绝不是动态的 - C# 3 完全是静态类型的。 (C# 4 is 在你想要的地方动态变化。)“var”再次只是类型推断。这就是为什么这篇博文将讨论事物的动态方面,而不是经常伴随动态语言的其他方面。
      • var 是类型推断的事实就是我说“(无论如何)”的原因。你是正确的,它不是动态类型的,但它的行为非常像它。
      【解决方案5】:

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

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

      这里有一些常见的例子

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

      回答你原来的问题:

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

      【讨论】:

      • 那么,为了完整起见,是什么让这是一个好方法?
      • 我非常不同意这种说法,我指给你steve.yegge.googlepages.com/is-weak-typing-strong-enough
      • 对不起,我不是故意冒犯的。虽然这句话在那个页面上突然出现在我身上“强与弱打字问题真的让人们兴奋不已。”呵呵...可以说动态语言是有目的的。不过,您不会同时编写一个高交易量的股票交易系统,对吗?
      • 嗯...如果我有一个优秀的程序员团队,我肯定会选择动态语言。但大多数语言都是如此......
      猜你喜欢
      • 2011-05-05
      • 2010-10-21
      • 2010-10-20
      • 2011-01-17
      • 1970-01-01
      • 2016-09-26
      • 2010-10-10
      相关资源
      最近更新 更多