Кіріспе

Белгіленген кірісті белгіленген шығыспен ауыстыру ережесі

Компьютерлік бағдарламалауда макро (макро нұсқаудың қысқартылған түрі) – белгілі бір кірістің қандай ауыстыру шығысына сәйкес екенін анықтайтын ереже немесе үлгі. Макроны кіріске қолдану макроны кеңейту деп аталады. Кіріс және шығыс лексикалық таңбалар немесе символдар тізбегі, немесе синтаксистік ағаш болуы мүмкін. Символдық макролар бағдарламалық қамтамасыз етуде жиі қолданылатын командалар тізбегін оңай шақыруға мүмкіндік береді. Токендер мен ағаш макролары кейбір бағдарламалау тілдерінде кодты қайта пайдалануға немесе тілді кеңейтуге, кейде салалық тілдер үшін қолдау көрсетеді. Макролар бағдарламалау тапсырмасын жеңілдету және қателерді азайту үшін, есептеу нұсқауларының тізбегін бағдарламашыға бір бағдарламалық оператор ретінде қолжетімді етеді. Сондықтан, оларды "макро" деп атайды, өйткені символдардың "кішкентай" тізбегінен кодтың "үлкен" блогын кеңейтуге болады. Макролар көбінесе шартты құрастырушы бағдарламасының не шығаратынын анықтайтын позициялық немесе кілт сөздік параметрлерге мүмкіндік береді және операциялық жүйе, платформа немесе басқа факторлар сияқты айнымалыларға сәйкес толық бағдарламалар немесе бағдарламалық кешендерді құру үшін қолданылады. Бұл термин "макро нұсқаулықтан" шыққан, ал мұндай кеңейтулер бастапқыда ассемблерлік кодты жасау үшін пайдаланылған.

Пернетақта мен тышқанның макролары

Пернетақта макростары мен тышқан макростары пернетақтаның және тышқанның қысқа тізбектерін басқа, көбінесе уақытты көп алатын, пернетақтаның және тышқанның тізбектеріне айналдыруға мүмкіндік береді. Осылайша, жиі қолданылатын немесе қайталама перне басулар мен тышқанның қозғалыстарын автоматтандыруға болады. Осы макростарды жасауға арналған жеке бағдарламалар макро жазу құралдары деп аталады. 1980-ші жылдары макро бағдарламалары – бастапқыда SmartKey, содан кейін SuperKey, KeyWorks, Prokey – өте танымал болды, алдымен сценарийлерді автоматты түрде форматтау үшін, содан кейін пайдаланушының әртүрлі енгізу тапсырмалары үшін қолданылды. Бұл бағдарламалар «тоқтату және жүйеде қалу» режимінде жұмыс істеді және кез келген жағдайда барлық пернетақталық енгізулерге қолданылды. Тышқанмен басқарылатын пайдаланушы интерфейстерінің пайда болуы және мәтін өңдегіштер мен электрондық кестелер сияқты қолданбаларда пернетақта мен тышқан макростарының болуы олардың тоқырауына әкелді, бұл қолданбаға қатысты пернетақта макростарын жасауға мүмкіндік берді. Пернетақта макростарын көп ойыншылы онлайн рольдік ойындарда (MMORPG) қайталама, бірақ пайдалы тапсырмаларды орындау үшін пайдалануға болады, осылайша ресурстарды жинақтауға болады. Бұл адам күшін қажет етпегендіктен, ойын экономикасын бұрмалауы мүмкін. Осы себепті макростарды пайдалану көптеген MMORPG-нің қызмет шарты (TOS) немесе пайдалану шарты (EULA) бұзу болып табылады, және олардың әкімшілері оларды жоюға көп күш жұмсайды.

Қолданба макролары мен скрипттер

