Jon Skeet发布了this blog post,其中他声称他将会问为什么语言的动态部分如此优秀。所以我以为我先发制人地问他:是什么让他们这么好?
答案 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)
让我们做一些优势/劣势比较:
动态语言:
静态语言:
为了使事情复杂化一些,请考虑C#等语言部分动态(无论如何感觉)使用var构造或Haskell等静态类型但由于类型推断而感觉动态的语言。
答案 4 :(得分:-1)
动态编程语言基本上在运行时执行其他语言在编译时执行的操作。这包括程序的扩展,添加新代码,扩展对象和定义,或者修改类型系统,所有这些都在程序执行期间而不是编译。
http://en.wikipedia.org/wiki/Dynamic_programming_language
以下是一些常见的例子
http://en.wikipedia.org/wiki/Category:Dynamic_programming_languages
回答你原来的问题:
它们很慢,你需要使用基本的文本编辑器来编写它们 - 没有智能感知或代码提示,它们往往是编写和维护的大麻烦。但最着名的一个(javascript)几乎运行在世界上的每一个浏览器上 - 我猜这是件好事。让我们称之为“广泛的兼容性”。我认为您可能会为大多数操作系统获得动态语言解释器,但对于大多数操作系统来说,您肯定无法获得非动态语言的编译器。