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, withthe default queue being 0. As an extension, GNU m4 supports morediversions, limited only by integer type size.Calling the `divert' macro with an invalid queue causes text to bediscarded until another call. Note that even while output is beingdiscarded, quotes around `divert' and other macros are needed toprevent 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)dnldnldnl The dnl macro causes m4 to discard the rest of the line, thusdnl preventing unwanted blank lines from appearing in the output.dnlH2(First Section)H2(Second Section)H2(Conclusion)dnldivert(0)dnldnl<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 по общим командам Руководство –
- ^ Jump up to: а б Веб-сайт GNU m4 «GNU M4» , по состоянию на 25 января 2020 г.
- ^ Руководство по GNU m4, онлайн и для загрузки в HTML, PDF и других формах. «GNU M4 — макропроцессор GNU» , по состоянию на 25 января 2020 г.
- ^ «Стандарты кодирования GNU: написание надежных программ» .цитата: «Избегайте произвольных ограничений на длину или количество любых структур данных».
Внешние ссылки
[ редактировать ]