【问题标题】:Which languages are dynamically typed and compiled (and which are statically typed and interpreted)?哪些语言是动态类型和编译的(哪些是静态类型和解释的)?
【发布时间】:2011-01-20 17:30:54
【问题描述】:

在阅读动态和静态类型的过程中,我不断提出这样的假设:静态类型语言是编译的,而动态类型的语言是解释的。我知道总的来说这是对的,但我对例外情况很感兴趣。

我真的希望有人不仅提供这些例外的一些示例,而且尝试解释为什么决定这些语言应该以这种方式工作。

【问题讨论】:

  • 对于同一种语言有许多不同的实现,这种被编译或解释的语言的区别是没有意义的。例如,即使是主要的动态语言,如 groovy、python、lisp、javascript、ruby、lua(Norman 提到)都具有“编译”实现。更糟糕的是,“编译”和“解释”本身的定义有点模糊——我猜你可以调用静态类型的 java 和 jvm 变体解释

标签: programming-languages type-systems dynamic-typing static-typing


【解决方案1】:

Java(一种静态类型语言)被编译为 JVM 字节码,该字节码在旧版本的 JVM 上进行解释,而现在它使用即时 (JIT) 编译,这意味着机器代码是在运行时生成的。我也相信 ML 及其方言可以被解释,而且 ML 肯定是静态类型的。

【讨论】:

  • 据我所知,Java在执行之前一直是编译成字节码的。 (字节码过去由解释器解释,但现在通常由 JIT 编译成机器码。)
【解决方案2】:

这里列出了一些有趣的系统。这不是详尽的!

动态类型和编译

  1. Gambit Scheme 编译器、Chez Scheme、Will Clinger 的 Larceny Scheme 编译器、Bigloo Scheme 编译器,可能还有许多其他编译器。

    为什么?

    很多人都非常喜欢 Scheme。程序作为数据,良好的宏观系统,35年的发展,大社区。但他们想要表现。因此,许多优秀的原生代码编译器——Chez Scheme 甚至是一个成功的商业产品(解释的字节码是免费的;你需要付费的原生代码)。

  2. Lua 的 LuaJIT 即时编译器。

    为什么?

    为了表明它可以做到。然后,人们开始喜欢在他们的 Lua 程序上获得 3 倍的加速。 Lua 存在于很多游戏中,其中性能很重要,而且它也正在渗透到其他产品中。 Adobe Lightroom 中 70% 的代码是 Lua。

  3. iconcIcon-to-C 编译器。

    为什么?

    使用它的五十个人喜欢图标。完全不寻常的评估模型,有史以来设计的最具创新性(在我看来,也是最好的)字符串处理系统。但这种评估模型非常昂贵,尤其是在 1980 年代后期的计算机上。通过将 Icon 编译为 C,Icon Project 使大型 Icon 程序可以在更短的时间内运行。

结论:人们首先开发了一种动态类型语言的附件,并且可能是一个重要的代码库。最终,社区推出了本机代码编译器,以便您获得更好的性能并解决更大的问题。

静态类型和解释

这个类别不太常见,但是...

  1. Objective Caml。机器学习的方言,大量语言设计创新实验的载体。

    为什么?

    非常便携的系统和非常快的编译时间。人们都喜欢这两个属性,因此新的语言设计理念得到了广泛传播。

  2. 莫斯科 ML。标准 ML,具有模块系统的一些额外功能。

    为什么?

    便携,编译速度快,易于制作交互式读取/评估/打印循环。成为流行的教学编译器。

  3. C-Terp。一个旧产品,我想可能来自 Gimpel Software。 Saber C——我认为你再也买不到了。

    为什么?

    调试。特别是在 MS-DOS 下调试 1980 年代的硬件。对于非常少的资源,您可以获得非常好的帮助在非常有限的硬件上调试 C 代码(想想:4.77MHz 处理器,8 位总线,640K RAM 满载)。几乎不可能为本地编译代码获得一个好的可视化调试器,但使用解释器,相当容易。

  4. UCSD Pascal — 使“P 码”成为家喻户晓的词的系统。

    为什么?

    老师们喜欢 Niklaus Wirth 的语言设计,编译器可以在非常小型机器上运行。 Wirth 简洁的设计和 UCSD P 系统形成了无与伦比的组合,而 Pascal 是 1970 年代的标准教学语言。年轻人可能很难理解,在 1970 年代,没有关于在第一门课程中教授什么语言的争论。今天我知道使用 C、C++、Haskell、Java、ML 和 Scheme 的程序。在 1970 年代,它始终是 Pascal,而 UCSD P 系统是一个重要的原因。

    如果您想知道,P 代表 portable

总结:解释静态类型语言是让每个人快速实现实现的好方法。 (它还具有在青铜时代硬件上调试的优势。)

【讨论】:

  • 哇,很棒的答案:D 非常感谢。
【解决方案3】:

Objective-C 已编译并支持动态类型(当然,当通过[target doSomething] 语法调用方法时)。也就是说,您可以向目标发送任何消息(使用普通语言语法,无需针对反射 API 进行编程),仅在编译时收到可能无法处理的警告,并且仅在运行时收到异常(如果目标未处理) ' 不响应该选择器(类似于方法签名);你可以询问任何对象(如果你的代码不知道更好或不在乎,它们都可以是静态类型id)是否respondsToSelector: 来探测它的功能。

【讨论】:

  • 仅供参考。实际上,在大多数情况下,Objective-C 类默认是完全动态类型的。
【解决方案4】:

Actionscript 具有动态类型并编译为字节码。

如果您想在 iPhone 上发布 Flash 应用程序,它甚至可以直接编译为本机机器代码。

【讨论】:

    【解决方案5】:

    Python 是一种具有编译器的动态语言。

    例如,参见this SO question - Python - why compile?

    一般来说,编译会使程序运行得更快。

    【讨论】:

    • 但仍然在解释器中运行,因为它没有编译成机器语言,而是编译成只能由 python 虚拟机(又名解释器)运行的特殊字节码
    • Java、C# 和其他 .NET 语言也是如此。它们仍然被认为是已编译的,即使是字节码。
    • 这很有趣。我猜字节码模糊了编译和解释之间的区别。
    • 任何语言都可以编译成介于“去掉空格”和“机器码”之间的任何形式,与类型系统无关。
    • .NET 字节码不被解释,它被进一步编译为本机代码(NetMF 是一个例外吗?)。 Java 不是 .NET 语言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2016-09-26
    • 2011-05-20
    相关资源
    最近更新 更多