Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
редактор макросов jEdit

Макросъемки (сокращенно «макроинструкция», от греческого сочетания формы μακρο- «длинный, большой» [1] ) в компьютерной науке это правило или шаблон , который определяет , как некий вход должен быть сопоставлен с выходом замены. Применение макроса к входу - это расширение макроса . Входные и выходные данные могут быть последовательностью лексических знаков или символов или синтаксическим деревом . Символьные макросы поддерживаются в программных приложениях, чтобы упростить вызов общих последовательностей команд. В некоторых языках программирования поддерживаются макросы токена и дерева, что позволяетповторное использование кода или расширение языка, иногда для языков, специфичных для предметной области .

Макросы используются, чтобы сделать последовательность вычислительных инструкций доступной для программиста в виде одного программного оператора, что делает задачу программирования менее утомительной и менее подверженной ошибкам. [2] [3] (Таким образом, они называются «макросы» , потому что «большой» блок кода может быть расширен с «малой» последовательности символов.) Макросы часто допускают позиционных или ключевых слов параметров , которые диктуют , что условная ассемблере программа генерирует и использовались для создания целых программ или комплектов программ в соответствии с такими переменными, как операционная система , платформа или другие факторы. Термин происходит от «макро-инструкции», и такие расширения изначально использовались при генерациикод языка ассемблера .

Макросы клавиатуры и мыши [ править ]

Клавиатурные макросы и макросы мыши позволяют короткие последовательности нажатий клавиш и действий мыши превратить в другие, как правило , больше времени, последовательности нажатий клавиш и действий мыши. Таким образом можно автоматизировать часто используемые или повторяющиеся последовательности нажатий клавиш и движений мыши . Отдельные программы для создания этих макросов называются регистраторами макросов .

В течение 1980-х годов макропрограммы - сначала SmartKey , затем SuperKey, KeyWorks, Prokey - были очень популярны, сначала как средство автоматического форматирования сценариев , а затем для множества задач пользовательского ввода. Эти программы были основаны на режиме работы TSR ( завершить и оставаться резидентным ) и применялись ко всему вводу с клавиатуры, независимо от того, в каком контексте это происходило. Они в некоторой степени устарели после появления пользовательских интерфейсов, управляемых мышью, и появления макросов клавиатуры и мыши в таких приложениях, как текстовые процессоры и электронные таблицы , что позволило создавать чувствительные к приложениям макросы клавиатуры.

Макросы клавиатуры можно использовать в многопользовательских ролевых онлайн-играх (MMORPG) для выполнения повторяющихся, но прибыльных задач, тем самым накапливая ресурсы. Поскольку это делается без человеческих усилий, это может исказить экономику игры. По этой причине использование макросов является нарушением TOS или EULA большинства MMORPG, и их администраторы тратят значительные усилия на их подавление. [4]

Макросы приложений и сценарии [ править ]

Макросы клавиатуры и мыши, созданные с использованием встроенных в приложение функций макросов, иногда называют макросами приложения . Они создаются путем однократного выполнения последовательности и разрешения приложению записывать действия. Также может существовать базовый язык макросов, чаще всего язык сценариев , с прямым доступом к функциям приложения.

Текстовый редактор программистов Emacs (сокращение от «редактирование макросов») доводит эту идею до конца. Фактически, большая часть редактора состоит из макросов. Первоначально Emacs был разработан как набор макросов на языке редактирования TECO ; позже он был перенесен на диалекты Лиспа .

Другой текстовый редактор для программистов, Vim (потомок vi ), также имеет полную реализацию макросов. Он может записывать в регистр (макрос) то, что человек набирает на клавиатуре, и его можно воспроизводить или редактировать так же, как макросы VBA для Microsoft Office. Vim также имеет скриптовый язык Vimscript [5] для создания макросов.

Visual Basic для приложений (VBA) - это язык программирования, включенный в Microsoft Office от Office 97 до Office 2019 (хотя он был доступен в некоторых компонентах Office до Office 97). Однако его функция эволюционировала и заменила макроязыки, которые изначально были включены в некоторые из этих приложений.

