Препроцессор

Препроцессор

Препроцессор — это компьютерная программа, принимающая данные на входе и выдающая данные, предназначенные для входа другой программы (например, компилятора). О данных на выходе препроцессора говорят, что они находятся в препроцессированной форме, пригодной для обработки последующими программами (компилятор). Результат и вид обработки зависят от вида препроцессора; так, некоторые препроцессоры могут только выполнить простую текстовую подстановку, другие способны по возможностям сравниться с языками программирования. Наиболее частый случай использования препроцессора — обработка исходного кода перед передачей его на следующий шаг компиляции. Языки программирования C/C++ и система компьютерной вёрстки TeX используют препроцессоры, значительно расширяющие их возможности.

В некоторых языках программирования этап компиляции и трансляции получили название «препроцессинга».

Содержание

Лексические препроцессоры

Лексическими препроцессорами называют низкоуровневые препроцессоры, потому что они требуют только лексического анализа, то есть они обрабатывают только исходный текст перед парсингом, выполняя простую замену лексем и специальных символов заданными последовательностями символов, в соответствии с правилами, установленными пользователями. Обычно они выполняют замену макросов, текстовые вставки из других файлов, а также условную компиляцию или подключение файлов.

Препроцессинг в C/C++

Наиболее широкое распространение среди лексических препроцессоров получил препроцессор языка Си, используемый в языках программирования Си и его потомке — C++. Препроцессор удаляет из кода комментарии, преобразует код в соответствии с макросами и выполняет иные директивы, начинающиеся с символа «#» (такие как #include, #define, разнообразные директивы типа #pragma).

Язык программирования PHP

PHP чаще всего используется при обработке веб-страниц. Текст страницы считывается и выдается в неизменном виде. Единственным исключением является наличие в тексте страницы инструкций PHP, ограниченных <?php в начале и ?> в конце.

Пример текста страницы, содержащей текущее время:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Текущее время</title>
<head>
<body>
<h1>Текущее время</h1>
 <?php
   print strftime('Сейчас %H часов, %M минут %S секунд');
 ?>
</body>
</html>

Препроцессор PHP заменит выделенную строку на:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Текущее время</title>
<head>
<body>
<h1>Текущее время</h1>
 Сейчас 10 часов, 15 минут 20 секунд
</body>
</html>

Прочие лексические препроцессоры

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

Синтаксические препроцессоры

Синтаксические препроцессоры впервые были представлены в семействе языков Лисп. Их роль заключалась в обработке синтаксических деревьев согласно набору правил, определенных пользователем. Для некоторых языков программирования, правила писались на том же самом языке, что и сама программа (симметрия компиляции). Примерами могут служить Лисп и OCaml. В некоторых языках используется полностью независимый язык для описания преобразований, например, XSLT препроцессор для XML или его аналог со статическими типами CDuce.

Синтаксические препроцессоры обычно используются для уточнения синтаксиса языка, расширения языка путем добавления новых примитивов, или встраиванием предметно-ориентированного языка программирования в основной язык.

Модификация синтаксиса

Хороший пример модификации синтаксиса — существование двух различных вариантов синтаксиса[1] в языке программирования Objective Caml. Программы можно писать используя обычный синтаксис или исправленный синтаксис, при этом выбор зависит от желания программиста.

Аналогично, набор программ, написанных на OCaml, имеет возможность настройки синтаксиса языка путем добавления новых операторов.

Расширение языка

Отличными примерами расширения языка при помощи макросов может служить их использование в семействе языков программирования Лисп. В то время как эти языки сами по себе имеют простые ядра, ориентированные на динамические типы, стандартные поставки Схема, императивы Common Lisp, объектно-ориентированное программирование ориентированы на статические типы. Почти все эти свойства реализованы синтаксическими препроцессорами, хотя это несет в себе отпечаток этапа компиляции «расширения макросами», управляемой компилятором Лисп. Это все еще может считаться формой препроцессорной обработки, так как это происходит перед остальными этапами компиляции.

Аналогично, типобезопасные регулярные выражения или генерация кода могут быть добавлены в синтаксис и семантику OCaml при помощи макросов, например, микронити (также известные как сопрограммы или волокна), монады или прозрачная обработка XML.

