【问题标题】:Why must dynamically typed languages store variable names as strings?为什么动态类型语言必须将变量名存储为字符串?
【发布时间】:2016-02-06 20:09:20
【问题描述】:

我读到动态类型语言比较慢,因为它们将变量名存储为字符串,但它们不能使用其他东西吗?我问这个问题是对这个问题的跟进:

Why are dynamically typed languages slow?

除了使用名称哈希查找之外,没有其他方法可以访问变量吗?这不是使用模板编程技术的机会吗?

【问题讨论】:

  • 如果你能做到foo = 'bar' + rand(); echo baz[foo];,直到运行时才知道这些,除了某种字符串查找之外,不可能优化它。
  • 我认为要么这个问题的答案不清楚,要么你不明白它的意思。在静态类型语言中,编译器可以在保证的有限时间内进行大量分析。在动态类型语言中,您甚至无法保证可以自动派生每个变量的类型。如果编译器甚至不知道,那么在编译期间对程序进行推理是非常困难的。
  • 所有静态类型语言都编译为动态类型语言(几乎所有的 x86 机器代码和 ARM 机器代码都是动态类型的 - RAM 没有类型 - 但过去有 CPU 已标记内存,其中 RAM 有类型,但它们在市场上是失败的)。即使他们编译成静态类型的语言(JVM 是静态类型的吗?我有疑问)他们运行的是动态类型的 CPU。
  • 另外,x86 程序集、ARM 程序集、PowerPC 程序集、MIPS 程序集、68k 程序集等都是动态类型的。您可以对任何变量执行任何整数或浮点运算。
  • 在有关编程语言的讨论中声称汇编是“动态类型的”是一种误导。动态类型意味着该语言将为您做一些低级的事情,例如将数据复制到不同的内存位置,更改原始值等……这是一个高级概念,指的是一种抽象类型。从这个意义上说,程序集不是动态类型的。它根本没有打字。它有一种类型,原始数据。

标签: types language-agnostic interpreted-language


【解决方案1】:

有几个原因,接下来只是几个。假设有一段代码接收变量x并访问其上的字段foo,一次该变量附加到Bar类型的对象,另一次附加到@类型的对象987654324@,都有其他字段,两者没有关系。访问x.foo 在这两种情况下都是有效的,但是由于类是完全不相关的,所以很难将标识符foo 映射到某个整数,以便以后可以快速访问所需的字段:它的位置和类型可能是不可预料的。为了增加一些现实性,假设系统中可能会出现一些其他类,并且它们也可能具有字段foo

另一种场景与面向对象的方法无关,是在 LISP 和类似语言被发明时学习的。它们不仅可以计算代码中静态写入的内容,还可以在运行时评估一些术语。可以检索术语,例如作为纯字符串,来自外部文件、数据库、网络等,然后用一个特殊的函数解释,通常称为eval。当然,动态计算的项可以指现有的变量。除了他们的名字,别无他法。

但是,在运行时优化某些变量访问似乎是合理的。关键问题是它只能在某些特定情况下完成,而不是像静态类型语言那样大部分时间。

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 2021-11-08
    • 1970-01-01
    • 2019-08-13
    • 2016-08-08
    • 2017-04-17
    • 2019-08-27
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多