Vyšlo v týdeníku Computerworld č. 7/93 v roce 1993
Vytištěno z adresy: http://www.earchiv.cz/a93/a307c120.php3

Patch

Již jednou jsme se na stránkách této rubriky zmínili o staré programátorské moudrosti, která praví, že v každém programu je chyba. Bylo to v souvislosti s tzv. beta-testy, které mají za cíl odhalit co možná nejvíce chyb ještě dříve, než se nový softwarový produkt dostane do běžného prodeje.

Ani ty nejdokonalejší a nejrozsáhlejší beta-testy však nemohou nikdy dát stoprocentní záruku bezchybnosti (což by ostatně popíralo platnost naší programátorské moudrosti). Co pak ale dělat s chybami, které o sobě dají vědět až poté, kdy se již nový program dostal "do světa"? Jednou z možností je smířit se s jejich existencí a opravit je až v nové verzi programu. Záleží jistě na povaze chyb, na strategii dodavatele programu, na frekvenci nových verzí a na mnoha dalších faktorech.

Obvykle však existuje ještě jedna možnost, která je ale rozumně použitelná jen v případě "malých" chyb. Například tehdy, je-li chyba v jedné jediné strojové instrukci nebo v několika málo instrukcích či několika málo datových bytech a je-li možné tuto chybu opravit změnou pouze těchto několika málo instrukcí či bytů, a není přitom nutné jakkoli měnit celý zbytek programu. Pak je možné vykonat potřebnou opravu přímo v kódu (tj. v binárním tvaru programu) pouhým přepsáním několika bytů a není nutné znovu překládat celý zdrojový tvar programu. Opravovat přímo v kódu je dokonce možné přímo u zákazníka, který si program někdy dříve zakoupil - například tak, že se mu vhodným způsobem sdělí, které byty a jakým způsobem opravovat. Nebo se mu pošle malý program, který tuto změnu provede sám - což je asi bezpečnější pro obě strany.

Pro právě naznačený mechanismus oprav přímo v kódu má angličtina velmi přiléhavý termín - patch, který v doslovném překladu znamená "záplata, náplast", ale také "záplatovat, vyspravovat". Používá se skutečně v obou významech: jako sloveso, vyjadřující vlastní opravování výše naznačeným způsobem (např. "to patch a piece of code", ve smyslu: vyspravit část kódu), a zároveň i jako podstatné jméno, které označuje samotnou "záplatu", tedy novou hodnotu těch bytů, které mají být přepsány (např. "to distribute a patch to all users", ve smyslu: rozeslat "záplatu" všem uživatelům).

Je dobré si zdůraznit, že právě naznačené "záplatování" je realizováno přepisováním dosavadních hodnot některých bytů novými hodnotami, a nikoli vkládáním nových bytů s tím, že všechny následující byty by se příslušným způsobem posunuly. Podstatnou vlastností celého mechanismu je totiž jeho lokální charakter, tedy realizace úzce lokalizovaných změn, které nevyvolávají nutnost následných změn v jiných částech kódu. Kdybychom totiž vložili přímo do kódu jeden jediný "nový" byte a všechny následující posunuli na adresy o jedničku vyšší, rázem by bylo nutné změnit všechny absolutní adresy v celém programu. A to není dost dobře možné (bez nového překladu zdrojového tvaru programu).

Proto je dosti zavádějící překládat anglické "to patch" jako "opravovat vsuvkami" (jak činí např. Anglicko-český výkladový slovník výpočetní techniky, SNTL 1990), protože nejde o vsouvání, ale o přepisování. Věcně správnější je tedy spíše "opravovat přepisováním" či "přepisovat přímo v kódu". Ve vhodném kontextu je zřejmě možné používat i "záplatování" či "vyspravování".

Motivací pro "záplatování" nemusí být vždy jen snaha opravit chybu. Přepisování přímo v kódu je zároveň i jednou z technik, které používají různí "průnikáři" (hackers). Vhodným přepsáním určité části kódu mohou například modifikovat či zcela odstranit hlášení o autorských právech k programu nebo upravit jeho zabezpečovací mechanismy proti neoprávněnému použití (např. modifikovat část kódu pro vyhodnocování hesel tak, aby každé zadané heslo bylo považováno za správné apod).

Existují však i "čistější" motivace. Například předchůdce všech dnešních editorů, oblíbený Wordstar, používal ve svých raných verzích techniku "záplatování", aby mohl sám sebe přizpůsobit konkrétním vlastnostem monitoru a tiskárny, které uživatel měl k dispozici. Výrobce zveřejnil adresy, na kterých jsou v kódu jeho editoru uloženy (jako konstanty) řídicí sekvence pro ovládání tiskárny a monitoru. Zveřejnil také přesný formát těchto konstant, a uživateli tak dal možnost změnit jejich implicitní hodnoty podle potřeb skutečné tiskárny a skutečného monitoru. Dnes se však tento způsob nepoužívá, především pro svou náročnost na znalosti a schopnosti uživatele, který si vlastně musel sám vytvořit vše potřebné pro ovládání svých konkrétních periferií. Místo toho se dnes uplatňuje spíše jiná filozofie - vše potřebné pro ovládání konkrétního zařízení (nejen tiskárny či monitoru) připraví již výrobce a ten uživateli dodá tzv. ovladač (driver) ve formě samostatného souboru. Programu, který se zařízením pracuje, pak uživatel při instalaci pouze určí, který ovladač má pro dané zařízení použít.