Po przejrzeniu kilku odpowiedzi na temat przepełnienia stosu jest jasne, że niektóre natywnie skompilowane języki mają funkcję usuwania śmieci . Ale nie jest dla mnie jasne, jak dokładnie by to działało.
Rozumiem, jak wyrzucanie elementów bezużytecznych może działać z interpretowanym językiem. Śmieciarka po prostu działałaby obok interpretera i usuwała nieużywane i nieosiągalne obiekty z pamięci programu. Oboje biegną razem.
Jak by to działało z skompilowanymi językami? Rozumiem, że kiedy kompilator skompiluje kod źródłowy do kodu docelowego - w szczególności macierzystego kodu maszynowego - jest to gotowe. Jego praca jest skończona. Jak więc skompilowany program może być również usuwany?
Czy kompilator działa w jakiś sposób z procesorem, gdy program jest wykonywany w celu usuwania obiektów „śmieciowych”? Czy też kompilator zawiera minimalny moduł wyrzucania elementów bezużytecznych w pliku wykonywalnym skompilowanego programu.
Uważam, że moje drugie stwierdzenie miałoby większą ważność niż poprzednie z powodu tego fragmentu tej odpowiedzi na temat przepełnienia stosu :
Jednym z takich języków programowania jest Eiffel. Większość kompilatorów Eiffla generuje kod C ze względu na przenośność. Ten kod C służy do tworzenia kodu maszynowego przez standardowy kompilator C. Implementacje Eiffla zapewniają GC (a czasem nawet dokładne GC) dla tego skompilowanego kodu i nie ma potrzeby używania VM. W szczególności kompilator VisualEiffel generował natywny kod maszynowy x86 bezpośrednio z pełną obsługą GC .
Ostatnia instrukcja wydaje się sugerować, że kompilator zawiera jakiś program w końcowym pliku wykonywalnym, który działa jako śmieciarz podczas działania programu.
Strona na stronie D języka na temat wyrzucania elementów bezużytecznych - która jest natywnie skompilowana i ma opcjonalny moduł wyrzucania elementów bezużytecznych - również wydaje się sugerować, że jakiś program działający w tle działa obok oryginalnego programu wykonywalnego w celu wdrożenia wyrzucania elementów bezużytecznych.
D jest językiem programowania systemowego z obsługą odśmiecania. Zwykle nie jest konieczne jawne zwalnianie pamięci. Po prostu przydziel w razie potrzeby, a moduł odśmiecania będzie okresowo zwracał całą nieużywaną pamięć do puli dostępnej pamięci.
Jeśli metoda wspomniano powyżej jest używany, jak dokładnie to działa? Czy kompilator przechowuje kopię jakiegoś programu do czyszczenia pamięci i wkleja go do każdego generowanego przez siebie pliku wykonywalnego?
Czy też mam błędne myślenie? Jeśli tak, to jakie metody są używane do implementacji czyszczenia pamięci dla skompilowanych języków i jak dokładnie by one działały?
malloc()
.