m4 - это универсальный макропроцессор, входящий в состав большинства Unix-подобных операционных систем, и компонент стандарта POSIX .
Парадигма | макрос |
---|---|
Разработано | Брайан Керниган , Деннис Ричи |
Впервые появился | 1977 |
Основные реализации | |
GNU m4 |
Язык был разработан Брайаном Керниганом и Деннисом Ричи для исходных версий UNIX . Это расширение более раннего макропроцессора m3 , написанного Ричи для неизвестного миникомпьютера AP-3. [1]
Препроцессор макросов работает как инструмент замены текста. Он используется для повторного использования текстовых шаблонов, как правило, в приложениях для компьютерного программирования , а также в приложениях для редактирования и обработки текста. Большинству пользователей требуется m4 как зависимость от GNU autoconf .
История
Макропроцессоры стали популярными, когда программисты широко использовали язык ассемблера . На заре программирования программисты заметили, что большая часть их программ состоит из повторяющегося текста, и изобрели простые средства для повторного использования этого текста. Вскоре программисты обнаружили преимущества не только повторного использования целых блоков текста, но и замены аналогичных параметров разными значениями. Это определило диапазон использования макропроцессоров.
В 1960-х годах в AT&T Bell Laboratories использовался ранний макропроцессор общего назначения M 6 , разработанный Дугласом Макилроем , Робертом Моррисом и Эндрю Холлом. [2]
Керниган и Ричи разработали m4 в 1977 году, основываясь на идеях Кристофера Стрейчи . Отличительные черты этого стиля предварительной обработки макросов:
- синтаксис свободной формы (не линейный, как типичный препроцессор макросов, предназначенный для обработки на языке ассемблера)
- высокая степень повторного расширения (аргументы макроса расширяются дважды: один раз во время сканирования и один раз во время интерпретации)
Реализация Rational Fortran с самого начала использовала m4 в качестве макроса; и большинство вариантов Unix поставляются вместе с ним.
По состоянию на 2021 год[Обновить]многие приложения продолжают использовать m4 как часть autoconf проекта GNU . Он также появляется в процессе настройки sendmail (широко распространенного агента передачи почты ) и для создания следов в наборе инструментов gEDA . SELinux Reference Policy в большой степени зависит от макро - процессор m4.
m4 имеет множество применений при генерации кода , но (как и в случае с любым макропроцессором) проблемы может быть трудно отладить. [3]
Функции
m4 предлагает следующие возможности:
- свободная форма синтаксис , а не синтаксис строки на основе
- высокая степень расширения макроса (аргументы расширяются во время сканирования и снова во время интерпретации)
- замена текста
- подстановка параметров
- включение файла
- манипуляции со строками
- условная оценка
- арифметические выражения
- системный интерфейс
- программистская диагностика
- независимый от языка программирования
- независимый от человеческого языка
- предоставляет возможности языка программирования
В отличие от большинства более ранних макропроцессоров, m4 не нацелен на какой-либо конкретный компьютер или человеческий язык; исторически, однако, его развитие возникло из-за поддержки диалекта Ratfor в Fortran . В отличие от некоторых других макропроцессоров, m4 является полным по Тьюрингу, а также является практическим языком программирования.
Идентификаторы без кавычек, которые соответствуют определенным макросам, заменяются их определениями. Помещение идентификаторов в кавычки подавляет раскрытие до, возможно, позже, например, когда строка в кавычках расширяется как часть замены макроса. В отличие от большинства языков, строки в m4 заключаются в кавычки с использованием обратного апострофа (`) в качестве начального разделителя и апострофа (') в качестве конечного разделителя. Отдельные начальные и конечные ограничители позволяют использовать произвольное вложение кавычек в строки, что позволяет точно контролировать то, как и когда происходит раскрытие макросов в разных частях строки.
Пример
В следующем фрагменте дается простой пример, который может быть частью библиотеки для генерации HTML- кода. Он автоматически определяет закомментированный макрос для нумерации разделов:
отклонить (-1)m4 имеет несколько очередей вывода, которыми можно управлять с помощьюмакрос 'divert'. Допустимые очереди от 0 до 10 включительно, сочередь по умолчанию - 0. В качестве расширения GNU m4 поддерживает большедиверсии, ограниченные только размером целочисленного типа.Вызов макроса `divert 'с недопустимой очередью приводит к тому, что текстотброшен до следующего звонка. Обратите внимание, что даже во время выводаотброшены, кавычки вокруг слова "divert" и другие макросы необходимы дляпредотвратить расширение.# Макросы не раскрываются в комментариях, а это означает, что такие ключевые слова# как divert и другие встроенные функции могут использоваться без последствий.# Вспомогательный макрос HTML:определить (`H2_COUNT ', 0)# Макрос H2_COUNT переопределяется каждый раз, когда используется макрос H2:define (`H2 ',`define (` H2_COUNT ', incr (H2_COUNT)) < h2 > H2_COUNT. $ 1 h2 > ')отклонить (1) dnldnldnl Макрос dnl заставляет m4 отбрасывать оставшуюся часть строки, таким образомdnl предотвращает появление в выводе нежелательных пустых строк.dnlH2 (Первая часть)H2 (второй раздел)H2 (Заключение)dnlотклонить (0) dnldnl< HTML >undivert (1) dnl Одна из очередей отправляется на вывод.HTML >
Обработка этого кода с помощью m4 генерирует следующий текст:
< HTML > < h2 > 1. Первый раздел h2 > < h2 > 2. Второй раздел h2 > < h2 > 3. Заключение h2 > HTML >
Реализации
FreeBSD , NetBSD и OpenBSD предоставляют независимые реализации языка m4. Кроме того, инструменты разработки проектов Heirloom включают бесплатную версию языка m4, унаследованную от OpenSolaris .
M4 был включен в операционную систему Inferno . Эта реализация более тесно связана с исходным m4, разработанным Керниганом и Ричи в версии 7 Unix, чем с его более сложными родственниками в UNIX System V и POSIX . [4]
GNU m4 - это реализация m4 для проекта GNU . [5] [6] Он разработан, чтобы избежать многих видов произвольных ограничений, встречающихся в традиционных реализациях m4, таких как максимальная длина строки, максимальный размер макроса и количество макросов. Удаление таких произвольных ограничений - одна из заявленных целей проекта GNU. [7]
Пакет GNU Autoconf широко использует возможности GNU m4.
GNU m4 в настоящее время поддерживается Гэри В. Воганом и Эриком Блейком. [5] GNU m4, выпущенная в соответствии с условиями Стандартной общественной лицензии GNU, является бесплатным программным обеспечением .
Смотрите также
- Препроцессор C
- Макро (информатика)
- Делать
- Обработчик шаблонов
- Система веб-шаблонов
Рекомендации
- ^ Брайан В. Керниган и Деннис М. Ричи. Макропроцессор m4. Технический отчет, Bell Laboratories, Мюррей-Хилл, Нью-Джерси, США, 1977 г. pdf
- Перейти ↑ Cole, AJ (1981). Макро процессоры (2-е, исправленное изд.). КУБОК Архив. п. 254.
- ^ Кеннет Дж. Тернер. Использование макроязыка m4. Технический отчет CSM-126, Департамент вычислительной техники и математики, Университет Стерлинга, Шотландия, сентябрь 1994 г. pdf
- ^ - Руководство по общим командам Inferno
- ^ a b Веб-сайт GNU m4 «GNU M4» , по состоянию на 25 января 2020 г.
- ^ Руководство по GNU m4, онлайн и для загрузки в HTML, PDF и других формах. "GNU M4 - GNU macro processor" , по состоянию на 25 января 2020 г.
- ^ «Стандарты кодирования GNU: написание надежных программ» . цитата: «Избегайте произвольных ограничений на длину или количество любых структур данных».
Внешние ссылки
- Сайт GNU m4
- Руководство по GNU m4
- m4 учебник
- Макро-магия: m4, часть первая и часть вторая