40

在我阅读动态和静态类型时,我一直反对静态类型语言被编译,而动态类型语言被解释的假设。我知道总的来说这是正确的,但我对例外情况很感兴趣。

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

4

5 回答 5

38

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

动态类型和编译

  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. iconc Icon -to-C 编译器。

    为什么?

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

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

静态类型和解释

此类别不太常见,但...

  1. 客观凸轮。机器学习的方言,语言设计中大量创新实验的载体。

    为什么?

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

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

    为什么?

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

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

    为什么?

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

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

    为什么?

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

    如果您想知道,P 代表便携式

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

于 2010-02-25T03:42:35.893 回答
3

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

于 2010-02-24T21:26:29.633 回答
2

Java (a statically typed language) is compiled to JVM bytecode, which was interpreted on older versions of the JVM, whereas it now uses Just In Time (JIT) compilation, meaning machine code is generated at runtime. I also believe ML and its dialects can be interpreted, and ML is definitely statically typed.

于 2010-02-24T21:07:21.010 回答
0

Python is a dynamic language that has compilers.

See this SO question - Python - why compile?, for instance.

In general, compiling makes the program run much faster.

于 2010-02-24T21:05:04.463 回答
0

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

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

于 2010-02-24T21:15:17.750 回答