k47.cz

twitter RSS
««« »»»

Samaritán a segfault

7. 10. 2019 — k47

Svobodný software stojí na zádech dobrovolníků, kteří otročí bez nároku na plat, slávu nebo věčný život v našich kolektivních srdcích. Někdy nic z toho nečekají, protože jen řeší své problémy. Když něco nefunguje pro vás, dost možná přesně to samé štve někoho dalšího.

V tomto duchu mi vadilo, že Ristretto – prohlížeč obrázků přibalený k prostředí Xfce – nebyl příliš svižný při načítání složky s 20000 obrázky & protože rychlost je moje věc, musel jsem to jako kyber-samaritán napravit. Kód doslova volal po spasiteli.

Nejdřív vám ale musím něco povědět o kvadratickém chování. Pokud máte lineární algoritmus, načtení jednoho obrázku trvá (dejme tomu) jednu vteřinu, načtení deseti pak deset vteřin. Kvadratický algoritmus zvládne jeden za vteřinu, zatím všechno v pořádku, ale deset mu trvá ±100 vteřin – deset na druhou, kvadratura (budu ignorovat fakt, že asymptotická analýza ignoruje konstanty, které hrají velkou roli v reálném světě). Program běžící v kvadratickém čase je špatná věc a měli bychom se jí vyhnout, pokud to jde. Nikdo nechce pomalé aplikace.

Když jsem se navigoval zdrojákem Ristretta a snažil se pochopit, jak do sebe jednotlivé části zapadají, na mě jeden kvadratický čas vykoukl. Rozeklané řádky C kódu jsem hladil pohledem a hele, tady jedna je. Pár řádků níže, tohle bude taky kvadratické. O něco dál zase a pak zase. Čtyři případy v jediné funkci a jeden v další. Někdo by vývojářům měl říct, že existují jiné datové struktury než spojové seznamy.

Ono to většinou nevadí, člověk otevře pár obrázků a je hotový. Pro dostatečně malé n je n2 pořád prťavé. Moje mise byla 200002 a to je viditelně víc než nula.

Jedinou překážku mezi mnou a slávou představoval fakt, že Ristretto je napsané v jazyku C a ten je… jak to říct? Je jako čínská výchova, bez utrpení se člověk nic nenaučí. Poskytne jen primitivní nástroje, naostřený klacek, kus kamene, provázek a pocit zranitelnosti ve stepi a očekává, že z toho postavíte jadernou ponorku. Někdo ji skutečně postavil, ale rozhodně to není ideální nástroj pro daný úkol. Nic nedává smysl, všechno je ošklivé, nemůžu přímo říct, co chci udělat, musím provádět divoké tance, abych uspokojil všemohoucí kompilátor a bizarní představy komise, které byl standard C18 vyjeven starým bohem Baalem po obětování kozy se sedmi očima a sedmi rohy. Jo a když někde udělám chybu, může se stát cokoli a nic na světě mě nevaruje. C je jako bůh ze starého zákona – krutý, nahodilý ve své krutosti a nikdy nedává varování. Provinil ses proti jednomu ze stovky přikázání? Doufám, že máš rád solné sloupy. C komunita je ale podnikavá a proti ošklivosti, krutosti a primitivnosti jazyka bojuje vynalézáním dalších ošklivostí.

Do toho jsou zdrojáky zapsány GNU stylem, který pobouří každého slušného občana. Abych to přiblížil, normální prog-jazyky jsou jako lidé, kteří mají rádi malby Ilji Repina. C je jako člověk, který chodí na podivné art-performance, kde zaplatí dvě stovky, aby v hangáru mohl křičet na kámen. C v GNU stylu je na tom podobně, jen on je ten kámen, hangár je plný hadů, ze stropu kape láva a vzduch je 70% tvořen metanem a z 30% vzpomínkami na Auschwitz.

Klid. Klid. Zhluboka se nadechnout, to přejde. Šok odezní a třeba to budu vidět jinak, třeba nakonec přece jenom vyřeším tenhle problém, který mají asi tři lidé na planetě. Nádech. Výdech.

Nakonec děs přece jen ustoupil. Zákopy první světové války si nikdo asi neužíval, ale vojáci si zvykli. Strach a úzkost zůstala, byla jen zatlačena dost hluboko, aby se mohli věnovat snahám přežití. Začal jsem studovat ošklivosti GTK a GDK kompenzující ošklivost céčka a začal něco dělat. Už to nebylo jen zírání do stránek programového Necronomiconu, ale něco víc, postup vpřed ze zákopů.

Pak najednou na mě vyskočil segfault – neoprávněný přístup do paměti.

Kde se to stalo? C odpovědělo: To ti neřeknu. Proč? To ti nepovím. Co jsem udělal špatně? Přečti si C standard, je to jen 534 stránek, burane.

A to byl okamžik, kdy jsem přestal. Čas můžu marnit lepšími způsoby jako třeba psaním tohohle článku. Céčko přenechám jiným lidem, kteří se nebojí božího hněvu, mají větší toleranci bolesti a lépe snáší bláto zákopů.

píše k47 & hosté, ascii@k47.cz