Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

Nenápadná revoluce v programování

Revolucia Budet! Je to revoluce v programování. Zásadní průlom. Dramaticky urychlí vývoj aplikací. Ušetří spoustu času. A přišla tak tiše a nenápadně, bez fanfár a potlesku.

Vlastně jsem si její přítomnost uvědomil až nedávno. Po delší době programování v PHP a JavaScriptu jsem potřeboval napsat něco v Delphi. To, že jsem měl tendenci psát v podmínkách == místo = a volat funkce bez parametrů jako foo(); namísto foo; jsou drobnosti (potěšilo mě, že ` foo()` Delphi zkousne). Tím, co mi v Delphi skutečně chybělo, byla Automatická Správa Paměti. Ona je tou tichou revolucí.

Přehlídla revolucí

Za svůj krátký život jsem už pár softwarových revolucí zažil. První byl asi příchod OOP. Bylo to roku 1989, za oknem zuřila totalita a já si v teple domova četl samizdatové vydání referenční příručky k Turbo Pascalu 5.5. Tehdy jsem se zajímal o tvorbou vizuálních aplikačních rozhraní (menu, okénka, atd) a OOP k tomu bylo jako dělané. Jen podotýkám, že tehdy vládl DOS, knihovny Turbo Vision neexistovaly a kdo chtěl mít v programu menu, okno nebo nedej bože myš, musel si to od píky naprogramovat sám.

Pamatuji si, že OOP v té době hodně schopných programátorů vůbec nepochopilo. Zůstali u svých osvědčených postupů a vystačí si s nimi dodnes.

Svým způsobem další revolucí bylo hromadné tažení směrem na Windows. Kdo tehdy nezvládl předělat svou aplikaci do okénkového prostředí Windows 3.1, skončil v propadlišti dějin. V této bitvě padlo několik „neporazitelných“ softwarových gigantů a z jejich popela povstali noví bojovníci. Tehdy Microsoft prosadil svůj balík Office a porazil konkurenci v podobě Lotus 1–2–3 a WordPerfect.

Byla to hodně krvavá revoluce, síto budoucích dějin.

Jak šel čas dál, počítače se začaly spojovat do sítí, Windows se naučily multithreading a programování se zase posunulo jinam. Časem Internet úplně zdomácněl, SQL server se stal vedle pizzy dalším příručním doplňkem aplikačního programátora, vznikla a zanikla spousta nových technologií a programovacích technik.

Automatická Správa Paměti

A. Správa: Paměti Jenže automatická správa paměti (dále GC) je revoluce jako hrom. Ale nepíší se o něm desítky příruček, nepořádají se výukové kurzy „Jak pochopit a správně používat GC“. GC je totiž natolik intuitivní a samozřejmé, že jej není třeba vyučovat.

O co jde? V PHP, JavaScriptu, Javě, .NET můžete alokovat kus paměti (třeba pro pole hodnot) a nemusíte se starat o to, kdy a jak ji uvolnit. Možná Vám pojem „uvolnění paměti“ vůbec nic neříká, protože prostě znáte jen ty jazyky, které GC umí. Podstatné je, že používám těchto jazyků dosáhnete mnohem vyšší tvůrčí výkonnosti.

Když někdo pátrá po důvodech obrovské popularity interpretovaných jazyků, jakými jsou třeba zmíněné PHP nebo VisualBasic, tak zjistí, že programátoři s nimi dosáhnu mnohem dříve kýženého výsledku. Jak je to možné? Je to díky bohatým knihovnám funkcí? Kvůli jednodušší syntaxi? Kdepak… Jsem přesvědčen, že je to díky automatické správě paměti.

Příklad

Vezměme si tyto dvě funkce

function foo() {
  alokuje pole a ukazatel
}

function sum(pole) {
  součet položek v poli.
}

celkem = sum(foo())

Volání sum(foo()) označí zkušený céčkový programátor za vážnou chybu. Protože paměť alokovanou ve funkci foo() je třeba někde zase uvolnit. Jiný návrhář označí za vadu už to, že foo() vůbec nějakou paměť alokuje. Zastává totiž teorii, že paměť by měla alokovat ta funkce, který ji i uvolní. Takto fungují třeba funkce z Windows API a ty je proto nutné často volat dvakrát: poprvé s dotazem, kolik paměti potřebuje k uložení výsledku, poté paměť alokovat a pak podruhé, aby výsledek vrátila.

