在我关于动态和静态类型的阅读中,我不断反对编译静态类型语言的假设,同时解释动态类型语言。我知道一般来说这是事实,但我对例外感兴趣。
我真的希望有人不仅可以提供这些例外的一些例子,而是试图解释为什么决定这些语言应该以这种方式运作。
答案 0 :(得分:35)
这是一些有趣系统的列表。 不详尽无遗!
Gambit Scheme编译器,Chez Scheme,Will Clinger的Larceny Scheme编译器,Bigloo Scheme编译器,可能还有很多其他编译器。
为什么?
很多人都非常喜欢Scheme。作为数据的程序,良好的宏观系统,35年的发展,大社区。但他们想要表现。因此,许多优秀的本机代码编译器 - Chez Scheme甚至是一个成功的商业产品(解释的字节码是免费的;您支付的本机代码)。
Lua的LuaJIT即时编译器。
为什么?
表明可以做到。然后,人们开始喜欢在他们的Lua程序上获得3倍的加速。 Lua参与很多游戏,性能很重要,而且它也在逐渐渗透到其他产品中。 Adobe Lightroom中70%的代码是Lua。
iconc
Icon - to-C编译器。
为什么?
使用它的五十个人喜欢图标。完全不同寻常的评估模型,最具创新性(在我看来,最好的)字符串处理系统。但是这种评估模型非常昂贵,特别是在20世纪80年代后期的计算机上。通过将Icon编译为C,Icon Project使大型Icon程序可以在更短的时间内运行。
结论:人们首先开发动态类型语言的附件,可能是一个重要的代码库。最终,社区吐出一个本机代码编译器,以便您可以获得更好的性能并解决更大的问题。
此类别不太常见,但......
Objective Caml。 ML方言,语言设计创新实验批次的载体。
为什么?
非常便携的系统和非常快的编译时间。人们喜欢这两种属性,因此新的语言设计思想被广泛传播。
莫斯科ML。标准ML具有模块系统的一些额外功能。
为什么?
便携,快速的编译时间,易于进行交互式读/评估/打印循环。成为一个受欢迎的教学编译器。
C-TERP。我认为可能来自Gimpel Software的旧产品。 Sabre C-a产品我认为你不能再买了。
为什么?
调试。特别是,在MS-DOS下调试20世纪80年代的硬件。对于非常少的资源,你可以在非常有限的硬件上调试C代码得到很好的帮助(想想:4.77MHz处理器带有8位总线,640K的RAM满载)。几乎不可能为本机编译的代码获得良好的可视化调试器,但使用解释器相当容易。
UCSD Pascal--使“P代码”成为家喻户晓的系统。
为什么?
教师喜欢Niklaus Wirth的语言设计,编译器可以在非常小型机器上运行。 Wirth的简洁设计和UCSD P系统是无与伦比的组合,Pascal是20世纪70年代的标准教学语言。年轻人可能会发现很难理解在20世纪70年代,在第一门课程中,对于教授什么语言存在 no 的争论。今天我知道使用C,C ++,Haskell,Java,ML和Scheme的程序。在20世纪70年代,它总是帕斯卡尔,而加州大学圣地亚哥分校的P系统是一个很重要的理由。
如果您想知道,P代表便携式。
摘要:解释静态类型语言是快速实现每个人手中的一种很好的方法。 (它也有利于青铜时代硬件的调试。)
答案 1 :(得分:3)
编译Objective-C并支持动态类型(当然通过[target doSomething]
语法调用方法时)。也就是说,您可以向目标发送任何消息(使用普通语言语法,无需针对反射API进行编程),在编译时仅接收可能无法处理的警告,并且仅在运行时接收异常(如果目标不存在)不响应那个选择器(这就像一个方法签名);并且您可以询问任何对象(如果您的代码不知道更好或不关心,可以都是静态类型id
)是否respondsToSelector:
来探测其功能。
答案 2 :(得分:2)
Java(一种静态类型语言)被编译为JVM字节码,该字节码在较旧版本的JVM上进行了解释,而现在使用Just In Time(JIT)编译,这意味着机器代码是在运行时生成的。我也相信ML及其方言可以被解释,ML绝对是静态类型。
答案 3 :(得分:1)
Actionscript具有动态类型并编译为字节码。
如果您想在iPhone上发布Flash应用程序,它甚至可以直接编译为本地机器代码。
答案 4 :(得分:0)