VyÜlo v t²denφku: COMPUTERWORLD
╚φslo:7/95
RoΦnφk:1995
Rubrika/kategorie: Co (ne)najdete ve slovnφku

zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ Φlßnek | nßsledujφcφ Φlßnek

Ji°φ Peterka

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


zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ Φlßnek | nßsledujφcφ Φlßnek
Tento Φlßnek m∙₧e b²t voln∞ Üφ°en, pokud se tak d∞je pro studijnφ ·Φely, na nev²d∞leΦnΘm zßklad∞ a se zachovßnφm tohoto dov∞tku. Podrobnosti hledejte zde, resp. na adrese http://archiv.czech.net/copyleft.htm