XEDIT , работающий в компоненте Conversational Monitor System (CMS) виртуальной машины , поддерживает макросы, написанные в EXEC , EXEC2 и REXX , а некоторые команды CMS фактически были оболочками для макросов XEDIT. Редактор Hessling (THE), частичный клон XEDIT, поддерживает макросы Rexx с использованием Regina и Open Object REXX (oorexx). Многие распространенные приложения, в том числе и на ПК, используют Rexx в качестве языка сценариев.

Макро-вирус [ править ]

VBA имеет доступ к большинству системных вызовов Microsoft Windows и выполняется при открытии документов. Это позволяет относительно легко писать компьютерные вирусы в VBA, обычно известные как макровирусы . В середине-конце 1990-х годов это стало одним из наиболее распространенных типов компьютерных вирусов. Однако в конце 1990-х годов и по настоящее время Microsoft исправляет и обновляет свои программы. Кроме того, современные антивирусные программы сразу же противодействуют таким атакам.

Параметризованный макрос [ править ]

Параметризованный макрос макрос , который способен вставить данные объектов в его расширение. Это дает макросу некоторые возможности функции .

В качестве простого примера на языке программирования C это типичный макрос, который не является параметризованным макросом:

 #define PI 3.14159

Это приводит к тому, что строка «PI» заменяется на «3.14159» везде, где она встречается. Он всегда будет заменен этой строкой, и результирующая строка не может быть изменена никаким образом. С другой стороны, пример параметризованного макроса:

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

То, что расширяется до этого макроса, зависит от того, какой аргумент x ему передан. Вот несколько возможных расширений:

 пред (2) → ((2) -1) пред (у + 2) → ((у + 2) -1) пред (f (5)) → ((f (5)) - 1)

Параметризованные макросы являются полезным механизмом на уровне исходного кода для выполнения встроенного расширения , но в таких языках, как C, где они используют простую текстовую замену, они имеют ряд серьезных недостатков по сравнению с другими механизмами для выполнения встроенного расширения, такими как встроенные функции .

С другой стороны, параметризованные макросы, используемые в таких языках, как Lisp , PL / I и Scheme , намного более мощны и способны принимать решения о том, какой код создавать, на основе своих аргументов; таким образом, их можно эффективно использовать для генерации кода времени выполнения .

Макросы подстановки текста [ править ]

Такие языки, как C, и некоторые языки ассемблера имеют элементарные макросистемы, реализованные как препроцессоры для компилятора или ассемблера. Макросы препроцессора C работают путем простой текстовой подстановки на уровне токена , а не на уровне символа. Однако макро-средства более сложных ассемблеров, например, IBM High Level Assembler (HLASM) не могут быть реализованы с помощью препроцессора; код для сборки инструкций и данных перемежается с кодом для сборки макросов.

Классическое использование макросов - это компьютерная система набора текста TeX и ее производные, где большая часть функциональности основана на макросах.

MacroML - экспериментальная система, которая стремится согласовать статическую типизацию и макросистемы. В Nemerle есть типизированные синтаксические макросы, и один из продуктивных способов думать об этих синтаксических макросах - как о многоступенчатых вычислениях .

Другие примеры:

  • m4 - сложный автономный макропроцессор.
  • ПРОФ
  • Макрорасширение TAL , сопровождающий язык атрибутов шаблона
  • SMX: для веб-страниц
  • ML / 1 (первый макроязык)
  • Общее назначение макропроцессора является контекстным шаблоном макропроцессора, который может быть описан как комбинация регулярных выражений , РБНФ и AWK [ править ]
  • SAM76
  • troff и nroff : для набора и форматирования man-страниц Unix.
  • CMS EXEC : для макросов командной строки и макросов приложений
  • EXEC 2 в Conversational Monitor System (CMS): для макросов командной строки и макросов приложений
  • CLIST в IBM Time Sharing Option (TSO): для макросов командной строки и макросов приложений
  • REXX : для макросов командной строки и макросов приложений, например, в AmigaOS , CMS, OS / 2 , TSO.
  • СЦЕНАРИЙ : для форматирования документов
  • Различные оболочки , например, для Linux

Некоторые основные приложения были написаны как текстовые макросы, вызываемые другими приложениями, например, XEDIT в CMS.

Встраиваемые языки [ править ]

Некоторые языки, например PHP , могут быть встроены в текст произвольного формата или в исходный код других языков. Механизм распознавания фрагментов кода (например, заключенных в скобки <?phpи ?>) аналогичен текстовому макроязыку, но это гораздо более мощные и полнофункциональные языки.