A ještě je třeba paměť uvolnit. Tedy musí se najít všechna místa, kde se může funkce ukončit, aby se před tím uvolnila paměť. Programátor zkrátka věnuje spoustu času správě paměti, zatímco hlavní úkol ustupuje do pozadí.

Oproti tomu v PHP stačí napsat jen ono `celkem = sum(foo()) `.

Programovací jazyky & auta

Kdo vyzkoušel automatiku, nechce už bez ní jezdit. Přitom nejvíc na ni nadává ten, kdo ji v životě nevyzkoušel ;-)

Komentáře

  1. MaD http://mad.bloguje.cz #1

    V zásadě souhlas, jen pár poznámek.
    Spousta jazyků nemá GC plně funkční (ze zde zmiňovaných určitě Visual Basic (6 a starší), myslím že i PHP a JavaScript) – nejsou schopny se vyrovnat se situací, kdy se dva objekty odkazují na sebe navzájem.
    S vhodnou knihovnou naopak může jako plně GC jazyk fungovat i C++ a dokonce existuje implementace GC funkční i pro jazyk C (libgc).
    Není také úplně pravda, že je automatická správa paměti vždycky jen příjemná, občas dokáže práci zkomplikovat (v .NETu jsem třeba dodněška nepřišel na způsob, jak rozumně řídit životnost COMových objektů, což leckdy dost vadí).

    před 12 lety | reagoval [2] Rene
  2. Rene http://blog.vyvojar.cz/rene #2

    #1 MaDe, Vyborny clanek;) I kdyz OOP je revoluce, kterou bych s GC revoltou zase tak jednoduse nesrovnaval:)

    To MaD: U VB6 bych ani o Garbage Collectoru nemluvil, jedna se o parodii na uklid pameti doplnenou o nepirlis dokonaly reference counting COM objektu,
    Ad uvolnovani COM objektu v Netu: V 99% pripadu nemam problem s uvolnovanim objektu pres Marshal.ReleaseComObject.
    Nektere COM objekty (typicky Excel nevhodne nasazeny v serverovem scenari) je nutne zrychlit uvolnovani COM objektu a wrapperu vlastnim volanim GC.Collect()

    před 12 lety
  3. Mormegil #3

    Jo souhlas; dokonce IMHO je mozna masivnejsi nasazeni GC vetsi zmena nez prichod OOP jako takovy (tady je ta revoluce IMHO spis ve zmene celeho navrhoveho procesu, ta ovsem s OOP primo nesouvisi, stejne dobre by se to dalo delat v jinem paradigmatu); vsimnete si, ze nerikam revoluce, GC uz je tady sakra dlouho na to, aby to byla revoluce, ted se uz „jenom“ da konecne pouzivat.

    Ale jako zastance Delphi si dovolim drobnou poznamecku: ten neprijemny pocit pri prechazeni PHP (apod.)->Delphi (apod.) taky souvisi s tim, ze si clovek zvykne na volnejsi styl, ale kdyz v Delphi dela, tak ho proste nektere konstrukce ani nenapadnou, vyresi to stejne dobre jinak i bez potreby GC.

    před 12 lety
  4. PJT #4

    A ted co je ucelem? Napsat 1× pracne program, ktery potom stovkam lidi tisickrat dobre a rychle funguje, nebo napsat 1× rychle program, ktery potom stovkam lidi tisickrat funguje pomalu? Uz je z principu interpretu, kdy mezi instrukci procesoru a instrukci interpretu je mnohem vice vrstev? Neni to jen projev samolibosti programatoru, kteri jsou lini jit vic do hloubky? Oni nas pak nuti sedet u kompu a cekat neskutecnou dobu na primitivni operaci, pricemz pocitac na stole ma desetitisickrat vyssi vykon nez stroj ktery tutez operaci pred par lety zvladal za polovicni dobu…

    před 10 lety
  5. Your nightmare #5

    Nepise se „od píky“ ale od pica. Mili, micro, nano, pico !

    před 9 lety
  6. Your nightmare #6

    pan DGX nejspise nezna rozdil mezi Garbage Collector a Automatic Memory Manager, to je typicky nedostatek, kterym trpi lide studujici z nekvalitnich === ceskych materialu.

    Dukaz: k cemu ti bude GC, kdyz budes muset pred kazdym uzitim pChar manualne volat malloc() ?

    před 9 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.