Макро (информатика)
В компьютерном программировании ( — макрос сокращение от « макроинструкция »; от греческого μακρο — «длинный, большой»). [ 1 ] ) — это правило или шаблон , определяющий, как определенные входные данные должны быть сопоставлены с заменяющими выходными данными. Применение макроса к входным данным называется расширением макроса . Входными и выходными данными могут быть последовательность лексических токенов или символов или синтаксическое дерево . Символьные макросы поддерживаются в программных приложениях , что упрощает вызов общих последовательностей команд . Макросы токенов и деревьев поддерживаются в некоторых языках программирования, что позволяет повторно использовать код или расширять язык, иногда для языков, специфичных для предметной области .
Макросы используются для того, чтобы сделать последовательность вычислительных инструкций доступной программисту в виде одного оператора программы , что делает задачу программирования менее утомительной и менее подверженной ошибкам. [ 2 ] [ 3 ] Поэтому их называют «макросами», потому что «большой» блок кода можно расширить из «маленькой» последовательности символов. Макросы часто допускают позиционные или ключевые параметры, которые определяют, что генерирует программа условного ассемблера , и используются для создания целых программ или наборов программ в соответствии с такими переменными, как операционная система , платформа или другие факторы. Этот термин происходит от «макроинструкции», и такие расширения первоначально использовались при создании на языке ассемблера кода .
Макросы клавиатуры и мыши
[ редактировать ]Макросы клавиатуры и макросы мыши позволяют коротким последовательностям нажатий клавиш и действий мыши трансформироваться в другие, обычно более трудоемкие последовательности нажатий клавиш и действий мыши. Таким образом можно автоматизировать часто используемые или повторяющиеся последовательности нажатий клавиш и движений мыши . Отдельные программы для создания этих макросов называются макрорекордерами .
В 1980-х годах программы-макросы — первоначально SmartKey , затем SuperKey, KeyWorks, Prokey — были очень популярны, сначала как средство автоматического форматирования сценариев , а затем для выполнения различных задач пользовательского ввода. Эти программы были основаны на резидентном режиме работы и применялись ко всему вводу с клавиатуры, независимо от того, в каком контексте он происходил. Они в некоторой степени устарели после появления пользовательских интерфейсов, управляемых мышью, и доступности макросов клавиатуры и мыши в таких приложениях, как текстовые процессоры и электронные таблицы , что позволило создавать макросы клавиатуры, чувствительные к приложению.
Макросы клавиатуры можно использовать в многопользовательских ролевых онлайн-играх (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) VM , поддерживает макросы, написанные на EXEC , EXEC2 и REXX , а некоторые команды CMS фактически были обертками вокруг макросов XEDIT. Редактор Hessling (THE), частичный клон XEDIT, поддерживает макросы Rexx с использованием Retina и 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 ему передается. Вот некоторые возможные расширения:
pred(2) → ((2) -1) pred(y+2) → ((y+2) -1) pred(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 (язык макросов один)
- Макрогенератор общего назначения — это контекстный макропроцессор сопоставления шаблонов, который можно описать как комбинацию регулярных выражений , EBNF и AWK. [ нужна ссылка ]
- troff и nroff : для набора и форматирования страниц руководства Unix.
- CMS EXEC : для макросов командной строки и макросов приложений.
- EXEC 2 в системе разговорного мониторинга (CMS): для макросов командной строки и макросов приложений.
- CLIST IBM в опции разделения времени (TSO): для макросов командной строки и макросов приложений.
- REXX : для макросов командной строки и макросов приложений, например, в AmigaOS , CMS, OS/2 , TSO.
- СКРИПТ : для форматирования документов.
- Различные оболочки , например, для Linux
Некоторые основные приложения написаны в виде текстовых макросов, вызываемых другими приложениями, например XEDIT в CMS.
Встраиваемые языки
[ редактировать ]Некоторые языки, такие как PHP , могут быть встроены в текст свободного формата или исходный код других языков. Механизм распознавания фрагментов кода (например, заключение в скобки <?php
и ?>
) похож на текстовый макроязык, но они гораздо более мощные и полнофункциональные языки.
Процедурные макросы
[ редактировать ]Макросы на языке PL/I написаны в подмножестве самого PL/I: компилятор выполняет « операторы препроцессора » во время компиляции, и результат этого выполнения образует часть компилируемого кода. Возможность использовать знакомый процедурный язык в качестве языка макросов дает гораздо большую мощность, чем у макросов замены текста, за счет более крупного и медленного компилятора. Макросы в PL/I, как и во многих ассемблерах, могут иметь побочные эффекты , например, устанавливать переменные, к которым могут получить доступ другие макросы.
Макросы кадров технологии Frame имеют собственный синтаксис команд, но также могут содержать текст на любом языке. Каждый кадр является одновременно общим компонентом в иерархии вложенных подсборок и процедурой интеграции с его кадрами подсборки (рекурсивный процесс, который разрешает конфликты интеграции в пользу подсборок более высокого уровня). Выходные данные представляют собой специальные документы, обычно компилируемые исходные модули. Технология фреймов позволяет избежать распространения похожих, но слегка различающихся компонентов — проблемы, которая преследовала разработку программного обеспечения со времен изобретения макросов и подпрограмм .
Большинство языков ассемблера имеют менее мощные процедурные макросы, например, позволяющие повторять блок кода N раз для развертывания цикла ; но они имеют совершенно другой синтаксис, чем реальный язык ассемблера.
Синтаксические макросы
[ редактировать ]Макросистемы, такие как препроцессор C, описанный ранее, которые работают на уровне лексических токенов, не могут надежно сохранять лексическую структуру. Вместо этого синтаксические макросистемы работают на уровне абстрактных синтаксических деревьев и сохраняют лексическую структуру исходной программы. Наиболее широко используемые реализации синтаксических макросистем встречаются в Lisp -подобных языках. Эти языки особенно подходят для макросов такого типа благодаря единообразному синтаксису в скобках (известному как S-выражения ). В частности, единый синтаксис упрощает определение вызовов макросов. Макросы Lisp преобразуют саму структуру программы, используя полный язык для выражения таких преобразований. Хотя синтаксические макросы часто встречаются в Lisp-подобных языках, они также доступны и в других языках, таких как Prolog . [ 6 ] Эрланг , [ 7 ] Дилан , [ 8 ] Скала , [ 9 ] Немерль , [ 10 ] Ржавчина , [ 11 ] Эликсир , [ 12 ] Nim , [ 13 ] Хасэ , [ 14 ] и Джулия . [ 15 ] Они также доступны в виде сторонних расширений JavaScript. [ 16 ] и С# . [ 17 ]
Ранние макросы Лиспа
[ редактировать ]До того, как в Лиспе появились макросы, в нем были так называемые FEXPR , операторы, подобные функциям, входные данные которых представляли собой не значения, вычисленные аргументами, а скорее синтаксические формы аргументов, а выходные данные были значениями, которые использовались в вычислениях. Другими словами, FEXPR были реализованы на том же уровне, что и EVAL, и предоставили окно на уровень метаоценки. В целом выяснилось, что эту модель сложно эффективно рассуждать. [ 18 ]
В 1963 году Тимоти Харт предложил добавить макросы в Lisp 1.5 в AI Memo 57: Определения макросов для LISP. [ 19 ]
Анафорические макросы
[ редактировать ]Анафорический макрос — это тип программного макроса, который намеренно фиксирует некоторую форму, предоставленную макросу, на которую можно ссылаться с помощью анафоры (выражения, ссылающегося на другое). Анафорические макросы впервые появились в книге Пола Грэма «О Лиспе», и их название является отсылкой к лингвистической анафоре — использованию слов вместо предыдущих слов.
Гигиенические макросы
[ редактировать ]В середине восьмидесятых годов появился ряд статей. [ 20 ] [ 21 ] ввел понятие гигиенического макрорасширения ( syntax-rules
), система, основанная на шаблонах, в которой синтаксическая среда определения макроса и использования макроса различна, что позволяет определяющим макросы и пользователям не беспокоиться о непреднамеренном захвате переменных (см. ссылочную прозрачность ). Гигиенические макросы стандартизированы для Scheme в стандартах R5RS , R6RS и R7RS . Существует ряд конкурирующих реализаций гигиенических макросов, таких как syntax-rules
, syntax-case
, явное переименование и синтаксические замыкания. Оба syntax-rules
и syntax-case
были стандартизированы в стандартах Схемы.
Недавно Racket объединил понятия гигиенических макросов с « башней оценщиков », так что время синтаксического расширения одной макросистемы равно обычному времени выполнения другого блока кода, [ 22 ] и показал, как применять чередующееся расширение и синтаксический анализ на языке без скобок. [ 23 ]
Ряд языков, кроме Scheme, либо реализуют гигиенические макросы, либо реализуют частично гигиенические системы. Примеры включают Scala , Rust , Elixir , Julia , Dylan , Nim и Nemerle .
Приложения
[ редактировать ]- Порядок оценки
- Макросистемы имеют множество применений. Возможность выбора порядка вычислений (см. ленивые вычисления и нестрогие функции ) позволяет создавать новые синтаксические конструкции (например, управляющие структуры ), неотличимые от встроенных в язык. Например, в диалекте Лиспа, который имеет
cond
но не хватаетif
, то последнее можно определить через первое с помощью макросов. Например, в Scheme есть как продолжения , так и гигиенические макросы, что позволяет программисту разрабатывать свои собственные абстракции управления, такие как циклы и конструкции раннего выхода, без необходимости встраивать их в язык. - Подъязыки данных и языки, специфичные для предметной области
- Далее, макросы позволяют определять языки данных, которые немедленно компилируются в код, а это означает, что такие конструкции, как конечные автоматы, могут быть реализованы естественным и эффективным способом. [ 24 ]
- Связывающие конструкции
- Макросы также можно использовать для введения новых конструкций привязки. Самый известный пример – трансформация
let
в применении функции к набору аргументов.
Феляйзена Гипотезы [ 25 ] что эти три категории составляют основные законные способы использования макросов в такой системе. Другие предложили альтернативное использование макросов, например, анафорические макросы в макросистемах, которые негигиеничны или допускают выборочную негигиеническую трансформацию.
Взаимодействие макросов и других особенностей языка было продуктивной областью исследований. Например, компоненты и модули полезны для крупномасштабного программирования, но для их совместного использования необходимо определить взаимодействие макросов и других конструкций. Для Scheme и других языков с макросами были предложены модули и системы компонентов, которые могут взаимодействовать с макросами. Например, язык Racket расширяет понятие макросистемы до синтаксической башни, где макросы могут быть написаны на языках, включая макросы, используя гигиену, чтобы гарантировать различие синтаксических слоев и позволяя модулям экспортировать макросы в другие модули.
Макросы для машинно-независимого программного обеспечения
[ редактировать ]Макросы обычно используются для сопоставления короткой строки (вызова макроса) с более длинной последовательностью инструкций. Другой, менее распространенный вариант использования макросов — обратное: сопоставление последовательности инструкций со строкой макроса. Именно такой подход был использован в системе мобильного программирования STAGE2 , которая использовала элементарный компилятор макросов (называемый SIMCMP) для отображения конкретного набора команд данного компьютера в машинно-независимые макросы. Приложения (особенно компиляторы), написанные с использованием этих машинно-независимых макросов, затем можно запускать без изменений на любом компьютере, оснащенном элементарным компилятором макросов. Первое приложение, запускаемое в таком контексте, представляет собой более сложный и мощный компилятор макросов, написанный на машинно-независимом языке макросов. Этот макрокомпилятор применяется к самому себе в режиме начальной загрузки для создания скомпилированной и гораздо более эффективной версии самого себя. Преимущество этого подхода состоит в том, что сложные приложения можно переносить с одного компьютера на другой компьютер с минимальными усилиями (для каждой целевой архитектуры достаточно просто написать элементарный макрокомпилятор). [ 26 ] [ 27 ] Появление современных языков программирования, особенно C , компиляторы которого имеются практически на всех компьютерах, сделало такой подход излишним. Однако это был один из первых (если не первый) случаев начальной загрузки компилятора .
Язык ассемблера
[ редактировать ]Хотя макрокоманды могут быть определены программистом для любого набора собственных программных инструкций ассемблера, обычно макросы связаны с библиотеками макросов, поставляемыми с операционной системой, обеспечивающими доступ к функциям операционной системы, таким как
- периферийный доступ с помощью методов доступа (включая такие макросы, как OPEN, CLOSE, READ и WRITE)
- функции операционной системы, такие как ATTACH, WAIT и POST для создания и синхронизации подзадач. [ 28 ] Обычно такие макросы расширяются до исполняемого кода, например, для макроинструкции EXIT.
- список инструкций определения констант , например, для макроса DCB — DTF (Define The File) для DOS. [ 29 ] — или сочетание кода и констант, детали расширения которых зависят от параметров макрокоманды (например, ссылка на файл и область данных для инструкции READ);
- исполняемый код часто завершался либо инструкцией регистра ветвления и связи для вызова подпрограммы, либо инструкцией вызова супервизора для прямого вызова функции операционной системы.
- Создание потока заданий этапа 2 для генерации системы , например, в OS/360 . В отличие от типичных макросов, макросы sysgen stage 1 не генерируют данные или код для загрузки в хранилище, а используют оператор PUNCH для вывода JCL и связанных данных.
В старых операционных системах, таких как те, что использовались на мэйнфреймах IBM, полная функциональность операционной системы была доступна только программам на языке ассемблера, но не программам на языке высокого уровня (если, конечно, не использовались подпрограммы языка ассемблера), поскольку стандартные макрокоманды не всегда выполнялись. иметь аналоги в процедурах, доступных в языках высокого уровня.
История
[ редактировать ]В середине 1950-х годов, когда программирование на ассемблере широко использовалось для написания программ для цифровых компьютеров , использование макроинструкций было инициировано для двух основных целей: уменьшить объем программного кода, который необходимо было написать, путем создания нескольких операторов языка ассемблера. из одной макрокоманды и для обеспечения соблюдения стандартов написания программ, например, стандартного определения команд ввода/вывода. [ 30 ] Инструкции макросов фактически были промежуточным этапом между программированием на языке ассемблера и языками программирования высокого уровня последующими , такими как FORTRAN и COBOL . Две из первых программных установок для разработки «макроязыков» для компьютера IBM 705 находились в Dow Chemical Corp. в Делавэре и в Управлении авиационных материалов Управления логистики баллистических ракет в Калифорнии. Макроинструкция, написанная в формате целевого языка ассемблера, обрабатывалась макрокомпилятором, который был препроцессором ассемблера, для генерации одной или нескольких инструкций ассемблера, которые затем обрабатывались программой ассемблера, которая транслировала бы инструкции языка ассемблера в машинного языка . инструкции [ 31 ]
К концу 1950-х годов за макроязыком последовали макроассемблеры . Это была комбинация того и другого, где одна программа выполняла обе функции: макропрепроцессора и ассемблера в одном пакете. [ 31 ] [ не удалось пройти проверку ]
В 1959 году Дуглас Э. Иствуд и Дуглас Макилрой из Bell Labs ввели условные и рекурсивные макросы в популярный ассемблер SAP . [ 32 ] создание так называемого Macro SAP. [ 33 ] Статья Макилроя 1960 года стала плодотворной в области расширения любых (включая языки высокого уровня языков программирования ) с помощью макропроцессоров . [ 34 ] [ 32 ]
Макросемблеры позволяли программистам на языке ассемблера реализовывать свои собственные макроязыки и обеспечивали ограниченную переносимость кода между двумя машинами с одним и тем же процессором, но с разными операционными системами, например, ранними версиями MS-DOS и CP/M-86 . Библиотеку макросов необходимо будет писать для каждой целевой машины, а не для всей программы на языке ассемблера. Обратите внимание, что более мощные ассемблеры макросов позволяли использовать конструкции условной сборки в макроинструкциях, которые могли генерировать разный код на разных машинах или в разных операционных системах, что уменьшало потребность в нескольких библиотеках. [ нужна ссылка ]
В 1980-х и начале 1990-х годов настольные ПК работали на частоте всего несколько МГц, а программы на языке ассемблера обычно использовались для ускорения программ, написанных на C, Fortran, Pascal и других языках. В то время в этих языках использовались разные соглашения о вызовах. Макросы можно использовать для взаимодействия подпрограмм, написанных на языке ассемблера, с интерфейсом приложений, написанных практически на любом языке. Опять же, базовый код ассемблера остался прежним, только нужно было написать библиотеки макросов для каждого целевого языка. [ нужна ссылка ]
В современных операционных системах, таких как Unix и ее производных, доступ к операционной системе осуществляется через подпрограммы, обычно предоставляемые динамическими библиотеками. Языки высокого уровня, такие как C, предлагают полный доступ к функциям операционной системы, устраняя необходимость в программах на языке ассемблера для реализации такой функциональности. [ нужна ссылка ]
Более того, стандартные библиотеки нескольких новых языков программирования, таких как Go , активно препятствуют использованию системных вызовов в пользу платформо-независимых библиотек, а также, если в этом нет необходимости, для улучшения переносимости и безопасности. [ 35 ]
См. также
[ редактировать ]- Анафорические макросы
- Язык ассемблера § Макросы (происхождение понятия макросов)
- Составной оператор
- Расширяемое программирование – механизмы программирования для расширения языка, компилятора и среды выполнения.
- Слитая операция
- Гигиенический макрос - макросы, расширение которых гарантированно не приведет к захвату идентификаторов.
- Макро и безопасность
- Программирование путем демонстрации - метод обучения компьютера или робота новому поведению.
- Интерполяция строк – замена заполнителей в строке значениями.
Ссылки
[ редактировать ]- ^ Оксфордский словарь английского языка , sv macro , макроинструкция и макро-
- ^ Гринвальд, Ирвин Д.; Кейн, Морин (апрель 1959 г.). «Система Share 709: программирование и модификация» . Журнал АКМ . 6 (2). Нью-Йорк, штат Нью-Йорк, США: ACM: 128–133. дои : 10.1145/320964.320967 . S2CID 27424222 .
Одним из важных применений программных макросов является экономия времени и устранение ошибок канцелярского типа при написании последовательности инструкций, которые часто повторяются в ходе программы.
- ^ Стрейчи, Кристофер (октябрь 1965 г.). «Макрогенератор общего назначения» . Компьютерный журнал . 8 (3): 225–241. дои : 10.1093/comjnl/8.3.225 .
- ^ «Runescape: масштабная приключенческая онлайн-игра от Jagex Ltd» . Проверено 3 апреля 2008 г.
- ^ «скрипты: vim онлайн» . www.vim.org .
- ^ «Макросы Пролога» . www.metalevel.at . Проверено 5 апреля 2021 г.
- ^ «Эрланг — Препроцессор» . erlang.org . Проверено 24 мая 2021 г.
- ^ «Макросистема Дилана — Открытый Дилан» . opendylan.org . Проверено 5 апреля 2021 г.
- ^ «Макросы определения» . Документация Скала . Проверено 5 апреля 2021 г.
- ^ «О программе — Официальный сайт языка программирования Nemerle» . nemerle.org . Проверено 5 апреля 2021 г.
- ^ «Макросы — язык программирования Rust» . doc.rust-lang.org . Проверено 5 апреля 2021 г.
- ^ «Макросы» . эликсир-lang.github.com . Проверено 5 апреля 2021 г.
- ^ «макросы» . nim-lang.org . Проверено 5 апреля 2021 г.
- ^ «Макросы» . Haxe — кроссплатформенный набор инструментов .
- ^ «Метапрограммирование · Язык Джулии» . docs.julialang.org . Проверено 5 апреля 2021 г.
- ^ «Sweet.js — гигиенические макросы для JavaScript» . www.sweetjs.org .
- ^ «Домашняя страница LeMP · Расширенный C#» . ecsharp.net .
- ^ Маршалл, Джо. «электронное письмо без названия» . Проверено 3 мая 2012 г.
- ^ Харт, Тимоти П. (октябрь 1963 г.). «Определения МАКРО для LISP». AI-памятки . hdl : 1721.1/6111 . АИМ-057.
- ^ Кольбекер, Юджин; Фридман, Дэниел; Феллейзен, Матиас; Дуба, Брюс (1986). «Гигиеническое макрорасширение». LFP '86: Материалы конференции ACM 1986 года по LISP и функциональному программированию . стр. 151–161. дои : 10.1145/319838.319859 . ISBN 0897912004 .
- ^ [1] Клингер, Рис. «Макросы, которые работают»
- ^ Флэтт, Мэтью. «Компонуемые и компилируемые макросы: когда они вам понадобятся?» (PDF) .
- ^ Рафкинд, Джон; Флэтт, Мэтью. «Хону: синтаксическое расширение алгебраической записи посредством облесения» (PDF) .
- ^ «Автоматы через макросы» . cs.brown.edu .
- ^ [2] , Маттиас Феллейзен, публикация в списке рассылки LL1
- ^ Оргасс, Ричард Дж.; Уэйт, Уильям М. (сентябрь 1969 г.). «База для мобильной системы программирования» . Коммуникации АКМ . 12 (9). Нью-Йорк, штат Нью-Йорк, США: ACM: 507–510. дои : 10.1145/363219.363226 . S2CID 8164996 .
- ^ Уэйт, Уильям М. (июль 1970 г.). «Система мобильного программирования: ЭТАП2». Коммуникации АКМ . 13 (7). Нью-Йорк, штат Нью-Йорк, США: ACM: 415–421. дои : 10.1145/362686.362691 . S2CID 11733598 .
- ^ «Университет Северной Флориды» (PDF) .
- ^ «ДТФ (ДОС/ВСЕ)» . ИБМ .
- ^ «Центр знаний IBM» . Центр знаний IBM . 16 августа 2013 г.
- ^ Jump up to: а б «Макроинструкции языка ассемблера» . Циско .
- ^ Jump up to: а б Холбрук, Бернард Д.; Браун, В. Стэнли. «Технический отчет по информатике № 99 - История компьютерных исследований в Bell Laboratories (1937–1975)» . Лаборатории Белла . Архивировано из оригинала 2 сентября 2014 года . Проверено 2 февраля 2020 г.
- ^ «Макро SAP – модификация макрокомпилятора SAP» . HOPL: Интернет-историческая энциклопедия языков программирования . Архивировано из оригинала 13 августа 2008 года.
- ^ Лейзелл, П. (1985). «История макропроцессоров в расширяемости языков программирования» . Компьютерный журнал . 28 (1): 29–33. дои : 10.1093/comjnl/28.1.29 .
- ^ «Пакет системного вызова — системный вызов — Пакеты Go» . pkg.go.dev . Проверено 6 июня 2024 г.