Makro (počítačová věda) - Macro (computer science)

editor maker jEdit

Makro (zkratka pro „makro instrukce“, z řečtiny kombinací forma μακρο- „dlouhý, velký“) v informatice je pravidlo, nebo vzor , který určuje, jak by měl být určitý vstup mapovány na náhradní výstup. Použití makra na vstup je rozšíření makra . Vstupem a výstupem může být sekvence lexikálních tokenů nebo znaků nebo strom syntaxe . V softwarových aplikacích jsou podporována znaková makra, která usnadňují vyvolání běžných sekvencí příkazů. V některých programovacích jazycích jsou podporována tokenová a stromová makra, která umožňují opětovné použití kódu nebo rozšíření jazyka, někdy pro jazyky specifické pro doménu .

Makra se používají k tomu, aby byla programátorům k dispozici sekvence výpočetních instrukcí jako jediné programové prohlášení, což činí programovací úlohu méně únavnou a méně náchylnou k chybám. (Říká se jim tedy „makra“, protože „velký“ blok kódu lze rozšířit z „malé“ posloupnosti znaků.) Makra často umožňují parametry pozic nebo klíčových slov, které určují, co program podmíněného assembleru generuje a byl použit k vytvářet celé programy nebo sady programů podle takových proměnných, jako je operační systém , platforma nebo jiné faktory. Termín pochází z „makro instrukce“ a taková rozšíření byla původně použita při generování kódu jazyka sestavení .

Makra klávesnice a myši

Klávesová makra a makra myši umožňují krátké sekvence úhozů a akcí myši transformovat do jiných, obvykle časově náročnějších, sekvencí úhozů a akcí myší. Tímto způsobem lze automatizovat často používané nebo opakující se sekvence úhozů a pohybů myší . Samostatné programy pro vytváření těchto maker se nazývají záznamníky maker .

V 80. letech 20. století byly makro programy - původně SmartKey , poté SuperKey, KeyWorks, Prokey - velmi populární, nejprve jako prostředek pro automatické formátování scénářů , poté pro různé úkoly zadávání uživatelů. Tyto programy byly založeny na provozním režimu TSR ( terminate and stay resident ) a aplikovány na všechny vstupy z klávesnice, bez ohledu na to, v jakém kontextu k nim došlo. Do určité míry upadly do zastarání po příchodu uživatelských rozhraní ovládaných myší a dostupnosti maker klávesnice a myši v aplikacích, jako jsou textové procesory a tabulky , což umožňuje vytvářet makra klávesnice citlivá na aplikace.

Klávesnicová makra mohou být použita v masivně multiplayerových online hrách na hrdiny (MMORPG) k provádění opakujících se, ale lukrativních úkolů, čímž se hromadí zdroje. Protože se to děje bez lidského úsilí, může to zkreslit ekonomiku hry. Z tohoto důvodu je používání maker porušením TOS nebo EULA většiny MMORPG a jejich správci vynakládají značné úsilí na jejich potlačení.

Aplikační makra a skriptování

Makra klávesnice a myši, která jsou vytvořena pomocí integrovaných funkcí makra aplikace, se někdy nazývají aplikační makra . Jsou vytvořeny provedením sekvence jednou a ponecháním aplikace zaznamenávat akce. Může existovat také základní makro programovací jazyk, nejčastěji skriptovací jazyk s přímým přístupem k funkcím aplikace.

Textový editor programátorů, Emacs , (zkratka pro „editační makra“), sleduje tuto myšlenku až do konce. Ve skutečnosti je většina editoru vytvořena z maker. Emacs byl původně navržen jako sada maker v editačním jazyce TECO ; později byl přenesen do dialektů Lispu .

Další textový editor programátorů, Vim (potomek vi ), má také implementaci maker klávesnice. Může zaznamenávat do registru (makra) to, co člověk zadává na klávesnici, a lze jej přehrávat nebo upravovat stejně jako makra VBA pro Microsoft Office. Vim má také skriptovací jazyk s názvem Vimscript pro vytváření maker.

Visual Basic for Applications (VBA) je programovací jazyk obsažený v Microsoft Office od Office 97 do Office 2019 (i když byl k dispozici v některých komponentách Office před Office 97). Jeho funkce se však vyvinula a nahradila makro jazyky, které byly původně součástí některých z těchto aplikací.

