Czego potrzeba śmieci (GC) w języku opartym na stosie? Czy w języku takim jak Forth lub RPL (w kalkulatorach HP ) istnieje potrzeba wyrzucania elementów bezużytecznych?
Sądzę, że skoro dane wyjściowe wyskakują ze stosu, nie byłoby takiej potrzeby. Czy coś brakuje?
garbage-collection
stack-oriented
Todd Moses
źródło
źródło
Tak, masz rację. Ale bazowanie na stosie to tylko część całej historii. Na przykład interpreter kodu bajtowego Java jest również oparty na stosie (skompilowany kod działa - ze względów wydajnościowych - inaczej). To mówi nam, że każdy język można przekształcić w język stosu.
Ważne są obiekty spoza stosu, ci, którzy mogą przeżyć bieżące wykonanie metody. Tak długo, jak język nie ma nic podobnego
malloc
lubnew
, nie ma takich obiektów i nie potrzebujeszdelete
ani GC.Język pozbawiony dynamicznej alokacji pamięci ma dość ograniczoną przydatność.
źródło
Wyrzucanie elementów bezużytecznych jest wymagane, jeśli język ma z natury wspierać dynamiczne struktury danych. Co jest niemal koniecznością, jeśli chcesz zrobić coś poza poziomem C. Bez niego utkniesz tylko w strukturach danych o stałej wielkości i samodzielnie zarządzasz pamięcią. Tak właśnie robi oryginalny Forth, ale prawdopodobnie nie jest to coś, co chciałbyś dziś robić, chyba że zajmujesz się jedynie kodowaniem systemów niskiego poziomu.
źródło
Odśmiecanie nie jest potrzebne, jeśli język używa przydziału statycznego zamiast przydziału stosu. Na przykład Fortran 77 z opcją -s (przechowywanie statyczne) przydziela całą pamięć podczas uruchamiania programu, dlatego przy uruchamianiu nie występuje przydział pamięci w celu zwolnienia. Chociaż wymaga to pewnej dyscypliny, możliwe jest pisanie programów, zwłaszcza symulacji w celu użycia statycznej alokacji pamięci. Przydział statyczny usuwa wszelkie wycieki pamięci i prowadzi do doskonałej wydajności pamięci podręcznej, ponieważ kompilator może korzystać z analizy statycznej w celu ustalenia, co załadować do pamięci podręcznej.
źródło