Специализированный язык

Одной из необычных особенностей семейства языков Лисп является возможность использования макросов для создания встроенного предметно-ориентированного языка программирования. Обычно, в большом количестве проектов, написанных на языке Лисп, модуль может быть написан на множестве подобных миниязыков, то есть, один может использовать SQL-диалект языка Лисп, а другой может быть написан на диалекте, ориентированном на графический интерфейс пользователя или вывод на принтер и т. д. Стандартная библиотека Common Lisp содержит пример такого уровня синтаксической абстракции в виде макроса LOOP, который реализует Алголоподобные миниязыки для описания комплексной итерации, при сохранении возможности использовать стандартные операторы Лисп.

Препроцессор/язык MetaOCaml обеспечивает схожие возможности и для внешнего предметно-ориентированного языка программирования. Этот препроцессор получая описание семантики языка (т. н. интерпретация) и комбинируя интерпретацию во время компиляции и генерации кода, передает это определение компилятору языка OCaml, а тот на основе этого языка создает байт-код или естественный код.

Макропроцессор общего назначения

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

Макропроцессор m4 вероятно наиболее известный пример подобного макропроцесора общего назначения.

Примеры

  • применение препроцессора Си для препроцессинга JavaScript-кода.[2]
  • применение M4 (см. пример в статье) или препроцессора Си в качестве движка шаблонов для генерации HTML.[3]
  • imake, интерфейс make использует препроцессор Си, задействованный X Window System, но в настоящее время происходит отказ этого в пользу automake.
  • grompp, макропроцессор для моделирования вводных файлов для GROMACS (быстрый, свободный, с открытым исходным кодом для решения проблем в вычислительной химии), использующий препроцессор Си (или другой препроцессор, определенный вводным файлом) для проверки разметки, применяя преимущественно механизмы #define и #include для создания эффективной разметки при работе grompp.

Интересные факты

Название широко распространенного скриптового языка программирования PHP является рекурсивным акронимом PHP: Hypertext Preprocessor.

См. также

Примечания

  1. The Revised syntax
  2. T. Snyder. JavaScript is Not Industrial Strength Как использовать препроцессор Си для JavaScript-кода
  3. J. Korpela. Using a C preprocessor as an HTML authoring tool 2000.

Ссылки

Логотип Викисловаря
В Викисловаре есть статья «preprocessor»

Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Полезное


Смотреть что такое "Препроцессор" в других словарях:

  • Препроцессор Си — Препроцессор С/С++  программный инструмент, изменяющий код программы для последующей компиляции и сборки, используемый в языках программирования Си и его потомка C++. Этот препроцессор обеспечивает использование стандартного набора… …   Википедия

  • Препроцессор — программа, обеспечивающая предварительную обработку входных данных для основной программы. Часто в задачу препроцессора входит раскрытие макроопределений. См. также: Макроязыки Финансовый словарь Финам …   Финансовый словарь

  • препроцессор — Устройство или программа, выполняющие предварительную обработку данных. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN preprocessor …   Справочник технического переводчика

  • Препроцессор GPRE — компьютерная программа для операционных систем UNIX, GNU/Linux и Microsoft Windows, осуществляющая перевод команд языков Embedded SQL и Dynamic SQL в выражения базового языка программирования. Поддерживаемые базовые языки программирования… …   Википедия

  • препроцессор — препроц ессор, а …   Русский орфографический словарь

  • Условная компиляция — В информатике, препроцессор  это компьютерная программа, принимающая данные на входе, и выдающая данные, предназначенные для входа другой программы, например, такой как компилятор. О данных на выходе препроцессора говорят, что они находятся в… …   Википедия

  • C++ — У этого термина существуют и другие значения, см. C. См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в …   Википедия

  • Сравнение языков программирования — Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей.  Условные обозначения  …   Википедия

  • С++ — См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в: 1985 г. Автор(ы): Бьёрн Страуструп …   Википедия

  • SQLJ — SQLJ  подмножество стандарта SQL, направленное на объединение преимуществ синтаксиса языков SQL и Java ради удобства реализации бизнес логики и работы с данными. Данный стандарт разработан консорциумом, состоящим из компаний IBM, Micro Focus …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»