Czy istnieje potrzeba wyrzucania elementów bezużytecznych w języku opartym na stosie?

16

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?

Todd Moses
źródło

Odpowiedzi:

14

GC jest zwykle stosowane do pamięci przydzielonej na stercie. Nie znam Forth ani RPL, ale jeśli nie ma stosu, a zamiast tego wszystko jest przechowywane na stosie globalnym, GC nie ma nic do roboty.

Mike Baranczak
źródło
2
Typowy wzorzec wykorzystania pamięci przez programy Forth, które czytałem na początku, były podobne do programów asemblacyjnych, ponieważ korzystały z wcześniej ustalonych statycznych globalnych adresów danych. Działa to, ponieważ Forth ma możliwość przesyłania danych między stosem a określonymi adresami. Ponadto ma możliwość obliczania adresów. Zatem możliwe byłoby utworzenie biblioteki alokatora w oparciu o koncepcję sterty, a biblioteka alokatora potrzebowałaby jakiegoś sposobu radzenia sobie ze skończonym rozmiarem sterty. Gdyby użytkownik Forth poszedł tą ścieżką, prawdopodobnie mógłby chcieć i wdrożyć GC.
mężczyzna z kosmosu w Cardiff,
13

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 malloclub new, nie ma takich obiektów i nie potrzebujesz deleteani GC.

Język pozbawiony dynamicznej alokacji pamięci ma dość ograniczoną przydatność.

maaartinus
źródło
nie jestem pewien, czy zgadzam się z ostatnim wierszem, czy kod bajtowy Java nie jest przydatny?
jk.
@jk., java bytecode ma dynamiczny przydział pamięci.
Peter Taylor,
1
W rzeczywistości istnieje kilka języków ogólnego przeznaczenia opartych na stosie. Zajrzyj na factorcode.org
Yam Marcovic,
1
W rzeczywistości czynnikiem są śmieci
Andrea
1

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.

przeł
źródło
1

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.

Michael Shopsin
źródło