Optimization 弱键入是性能提高还是降低?

Optimization 弱键入是性能提高还是降低?,optimization,typing,scripting-language,Optimization,Typing,Scripting Language,在编写解释语言时,弱类型还是强类型更快 我想知道这一点,因为通常更快的动态类型解释语言(Lua、Javascript),事实上大多数解释语言都使用弱类型 但另一方面,强类型提供了弱类型不能提供的保证,那么,优化技术是否可以用于一种类型而不能用于另一种类型呢 对于强类型,我的意思是类型之间没有隐式转换。例如,这在强类型语言中是非法的,但在弱类型语言中(可能)是合法的:“5”*2==10。尤其是Javascript在这些类型转换方面臭名昭著。在我看来,由于缺乏“强类型解释语言”(使用我从问题注释中

在编写解释语言时,弱类型还是强类型更快

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

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



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

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

我想不出有哪种语言是经过解释的,并且没有隐式转换的。我认为这有两个原因:

  • 解释语言往往不是静态类型的。我认为这是因为如果要实现一种静态类型的语言,那么从历史上看,编译是相对容易的,并为您提供了显著的性能优势

  • 如果一种语言不是静态类型的,那么它将被迫进行隐式转换。另一种选择将使程序员的生活变得太艰难(他们必须跟踪类型,在源代码中不可见,以避免运行时错误)

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

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

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

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

    [如果我仍然不理解,很抱歉。我担心我遗漏了一些东西,因为这个问题——以及这个答案——似乎不有趣……]

    [编辑:问相同(?)问题的更好方式可能是“动态(后期绑定?)语言处理类型转换的各种方式的比较优势/劣势是什么?”因为我认为你可能会认为python的方法特别强大(表达性),但与其他解释语言的成本类似(而且这个问题避免了争论python或任何其他语言是否为“弱类型”。]

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

    “5”*2==10

    问题在于,“弱类型”不是一个定义良好的术语,因为有两种非常不同的方式可以发生这种“隐式转换”,这对性能的影响几乎相反:

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

    +1这是一个有趣的问题,尽管我担心一般来说很难回答。我期待着看到关于解释器优化的血淋淋的细节。只是想澄清一下,你说的弱类型和强类型是什么意思?(我尽量避免使用这些术语——人们以许多不兼容的方式使用它们。)强类型,因为在类型之间没有隐式转换。例如,这在强类型语言中是非法的,但在弱类型语言中(可能)是合法的:
    “5”*2==10
    。尤其是Javascript,它因这些类型转换而臭名昭著。编辑:将其添加到问题中。现在大多数现代JavaScript引擎不再进行解释,而是直接编译成字节码。所以很难将这个问题应用到语言中。这个问题在两个方面都没有意义。首先:执行隐式转换时会产生隐式转换的开销。无论语言是否支持隐式转换,不执行任何此类隐式转换的程序都是相同的。因此,您的问题就像询问具有内置反正切函数的编程语言是否比不具有内置反正切函数的编程语言慢。第二:执行