9

在编写解释型语言时,弱类型和强类型哪个更快?

我想知道这一点,因为通常更快的动态类型解释语言(Lua,Javascript),事实上大多数解释语言都使用弱类型。

但另一方面,强类型提供了保证弱类型不提供的保证,那么,优化技术是否可以用于一种无法用于另一种的优化技术?


对于强类型,我的意思是类型之间没有隐式转换。例如,这在强类型语言中是非法的,但在弱类型语言中(可能)是合法的:"5" * 2 == 10. 尤其是 Javascript 因这些类型转换而臭名昭著。

4

2 回答 2

3

在我看来,由于缺乏“强类型解释语言”(使用我从问题评论中理解的定义),这个问题很难用明确的例子来回答。

我想不出任何可以解释且没有隐式转换的语言。我认为这有两个原因:

  1. 解释语言往往不是静态类型的。我认为这是因为如果你要实现一种静态类型的语言,那么从历史上看,编译相对容易,并且会给你带来显着的性能优势。

  2. 如果一种语言不是静态类型的,那么它就会被迫进行隐式转换。替代方案会让程序员的生活变得太难(他们必须跟踪类型,在源代码中不可见,以避免运行时错误)。

因此,在实践中,所有解释语言都是弱类型的。但是性能增加或减少的问题意味着与一些没有的比较。至少,如果我们想讨论不同的现有实施策略,它确实如此。

现在你可能会回答“好吧,想象一个”。好的。因此,您要求在运行时检测到转换需要的代码与程序员明确添加转换的代码之间的性能差异。在这种情况下,您正在比较动态检测转换需求和调用程序员指定的显式函数之间的区别。

从表面上看,检测总是会增加一些开销(在 [后期] 编译的语言中,可以通过 jit 改善,但你问的是解释器)。但是如果你想要快速失败的行为(类型错误),那么即使是显式转换也必须检查类型。所以在实践中,我想差异相对较小。

这又回到了原点——因为弱类型的性能成本很低(考虑到问题中的所有其他约束/假设),并且替代方案的可用性成本很高,大多数(所有?)解释语言支持隐式转换。

[对不起,如果我还是不明白。我担心我错过了一些东西,因为这个问题 - 以及这个答案 - 似乎并不有趣......]

[编辑:也许一个更好的方式来询问相同(?)的事情就像“动态(后期绑定?)语言处理类型转换的各种方式的比较优势/劣势是什么?” 因为我认为您可能会争辩说 python 的方法特别强大(富有表现力),同时与其他解释语言具有相似的成本(并且这个问题避免了争论 python 或任何其他语言是否是“弱类型”)。]

于 2012-03-10T14:58:58.277 回答
1

对于强类型,我的意思是类型之间没有隐式转换。

"5" * 2 == 10

问题是“弱类型化”不是一个定义明确的术语,因为这种“隐式转换”可以通过两种截然不同的方式发生,它们对性能的影响几乎相反:

  • “脚本语言方式”:值具有运行时类型,并且当操作需要不同类型时,语言隐式应用语义规则在类型之间进行转换(例如将二进制数格式化为十进制字符串)。这往往会降低性能,因为它 A) 需要在运行时有类型信息,并且 b) 需要检查此信息。这两个要求都会引入开销。
  • “C 方式”:在运行时,一切都只是字节。如果您可以说服编译器在字符串上应用一个采用 4 字节整数的操作,那么根据您的操作方式,该字符串的前 4 个字节将被简单地视为它们是一个(可能非常大) 整数,否则会出现缓冲区溢出。或者恶魔从你的鼻子里飞出来。这种方法不需要开销,并导致非常快的性能(以及非常惊人的崩溃)。
于 2012-03-10T15:15:23.980 回答