Қолданбаның кіріктірілген макрос мүмкіндіктерін пайдалана отырып құрылған пернетақта мен тышқан макростары кейде қолданба макростары деп аталады. Олар тізбекті бір рет орындау арқылы және қолданбаға әрекеттерді жазуға мүмкіндік беру арқылы жасалады. Қолданбаның мүмкіндіктеріне тікелей қол жетімділігі бар негізгі макро бағдарламалау тілі, көбінесе скрипт тілі болуы мүмкін. Бағдарламашылардың мәтіндік редакторы Emacs ("редакциялау макростарын" білдіретін қысқарту) осы идеяны логикалық аяқталуға жеткізеді. Шын мәнінде, редактордың көп бөлігі макростардан тұрады. Emacs бастапқыда редакциялау тілі TECO-да макростар жиынтығы ретінде жасалған; кейіннен ол Lisp диалектілеріне көшірілді. Басқа бағдарламашылардың мәтіндік редакторы Vim (vi-дің ұрпағы) да пернетақта макростарын іске асырады. Ол пернетақтадағы енгізілген мәтінді тіркемеге (макросқа) жаза алады және оны Microsoft Office үшін VBA макростары сияқты қайта ойнатуға немесе өңдеуге болады. Vim-де макростар жасауға арналған Vimscript деп аталатын скрипт тілі де бар. Visual Basic for Applications (VBA) – Office 97-ден Office 2019-ға дейін Microsoft Office құрамына енгізілген бағдарламалау тілі (бірақ ол Office 97-ден бұрын Office-тің кейбір компоненттерінде де қолжетімді болған). Дегенмен, оның функциясы бастапқыда осы қолданбалардың кейбіреулеріне енгізілген макрос тілдерінен дамып, оларды ығыстырды. XEDIT, VM-нің Conversational Monitor System (CMS) компонентінде жұмыс істейді, EXEC, EXEC2 және REXX тілдерінде жазылған макростарды қолдайды, ал кейбір CMS командалары іс жүзінде XEDIT макростарының айналасына оралған. Hessling Editor (THE), XEDIT-тің толық емес көшірмесі, Regina және Open Object REXX (oorexx) қолдауымен Rexx макростарын қолдайды. Көптеген таныс қолданбалар, соның ішінде жеке компьютерлердегілер де, Rexx-ті скрипт тілі ретінде пайдаланады.

Макровирус

VBA Microsoft Windows жүйелік шақыруларының көп бөлігіне қол жеткізе алады және құжаттар ашылғанда іске қосылады. Осының арқасында VBA-да компьютерлік вирустарды, көбінесе макровирустар деп аталатындарды жазу өте оңай. 1990 жылдардың ортасы мен соңында бұл компьютерлік вирустардың ең көп таралған түріне айналды. Бірақ 1990 жылдардың соңынан бері және қазірге дейін Microsoft өзінің бағдарламаларын жаңарту арқылы қауіпсіздігін арттырып келеді. Сонымен қатар, қазіргі антивирустық бағдарламалар мұндай шабуылдарды дереу тойтарып алады.

Тіркеуге болатын тілдер

Кейбір тілдер, мысалы PHP, кез келген форматтағы мәтінге немесе басқа тілдердің бастапқы кодына кіріктірілуі мүмкін. Код үзінділерінің қалай танылатынының механизмі (мысалы, <?php және ?> белгілерімен шектелуі) мәтіндік макро тілге ұқсас, бірақ олар одан әлдеқайда күшті, толыққанды тілдер.

Процедуралық макрос

PL/I тіліндегі макростар PL/I тілінің өзінің кіші жиымында жазылады: компилятор компиляция уақытында «алдын ала өңдеу операторларын» орындайды, ал осы орындаудың нәтижесі компиляцияланатын кодтың бір бөлігін құрайды. Макро тілі ретінде таныс процедуралық тілді пайдалану мүмкіндігі, қарапайым мәтінді алмастыру макроларынан гөрі әлдеқайда көп мүмкіндік береді, бірақ бұл үлкен және баяу компилятордың құнымен төленеді. PL/I-дегі макростар, сондай-ақ көптеген ассемблерлерде, жанама әсерлерге ие болуы мүмкін, мысалы, басқа макростарға қолжетімді айнымалыларды орнату. Фрейм технологиясының фрейм макролары өздерінің командалық синтаксисіне ие, бірақ кез келген тілдегі мәтінді де қамтуы мүмкін. Әрбір фрейм – бұл ұялы қосалқы жинақтардың иерархиясындағы жалпы компонент, сонымен қатар өзін қосалқы жинақтардың фреймдерімен біріктіру процедурасы (интеграциялық қақтығыстарды жоғары деңгейдегі қосалқы жинақтардың пайдасына шешетін рекурсивті процесс). Нәтижелері – әдетте компиляцияланатын бастапқы модульдер болып табылатын жеке құжаттар. Фрейм технологиясы ұқсас, бірақ сәл өзгеше компоненттердің көбеюін болдырмауға мүмкіндік береді, бұл макростар мен кіші программалар пайда болғаннан бері бағдарламалық жасақтаманы дамытуды қиындататын мәселе. Көптеген ассемблер тілдері процессуалдық макролардың мүмкіндіктері шектеулі, мысалы, код блогын циклды ашу үшін N рет қайталауға рұқсат береді; бірақ олардың нақты ассемблер тілінен мүлдем өзгеше синтаксисі бар.

Синтаксистік макростар

