Препроцессор
{{Expansion depth limit exceeded|Процессор (значения)}} Препроцессор — это компьютерная программа, принимающая данные на входе и выдающая данные, предназначенные для входа другой программы (например, компилятора). О данных на выходе препроцессора говорят, что они находятся в препроцессированной форме, пригодной для обработки последующими программами (компилятор). Результат и вид обработки зависят от вида препроцессора; так, некоторые препроцессоры могут только выполнить простую текстовую подстановку, другие способны по возможностям сравниться с языками программирования. Наиболее частый случай использования препроцессора — обработка исходного кода перед передачей его на следующий шаг компиляции. Языки программирования C/C++ и система компьютерной вёрстки TeX используют препроцессоры, значительно расширяющие их возможности.
В некоторых языках программирования этап компиляции и трансляции получили название «препроцессинга».
<span class="error">Expansion depth limit exceeded Лексическими препроцессорами называют низкоуровневые препроцессоры, потому что они требуют только лексического анализа, то есть они обрабатывают только исходный текст перед парсингом, выполняя простую замену лексем и специальных символов заданными последовательностями символов, в соответствии с правилами, установленными пользователями. Обычно они выполняют замену макросов, текстовые вставки из других файлов, а также условную компиляцию или подключение файлов.
<span class="error">Expansion depth limit exceeded {{Expansion depth limit exceeded|Препроцессор Си}} Наиболее широкое распространение среди лексических препроцессоров получил препроцессор языка Си, используемый в языках программирования Си и его потомке — C++. Препроцессор удаляет из кода комментарии, преобразует код в соответствии с макросами и выполняет иные директивы, начинающиеся с символа «#» (такие как #include, #define, разнообразные директивы типа #pragma).
<span class="error">Expansion depth limit exceeded
PHP чаще всего используется при обработке веб-страниц. Текст страницы считывается и выдаётся в неизменном виде. Единственным исключением является наличие в тексте страницы инструкций PHP, ограниченных <?php в начале и ?> в конце.
Пример текста страницы, содержащей текущее время: Expansion depth limit exceeded Препроцессор PHP заменит выделенную строку на: Expansion depth limit exceeded
<span class="error">Expansion depth limit exceeded Прочие лексические препроцессоры поддерживают универсальный язык m4, обычно применяемый в кросс-платформенных системах сборки, таких как autoconf, и GEMA — обработчик макросов с открытым исходным кодом, работа которого основана на контекстных шаблонах.
<span class="error">Expansion depth limit exceeded Синтаксические препроцессоры впервые были представлены в семействе языков Лисп. Их роль заключалась в обработке синтаксических деревьев согласно набору правил, определённых пользователем. Для некоторых языков программирования, правила писались на том же самом языке, что и сама программа (симметрия компиляции). Примерами могут служить Лисп и OCaml. В некоторых языках используется полностью независимый язык для описания преобразований, например, XSLT препроцессор для XML или его аналог со статическими типами CDuce.
Синтаксические препроцессоры обычно используются для уточнения синтаксиса языка, расширения языка путём добавления новых примитивов, или встраиванием предметно-ориентированного языка программирования в основной язык.
<span class="error">Expansion depth limit exceeded
Хороший пример модификации синтаксиса — существование двух различных вариантов синтаксисаExpansion depth limit exceeded в языке программирования Objective Caml. Программы можно писать используя обычный синтаксис или исправленный синтаксис, при этом выбор зависит от желания программиста.
Аналогично, набор программ, написанных на OCaml, имеет возможность настройки синтаксиса языка путём добавления новых операторов.
<span class="error">Expansion depth limit exceeded
Отличными примерами расширения языка при помощи макросов может служить их использование в семействе языков программирования Лисп. В то время как эти языки сами по себе имеют простые ядра, ориентированные на динамические типы, стандартные поставки Схема, императивы Common Lisp, объектно-ориентированное программирование ориентированы на статические типы. Почти все эти свойства реализованы синтаксическими препроцессорами, хотя это несёт в себе отпечаток этапа компиляции «расширения макросами», управляемой компилятором Лисп. Это всё ещё может считаться формой препроцессорной обработки, так как это происходит перед остальными этапами компиляции.
Аналогично, типобезопасные регулярные выражения или генерация кода могут быть добавлены в синтаксис и семантику OCaml при помощи макросов, например, микронити (также известные как сопрограммы или волокна), монады или прозрачная обработка XML.
<span class="error">Expansion depth limit exceeded
Одной из необычных особенностей семейства языков Лисп является возможность использования макросов для создания встроенного предметно-ориентированного языка программирования. Обычно, в большом количестве проектов, написанных на языке Лисп, модуль может быть написан на множестве подобных миниязыков, то есть, один может использовать SQL-диалект языка Лисп, а другой может быть написан на диалекте, ориентированном на графический интерфейс пользователя или вывод на принтер и так далее. Стандартная библиотека Common Lisp содержит пример такого уровня синтаксической абстракции в виде макроса LOOP, который реализует миниязыки, подобные языку Алгол, для описания комплексной итерации, при сохранении возможности использовать стандартные операторы Лисп.
Препроцессор/язык MetaOCaml обеспечивает схожие возможности и для внешнего предметно-ориентированного языка программирования. Этот препроцессор, получая описание семантики языка (так называемая «интерпретация») и комбинируя интерпретацию во время компиляции и генерации кода, передаёт это определение компилятору языка OCaml, а тот на основе этого языка создаёт байт-код или естественный код.
<span class="error">Expansion depth limit exceeded Препроцессоры, выполняя только один из этапов трансляции, ориентированы на задачу фрагментарной обработки данных (например, компиляция языка Си). Сходные с ними программы, называемые в таком случае макропроцессорами, также могут предназначаться для общих целей, то есть перед ними не ставится цель реализации специфического использования или языка программирования, а они разрабатываются для использования широкого круга задач обработки данных.
Макропроцессор m4 вероятно наиболее известный пример подобного макропроцессора общего назначения.
<span class="error">Expansion depth limit exceeded
- Применение препроцессора Си для препроцессинга JavaScript-кодаExpansion depth limit exceeded.
- Применение M4 (см. пример в статье) или препроцессора Си в качестве движка шаблонов для генерации HTML.Expansion depth limit exceeded
- imake (от interface make) использует препроцессор Си. Применялся в проекте X Window System до перехода на automake.
- grompp — макропроцессор для файлов моделей проекта GROMACS (свободные программы с открытым кодом для решения проблем вычислительной химии). По умолчанию использует препроцессор Си, но в файле модели можно указать любой другой препроцессор. Применяется для проверки разметки. Использует директивы
#defineи#include.
<span class="error">Expansion depth limit exceeded
- Название широко распространённого препроцессора PHP является рекурсивным акронимом: PHP — «php: hypertext preprocessor».
<span class="error">Expansion depth limit exceeded
- Директива (программирование)
- Препроцессор GPRE
- Метапрограммирование
- Сниппет
- Пре-процессор трассировки программного обеспечения Windows
<span class="error">Expansion depth limit exceeded {{Expansion depth limit exceeded}}
<span class="error">Expansion depth limit exceeded {{Expansion depth limit exceeded|preprocessor}}
- DSL Design in Lisp
- Программирование снизу вверх {{Expansion depth limit exceeded|url=http://www.paulgraham.com/progbot.html |date=20210505083832 }}
- The PIKT piktc {{Expansion depth limit exceeded|url=http://pikt.org/pikt/ref/ref.4.piktc.html |date=20201202194401 }} text, script, and configuration file preprocessor {{Expansion depth limit exceeded|url=http://pikt.org/pikt/ref/ref.3.html |date=20201202060607 }}