Процедурные макросы [ править ]

Макросы на языке PL / I написаны в подмножестве самого PL / I: компилятор выполняет « операторы препроцессора » во время компиляции, и выходные данные этого выполнения образуют часть компилируемого кода. Возможность использовать знакомый процедурный язык, поскольку макроязык дает гораздо больше возможностей, чем у макросов замены текста, за счет более крупного и медленного компилятора.

Макросы кадра Frame Technology имеют собственный синтаксис команд, но также могут содержать текст на любом языке. Каждый фрейм является как общим компонентом в иерархии вложенных подсборок, так и процедурой для интеграции с его фреймами подсборки (рекурсивный процесс, который разрешает конфликты интеграции в пользу подсборок более высокого уровня). На выходе получаются пользовательские документы, обычно компилируемые исходные модули. Фреймовая технология позволяет избежать увеличения числа похожих, но слегка отличающихся компонентов - проблемы, которая преследовала разработку программного обеспечения с момента изобретения макросов и подпрограмм .

Большинство языков ассемблера имеют менее мощные процедурные макросы, например, позволяющие повторять блок кода N раз для развертывания цикла ; но они имеют совершенно иной синтаксис, чем фактический язык ассемблера.

Синтаксические макросы [ править ]

Макросистемы - такие как препроцессор C, описанный ранее, - которые работают на уровне лексических токенов, не могут надежно сохранять лексическую структуру. Вместо этого синтаксические макросистемы работают на уровне абстрактных синтаксических деревьев и сохраняют лексическую структуру исходной программы. Наиболее широко используемые реализации синтаксических макросистем находятся в Lisp- подобных языках. Эти языки особенно подходят для этого стиля макросов из-за их единообразного синтаксиса в скобках (известного как S-выражения). В частности, унифицированный синтаксис упрощает определение вызовов макросов. Макросы Lisp преобразуют саму структуру программы, и для выражения таких преобразований доступен полный язык. Хотя синтаксические макросы часто встречаются в языках типа Lisp, они также доступны и в других языках, таких как Prolog , Dylan , Scala , Nemerle , Rust , Elixir , Nim , Haxe , [6] и Julia . Они также доступны как сторонние расширения для JavaScript , [7] C # и Python . [8][9]

Макросы раннего Лиспа [ править ]

До того, как в Лиспе появились макросы, в нем были так называемые FEXPR , операторы, подобные функциям, входными данными которых были не значения, вычисленные аргументами, а скорее синтаксические формы аргументов, а выходными данными были значения, которые должны использоваться в вычислениях. Другими словами, FEXPR были реализованы на том же уровне, что и EVAL, и обеспечивали окно в уровень метаоценки. В целом оказалось, что эту модель сложно эффективно осмыслить. [10]

В 1963 году Тимоти Харт предложил добавить макросы в Lisp 1.5 в AI Memo 57: MACRO Definitions for LISP. [11]

Анафорические макросы [ править ]

Анафорический макрос - это тип программного макроса, который намеренно фиксирует некоторую форму, предоставленную макросу, на которую может ссылаться анафора (выражение, относящееся к другому). Анафорические макросы впервые появились в книге Пола Грэма «О Лиспе», и их название - отсылка к лингвистической анафоре - использованию слов в качестве замены предшествующих слов.

Гигиенические макросы [ править ]

В середине восьмидесятых годов в ряде статей [12] [13] было введено понятие гигиенического макрорасширения ( syntax-rules), системы на основе шаблонов, в которой синтаксические среды определения макроса и использования макроса различны, что позволяет определять макроопределения и пользователям не нужно беспокоиться о непреднамеренном захвате переменных (см. ссылочную прозрачность ). Гигиенические макросы стандартизированы для Scheme в стандартах R5RS , R6RS и R7RS . Ряд конкурирующих реализаций гигиенических макросов существует такие как syntax-rules, syntax-case, явное переименование и синтаксическое закрытие. Оба syntax-rulesи syntax-caseбыли стандартизированы в стандартах Схемы.

Недавно Racket объединил понятия гигиенических макросов с « башней оценщиков », так что время синтаксического расширения одной макросистемы является обычным временем выполнения другого блока кода [14], и показал, как применять чередование расширения и синтаксического анализа. на языке без скобок. [15]

