2009-05-06 17 views
5

Czy jest możliwe, aby język nieinterpretowany miał kosz na śmieci. Języki interpretowane mają Interpretor uruchamiający Program wiersz po linii, więc Interpretor może równie dobrze udostępniać środowisko wykonawcze z GC. Ale czy możliwe jest posiadanie Garbage Collectora dla dowolnego innego języka bez budowania GC w samym kodzie?Czy język nieinterpretowany może zawierać narzędzie do zbierania śmieci?

+5

Zastanawiam się, czy zakładasz fałszywą dychotomię między "interpretowanym" a "rodzimym". Java i C# na przykład nie są ani "interpretowane" ani "natywne" - działają (zasadniczo) w VM, ale z IL. –

+0

Czy możesz wyjaśnić więcej:? – Geek

+0

W tej rozmowie zobacz komentarze do mojej odpowiedzi. –

Odpowiedz

0

Tak.

C++ z implementacją inteligentnego wskaźnika będzie zbierać śmieci, gdy licznik odwołań do wskaźnika inteligentnego przejdzie do zera.

Masz zbiórkę śmieci. Nie zbudowałeś tego sam.

+1

Myślę, że chodzi o śledzenie zbierania śmieci, a refcount nie jest substytutem. –

+1

To nie jest zbieranie śmieci. Połącz kilka obiektów w taki sposób, aby miały cykl i nigdy nie zostaną zniszczone, chyba że ręcznie przerwiesz cykl. – sharptooth

+0

@sharptooth: weź to z resztą świata, nie ja: http://www.codeproject.com/KB/cpp/automatic_gc_using_sp.aspx –

11

Odśmiecanie wymaga jedynie, aby zmienne wskaźnika były oznaczone specjalną metodą, aby środowisko wykonawcze mogło je zidentyfikować i użyć do usuwania śmieci. Nie ma to nic wspólnego z interpretacją/kompilacją, lecz wymaga specjalnego środowiska wykonawczego i przechowywania dodatkowych danych dla każdej zmiennej.

+0

Dobrze zinterpretowane języki dają ci czas działania. Co więcej, Interpretor może łatwiej pracować jako run-time i uruchamiać także śmieciarze. Każdy język ojczysty będzie miał system operacyjny jako środowisko wykonawcze? A więc nie ma GC? – Geek

+1

GC i interpretacja nie są ze sobą powiązane. Tak, w przypadku języka interpretowanego potencjalnie łatwiej jest zbierać elementy do odśmiecania, ale mogą to również robić języki nieinterpretowane. Zwykle systemy operacyjne nie mają wbudowanej obsługi usuwania pamięci, ale wiele środowisk językowych ma. – sharptooth

+2

Nawet bez zaznaczania zmiennych wskaźnika w specjalny sposób można mieć tak zwaną konserwatywną GC, która traktuje całą zawartość pamięci jako potencjalne wskaźniki. Zobacz odpowiedź Boehm'a w drugiej odpowiedzi. –

6

Cóż, języki .NET (które emitują do IL - C#, VB.NET, MC++, itp.) Nie są interpretowane (szczególnie jeśli używasz NGEN) - i mają pełne usuwanie śmieci.

Podobnie, Java.

+0

Java jest interpretowana jako mój przyjaciel. Nawet jeśli jest z HotSpotem. – Geek

+0

Nie - może nie być "natywny", ale to nie czyni go "interpretowanym" - przynajmniej nie w normalnej definicji. –

+0

Nie odpowiadam na twoją odpowiedź "przynajmniej nie w normalnej definicji"? Jest interpretowany. ?? – Geek

0

Objective-C 2 ma teraz odśmiecanie i dostępne są także biblioteki do zbierania śmieci dla C++.

Myślę, że jest to możliwe tak długo, jak długo istnieje, język pozwala na sprawdzenie obiektów, dzięki czemu można przejść przez drzewo obiektów.

+1

Czy możesz wyjaśnić, jak to działa. To jest jak dołączanie wątku GC razem z twoim programem, nieprawdaż? – Geek

+1

Oddzielny wątek nie ma związku z GC - tak po prostu jest tak, jak robi to Java.Większość C++ (i Objective-C) radzi sobie z tym przy kasowaniu, gdy liczba ref idzie na zero. –

+1

Objective-C 2 ma prawdziwy zbiór śmieci; środowisko wykonawcze przemierza drzewo obiektów. Refcounts są ignorowane, gdy włączone jest usuwanie śmieci. Wierzę, że to część pętli zdarzeń, ale nie jestem pewien. –

2

Nowe C++ 0x zawiera funkcje, które ułatwiają implementację funkcji czyszczenia pamięci. Zobacz na przykład: interview.

3

Haskell ma zbieranie śmieci, czy to skompilowane do kodu natywnego lub interpretowane.

Powiązane problemy