<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D1%80%D0%B5%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80</id>
	<title>Препроцессор - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D1%80%D0%B5%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80&amp;action=history"/>
	<updated>2026-07-16T17:41:29Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80&amp;diff=31225&amp;oldid=prev</id>
		<title>imported&gt;Alex NB OT: замена имён и значений устаревшего неподдерживаемого InternetArchiveBot формата параметров доступности ссылок (1)</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80&amp;diff=31225&amp;oldid=prev"/>
		<updated>2025-07-16T10:13:21Z</updated>

		<summary type="html">&lt;p&gt;замена имён и значений устаревшего неподдерживаемого InternetArchiveBot формата параметров доступности ссылок (1)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{значения|Процессор (значения)}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Препроцессор&amp;#039;&amp;#039;&amp;#039; — [[компьютерная программа]], принимающая данные на входе и выдающая данные, предназначенные для входа другой программы (например, [[компилятор]]а). О данных на выходе препроцессора говорят, что они находятся в &amp;#039;&amp;#039;&amp;#039;препроцессированной&amp;#039;&amp;#039;&amp;#039; форме, пригодной для обработки последующими программами (компилятор). Результат и вид обработки зависят от вида препроцессора; так, некоторые препроцессоры могут только выполнить простую текстовую подстановку, другие способны по возможностям сравниться с языками программирования. Наиболее частый случай использования препроцессора — обработка [[исходный код|исходного кода]] перед передачей его на следующий шаг компиляции. [[Язык программирования|Языки программирования]] [[Си (язык программирования)|C]]/[[C++]] и система [[компьютер]]ной [[вёрстка|вёрстки]] [[TeX]] используют препроцессоры, значительно расширяющие их возможности.&lt;br /&gt;
