Как происходит распределение памяти для переменных в языках сценариев? - PullRequest
6 голосов
/ 24 февраля 2009

Например, в JavaScript

Я могу сказать

var x = 5;

Позже я могу сделать

x = 'a';

, а затем

x = "hello";

Итак, как распределяется память для переменных? Так как все переменные имеют общий тип 'var', значения переменных могут меняться во время выполнения, как показано выше. Разве это не трудная задача выделить и управлять памятью для этих переменных? Точно, как это сделано?

Ответы [ 3 ]

3 голосов
/ 24 февраля 2009

Python использует метод, называемый подсчет ссылок , который в основном устанавливает счетчик в значение. Каждый раз, когда создается ссылка на значение, счетчик увеличивается. Когда ссылка на значение теряется (например, когда вы присваиваете новое значение 'x'), значение уменьшается. Когда счетчик достигает нуля, это означает, что ссылки на значение не существует, и оно может быть освобождено. Это упрощенное объяснение, но это, по крайней мере, основы.

1 голос
/ 24 февраля 2009

Может быть, эта ссылка дает больше понимания, по крайней мере, со стороны JavaScript.

0 голосов
/ 24 февраля 2009

Ну, эти переменные являются ссылками на неизменяемые строки, которые выделяются во время компиляции.

Конечно, это зависит от виртуальной машины, но в целом, я думаю, что большинство языков сценариев на основе C выделяют большой блок памяти, расширяя его по мере необходимости и самостоятельно выделяя его, редко, если вообще когда-либо возвращают что-либо O / S. Особенно в лексически ограниченном языке, которым почти все они являются, все переменные распределяются динамически в этом блоке, а не на чем-либо аналогичном стеку C, и они освобождаются либо с помощью подсчета ссылок, либо с помощью сборщика мусора.

Если ваш язык сценариев работает на JVM, или .NET, или что-то в этом роде (Parrot?), Создание переменной - это просто создание чего-то похожего на объект Java. Через некоторое время после того, как больше не будет ссылок на объект, сборщик мусора освободит память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...