Ряд языков, отличных от Scheme, либо реализуют гигиенические макросы, либо реализуют частично гигиенические системы. Примеры включают Scala , Rust , Elixir , Julia , Dylan , Nim и Nemerle .

Приложения [ править ]

Порядок оценки
Макросистемы имеют множество применений. Возможность выбора порядка оценки (см. Ленивое вычисление и нестрогие функции ) позволяет создавать новые синтаксические конструкции (например, управляющие структуры ), неотличимые от тех, что встроены в язык. Например, в диалекте Лиспа, который имеет, condно отсутствует if, можно определить последний в терминах первого, используя макросы. Например, в Scheme есть как продолжения, так и гигиенические макросы, которые позволяют программисту разрабатывать собственные абстракции управления, такие как циклы и конструкции раннего выхода, без необходимости встраивать их в язык.
Субъязыки данных и языки предметной области
Затем макросы позволяют определять языки данных, которые немедленно компилируются в код, что означает, что такие конструкции, как конечные автоматы, могут быть реализованы естественным и эффективным образом. [16]
Связывающие конструкции
Макросы также можно использовать для введения новых конструкций связывания. Самый известный пример - это преобразование letв приложение функции к набору аргументов.

Фелляйзен предполагает [17], что эти три категории составляют основные законные применения макросов в такой системе. Другие предложили альтернативные варианты использования макросов, такие как анафорические макросы в макросистемах, которые негигиеничны или допускают выборочное антигигиеничное преобразование.

Взаимодействие макросов и других языковых функций было продуктивной областью исследований. Например, компоненты и модули полезны для крупномасштабного программирования, но взаимодействие макросов и этих других конструкций должно быть определено для их совместного использования. Модульные и компонентные системы, которые могут взаимодействовать с макросами, были предложены для Scheme и других языков с макросами. Например, язык Racket расширяет понятие макросистемы до синтаксической башни, где макросы могут быть написаны на языках, включая макросы, с использованием гигиены, чтобы гарантировать, что синтаксические слои различны, и позволяя модулям экспортировать макросы в другие модули.

Макросы для машинно-независимого программного обеспечения [ править ]

Макросы обычно используются для сопоставления короткой строки (вызов макроса) более длинной последовательности инструкций. Другое, менее распространенное использование макросов - обратное: отображение последовательности инструкций в строке макроса. Это был подход, принятый системой мобильного программирования STAGE2, которая использовала элементарный компилятор макросов (называемый SIMCMP) для сопоставления определенного набора команд данного компьютера с аналогичными машинно-независимыми макросами. Приложения (особенно компиляторы), написанные с помощью этих машинно-независимых макросов, можно будет запускать без изменений на любом компьютере, оснащенном элементарным компилятором макросов. Первое приложение, запускаемое в таком контексте, - это более сложный и мощный компилятор макросов, написанный на машинно-независимом языке макросов. Этот компилятор макросов применяется к самому себе вbootstrap , чтобы создать скомпилированную и гораздо более эффективную версию самого себя. Преимущество этого подхода состоит в том, что сложные приложения могут быть перенесены с одного компьютера на совершенно другой компьютер с очень небольшими усилиями (для каждой архитектуры целевой машины достаточно написать элементарный компилятор макросов). [18] [19] Появление современных языков программирования, в частности C , компиляторы которого доступны практически на всех компьютерах, сделало такой подход излишним. Однако это был один из первых (если не первый) случаев начальной загрузки компилятора .

Язык ассемблера [ править ]

Хотя макрокоманды могут быть определены программистом для любого набора программных инструкций на собственном ассемблере, обычно макросы связаны с библиотеками макросов, поставляемыми с операционной системой, что позволяет получить доступ к функциям операционной системы, таким как

  • периферийный доступ с помощью методов доступа (включая макросы, такие как OPEN, CLOSE, READ и WRITE)
  • функции операционной системы, такие как ATTACH, WAIT и POST для создания и синхронизации подзадач. [20] Обычно такие макросы расширяются в исполняемый код, например, для макрокоманды EXIT,
  • список инструкций определения констант , например, для макроса DCB - DTF (Define The File) для DOS [21] - или комбинации кода и констант, с деталями раскрытия, зависящими от параметров макроса инструкции (например, как ссылка на файл и область данных для инструкции READ);
  • исполняемый код часто оканчивается либо инструкцией регистра ветвления и связывания для вызова подпрограммы, либо инструкцией вызова супервизора для непосредственного вызова функции операционной системы.

