Zupełnie nie rozumiem, czemu na Wykop trafił artykuł o odśmiecaniu pamięci w Pythonie, wiem za to, że jest to świetna okazja, żeby się nad nim nieco popastwić. Zacznijmy od tego, że Python nie kończy się niemą samogłoską i nie odmieniamy go z apostrofem.
W przydługim wstępie do jeszcze dłuższego tekstu czytamy, że Python jest językiem. Świetnie. Zastanawiam się w tym momencie, jaki jest target audience
owego dzieła, zanosi się bowiem na wykład dla początkujących. Po przecinku atakuje nas jednak automatyczna alokacja pamięci (i co to właściwie znaczy automatyczna
— alokacja następuje wtedy, kiedy programista tworzy nowy obiekt).
Atakuje bez uprzedzenia, wypadałoby chociaż wspomnieć, że w językach niższego poziomu istnieją specjalne operatory i wymagane jest jawne zarządzanie zasobami. W Pythonie (w Javie, PHP…) nie jest wymagane jawne usuwanie obiektów, to prawda. Nie zgodzę się jednak z podsumowaniem, że główną zaletą tego rozwiązania jest fakt, że programiści nie muszą się martwić o zabezpieczenie pamięci.
Główną zaletą posiadania dużego trawnika nie jest możliwość rzadszego sprzątania po swoim psie, tak zbieranie psich bobków, jak pilnowanie zakresów buforów jest świętym obowiązkiem programisty i żaden język go w tym nie wyręczy. Autor tego akapitu chyba nigdy nie próbował napisać w C odpowiednika alaMaKota = ' '.join(('Ala', 'ma', 'kota')), gdyby spróbował, to wiedziałby, co jest główną zaletą. Przejrzystość kodu.
Podsumowując wstęp, Python nie jest wymarzonym narzędziem dla programisty.
Python jest jednym z języków i — jak każdy z języków (nie zaczynających się słowem visual
) — nadaje się do jednych rzeczy, a nie nadaje do innych. Nie wiem też, jakie powinienem mieć oczekiwania względem procesu śmieciarza, ale praktyka każe mi usuwać duże zbędne obiekty niezależnie od używanego języka.
Dalej mamy całą masę oderwanej od przykładów teorii. Wystarczyłoby powiedzieć, że z odśmiecaniem pamięci wiążą się trzy potencjalne problemy:
- fragmentacja pamięci, która powoduje, że tworzenie dużych ciągłych struktur staje się bardzo kosztowne,
- wykrywanie wysp, czyli obiektów odwołujących się do siebie nawzajem, ale oderwanych od aktualnego stanu programu,
- przechowywanie obiektów, które często zmieniają swój rozmiar, na przykład typów numerycznych o nieskończonej precyzji.
Resztę można sprowadzić do stwierdzenia (którego w artykule brak, co oznacza, że ze swoim tytułem nie ma nic wspólnego), że CPython radzi sobie z wszystkimi trzema wymienionymi powyżej. Ni więcej, ni mniej. Żadnej alokacji, dzielenia stosu ani tablic uchwytów przywoływać tu nie trzeba, bo — za przeproszeniem — robi się burdel, a nic z tego nie wynika.
Podsumowując, możesz w Pythonie programować tak samo jak w Javie albo Rubym i wcale nie musisz z głowy recytować algorytmu śmieciarza. Genialne, tylko o czym był ten artykuł i po co trafił na Wykop?

Trzeci akapit, drugie zdanie - nie chodziło czasem o ’stertę’ [heap]? Bo wydaje mi się, że ‘automatyczne’ usuwanie obiektów ze stosu to ma ‘nawet’ C.
Przykład z przejrzystością kodu jest średni, powiem szczerze, że nie wiem co on robi, domyślam się, że łączy elementy podanej tablicy znakiem spacji w jeden string. I naprawdę, żeby to zrobić wykonuje się metode znaku [ew. stringu]? Cóż, jak dla mnie to powinna być metoda tablicy stringów, ze znakiem jako parametrem…
GC - fajna zabawka, ale myślę, że dobre programy z niej w ogóle nie korzystają. To nie jest wielki wysiłek stworzyć aplikacje tak, żeby wiedzieć gdzie tworzone dynamicznie obiekty kończą swoją przydatność i mogą być usunięte…
Nivertius:
Tam wcale nie powinno być stosu, tylko pamięć, ale pisałem to w środku nocy.
Przykład z przejrzystością - ten kawałek kodu jest bzdurny, ale spróbuj napisać to samo w C (z dynamicznym złączeniem wektora asciiz).
Co to znaczy, że dobre programy nie korzystają z cechy języka?
PS: Jakbyś nie zauważył, to powyższy tekst jest narzekaniem na inny tekst.
Dlaczego trafił na Wykop? Idiotyczne pytanie. Bo mógł :)
Patrys:
Napisać to samo w C - zawsze możesz sobie to opakować w funkcje ładną, albo ściągnąć pakiet odpowiedni, albo nie być masochistą i nie korzystać z C ;->
Tak czy owak join(char**, int, char) do mnie bardziej przemawia niż ta metoda.
Poprawka do ‘dobrych programów’: Mój błąd, myślałem, że w Javie/Pythonie GC nie zajmuje się usuwaniem obiektów explicite, ani po wyjściu ze scope, wydawało mi się, że działa w trybie ’search & destroy’ na obiektach bez referencji. Tak więc korekta: Dobre programy nie posiadają deallokacji implicite nigdzie poza wyjściami ze scope [i chyba powiedziałem gdzieś jeszcze, ale już nie pamiętam].
PS. Spoko, widzę. Ja tak dla poprawności ;-)
Wykop ostatnimi czasy jest coraz bardziej podobny do pudelka.