m4 (компьютерный язык)
Парадигма | макрос |
---|---|
Разработано | Брайан Керниган , Деннис Ритчи |
Впервые появился | 1977 год |
Основные реализации | |
ГНУ м4 |
m4 — макропроцессор общего назначения, включенный в большинство Unix-подобных операционных систем и являющийся компонентом стандарта POSIX .
Язык был разработан Брайаном Керниганом и Деннисом Ритчи для оригинальных версий UNIX . Это расширение более раннего макропроцессора m3, написанного Ричи для неизвестного миникомпьютера AP-3. [ 1 ]
макросов Препроцессор действует как инструмент замены текста. Он используется для повторного использования текстовых шаблонов, как правило, в приложениях компьютерного программирования , а также в приложениях для редактирования и обработки текста. Большинству пользователей требуется m4 как зависимость от GNU autoconf .
История [ 2 ]
[ редактировать ]Макропроцессоры стали популярными, когда программисты стали широко использовать язык ассемблера . На заре программирования программисты заметили, что большая часть их программ состоит из повторяющегося текста, и изобрели простые средства для повторного использования этого текста. Программисты вскоре обнаружили преимущества не только повторного использования целых блоков текста, но и замены одинаковых параметров разными значениями. Это определило диапазон использования макропроцессоров.
В 1960-х годах появился первый макропроцессор общего назначения M. 6 , использовался в AT&T Bell Laboratories и был разработан Дугласом Макилроем , Робертом Моррисом и Эндрю Холлом. [ 3 ]
Керниган и Ритчи разработали m4 в 1977 году, взяв за основу идеи Кристофера Стрейчи . Отличительные особенности этого стиля предварительной обработки макросов включали:
- синтаксис свободной формы (не построчный, как у типичного препроцессора макросов, предназначенного для обработки на языке ассемблера)
- высокая степень повторного раскрытия (аргументы макроса расширяются дважды: один раз во время сканирования и один раз во время интерпретации)
В реализации Rational Fortran с самого начала в качестве макродвижка использовался m4, и большинство вариантов Unix поставляются с ним.
По состоянию на 2021 год [update] многие приложения продолжают использовать m4 как часть GNU проекта autoconf . Он также появляется в процессе настройки sendmail (распространенного агента передачи почты ) и для создания следов в наборе инструментов gEDA . Эталонная политика SELinux во многом зависит от макропроцессора m4.
m4 имеет множество применений при генерации кода , но (как и в случае с любым макропроцессором) проблемы могут быть трудно отладить. [ 4 ]
Функции
[ редактировать ]m4 предлагает следующие возможности:
- синтаксис свободной формы , а не строковый синтаксис
- высокая степень расширения макросов (аргументы расширяются во время сканирования и снова во время интерпретации)
- замена текста
- подстановка параметров
- включение файла
- манипуляция со строками
- условная оценка
- арифметические выражения
- системный интерфейс
- программатор диагностики
- независимый от языка программирования
- независимый от человеческого языка
- предоставляет возможности языка программирования
В отличие от большинства более ранних макропроцессоров, m4 не предназначен для какого-либо конкретного компьютера или человеческого языка; однако исторически его развитие возникло для поддержки ратфорского диалекта Фортрана . В отличие от некоторых других макропроцессоров, m4 является Тьюринг-полным и практичным языком программирования.
Идентификаторы без кавычек, соответствующие определенным макросам, заменяются их определениями. Размещение идентификаторов в кавычках подавляет раскрытие до тех пор, пока, возможно, не произойдет позже, например, когда строка в кавычках расширяется как часть замены макроса. В отличие от большинства языков, строки в m4 заключаются в кавычки с использованием обратного кавычка (`) в качестве начального разделителя и апострофа (') в качестве конечного разделителя. Отдельные начальные и конечные разделители позволяют использовать произвольное вложение кавычек в строки, обеспечивая высокую степень контроля над тем, как и когда расширение макроса происходит в различных частях строки.
Пример
[ редактировать ]Следующий фрагмент представляет собой простой пример, который может стать частью библиотеки для генерации HTML- кода. Он определяет макрос с комментариями для автоматической нумерации разделов:
divert(-1)
m4 has multiple output queues that can be manipulated with the
`divert' macro. Valid queues range from 0 to 10, inclusive, with
the default queue being 0. As an extension, GNU m4 supports more
diversions, limited only by integer type size.
Calling the `divert' macro with an invalid queue causes text to be
discarded until another call. Note that even while output is being
discarded, quotes around `divert' and other macros are needed to
prevent expansion.
# Macros aren't expanded within comments, meaning that keywords such
# as divert and other built-ins may be used without consequence.
# HTML utility macro:
define(`H2_COUNT', 0)
# The H2_COUNT macro is redefined every time the H2 macro is used:
define(`H2',
`define(`H2_COUNT', incr(H2_COUNT))<h2>H2_COUNT. $1</h2>')
divert(1)dnl
dnl
dnl The dnl macro causes m4 to discard the rest of the line, thus
dnl preventing unwanted blank lines from appearing in the output.
dnl
H2(First Section)
H2(Second Section)
H2(Conclusion)
dnl
divert(0)dnl
dnl
<HTML>
undivert(1)dnl One of the queues is being pushed to output.
</HTML>
Обработка этого кода с помощью m4 генерирует следующий текст:
<HTML>
<h2>1. First Section</h2>
<h2>2. Second Section</h2>
<h2>3. Conclusion</h2>
</HTML>
Реализации
[ редактировать ]FreeBSD , NetBSD и OpenBSD предоставляют независимые реализации языка m4. Кроме того, инструменты разработки проектов Heirloom включают бесплатную версию языка m4, полученную из OpenSolaris .
M4 был включен в операционную систему Inferno . Эта реализация более тесно связана с исходным m4, разработанным Керниганом и Ритчи в версии 7 Unix, чем с его более сложными родственниками в UNIX System V и POSIX . [ 5 ]
GNU m4 — это реализация m4 для проекта GNU . [ 6 ] [ 7 ] Он разработан, чтобы избежать многих видов произвольных ограничений, встречающихся в традиционных реализациях m4, таких как максимальная длина строки, максимальный размер макроса и количество макросов. Устранение таких произвольных ограничений является одной из заявленных целей проекта GNU. [ 8 ]
Пакет GNU Autoconf широко использует возможности GNU m4.
GNU m4 в настоящее время поддерживается Гэри В. Воганом и Эриком Блейком. [ 6 ] GNU m4 — бесплатное программное обеспечение , выпущенное на условиях Стандартной общественной лицензии GNU .
См. также
[ редактировать ]- Препроцессор C
- Макро (информатика)
- Делать
- Процессор шаблонов
- Система веб-шаблонов
- AWK – язык программирования
Ссылки
[ редактировать ]- ^ Брайан В. Керниган и Деннис М. Ричи. Макропроцессор m4. Технический отчет, Bell Laboratories, Мюррей-Хилл, Нью-Джерси, США, 1977 г. pdf.
- ^ История GNU m4
- ^ Коул, Эй Джей (1981). Макропроцессоры (2-е, исправленное изд.). Архив Кубка. п. 254.
- ^ Кеннет Дж. Тернер. Использование языка макросов m4. Технический отчет CSM-126, факультет вычислительной техники и математики, Университет Стерлинга, Шотландия, сентябрь 1994 г. pdf
- ^ Inferno по общим командам Руководство –
- ^ Перейти обратно: а б Веб-сайт GNU m4 «GNU M4» , по состоянию на 25 января 2020 г.
- ^ Руководство по GNU m4, онлайн и для загрузки в HTML, PDF и других формах. «GNU M4 — макропроцессор GNU» , по состоянию на 25 января 2020 г.
- ^ «Стандарты кодирования GNU: написание надежных программ» . цитата: «Избегайте произвольных ограничений на длину или количество любых структур данных».
Внешние ссылки
[ редактировать ]