Лексикалық белгілер деңгейінде жұмыс істейтін, бұрын сипатталған C препроцессоры сияқты макрожүйелер лексикалық құрылымды сенімді сақтай алмайды. Синтаксистік макрожүйелер абстрактілі синтаксистік ағаштар деңгейінде жұмыс істейді және бастапқы бағдарламаның лексикалық құрылымын сақтайды. Синтаксистік макрожүйелердің ең көп қолданылатын іске асырылымдары Lisp сияқты тілдерде кездеседі. Бұл тілдердің бірыңғай, жақшалы синтаксисі (S-өрнектер деп аталады) макроның осы стиліне ерекше қолайлы. Атап айтқанда, бірыңғай синтаксис макроларды шақыруды анықтауды жеңілдетеді. Lisp макролары бағдарлама құрылымын өзі өзгертеді, мұндай түрлендірулерді беру үшін толыққанды тіл қолданылады. Синтаксистік макростар көбінесе Lisp сияқты тілдерде кездеседі, бірақ олар Prolog, Erlang, Dylan, Scala, Nemerle, Rust, Elixir, Nim, Haxe және Julia сияқты басқа тілдерде де қолжетімді. Олар сондай-ақ JavaScript және C# үшін үшінші тараптық кеңейтімдер ретінде де бар.

Lisp-тің алғашқы макростары

Lisp-те макростар пайда болғанға дейін, FEXPR деп аталатын операторлар болған, олардың кірістері аргументтердің есептелген мәндері емес, оның орнына аргументтердің синтаксистік түрлері болды, ал шығыстары есептеуде қолданылатын мәндерді құрады. Яғни, FEXPR-лер EVAL деңгейінде іске асырылды және мета-бағалау қабатына қол жеткізуге мүмкіндік берді. Бұл модельді тиімді түсіну қиын болып табылған. 1963 жылы Тимоти Харт AI Memo 57: LISP үшін MACRO анықтамаларында Lisp 1.5-ке макростарды қосуды ұсынды.

Анафориялық макрос

Анафоралық макрос – макросқа берілген және анафора арқылы (басқа бір өрнек арқылы) сілтеме жасауға болатын нысандарды әдейі түсіретін бағдарламалау макросының бір түрі. Анафоралық макростар алғаш рет Пол Грэмнің «On Lisp» еңбегінде пайда болды, ал олардың атауы тілдік анафораға сілтеме жасайды – бұрын айтылған сөздердің орнына сөздерді қолдану.

Гигиеналық макрос

Сегізінші жылдардың ортасында бірқатар мақалалар гигиеналық макро кеңейту (синтаксис ережелері) тұжырымын енгізді – макро анықтамасы мен макро қолданылуының синтаксистік ортасы ерекше болатын, макро анықтаушылар мен пайдаланушыларға кездейсоқ айнымалыны ұстап алу туралы уайымдамауға мүмкіндік беретін үлгіге негізделген жүйе (атап айтқанда, анықтық). Гигиеналық макростар R5RS, R6RS және R7RS стандарттарында қалыптастырылған. Гигиеналық макростарды іске асырудың бірнеше бәсекелес әдістері бар, мысалы, синтаксис ережелері, синтаксис жағдайлары, нақты атауларын өзгерту және синтаксистік жабылулар. Синтаксис ережелері мен синтаксис жағдайлары да Схема стандарттарында қалыптастырылған. Соңғы кезде Racket гигиеналық макростар тұжырымын "бағалаушылар тізбегімен" біріктірді, сонда бір макро жүйенің синтаксистік кеңейту уақыты басқа код блогының қалыпты орындалу уақыты болып табылады, және қабаттасқан кеңейтуді және дөңгелек емес тілде талдауды қалай қолдануға болатынын көрсетті. Схемадан басқа көптеген тілдер гигиеналық макростарды немесе жартылай гигиеналық жүйелерді іске асырады. Мысалдарға Scala, Rust, Elixir, Julia, Dylan, Nim және Nemerle кіреді.

Машинаға тәуелсіз бағдарламалық жасақтама үшін макростар

Макролар әдетте қысқа тізбекті (макро шақыру) нұсқаулардың ұзын тізбегіне сәйкестендіру үшін қолданылады. Макроларды қолданудың тағы бір, сирек кездесетін түрі – керісінше: нұсқаулар тізбегін макро тізбегіне сәйкестендіру. Осы әдісті STAGE2 мобильді бағдарламалау жүйесі қолданды, ол SIMCMP деп аталатын қарапайым макро компиляторын пайдаланып, нақты компьютердің нұсқаулар жиынтығын машинаға тәуелсіз макроларға аударды. Осы машинаға тәуелсіз макроларда жазылған қосымшалар (әсіресе компиляторлар) бастапқы макро компиляторымен жабдықталған кез келген компьютерде өзгеріссіз іске қосылуы мүмкін. Мұндай ортада алғашқы іске қосылатын қосымша – машинаға тәуелсіз макро тілінде жазылған, күрделірек және қуаттырақ макро компиляторы болып табылады. Бұл макро компиляторы өзін-өзіне, жүктеу арқылы, компиляцияланған және әлдеқайда тиімді нұсқасын жасау үшін қолданылады. Бұл тәсілдің артықшылығы – күрделі қосымшаларды бір компьютерден өте ерекше компьютерге аз күш жұмсап көшіруге болады (әрбір мақсатты машина архитектурасы үшін тек қарапайым макро компиляторын жазу қажет). Қазіргі заманғы бағдарламалау тілдерінің, әсіресе C тілінің пайда болуы, олар үшін компиляторлар дерлік барлық компьютерде қолжетімді болғандықтан, мұндай тәсілдің қажеттілігін жойды. Дегенмен, бұл компиляторды жүктеудің алғашқы мысалдарының бірі (немесе тіпті біріншісі) болды.

