m4 (компьютерный язык) - m4 (computer language)

м4
Парадигма макрос
Разработано Брайан Керниган , Деннис Ричи
Впервые появился 1977 ; 44 года назад ( 1977 )
Основные реализации
GNU m4

m4 - это универсальный макропроцессор, входящий в состав большинства Unix-подобных операционных систем, и компонент стандарта POSIX .

Язык был разработан Брайаном Керниганом и Деннисом Ричи для исходных версий UNIX . Это расширение более раннего макропроцессора m3 , написанного Ричи для неизвестного миникомпьютера AP-3.

Препроцессор макросов работает как инструмент замены текста. Он используется для повторного использования текстовых шаблонов, как правило, в приложениях для компьютерного программирования , а также в приложениях для редактирования и обработки текста. Большинству пользователей требуется m4 как зависимость от GNU autoconf .

История

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

В 1960-х годах в AT&T Bell Laboratories использовался ранний макропроцессор общего назначения M 6 , разработанный Дугласом Макилроем , Робертом Моррисом и Эндрю Холлом.

Керниган и Ричи разработали m4 в 1977 году, основываясь на идеях Кристофера Стрейчи . Отличительные черты этого стиля предварительной обработки макросов:

  • синтаксис свободной формы (не линейный, как типичный препроцессор макросов, предназначенный для обработки на языке ассемблера)
  • высокая степень повторного расширения (аргументы макроса расширяются дважды: один раз во время сканирования и один раз во время интерпретации)

Реализация Rational Fortran с самого начала использовала m4 в качестве макроса; и большинство вариантов Unix поставляются вместе с ним.

По состоянию на 2021 год многие приложения продолжают использовать m4 как часть autoconf проекта GNU . Он также появляется в процессе настройки sendmail (широко распространенного агента передачи почты ) и для создания следов в наборе инструментов gEDA . SELinux Reference Policy в большой степени зависит от макро - процессор m4.

m4 имеет множество применений при генерации кода , но (как и в случае с любым макропроцессором) проблемы может быть трудно отладить.

Функции

m4 предлагает следующие возможности:

  • свободная форма синтаксис , а не синтаксис строки на основе
  • высокая степень расширения макроса (аргументы расширяются во время сканирования и снова во время интерпретации)
  • замена текста
  • подстановка параметров
  • включение файла
  • манипуляции со строками
  • условная оценка
  • арифметические выражения
  • системный интерфейс
  • программистская диагностика
  • независимый от языка программирования
  • независимый от человеческого языка
  • предоставляет возможности языка программирования

В отличие от большинства более ранних макропроцессоров, m4 не нацелен на какой-либо конкретный компьютер или человеческий язык; исторически, однако, его развитие возникло из-за поддержки диалекта Ratfor в Fortran . В отличие от некоторых других макропроцессоров, 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 .

GNU m4 - это реализация m4 для проекта GNU . Он разработан, чтобы избежать многих видов произвольных ограничений, встречающихся в традиционных реализациях m4, таких как максимальная длина строки, максимальный размер макроса и количество макросов. Удаление таких произвольных ограничений - одна из заявленных целей проекта GNU.

Пакет GNU Autoconf широко использует возможности GNU m4.

GNU m4 в настоящее время поддерживается Гэри В. Воганом и Эриком Блейком. GNU m4, выпущенная в соответствии с условиями Стандартной общественной лицензии GNU, является бесплатным программным обеспечением .

Смотрите также

использованная литература

внешние ссылки