XEDIT , běžící na komponentě VM systému Conversational Monitor System (CMS) , podporuje makra napsaná v EXEC , EXEC2 a REXX a některé příkazy CMS byly ve skutečnosti obálky kolem maker XEDIT. The Hessling Editor (THE), částečný klon XEDIT, podporuje makra Rexx pomocí Regina a Open Object REXX (oorexx). Mnoho běžných aplikací, a některé na počítačích, používají Rexx jako skriptovací jazyk.

Makro virus

VBA má přístup k většině systémových volání systému Microsoft Windows a spouští se při otevírání dokumentů. Díky tomu je relativně snadné psát počítačové viry ve VBA, běžně známém jako makro viry . V polovině 90. let se stal jedním z nejběžnějších typů počítačových virů. Koncem devadesátých let a dosud však Microsoft své programy opravoval a aktualizoval. Současné antivirové programy navíc proti takovým útokům okamžitě bojují.

Parametrizované makro

Parametrizované makro je makro, které je možné vložit uvedené předměty do její expanzi. To dává makru určitou sílu funkce .

Jako jednoduchý příklad se v programovacím jazyce C jedná o typické makro, které není parametrizovaným makrem:

 #define PI   3.14159

To způsobí, PIže bude vždy nahrazen 3.14159kdekoli, kde k tomu dojde. Na druhé straně je příkladem parametrizovaného makra:

 #define pred(x)  ((x)-1)

To, na co se toto makro rozšíří, závisí na tom, jaký argument x mu bude předán. Zde je několik možných rozšíření:

 pred(2)    →  ((2)   -1)
 pred(y+2)  →  ((y+2) -1)
 pred(f(5)) →  ((f(5))-1)

Parametrizovaná makra jsou užitečným mechanismem na úrovni zdrojů pro provádění in-line expanze , ale v jazycích, jako je C, kde používají jednoduchou textovou substituci, mají řadu závažných nevýhod oproti jiným mechanismům pro provádění in-line expanze, jako jsou například vložené funkce .

Parametrizovaná makra používaná v jazycích, jako je Lisp , PL/I a Scheme , jsou na druhé straně mnohem výkonnější, schopná se rozhodovat o tom, jaký kód vyprodukovat na základě jejich argumentů; lze je tedy efektivně použít k provádění generování kódu za běhu .

Makra pro nahrazování textu

Jazyky, jako je C a některé montážní jazyky, mají základní makrosystémy, implementované jako preprocesory kompilátoru nebo assembleru. Makra preprocesoru C fungují spíše pomocí jednoduché textové náhrady na tokenu než na úrovni znaků. Makro zařízení sofistikovanějších assemblerů, např. IBM High Level Assembler (HLASM), však nelze implementovat pomocí preprocesoru; kód pro sestavení pokynů a dat je proložen kódem pro sestavení vyvolání makra.

Klasické využití maker je v systému počítačové sazby TeX a jeho derivátech, kde většina funkcí vychází z maker.

MacroML je experimentální systém, který se snaží sladit statické psaní a makrosystémy. Nemerle zadal syntaxová makra a jeden produktivní způsob, jak o těchto syntaxových makrech přemýšlet, je vícestupňový výpočet .

Další příklady:

Některé hlavní aplikace byly napsány jako textová makra vyvolaná jinými aplikacemi, např. XEDIT v CMS.

Vložitelné jazyky

Některé jazyky, například PHP , mohou být vloženy do textu ve volném formátu nebo do zdrojového kódu jiných jazyků. Mechanismus, pomocí kterého jsou fragmenty kódu rozpoznávány (například se závorkami <?phpa ?>), je podobný textovému jazyku makro, ale jsou mnohem výkonnějšími a plně funkčními jazyky.

Procedurální makra

Makra v jazyce PL/I jsou zapsána v podmnožině samotného PL/I: kompilátor v době kompilace provádí " příkazy preprocesoru " a výstup z tohoto provedení je součástí kompilovaného kódu. Schopnost používat známý jazyk procedur jako makro jazyk dává sílu mnohem větší než u maker pro nahrazování textu, na úkor většího a pomalejšího kompilátoru.

