2014-06-14 5 views
5

Я изучаю операционные системы и то, что я не понимаю, это кучи и стеки. Я знаю преимущества и то, как каждый работает, но в случае динамических языков я не могу понять, как распределяется стек.Стек и куча в PHP?

В статических типизированных языках все примитивные типы данных хранятся в стеке, так как они малы и будут освобождены более или менее в том же порядке, в каком они были выделены, однако на таких языках, как PHP, это неизвестно до времени выполнения. Итак, каков размер стека и распределение переменных?

Если я правильно понимаю, размер стека определяется во время компиляции путем анализа количества примитивных типов данных и некоторого смещения. Как процесс выполняется на PHP или других динамических языках?

Если этот вопрос удар в темноте, пожалуйста, дайте мне несколько руководств, как узнать об этом

+1

Я установил динамическое программирование тегов на динамические языки – Jack

ответ

2
  1. Если я правильно понимаю, все типы PHP данных являются zval. И zval основывается на нескольких типах данных «Z» (определенных в C). Существует предельное число «реальных» типов данных. Я считаю, что они хранятся в стеке.

    Так что, хотя пользователи могут создавать новый тип данных, но они не являются «реальными» типами данных, а разными значениями zval. И число и определение «реальных» типов данных стабильны. Таким образом, размер и содержимое стека не будут меняться во время выполнения.

  2. Размер памяти ограничен. PHP должен активно делать reference counting и сбор мусора. Для более подробной информации, пожалуйста, прочитайте this slide about PHP memory management.

1

В случае dynamic programming language, intepreter позаботится об этом. Действие интерпретации примерно похоже на компьютер. Предположим, что C-подобный язык программирования интерпретируется на 32-битной машине:

c = 10;

В основном происходит следующее выражение для каждого, в минимальной интерпретации:

  • интерпретируют неявно вывести c тип переменной как целое число;
  • c идентификатор ставится на symbol table
  • правой стороне выражения вычисляется и результат, связанный с идентификатором c.

И когда вы пишете выражение вроде этого:

a = c * 2 

посмотрите в таблице символов выполняется, ищет c идентификатора, и если найден, то запись из таблицы символов опорного удержания, например, , где наше значение 10 было сохранено в памяти. Это значение 10 загружается, а затем «заменяется» в выражении.

+0

как насчет значений, которые не назначены? – gorgi93

+1

Они все еще живут по памяти. –

+0

как какой тип или тип переменной? – gorgi93