【问题标题】:How is the memory allocation done for variables in scripting languages?脚本语言中的变量是如何分配内存的?
【发布时间】:2010-10-09 14:08:11
【问题描述】:

例如,在javascript中

我可以说

var x = 5;

以后我可以做

x = 'a';

然后

x = "hello";

那么,如何为变量分配内存?事实上,所有变量都有一个共同的类型“var”,变量的值可以在运行时改变,如上所示。为这些变量分配和管理内存不是一项艰巨的任务吗?到底是怎么做到的?

【问题讨论】:

标签: javascript memory-management scripting variables


【解决方案1】:

Python 使用一种称为reference counting 的技术,它基本上在值中放置一个计数器。每次创建对值的引用时,计数器都会递增。当对该值的引用丢失时(例如,当您将新值分配给“x”时),该值将递减。当计数器达到零时,这意味着不存在对该值的引用,并且可以将其释放。这是一个简化的解释,但至少是基础知识。

【讨论】:

  • 那么 x 将被视为什么?当我说 x=5 时,它会在分配期间被视为 int 还是 string?类型信息将存储在哪里?
  • 如何分配变量和存储类型信息将是特定于实现的。如果你想了解一种实现是如何做到的,可以下载 Rhino:JavaScript for Java mozilla.org/rhino。
  • 这仅在 CPython 中是正确的,并且也忽略了垃圾收集。你应该修复它。
【解决方案2】:

嗯,那些变量是对在编译时分配的不可变字符串的引用。

当然,这取决于虚拟机,但总的来说,我认为,大多数基于 C 的脚本语言会分配一大块内存,并根据需要对其进行扩展,并在其中进行自己的分配,很少会回馈任何东西操作系统。特别是在几乎所有的词法范围语言中,变量都是在这个块内动态分配的,而不是在类似于 C 堆栈的任何东西上,并且它们通过引用计数或垃圾收集器被释放。

如果您的脚本语言在 JVM、.NET 或类似的东西(Parrot?)上运行,则创建变量只是创建类似 Java 对象的东西。在不再引用该对象一段时间后,垃圾收集器将回收内存。

【讨论】:

  • 除非VM可能会进行逃逸分析,有时无论如何都会在堆栈上分配对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
相关资源
最近更新 更多