Rámcová makra rámové technologie mají vlastní syntaxi příkazů, ale mohou také obsahovat text v jakémkoli jazyce. Každý rámec je jak obecnou součástí hierarchie vnořených podsestav, tak postupem pro integraci se svými rámci podsestav (rekurzivní proces, který řeší konflikty integrace ve prospěch podsestav vyšší úrovně). Výstupy jsou vlastní dokumenty, obvykle kompilovatelné zdrojové moduly. Technologie rámců může zabránit šíření podobných, ale jemně odlišných komponent, což je problém, který sužuje vývoj softwaru od vynálezu maker a podprogramů .

Většina montážních jazyků má méně výkonná procedurální makra, například umožňuje blok kódu opakovat N krát pro rozvinutí smyčky ; ale tyto mají úplně jinou syntaxi než skutečný jazyk sestavení.

Syntaktická makra

Makro systémy - například C preprocesor popsaný výše -, které fungují na úrovni lexikálních tokenů, nemohou spolehlivě zachovat lexikální strukturu. Syntaktické makro systémy fungují místo toho na úrovni abstraktních stromů syntaxe a zachovávají lexikální strukturu původního programu. Nejpoužívanější implementace syntaktických makro systémů se nacházejí v jazycích podobných Lispu . Tyto jazyky jsou obzvláště vhodné pro tento styl makra díky jejich jednotné syntaxi v závorkách (známé jako výrazy S ). Jednotná syntaxe zejména usnadňuje určení vyvolání maker. Makra Lisp transformují samotnou strukturu programu s plným jazykem, který je k vyjádření těchto transformací k dispozici. I když se syntaktická makra často nacházejí v jazycích podobných Lispu, jsou k dispozici také v jiných jazycích, jako jsou Prolog , Erlang , Dylan , Scala , Nemerle , Rust , Elixir , Nim , Haxe a Julia . Jsou také k dispozici jako rozšíření třetích stran pro JavaScript , C# a Python .

Brzy makra Lisp

Předtím, než měl Lisp makra, měl takzvané FEXPR , funkcionální operátory, jejichž vstupy nebyly hodnoty vypočítané argumenty, ale spíše syntaktické formy argumentů, a jejichž výstupem byly hodnoty, které měly být použity při výpočtu. Jinými slovy, FEXPR byly implementovány na stejné úrovni jako EVAL a poskytovaly okno do vrstvy meta-vyhodnocení. To bylo obecně shledáno jako obtížný model, o kterém lze efektivně uvažovat.

V roce 1963 Timothy Hart navrhl přidání maker do Lisp 1.5 v AI Memo 57: MACRO Definitions pro LISP.

Anaforická makra

Anaforické makro je typ programovacího makra, které záměrně zachycuje určitou formu dodanou makru, na kterou může odkazovat anafora (výraz odkazující na jiný). Anaforická makra se poprvé objevila v díle Paula Grahama On Lisp a jejich název je odkazem na lingvistickou anaforu - použití slov jako náhražky předchozích slov.

Hygienická makra

V polovině osmdesátých let řada příspěvků zavedla pojem hygienické expanze makra ( syntax-rules), systém založený na vzorcích, kde jsou syntaktická prostředí definice makra a používání maker odlišná, což umožňuje definicím maker a uživatelům nebát se neúmyslného zachytávání proměnných (viz referenční průhlednost ). Hygienická makra byla standardizována pro schéma ve standardech R5RS , R6RS a R7RS . Řada konkurenčních verzí hygienické maker existovat jako je syntax-rules, syntax-case, explicitní přejmenování a syntaktické uzávěry. Oba syntax-rulesa syntax-casebyly standardizovány v normách schématu.

V poslední době, raketa zkombinoval pojmy hygienických maker s „ věží hodnotitelů “, tak, že syntaktické expanze doba jedné makro systému je běžné runtime jiného bloku kódu, a ukázal, jak aplikovat prokládaný expanzi a analýze v non -patentovaný jazyk.

Řada jazyků jiných než Scheme buď implementuje hygienická makra, nebo implementuje částečně hygienické systémy. Mezi příklady patří Scala , Rust , Elixir , Julia , Dylan , Nim a Nemerle .

Aplikace