В более старых операционных системах, таких как те, которые используются на мэйнфреймах IBM, полная функциональность операционной системы была доступна только для программ на языке ассемблера, а не для программ на языке высокого уровня (если, конечно, не использовались подпрограммы на языке ассемблера), поскольку стандартные макрокоманды не всегда иметь аналоги в подпрограммах, доступных для языков высокого уровня.

История [ править ]

В середине 1950-х годов, когда программирование на языке ассемблера широко использовалось для написания программ для цифровых компьютеров , использование макросов было начато для двух основных целей: уменьшить объем программного кода, который необходимо было написать, путем генерации нескольких операторов языка ассемблера из одной макрос-инструкции и для обеспечения соблюдения стандартов написания программ, например, для определения команд ввода / вывода стандартными способами. [22] Макроинструкции были фактически промежуточным звеном между программированием на языке ассемблера и последующими языками программирования высокого уровня , такими как FORTRAN и COBOL.. Две из самых ранних программных установок для разработки «макроязыков» для компьютера IBM 705 были в Dow Chemical Corp. в Делавэре и в Управлении авиационных материалов Управления по логистике баллистических ракет в Калифорнии. Макро-инструкция, написанная в формате целевого языка ассемблера, будет обрабатываться компилятором макросов, который был препроцессором ассемблера, чтобы сгенерировать одну или несколько инструкций языка ассемблера, которые затем будут обработаны программой ассемблера, которая будет переводить инструкции на языке ассемблера в инструкции на машинном языке . [23]

К концу 1950-х за макроязыком последовали Макроассемблеры. Это была комбинация того, что одна программа выполняла обе функции - макропроцессора и ассемблера в одном пакете. [23] [ неудачная проверка ]

В 1959 году Дуглас Иствуд и Дуглас Макилрой из Bell Labs ввели условные и рекурсивные макросы в популярный ассемблер SAP [24], создав так называемый Macro SAP. [25] Статья Макилроя 1960 года была плодотворной в области расширения любых (в том числе высокоуровневых ) языков программирования с помощью макропроцессоров . [26] [24]

Макроассемблеры позволили программистам на ассемблере реализовать свой собственный макроязык и ограничили переносимость кода между двумя машинами, на которых работает один и тот же процессор, но с разными операционными системами, например ранние версии MSDOS и CPM-86. Библиотека макросов должна быть написана для каждой целевой машины, но не для всей программы на языке ассемблера. Обратите внимание, что более мощные макроассемблеры позволяли использовать конструкции условной сборки в макро-инструкциях, которые могли генерировать разный код на разных машинах или в разных операционных системах, что уменьшало потребность в нескольких библиотеках. [ необходима цитата ]

В 1980-х и начале 1990-х настольные ПК работали только на нескольких МГц, и процедуры на языке ассемблера обычно использовались для ускорения программ, написанных на C, Fortran, Pascal и других. В то время в этих языках использовались разные соглашения о вызовах. Макросы можно использовать для взаимодействия подпрограмм, написанных на языке ассемблера, с интерфейсной частью приложений, написанных практически на любом языке. Опять же, основной код языка ассемблера остался прежним, только библиотеки макросов нужно было написать для каждого целевого языка. [ необходима цитата ]

В современных операционных системах, таких как Unix и его производные, доступ к операционной системе обеспечивается с помощью подпрограмм, обычно предоставляемых динамическими библиотеками. Языки высокого уровня, такие как C, предлагают полный доступ к функциям операционной системы, устраняя необходимость в программах на языке ассемблера для таких функций. [ необходима цитата ]

См. Также [ править ]

  • Анафорические макросы
  • Язык ассемблера § Макросы (происхождение концепции макросов)
  • Расширяемое программирование
  • Гигиенические макросы
  • Программирование путем демонстрации  - методика обучения новому поведению компьютера или робота.
  • Интерполяция строки  - замена заполнителей в строке значениями
  • Информатика и инженерия
  • Информатика

