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:

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ě...

Feb 24, 2004 – 10:36

Comments

David Majda
David Majda
[1]: Takové prohlášení je jenom plácání do větru, dokud není podloženo nějakými argumenty. Netvrdím, že soudím věci objektivně (jak lze objektivně definovat eleganci a krásu jazyka?), ale aspoň jsem se pokusil některá negativa (i pozitiva) vyjmenovat. Narozdíl od vás :-(
finn
finn
To, že musíte dvacet sekund přemýšlet nad deklarací čehosi, svědčí pouze o tom, že v jazyce nejste dotatečně zběhlý.

Ukládat u řetězců jejich délku je pitomost. Pokud by se délka řetězce ukládala jako osmibitové číslo, omezí se tím jeho možná délka na 255 znaků. Pokud se uloží jako 16bitové číslo, bude se neefektivně zpracovávat na 32bitových strojích a naopak. Ukládání délky řetězce má smysl ve vyšších jazycích (typu PHP apod.), ale ne v C.

Zkrátka jste z Pascalu zvyklý na něco jiného a hledáte chyby tam, kde nejsou. Céčko má spoustu jiných nectností (téměř nulová typová kontrola aj.), které jsou nutnou daní za jeho nízkoúrovňovost a přenositelnost.

Pokud něco kritizujete, pak formulace "(céčkovské neduhy...) ... se s námi díky evoluci povlečou..." nesmyslná, proč děkovat něčemu za problémy, že :) Ale to jen tak na okraj...

bye, f.
David Majda
David Majda
> To, že musíte dvacet sekund přemýšlet nad
> deklarací čehosi, svědčí pouze o tom, že v
> jazyce nejste dotatečně zběhlý.

A nebo o tom, že je to navržené zbytečně neintuitivně.

> Ukládat u řetězců jejich délku je pitomost.

A proč to snad každá knihovna v C++ (což rozhodně není jazyk o moc vyšší než C) u své implementace třídy string dělá? Popravdě řečeno vlastně ani nevím o žádném jiném jazyce, než C, kde se NULL-terminated řetězce nativně používají.

To, že je to v céčku takhle blbě, je právě důsledek "evoluční" kompatibility čehosi s čímsi kdysi dávno.

BTW pokud vím, tak skoro všechny dnešní jazyky ukládáají délku řetězce jako 32bitové číslo (to jen k té efektivitě).

> Zkrátka jste z Pascalu zvyklý na něco jiného
> a hledáte chyby tam, kde nejsou.

S první částí věty souhlasím, s tou druhou nikoliv.

> Pokud něco kritizujete, pak formulace...

Jo, to je pravda :-)

Add comment

It is not possible to add comments to posts older than one month.