Pořadí hodnocení
Makro systémy mají řadu použití. Možnost volby pořadí hodnocení (viz líné hodnocení a nestriktní funkce ) umožňuje vytváření nových syntaktických konstruktů (např. Řídících struktur ) k nerozeznání od těch, které jsou do jazyka zabudovány. Například v dialektu Lisp, který má, condale chybí if, je možné jej definovat z hlediska prvního pomocí maker. Scheme má například pokračování i hygienická makra, což umožňuje programátorovi navrhnout vlastní kontrolní abstrakce, jako jsou smyčkové a časné výstupní konstrukce, aniž by je bylo nutné integrovat do jazyka.
Datové subjazyky a jazyky specifické pro doménu
Dále makra umožňují definovat datové jazyky, které jsou okamžitě kompilovány do kódu, což znamená, že konstrukce, jako jsou stavové stroje, lze implementovat přirozeným a efektivním způsobem.
Vazba konstruktů
Makra lze také použít k zavedení nových vazebných konstrukcí. Nejznámějším příkladem je transformace letna použití funkce na sadu argumentů.

Felleisen se domnívá, že tyto tři kategorie tvoří primární legitimní použití maker v takovém systému. Jiní navrhli alternativní využití maker, například anaforická makra v makrosystémech, která jsou nehygienická nebo umožňují selektivní nehygienickou transformaci.

Interakce maker a dalších jazykových funkcí je produktivní oblastí výzkumu. Například komponenty a moduly jsou užitečné pro programování ve velkém měřítku, ale interakce maker a těchto dalších konstrukcí musí být definována pro jejich společné použití. Modulové a komponentní systémy, které mohou interagovat s makry, byly navrženy pro Scheme a další jazyky s makry. Jazyk Racket například rozšiřuje pojem makrosystému na syntaktickou věž, kde lze makra zapisovat v jazycích včetně maker, přičemž pomocí hygieny zajistíte, že syntaktické vrstvy jsou odlišné a umožní modulům exportovat makra do jiných modulů.

Makra pro software nezávislý na stroji

Makra se obvykle používají k mapování krátkého řetězce (vyvolání makra) na delší sekvenci pokynů. Další, méně obvyklé, používání maker je udělat obráceně: namapovat sekvenci instrukcí na řetězec makra. To byl přístup, který použil mobilní programovací systém STAGE2, který pomocí rudimentárního kompilátoru maker (nazývaného SIMCMP) mapoval konkrétní sadu instrukcí daného počítače na protějšky maker nezávislých na stroji . Aplikace (zejména kompilátory) napsané v těchto strojově nezávislých makrech pak lze spouštět beze změny na jakémkoli počítači vybaveném základním kompilátorem maker. První spuštěnou aplikací v takovém kontextu je sofistikovanější a výkonnější kompilátor maker napsaný ve strojově nezávislém jazyce maker. Tento kompilátor maker je aplikován na sebe, způsobem bootstrap , aby vytvořil jeho kompilovanou a mnohem efektivnější verzi. Výhodou tohoto přístupu je, že složité aplikace lze přenášet z jednoho počítače na velmi odlišný počítač s velmi malým úsilím (pro každou architekturu cílového stroje stačí psaní základního kompilátoru maker). Příchod moderních programovacích jazyků, zejména C , pro které jsou kompilátory k dispozici prakticky na všech počítačích, učinil takový přístup nadbytečným. Jednalo se však o jednu z prvních instancí (ne -li první) bootstrapování kompilátoru .

Jazyk montáže

Zatímco instrukce makra mohou být definovány programátorem pro libovolnou sadu instrukcí nativního programu assembleru, makra jsou obvykle spojena s knihovnami maker dodávanými s operačním systémem, což umožňuje přístup k funkcím operačního systému, jako je

  • periferní přístup pomocí přístupových metod (včetně maker jako OPEN, CLOSE, READ a WRITE)
  • funkce operačního systému, jako je ATTACH, WAIT a POST pro vytváření a synchronizaci dílčích úkolů. Taková makra se obvykle rozbalí do spustitelného kódu, např. Pro makro instrukci EXIT,
  • seznam definovaných konstantních instrukcí, např. pro makro DCB — DTF (Define The File) pro DOS — nebo kombinace kódu a konstant, s podrobnostmi o rozšíření v závislosti na parametrech makro instrukce (např. do souboru a datové oblasti pro instrukci READ);
  • spustitelný kód často končil buď instrukcí registru větve a odkazu pro volání rutiny, nebo instrukcí volání supervizora pro přímé volání funkce operačního systému.
  • Generování streamu úlohy Stage 2 pro generování systému v např. OS/360 . Na rozdíl od typických maker, makra sysgen fáze 1 negenerují data ani kód, který se má načíst do úložiště, ale spíše používají příkaz PUNCH k výstupu JCL a přidružených dat.

