Krev a střeva interpretru
Jsem prostý člověk s prostými zálibami. Chci rychle jezdit na kole, psát rychlé programy a převzít kontrolu na prostředky výroby. Jednoduché základní tužby. Nechci nic, jen rychlost.
To mě přivádí k dnešnímu tématu: PHP. Pro ty, kdo nejste v obraze, jde o napůl programovací jazyk a napůl předzvěst konce světa. Z důvodů, které jsou ztracené dějinám, se ve velkém rozmohl na webu jako lingua franca toho, co běží na serverech. Stará k47čka běžela na PHP, wikipedie běží na PHP. PHP je všude, jako bizarní extremofilní bakterie, které přežijí mráz ledovců, horko lávy a vakuum kosmu. A to není dobrá zpráva. PHP má k dokonalosti a eleganci velice daleko. Je to ošklivý produkt bizarních evolučních procesů, který Rasmus Lerdorf porodil po seanci s mrtvými bohy z potopeného města R'lyeh a neeuklidovská geometrie Lovecraftovské noční můry v něm přežívá. Podivná syntaxe, nekonzistence, bizarní a neintuitivní chování, dokumentace, která je jen tak kompletní, aby ve vás navodila pocit bezpečí a hned udeřila jako banda kultistů s obětními dýkami. Generace optimistů se temnotu v nitru snažily zazdít novými verzemi, které odstraňovaly největší hříchy proti lidskosti, ale zlo stále prosakuje skrz.
To je ale jen ošklivost na povrchu, zlo se kterým přijdete do styku, když píšete PHP. Pod povrchem číhá zlo zcela se vymykající lidskému rozumu. Střeva interpretru jsou napsaná v jazyce C, obskurním, prastarém a sebevědomě sadistickém jazyce a nikde není ani řádek, který by vám vysvětlil, co to znamená.
Z naprosté nepřítomnosti komentářů doslova mrazí v zádech. Proč by to někdo
dělal? Proč by někdo napsal sto tisíc řádků jazyku, jehož specifikace v prvním
paragrafu výslovně uvádí, že vás osobně nesnáší, ale nevysvětlil, co, jak a proč? C je jako novostavba na minovém poli – musíte si dávat sakra pozor,
abyste ten barák postavili a výsledek je impresivní ukázka odhodlání, ale
existuje tolik lepších možností. A neřeknou nic. Jakou roli hraje tahle
proměnná? Jaké může mít hodnoty? Kdo a jak ji nastavuje? Tohle pole se jmenuje
flags. Jakou množinu příznaků reprezentuje? Jeden soubor definuje funkce
_zend_hash_init
, zend_hash_init
, zend_hash_init_ex
a zend_hash_real_init
. Co každá z nich dělá? Kdy mám jakou použít? Jakou z nich
mám vůbec použít? Nic. Ani slovo.
Když si přečtete Necronomicon, víte na čem jste. Jste v háji, to je jasné, ale jistota hrůzných faktů je vždy uspokojivější než nejistota a potenciál toho samého. Jazyk a runtime může mít zcela absurdní chování nad kterým zůstává rozum stát, může od uživatele vyžadovat složité tance a komplikované manévry, aby vyhověl jeho vrtochům, to je fajn. Není to příjemné, ale je to fajn, protože když je chování zapsané černé na bílém, víme na čem jsme. Můžeme se jím řídit. Když ale není zapsáno nic, naznačeno ještě méně a chování je kombinací implementačních detailů, náhody, kosmické karmy a špatných vtipů, co máme sakra dělat? Jak v tom můžeme pracovat? Jak můžeme vylepšit současný marazmus, když nám pohrdavé ticho PHP interpretru hází klacky pod nohy.
Nic z toho jsem nechtěl dělat. Nechtěl jsem se do toho pouštět. Ani v nejmenším. Psal jsem článek na 0xDEADBEEF a zaběhl jsem se. Napadlo mě,
že by se bylo možné zrychlit funkce sort
, rsort
, asort
a arsort
s parametrem SORT_NUMERIC použitím radix sortu. Prostá a ušlechtilá
myšlenka, změna by se mi hodila a v duchu free software se může hodit i dalším
lidem. Chvíli nevím, co se dělo a pak jsem se přistihl, jak křičím na
obrazovku a vyhrožuju makru HT_SIZE_TO_MASK
, že jestli mi hned nevyzradí
všechna svá tajemství, otrávím celou jeho rodinu ricinem. V jednu chvíli jsem
byl tak naštvaný a frustrovaný neproniknutelností C kódu, že jsem se musel
projít.
Nakonec jsem to po nadlidském utrpení dal. Nová verze řadí asi 2.5× rychleji, ale za jakou cenu? Připadám si o patnáct let starší, jako veterán, který se vrátil z války a nese si traumata, která nepochopí nikdo, kdo tam nebyl.
Jo. Programování je krásné. Hlavně pokud máte rádi ten svěží pocit, když jste pohřbíváni zaživa.