Ach ta evoluce...
Nemyslím teď evoluci biologickou, ale technologickou. Jakmile se totiž jednou něco v informatické branži chytí, nejde to vzít zpátky, i když se zjistí, že je to úplně špatně. Kompatibilita je kámen úspěchu. A pokus vnutit uživatelům něco, co je "nové a lepší" selhávají. Takže se rozšiřuje to staré.
Popravdě řečeno, myšlenky v minulém odstavci ve mě vyvolal pohled do logu serveru, na kterém běží tyto stránky – našel jsem tam totiž takovýto řetězec jako user-agent (pro méně znalé: user-agent je identifikace prohlížeče přistupujícího na stránky):
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125
Nádherně je na něm vidět, jak postupovala evoluce webových pohlížečů. Kdysi dávno tu byl Mosiac. Když o něco později vznikl Netscape, používal jako svou identifikaci řetězec "Mozilla/x.y" a dodatečné informace byly v závorce. I stalo se, že stránky se začaly řídit podle user-agenta a občas nabízely jiný obsah pro Netscape (uměl toho víc) a jiný pro ostatní prohlížeče.
Když pak vstoupil do hry Microsoft a dohnal se svým Internet Explorerem technologický náskok Netscapu, samozřejmě chtěl, aby se uživatelům zobrazovaly "bohatší" verze stránek. Musel tedy ve svém user-agent řetězci lhát a předstírat, že je Netscape (čili měl a dodnes má na začátku user-agenta také "Mozilla/x.y").
Pak přišlo Gecko (nový renderovací engine Mozilly) a ze stejného důvodu muselo úvodní část řetězce zachovat. Obdobně to dělají prakticky všechny dnešní prohlížeče.
Gecko si ale přidalo do řetězce i svojí značku a časem se objevily stránky, které byly částečně optimalizované pro něj. Gecko se stalo synonymem prohlížeče poctivě dodržujícího internetové standardy. A když v Apple vytvořili nový prohlížeč Safari, který také podporuje standardy velice rozumně, nezbylo jim, než text "Gecko" v řetězci user-agent zopakovat, protože jinak by toho stránky nevyužily. Samozřejmě, Safari si přidává i vlastní podpis ("AppleWebKit/xyz" a "Safari/xyz"). Hmm, a takhle to možná bude pokračovat donekonečna. A aplikace (mám na mysli např. analyzátory logů) se budou muset vybavovat stále "jemnějšími" algoritmy, aby vůbec dokázaly rozlišit, co za prohlížeč návštěvník použil. Žádná sláva :-(
Existuje ale ještě zajímavější případ evoluce něčeho nepodařeného – tím je C/C++. Céčko jako programovací jazyk bych bez váhání označil jako "piece of shit". Jediná opravdu pozitivní věc na něm je jeho praktická syntaxe a možná ještě velmi schopný makroprocesor. Tím ale pozitiva končí. Začínají ta negativa:
- šílený (ne)typový systém
- úplně úchylné deklarace (proč proboha musím 20 sekund přemýšlet, jak nadeklarovat typ "pointer na funkci" – třeba v Pascalu to přitom jde úplně přirozeně)
- řetězce ukončované nulou (koho proboha napadlo neevidovat u nich délku?)
- funkce jsou defaultně exportovány ven z modulu (nejsou
static
) - celý mechanismus hlavičkových souborů je obskurní (unity v Pascalu jsou podle mě ideální způsob modularizace)
case
u příkazuswtich
jsou jakoby návěští (nutnost všude psátbreak
, což se velice snadno zapomíná)- u všech struktur a výčtových typů se všude musí uvádět příslušené klíčové
slovo před vlastním názvem typu (pokud nepoužijete
typedef
)
Stručně řečeno, programování v C je podle mě hodně nepřirozené (aspoň pro bývalého Pascalistu). Kdyby se v tomto jazyce opravily všechny nedostatky a nelogičnosti, ani o píď by to nezmenšilo hrubý výkon zkompilované aplikace (možná místy s vyjímkou u řetězců), který je většinou hlavním argumentem použití céčka jako programovacího jazyka. Jenže, kostky jsou vrženy, a programátoři se s céčkem musí naučit žít. Jen se dost divím, že některé věci nenapadly už autory jazyka samotného.
Co je ovšem nejhorší, že v zájmu kompatibility se céčkových neduhů nezbavil ani jazyk C++, který je jinak dost velkým krokem kupředu (možná až moc velkým). Takže se s námi díky evoluci asi povlečou věčně...