Ve starších operačních systémech, jako jsou systémy používané na sálových počítačích IBM, byla plná funkčnost operačního systému k dispozici pouze programům v jazyce assembler, nikoli v jazykových programech na vysoké úrovni (samozřejmě pokud nebyly použity podprogramy jazyka sestavení), protože standardní pokyny k makru ne vždy mít protějšky v rutinách k dispozici pro jazyky na vysoké úrovni.

Dějiny

V polovině padesátých let minulého století, kdy se programování v jazyce assembleru běžně používalo k psaní programů pro digitální počítače , bylo použití instrukcí pro makro zahájeno ze dvou hlavních účelů: snížit množství programového kódování, které bylo nutné zapsat, generováním několika příkazů jazyka sestavení z jedné makro instrukce a prosadit standardy psaní programu, např. zadávání vstupních/výstupních příkazů standardními způsoby. Makro instrukce byly ve skutečnosti prostředním krokem mezi programováním v assembleru a programovacími jazyky na vysoké úrovni, které následovaly, jako FORTRAN a COBOL . Dvě z prvních programovacích instalací na vývoj „makro jazyků“ pro počítač IBM 705 byly v Dow Chemical Corp. v Delaware a Air Material Command, Ballistics Missile Logistics Office v Kalifornii. Makro instrukce napsané ve formátu cílového jazyka sestavení by byly zpracovány kompilátorem maker, což byl předprocesor pro assembler, za účelem generování jedné nebo více instrukcí jazyka sestavení, které budou dále zpracovány programem assembleru, který by překládal montážní jazykové instrukce do strojových jazykových instrukcí.

Koncem padesátých let byl makro jazyk následován sestaviteli maker. Jednalo se o kombinaci obou, kde jeden program obsluhoval obě funkce, makro předprocesor a assembler ve stejném balíčku.

V roce 1959 Douglas E. Eastwood a Douglas McIlroy z Bell Labs zavedli podmíněné a rekurzivní makra do populárního assembleru SAP , čímž vytvořili to, co je známé jako Macro SAP. McIlroyův dokument z roku 1960 byl klíčový v oblasti rozšíření jakýchkoli (včetně vysokých ) programovacích jazyků prostřednictvím makro procesorů .

Sestavovači maker dovolili programátorům sestavovacího jazyka implementovat svůj vlastní makro jazyk a umožnili omezenou přenositelnost kódu mezi dvěma počítači se stejným CPU, ale různými operačními systémy, například starší verze MSDOS a CPM-86. Knihovna maker by musela být zapsána pro každý cílový počítač, ale ne pro celkový program jazyka sestavení. Všimněte si toho, že výkonnější makro assemblery umožňovaly použití konstruktů podmíněné montáže v pokynech k makru, které by mohly generovat různý kód na různých počítačích nebo různých operačních systémech, což snižuje potřebu více knihoven.

V osmdesátých a na začátku devadesátých let běžely stolní počítače jen na několika MHz a rutiny v montážním jazyce se běžně používaly k urychlení programů napsaných v jazycích C, Fortran, Pascal a dalších. Tyto jazyky v té době používaly různé konvence volání. Makra lze použít k propojení rutin napsaných v jazyce sestavení s frontendem aplikací napsaných téměř v jakémkoli jazyce. Základní kód jazyka sestavení zůstal opět stejný, pouze pro každý cílový jazyk bylo nutné zapsat knihovny maker.

V moderních operačních systémech, jako je Unix a jeho deriváty, je přístup k operačnímu systému zajištěn pomocí podprogramů, obvykle poskytovaných dynamickými knihovnami. Jazyky na vysoké úrovni, jako je C, nabízejí komplexní přístup k funkcím operačního systému, čímž se eliminuje potřeba jazykových programů assembleru pro tyto funkce.

Viz také

Reference

externí odkazy