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

Macro

Programování může být i fyzicky náročnou záležitostí - považujeme-li za fyzicky náročné intenzivní bušení do klávesnice. Někdy se totiž může stát, že naprogramování něčeho konkrétního dá opravdu hodně práce, resp. vyžádá si „naťukání" opravdu velkého kusu zdrojového textu. Přitom samozřejmě velmi záleží na schopnostech a stylu konkrétního programátora, ale nezanedbatelný vliv zde má i výrazová schopnost použitého programovacího jazyka. Není jistě těžké nahlédnout, že čím vyšší je úroveň programovacího jazyka, tím větší je semantický obsah jednotlivých syntaktických elementů tohoto jazyka. Neboli, řečeno srozumitelnější mluvou: tím více znamená to, co v daném jazyce napíši. Zdaleka „nejukecanějšími" jsou proto programy v jazyku symbolických adres, neboli v asembleru. Zde se mnohdy člověk dříve upíše, než něco skutečně smysluplného naprogramuje.

Není proto divu, že lidé se brzy začali ohlížet po takových mechanismech, které by jim usnadnily psaní rozsáhlejších zdrojových textů, a tuto mnohdy dosti monotónní činnost co možná nejvíce zefektivnily. Vcelku logicky se pak takovéto mechanismy vyvinuly a došly největšího uplatnění u těch „nejukecanějších" programovacích jazyků, tedy u nejrůznějších asemblerů. Společným charakteristickým rysem všech těchto mechanismů je skutečnost, že fungují na textové úrovni - můžeme si je představit jako automatické dosazování celých kusů textu na určená místa. A to ještě dříve, než překladač (asembler) začne doopravdy překládat zdrojový text.

V souvislosti s těmito mechanismy se používá výstižný termín makro (angl.: macro). Jako tzv. tělo makra se označuje vzor textu, který má být na určité místo zdrojového programu dosazen. Takovýchto vzorů ale může být více (samozřejmě různých), a tak každý z nich musí mít vhodné označení - tzv. jméno makra. Vše pak funguje následujícím způsobem: pokud nechceme nějaký text vypisovat vícekrát, napíšeme jej jen jednou, jako vzor, a opatříme jej vhodným jménem. Tím tzv. definujeme makroinstrukci (též: makropříkaz, zkráceně jen makro). Když pak někde potřebujeme napsat stejný text, nemusíme jej skutečně vypisovat - stačí místo něj uvést jméno, které jsme přiřadili příslušnému makru (makroinstrukci, makropříkazu). Toto se většinou označuje jako volání makra (macro call), i když to není příliš výstižné: volání by totiž naznačovalo odskok na jiné místo v programu, zatímco zde k žádnému odskoku nedochází. Zde se naopak vezme příslušný text, a dosadí se na místo, kde bylo makro voláno. Pokud je makro tímto způsobem voláno například na deseti místech, je efekt stejný, jako kdyby byl příslušný text desetkrát rozepsán na zmíněných deseti místech (a existoval v deseti exemplářích). Místo „rozepsání" se však hovoří o tzv. rozvoji makra (macro expansion). Naproti tomu při skutečném volání by příslušný podprogram existoval jen jednou.

Jak jsme si již naznačili, možnost používat makra vznikla nejprve u různých překladačů jazyka symbolických adres, neboli asemblerů. Příslušné překladače se pak ale již označovaly jako makroasemblery , což mělo zdůraznit právě jejich schopnost práce s makoinstrukcemi (makry). Pro správné pochopení jejich podstaty je vhodné si představit, že jde o běžný překladač-asembler, před který se předřadí ještě jeden pomocný překladač, fungující jako textový preprocesor. Jeho úkolem je provedení všech rozvojů maker, neboli dosazení textů, tvořících těla maker, na místa jejich volání. V praxi přitom nejde o skutečně samostatný předřazený překladač, ale pouze o samostatný průchod překladače zdrojovým textem, při kterém dochází výhradně k rozvoji maker, zatímco k vlastnímu překladu dochází až při dalším průchodu (či průchodech).

Jednotlivá makra přitom nemusí zdaleka představovat jen „neměnné" kusy texty. Ve většině konkrétních případů mohou mít makra i různé parametry, mohou se větvit v závislosti na různých podmínkách, jejich rozvoje se mohou předčasně ukončovat, makra se mohou do sebe vnořovat apod. Vždy samozřejmě záleží na konkrétním makrojazyku, který určuje přesná pravidla pro definice, volání a rozvoje maker. Zdůrazněme si ale jednu velmi podstatnou skutečnost, která je klíčová pro správné pochopení celé podstaty maker a jejich odlišení od mechanismu podprogramů - makra jsou výhradně záležitostí zdrojového textu, a s jeho překladem zanikají. Naproti tomu podprogramy překlad „přežijí", a existují i v přeložených a spustitelných programech.

Makra, makrojazyky a možnost používání makroinstrukcí však nejsou výhradní záležitostí programování na úrovni asembleru - analogické mechanismy dnes mají zabudovány i překladače mnohých vyšších programovacích jazyků. Jejich cílem je přitom totéž, co bylo cílem na úrovni asembleru: zefektivnit práci programátora, který píše zdrojový text.

Programování na nejrůznějších úrovních však není zdaleka jedinou činností, při které lidé musí vykonávat neustále se opakující činnosti - které je zcela zákonitě přestávají bavit, jakmile je mají dělat vícekrát. A jakmile člověka něco nebaví, příslušnou činnost dělá pomalu, s chybami, nepřesně atd. Není proto divu, že i tvůrci nejrůznějších aplikací zabudovali do svých výtvorů obdobu „maker". Setkáme se s nimi například v textových editorech, ve spreadsheetech a v mnoha dalších aplikacích. Někdy jde jen o skromné prostředky, umožňující předem „nahrát" sekvenci příkazů a pak je následně přehrát. Jindy jde až o celé propracované makrojazyky, které umožňují vybudovat nad daným produktem úplně novou aplikaci, šitou na míru konkrétním specifickým potřebám.