Тарих

1950-ші жылдардың ортасында, цифрлық компьютерлер үшін бағдарлама жазуда ассемблерлік тіл кеңінен қолданылған кезде, макро нұсқауларды қолдану екі маңызды мақсатта басталды: бір макро нұсқаудан бірнеше ассемблерлік тіл нұсқамаларын жасау арқылы бағдарлама кодтау көлемін азайту және енгізу/шығару командаларын стандартты тәсілдермен көрсету сияқты бағдарлама жазу стандарттарын сақтау. Макро нұсқаулары ассемблерлік тіл бағдарламалау мен FORTRAN және COBOL сияқты жоғары деңгейдегі бағдарламалау тілдері арасындағы аралық қадам болды. IBM 705 компьютері үшін «макро тілдерді» әзірлеуге кіріскен алғашқы бағдарламалау орталықтарының екеуі – Делавэр штатындағы Dow Chemical Corp. және Калифорниядағы Баллистикалық зымырандар логистикалық кеңсесінің Әуе күштері бөлімшесі болды. Мақсатты ассемблерлік тіл форматында жазылған макро нұсқау, ассемблерге алдын ала процессор болып табылатын макро компилятормен өңделіп, ассемблер бағдарламасымен өңделетін бір немесе бірнеше ассемблерлік тіл нұсқамаларын жасады. Бұл бағдарлама ассемблерлік тіл нұсқамаларын машина тіліне аударды. 1950-ші жылдардың соңында макро тілдерден кейін макро ассемблерлер пайда болды. Бұл екеуінің біріктірілген түрі болды, бір бағдарлама макро алдын ала процессор және ассемблер функцияларын бірдей орындады, нәтижесінде Macro SAP пайда болды. Макілройдың 1960 жылғы мақаласы макропроцессорлар арқылы кез келген (жоғары деңгейлі тілдерді қоса) бағдарламалау тілдерін кеңейту саласындағы маңызды жұмыс болды. Макро ассемблерлер ассемблерлік тіл бағдарламашыларына өздерінің макро тілдерін жасауға және бір процессорда, бірақ әртүрлі операциялық жүйелерде (мысалы, MS DOS және CP/M 86-ның ерте нұсқалары) жұмыс істейтін екі машина арасында кодты шектеулі түрде тасымалдауға мүмкіндік берді. Макро кітапханасы әрбір мақсатты машина үшін жазылуы керек болса да, жалпы ассемблерлік бағдарлама жазылмайтын. Күшті макро ассемблерлер макро нұсқауларында шартты ассемблер конструкцияларын пайдалануға мүмкіндік берді, бұл әртүрлі машиналарда немесе операциялық жүйелерде әртүрлі кодты жасауға және көптеген кітапханаларға қажеттілікті азайтуға мүмкіндік берді. 1980-ші және 1990-шы жылдардың басында үстелдік компьютерлердің жылдамдығы бірнеше МГц-ке жететін, ал C, Fortran, Pascal және басқа тілдерде жазылған бағдарламаларды жылдамдату үшін ассемблерлік тіл тәсілдері жиі қолданылды. Бұл тілдер сол кезде әртүрлі шақыру конвенцияларын пайдаланды. Макролар ассемблерлік тілде жазылған процедураларды кез келген тілде жазылған қолданбалардың алдыңғы бөлігімен байланыстыру үшін қолданылатын. Негізгі ассемблерлік код өзгермейтін, тек макро кітапханалары әрбір мақсатты тіл үшін жазылуы керек болды. Unix және оның туындылары сияқты қазіргі операциялық жүйелерде операциялық жүйеге қол жеткізу әдетте динамикалық кітапханалар арқылы қамтамасыз етіледі. C сияқты жоғары деңгейлі тілдер операциялық жүйе функцияларына толық қол жеткізуді ұсынады, сондықтан мұндай функционалдық үшін ассемблерлік бағдарламалар қажет болмайды.