&lt;br /&gt;
В некоторых языках программирования этап [[Компиляция (программирование)|компиляции]] и [[Транслятор|трансляции]] получили название «препроцессинга».&lt;br /&gt;
&lt;br /&gt;
== Лексические препроцессоры ==&lt;br /&gt;
Лексическими препроцессорами называют низкоуровневые препроцессоры, потому что они требуют только [[лексический анализ|лексического анализа]], то есть они обрабатывают только исходный текст перед [[парсер|парсингом]], выполняя простую замену [[Лексема (информатика)|лексем]] и специальных символов заданными последовательностями символов, в соответствии с правилами, установленными пользователями. Обычно они выполняют замену [[макрос]]ов, текстовые вставки из других файлов, а также [[условная компиляция|условную компиляцию]] или подключение файлов.&lt;br /&gt;
&lt;br /&gt;
=== Препроцессинг в C/C++ ===&lt;br /&gt;
{{main|Препроцессор Си}}&lt;br /&gt;
Наиболее широкое распространение среди лексических препроцессоров получил препроцессор языка Си, используемый в языках программирования [[Си (язык программирования)|Си]] и его потомке — [[C++]]. Препроцессор удаляет из кода [[Комментарии (программирование)|комментарии]], преобразует код в соответствии с макросами и выполняет иные директивы, начинающиеся с символа «#» (такие как #include, #define, разнообразные директивы типа #pragma).&lt;br /&gt;
&lt;br /&gt;
== Язык программирования PHP ==&lt;br /&gt;
[[PHP]] чаще всего используется при обработке [[веб-страница|веб-страниц]]. Текст страницы считывается и выдаётся в неизменном виде. Единственным исключением является наличие в тексте страницы инструкций PHP, ограниченных &amp;lt;code&amp;gt;&amp;amp;lt;?php&amp;lt;/code&amp;gt; в начале и &amp;lt;code&amp;gt;?&amp;amp;gt;&amp;lt;/code&amp;gt; в конце.&lt;br /&gt;
&lt;br /&gt;
Пример текста страницы, содержащей текущее время:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/loose.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Текущее время&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Текущее время&amp;lt;/h1&amp;gt;&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
   print strftime(&amp;#039;Сейчас %H часов, %M минут %S секунд&amp;#039;);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Препроцессор PHP заменит выделенную строку на:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/loose.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Текущее время&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Текущее время&amp;lt;/h1&amp;gt;&lt;br /&gt;
 Сейчас 10 часов, 15 минут 20 секунд&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Прочие лексические препроцессоры ===&lt;br /&gt;
Прочие лексические препроцессоры поддерживают универсальный язык [[Макропроцессор m4|m4]], обычно применяемый в кросс-платформенных системах сборки, таких как [[autoconf]], и [[Универсальный макропроцессор|GEMA]] — обработчик макросов с открытым исходным кодом, работа которого основана на [[контекстный шаблон|контекстных шаблонах]].&lt;br /&gt;
&lt;br /&gt;
== Синтаксические препроцессоры ==&lt;br /&gt;
Синтаксические препроцессоры впервые были представлены в семействе языков [[Лисп]]. Их роль заключалась в обработке синтаксических деревьев согласно набору правил, определённых пользователем. Для некоторых языков программирования, правила писались на том же самом языке, что и сама программа (симметрия компиляции). Примерами могут служить Лисп и [[OCaml]]. В некоторых языках используется полностью независимый язык для описания преобразований, например, [[XSLT]] препроцессор для [[XML]] или его аналог со статическими типами [[CDuce]].&lt;br /&gt;
&lt;br /&gt;
Синтаксические препроцессоры обычно используются для уточнения синтаксиса языка, расширения языка путём добавления новых примитивов, или встраиванием [[Предметно-ориентированный язык программирования|предметно-ориентированного языка программирования]] в основной язык.&lt;br /&gt;
&lt;br /&gt;
=== Модификация синтаксиса ===&lt;br /&gt;
&lt;br /&gt;
Хороший пример модификации синтаксиса — существование двух различных вариантов синтаксиса&amp;lt;ref&amp;gt;{{Cite web |url=http://caml.inria.fr/pub/docs/manual-camlp4/manual007.html |title=The revised syntax&amp;lt;!-- Заголовок добавлен ботом --&amp;gt; |access-date=2008-07-13 |archive-date=2015-09-24 |archive-url=https://wayback.archive-it.org/all/20150924210556/http://caml.inria.fr/pub/docs/manual-camlp4/manual007.html |url-status=live }}&amp;lt;/ref&amp;gt; в языке программирования [[OCaml|Objective Caml]]. Программы можно писать используя &amp;#039;&amp;#039;обычный синтаксис&amp;#039;&amp;#039; или &amp;#039;&amp;#039;исправленный синтаксис&amp;#039;&amp;#039;, при этом выбор зависит от желания программиста.&lt;br /&gt;
&lt;br /&gt;
Аналогично, набор программ, написанных на OCaml, имеет возможность настройки синтаксиса языка путём добавления новых операторов.&lt;br /&gt;
&lt;br /&gt;
=== Расширение языка ===&lt;br /&gt;
&lt;br /&gt;
Отличными примерами расширения языка при помощи макросов может служить их использование в семействе языков программирования [[Лисп]]. В то время как эти языки сами по себе имеют простые ядра, ориентированные на динамические типы, стандартные поставки [[Схема (язык программирования)|Схема]], императивы [[Common Lisp]], объектно-ориентированное программирование ориентированы на статические типы. Почти все эти свойства реализованы синтаксическими препроцессорами, хотя это несёт в себе отпечаток этапа компиляции «расширения макросами», управляемой компилятором Лисп. Это всё ещё может считаться формой препроцессорной обработки, так как это происходит перед остальными этапами компиляции.&lt;br /&gt;
&lt;br /&gt;
Аналогично, типобезопасные [[регулярные выражения]] или [[Кодогенерация|генерация кода]] могут быть добавлены в синтаксис и семантику [[OCaml]] при помощи макросов, например, микронити (также известные как [[Сопрограмма|сопрограммы]] или [[Волокно (информатика)|волокна]]), [[Монада (программирование)|монады]] или прозрачная обработка XML.&lt;br /&gt;
&lt;br /&gt;
=== Специализированный язык ===&lt;br /&gt;
&lt;br /&gt;
Одной из необычных особенностей семейства языков [[Лисп]] является возможность использования макросов для создания встроенного [[Предметно-ориентированный язык программирования|предметно-ориентированного языка программирования]]. Обычно, в большом количестве проектов, написанных на языке Лисп, модуль может быть написан на множестве подобных миниязыков, то есть, один может использовать [[SQL]]-диалект языка Лисп, а другой может быть написан на диалекте, ориентированном на графический интерфейс пользователя или вывод на принтер и так далее. Стандартная библиотека [[Common Lisp]] содержит пример такого уровня синтаксической абстракции в виде макроса LOOP, который реализует миниязыки, подобные языку Алгол, для описания комплексной итерации, при сохранении возможности использовать стандартные операторы Лисп.&lt;br /&gt;
&lt;br /&gt;
Препроцессор/язык [[MetaOCaml]] обеспечивает схожие возможности и для внешнего [[Предметно-ориентированный язык программирования|предметно-ориентированного языка программирования]]. Этот препроцессор, получая описание семантики языка (так называемая «интерпретация») и комбинируя интерпретацию во время компиляции и генерации кода, передаёт это определение компилятору языка [[OCaml]], а тот на основе этого языка создаёт байт-код или естественный код.&lt;br /&gt;
&lt;br /&gt;
== Макропроцессор общего назначения ==&lt;br /&gt;
Препроцессоры, выполняя только один из этапов трансляции, ориентированы на задачу фрагментарной обработки данных (например, [[компилятор|компиляция]] языка [[Си (язык программирования)|Си]]). Сходные с ними программы, называемые в таком случае [[макропроцессор]]ами, также могут предназначаться для общих целей, то есть перед ними не ставится цель реализации специфического использования или языка программирования, а они разрабатываются для использования широкого круга задач обработки данных.&lt;br /&gt;
&lt;br /&gt;
[[Макропроцессор m4]] вероятно наиболее известный пример подобного макропроцессора общего назначения.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
&lt;br /&gt;
* Применение [[Препроцессор Си|препроцессора Си]] для препроцессинга [[JavaScript]]-кода&amp;lt;ref&amp;gt;T. Snyder. [http://blog.inetoffice.com/?p=12 JavaScript is Not Industrial Strength] {{Wayback|url=http://blog.inetoffice.com/?p=12 |date=20080116034428 }} Как использовать [[препроцессор Си]] для JavaScript-кода&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Применение [[Макропроцессор m4|M4]] &amp;lt;small&amp;gt;(см. пример в статье)&amp;lt;/small&amp;gt; или [[Препроцессор Си|препроцессора Си]] в качестве [[движка шаблонов]] для генерации [[HTML]].&amp;lt;ref&amp;gt;J. Korpela. [http://www.cs.tut.fi/~jkorpela/html/cpre.html Using a C preprocessor as an HTML authoring tool] {{Wayback|url=http://www.cs.tut.fi/~jkorpela/html/cpre.html |date=20151208142426 }} 2000.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[imake]] (от &amp;#039;&amp;#039;interface [[make]]&amp;#039;&amp;#039;) использует препроцессор Си. Применялся в проекте [[X Window System]] до перехода на [[automake]].&lt;br /&gt;
* [[grompp]] — макропроцессор для файлов моделей проекта [[GROMACS]] (свободные программы с открытым кодом для решения проблем [[вычислительная химия|вычислительной химии]]). По умолчанию использует препроцессор Си, но в файле модели можно указать любой другой препроцессор. Применяется для проверки разметки. Использует директивы &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;#define&amp;lt;/code&amp;gt; и &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;#include&amp;lt;/code&amp;gt;.&lt;br /&gt;
* [[Sass]], и [[LESS (язык стилей)|LESS]] — это препроцессоры CSS.&lt;br /&gt;
&lt;br /&gt;
== Интересные факты ==&lt;br /&gt;
&lt;br /&gt;
* Название широко распространённого препроцессора [[PHP]] является [[Рекурсивный акроним|рекурсивным акронимом]]: PHP — «&amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039;hp: &amp;#039;&amp;#039;&amp;#039;h&amp;#039;&amp;#039;&amp;#039;ypertext &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039;reprocessor».&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Директива (программирование)]]&lt;br /&gt;
* [[Препроцессор GPRE]]&lt;br /&gt;
* [[Метапрограммирование]]&lt;br /&gt;
* [[Сниппет]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{Wiktionarypar|preprocessor}}&lt;br /&gt;
* [https://web.archive.org/web/20090214092527/http://lispm.dyndns.org/news?ID=NEWS-2005-07-08-1 DSL Design in Lisp]&lt;br /&gt;
* [http://www.paulgraham.com/progbot.html Программирование снизу вверх] {{Wayback|url=http://www.paulgraham.com/progbot.html |date=20210505083832 }}&lt;br /&gt;
* The [[PIKT]] [http://pikt.org/pikt/ref/ref.4.piktc.html piktc] {{Wayback|url=http://pikt.org/pikt/ref/ref.4.piktc.html |date=20201202194401 }} [http://pikt.org/pikt/ref/ref.3.html text, script, and configuration file preprocessor] {{Wayback|url=http://pikt.org/pikt/ref/ref.3.html |date=20201202060607 }}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Препроцессоры]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Alex NB OT</name></author>
	</entry>
</feed>