Vyšlo v týdeníku Computerworld č. 7/95 v roce 1995
Vytištěno z adresy: http://www.earchiv.cz/a95/a507c120.php3

Linker

Lidé, kteří se aktivně zabývají programováním, mají dnes k dispozici takové nástroje, o jakých se jejich předchůdcům v pionýrských dobách výpočetní techniky zcela určitě ani nesnilo. Kdo by tehdy pomyslel například na integrované vývojové prostředí (IDE, Integrated Development Environment) takového typu, jakým se proslavila firma Borland, a jaké záhy uvedly na trh i další firmy? Pravdou je, že takováto integrovaná vývojová prostředí dokáží výrazně zvýšit efektivitu práce zkušených programátorů. Na druhé straně ale u méně zkušených programátorů vytváří velmi nebezpečné návyky - umožňují jim programovat experimentálním způsobem, metodou pokusů a omylů: nabušit do klávesnice kus zdrojového textu, nechat si v něm najít syntaktické chyby, pak program spustit, a s podporou účinných ladících prostředků hledat chyby semantické. Z programování, které původně vyžadovalo především hodně myšlení, se náhle stává něco úplně jiného.

Změna stylu a způsobu programování však není zdaleka jedinou změnou, kterou integrovaná vývojová prostředí přináší. Dalším zajímavým efektem je vytváření iluze, že překlad zdrojového programu je jednostupňový proces, jehož přímým výstupem je okamžitě spustitelný program. Vytváření této iluze podporuje právě ona „integrovanost" vývojových prostředí - tu je třeba chápat v tom smyslu, že příslušná vývojová prostředí jsou ve své podstatě programovým balíkem, který obsahuje všechny prostředky, nutné jak pro vytvoření spustitelného programu, tak i pro jeho vlastní spuštění. Překladač příslušného programovacího jazyka je sice vždy nejvýznamnější složkou takovéhoto balíku, ale nikoli složkou jedinou - všechny složky jsou ovšem v příslušném vývojovém prostředí natolik těsně integrovány, že se jejich samostatná identita prakticky úplně ztrácí. Jaké složky to ale jsou?

Kromě překladače jde obvykle o různé ladící prostředky, které se ale na vlastním překladu a tvorbě přeloženého programu přímo nepodílí. Na tom se ale významně podílí jiná složka, plnící funkci tzv. linkeru (též: linkage editoru, link editoru, česky také: sestavujícího programu, linkujícího programu). Jejím úkolem je tzv. linkování, resp. sestavování jednotlivých programových modulů. Co si pod tím představit?

Pro odpověď je vhodné si nejprve zajít poněkud do historie, do doby, kdy počítače ještě zdaleka nebyly tak výkonné jako dnes, a nedisponovaly takovými objemy operační paměti a diskové kapacity. Kdo tehdy potřeboval přeložit nějaký rozsáhlejší program, obvykle velmi brzy narazil na těžko překonatelnou hranici: díky omezeným systémovým zdrojům tehdejších počítačů dokázaly překladače zvládnout jen zdrojové programy určité velikosti - kdo potřeboval přeložit program větší, měl jednoduše smůlu.

Vlastně ne tak úplně. Lidé totiž přišli na to, že programy by se mohly překládat i po částech - tak velkých, aby je příslušné překladače dokázaly zvládnout, a aby jednotlivé přeložené části stačilo vcelku jednoduchým způsobem „poskládat" (slinkovat) dohromady, do jediného výsledného celku, který by již mohl představovat výsledný spustitelný program. Produktem překladu, neboli výstupem překladače, pak ovšem může být jen jakýsi polotovar - přesněji mezitvar, který musí být při spojování s ostatními částmi dodatečně upravován. Tomuto mezitvaru se nejčastěji říká objektový kód (object code). Má-li povahu samostatného modulu, jde objektový modul (object modul). Je-li vytvářen ve formě samostatného souboru, pak má obvykle příponu OBJ.

Čím se ale tento mezitvar liší od spustitelného programu? Ukažme si to na příkladu: představme si zdrojový program, pozůstávající na úrovni svého zdrojového tvaru ze dvou částí (zdrojových modulů), které jsou překládány samostatně (jsou kompilovány separátně). Dále si představme, že v jednom z těchto modulů programátor zavedl proměnnou A (deklaroval ji, tj. definoval její typ a případné další atributy), a v tomto modulu ji také skutečně používá. Překladač, který tento modul překládá, pak má dostatek informací o proměnné A, a může správně přeložit všechny odkazy na tuto proměnnou.

Co ale v případě, kdy se programátor potřebuje odkazovat na tutéž proměnnou A i v rámci druhého zdrojového modulu? Nemůže si ji zavést (deklarovat) znovu, protože by pak šlo o jinou proměnnou. Místo toho ale může v tomto druhém modulu prohlásit, že bude používat proměnnou A, nacházející se v jiném modulu, a překladači poskytnout i některé další informace o této proměnné (především o jejím typu). Když pak překladač samostatně překládá takovýto zdrojový modul, postupuje v dobré víře, že programátorem poskytnuté informace jsou korektní a pravdivé, a že zmíněná proměnná v jiném programovém modulu skutečně existuje. Odkazy na tuto proměnnou však překladač při nejlepší vůli není schopen správně přeložit - například už jen proto, že nezná její konkrétní adresu. Proto vytvoří takový objektový kód, který místo konkrétních odkazů na proměnnou A obsahuje pouze informace o tom, jak odkaz na proměnnou A „dopočítat" v okamžiku, kdy její adresa (a další informace o proměnné A) bude známa. K tomu však dojde až poté, co budou samostatně přeloženy (zkompilovány) všechny potřebné zdrojové moduly, a bude povolán linker (linkující program, sestavující program) k tomu, aby je sestavil (slinkoval) dohromady. Tento sestavující program si zjistí skutečnou adresu námi uvažované proměnné A, a pak „dopočítá" všechny odkazy na ni, které dosud nebyly přesně přeloženy. V této souvislosti se také říká, že linker dořeší všechny dosud nevyřešené odkazy. A právě to je hlavní náplň jeho činnosti.

S obrovským nárůstem schopností dnešních počítačů však zmizela původní motivace, kvůli které byla zavedena možnost tzv. separátní kompilace - neboli možnost samostatného překladu jednotlivých zdrojových modulů. Na dnešních počítačích, a s pomocí dnešních překladačů, již není problémem překládat i opravdu velmi velké zdrojové programy. Úloha sestavujících programů (linkerů) se pak často redukuje jen na „přilinkování" některých knihovních objektových modulů k hlavnímu programu. Také díky tomu pak může být samotný linker efektivně „schován" pod vlastním překladačem, a volán v podstatě automaticky, bez explicitního popudu uživatele. Jak jsme si již naznačili výše, v rámci integrovaných vývojových prostředí sestavující programy (linkery) již nejsou prakticky vůbec „vidět".