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?