2014-06-14 17 views
5

Uczyłem się o systemach operacyjnych i rzeczy, których nie rozumiem dokładnie są stosy i stosy. Znam zalety i sposób ich działania, ale w przypadku języków dynamicznych nie wiem, w jaki sposób przydzielany jest stos.Stos i sterty w PHP?

W językach statycznych wszystkie prymitywne typy danych są przechowywane na stosie, ponieważ są małe i zostaną zwolnione mniej więcej w takiej samej kolejności, w jakiej zostały przydzielone, jednak w językach takich jak PHP nie jest to znane aż do czasu wykonywania. W jaki sposób jest możliwy rozmiar stosu i alokacja zmiennych?

Jeśli dobrze rozumiem, rozmiar stosu jest określany na podstawie czasu kompilacji, analizując liczbę pierwotnych typów danych i pewne przesunięcie. Jak przebiega proces w PHP lub innych dynamicznych językach?

Jeśli to pytanie jest kopnięcie w ciemności, proszę dać mi kilka wskazówek, jak się uczyć o tym

+1

Naprawiłem dynamiczne programowanie tagów na języki dynamiczne – Jack

Odpowiedz

2
  1. Jeśli rozumiem go poprawnie, wszystkie typy danych PHP są zval. I zval opiera się na kilku typach danych "Z" (zdefiniowanych w C). Istnieje limit liczby "prawdziwych" typów danych. Uważam, że są przechowywane w stosie.

    Tak więc, mimo że użytkownicy mogą tworzyć nowy typ danych, ale nie są to "rzeczywiste" typy danych, ale różne wartości zval. Liczba i definicja "prawdziwego" typu danych są stabilne. W związku z tym rozmiar i zawartość stosu nie ulegnie zmianie w czasie wykonywania.

  2. Rozmiar pamięci jest ograniczony. PHP musi aktywnie wykonać reference counting i wyrzucać śmieci. Aby uzyskać więcej informacji, przeczytaj this slide about PHP memory management.

1

W przypadku dynamic programming language, opiekun się tym zajmuje. Akt interpretacyjny jest z grubsza podobny do komputera. Załóżmy, że język programowania interpretowany w stylu C działa na 32-bitowej maszynie:

c = 10;

Zasadniczo dodaje się dzieje każdego słowa, w minimalnej interpretować:

  • Interpretuj domyślnie wywnioskować c typu zmiennego jako całkowita;
  • c identyfikator jest umieścić na symbol table
  • prawej stronie wyrażenia jest oceniany, a wynik jest powiązany c identyfikator.

A kiedy piszesz wyrażenie takiego:

a = c * 2 

zapoznać się w tablicy symboli jest wykonywana, szuka identyfikatora c i jeśli znajdzie, ten wpis z tabeli symbol odniesienia hold np , gdzie nasza wartość 10 została zapisana w pamięci. Ta wartość 10 jest ładowana, a następnie "zastępowana" w wyrażeniu.

+0

co z wartościami, które nie są nieprzypisane? – gorgi93

+1

Nadal żyją w pamięci. –

+0

jako rodzaj lub typ zmiennej? – gorgi93