Ссылки [ править ]

  1. ^ Оксфордский словарь английского языка , sv- макрос , макро-инструкция и макро-
  2. ^ Гринвальд, Ирвин Д .; Морин Кейн (апрель 1959). «Система Share 709: программирование и модификация». Журнал ACM . Нью-Йорк, Нью-Йорк, США: ACM. 6 (2): 128–133. DOI : 10.1145 / 320964.320967 . S2CID  27424222 . Одно из важных применений макросов программиста - экономия времени и ошибок канцелярского типа при написании последовательности инструкций, которые часто повторяются в ходе выполнения программы.
  3. ^ Стрейчи, Кристофер (октябрь 1965). «Макрогенератор общего назначения» . Компьютерный журнал . 8 (3): 225–241. DOI : 10.1093 / comjnl / 8.3.225 .
  4. ^ "Runescape: Massive Online Adventure Game от Jagex Ltd" . Проверено 3 апреля 2008 .
  5. ^ "скрипты: vim онлайн" . www.vim.org .
  6. ^ «Макросы» . Haxe - кроссплатформенный инструментарий .
  7. ^ «Sweet.js - Гигиенические макросы для JavaScript» . www.sweetjs.org .
  8. ^ «Макросы в Python: квазицитаты, классы, LINQ и многое другое !: lihaoyi / macropy» . 7 февраля 2019 г. - через GitHub.
  9. ^ "Домашняя страница LeMP · Улучшенный C #" . ecsharp.net .
  10. ^ Маршалл, Джо. "электронное письмо без названия" . Проверено 3 мая 2012 года .
  11. ^ "AIM-057, MACRO Определения для LISP, Тимоти П. Харт". ЛВП : 1721,1 / 6111 . Цитировать журнал требует |journal=( помощь )
  12. ^ Кольбекер, Юджин; Фридман, Дэниел; Фелляйзен, Матиас; Дуба, Брюс. «Гигиеническое макрорасширение». DOI : 10.1145 / 319838.319859 .
  13. ^ [1] Клинджер, Рис. «Работающие макросы»
  14. ^ Flatt, Мэтью. "Составные и компилируемые макросы: когда это нужно?" (PDF) .
  15. ^ Рафкинд, Джон; Флэтт, Мэтью. «Хону: синтаксическое расширение для алгебраической записи с помощью лесонасаждений» (PDF) .
  16. ^ «Автоматы через макросы» . cs.brown.edu .
  17. ^ [2] , Маттиас Фелляйзен, публикация в списке рассылки LL1
  18. ^ Orgass, Ричард Дж .; Уильям М. Уэйт (сентябрь 1969 г.). «База для системы мобильного программирования». Коммуникации ACM . Нью-Йорк, Нью-Йорк, США: ACM. 12 (9): 507–510. DOI : 10.1145 / 363219.363226 . S2CID 8164996 . 
  19. ^ Уэйт, Уильям М. (июль 1970). «Система мобильного программирования: STAGE2». Коммуникации ACM . Нью-Йорк, Нью-Йорк, США: ACM. 13 (7): 415–421. DOI : 10.1145 / 362686.362691 . S2CID 11733598 . 
  20. ^ "Университет Северной Флориды" (PDF) .
  21. ^ "DTF (DOS / VSE)" .
  22. ^ «Центр знаний IBM» . Центр знаний IBM .
  23. ^ a b «Макроинструкции языка ассемблера» . Cisco .
  24. ^ a b Холбрук, Бернард Д.; Браун, У. Стэнли. "Технический отчет по вычислительной науке № 99 - История компьютерных исследований в Bell Laboratories (1937–1975)" . Bell Labs . Архивировано из оригинала на 2 сентября 2014 года . Проверено 2 февраля 2020 года .
  25. ^ «Macro SAP - Модификация компилятора макросов SAP» . HOPL: Интернет-историческая энциклопедия языков программирования . Архивировано из оригинального 13 августа 2008 года.
  26. ^ Layzell, П. (1985). «История использования макросов в расширяемости языков программирования» . Компьютерный журнал . 28 (1): 29–33. DOI : 10.1093 / comjnl / 28.1.29 .

Внешние ссылки [ править ]

  • Как писать макроинструкции
  • Рочестерский технологический институт, профессора Powerpoint