Препроцессор
Эта статья нуждается в дополнительных цитатах для проверки . ( февраль 2013 г. ) |
Преобразование данных |
---|
Концепции |
Языки трансформации |
Техники и трансформации |
Приложения |
Связанный |
В информатике — препроцессор (или прекомпилятор ). [1] — это программа , которая обрабатывает входные данные для получения вывода, который используется в качестве входных данных в другой программе. Выходные данные называются предварительно обработанной формой входных данных, которая часто используется некоторыми последующими программами, такими как компиляторы . Объем и вид выполняемой обработки зависят от характера препроцессора; некоторые препроцессоры способны выполнять лишь относительно простые текстовые замены и расширения макросов , в то время как другие обладают возможностями полноценных языков программирования .
Типичным примером компьютерного программирования является обработка исходного кода перед следующим этапом компиляции.В некоторых компьютерных языках (например, C и PL/I ) существует этап перевода, известный как предварительная обработка . Он также может включать обработку макросов, включение файлов и языковые расширения.
Лексические препроцессоры
[ редактировать ]Лексические препроцессоры являются препроцессорами самого низкого уровня, поскольку они требуют только лексического анализа , то есть они работают с исходным текстом перед любым синтаксическим анализом , выполняя простую замену токенизированных последовательностей символов на другие токенизированные последовательности символов в соответствии с заданными пользователем. правила. Обычно они выполняют макроподстановку , текстовое включение других файлов, а также условную компиляцию или включение.
Препроцессор C
[ редактировать ]Наиболее распространенным примером этого является препроцессор C , который принимает строки, начинающиеся с '#', в качестве директив .Препроцессор C не ожидает, что его входные данные будут использовать синтаксис языка C.Некоторые языки используют другой подход и используют встроенные функции языка для достижения аналогичных целей. Например:
- Вместо макросов некоторые языки используют агрессивную встраивание и шаблоны.
- Вместо включений в некоторых языках используется импорт во время компиляции, основанный на информации о типе в объектном коде.
- Некоторые языки используют
if-then-else
и устранение мертвого кода для достижения условной компиляции .
Другие лексические препроцессоры
[ редактировать ]общего назначения Другие лексические препроцессоры включают m4 , наиболее часто используемый в кроссплатформенных системах сборки, таких как autoconf , и GEMA , макропроцессор с открытым исходным кодом, который работает с шаблонами контекста.
Синтаксические препроцессоры
[ редактировать ]Синтаксические препроцессоры были представлены в Lisp семействе языков . Их роль заключается в преобразовании синтаксических деревьев в соответствии с рядом определяемых пользователем правил. Для некоторых языков программирования правила написаны на том же языке, что и программа (отражение во время компиляции). Это относится к Lisp и OCaml . Некоторые другие языки полагаются на полностью внешний язык для определения преобразований, например препроцессор XSLT для XML или его статически типизированный аналог CDuce.
Синтаксические препроцессоры обычно используются для настройки синтаксиса языка, расширения языка путем добавления новых примитивов или встраивания предметно-ориентированного языка программирования (DSL) в язык общего назначения.
Настройка синтаксиса
[ редактировать ]Хорошим примером настройки синтаксиса является существование двух разных синтаксисов в языке программирования Objective Caml . [2] Программы могут быть написаны как с «обычным синтаксисом», так и с «пересмотренным синтаксисом», и по запросу могут быть красиво напечатаны с использованием любого из синтаксисов.
Аналогичным образом, ряд программ, написанных на OCaml, настраивают синтаксис языка путем добавления новых операторов.
Расширение языка
[ редактировать ]Лучшие примеры расширения языка с помощью макросов можно найти в Лисп семействе языков . Хотя языки сами по себе представляют собой простые динамически типизированные функциональные ядра, стандартные дистрибутивы Scheme или Common Lisp допускают императивное или объектно-ориентированное программирование, а также статическую типизацию. Почти все эти функции реализуются посредством синтаксической предварительной обработки, хотя следует отметить, что фаза компиляции «расширения макроса» обрабатывается компилятором в Lisp. Это по-прежнему можно считать формой предварительной обработки, поскольку она происходит перед другими этапами компиляции.
Специализация языка
[ редактировать ]Одной из необычных особенностей семейства языков Lisp является возможность использования макросов для создания внутреннего DSL. Как правило, в большом проекте на основе Lisp модуль может быть написан на множестве таких мини-языков : один, возможно, использует основанный на SQL диалект Lisp , другой написан на диалекте, специализированном для графических интерфейсов или красивой печати и т. д. Common Lisp Стандартная библиотека содержит пример этого уровня синтаксической абстракции в виде макроса LOOP, который реализует мини-язык типа Algol для описания сложных итераций, в то же время позволяя использовать стандартные операторы Lisp.
Препроцессор /язык MetaOCaml предоставляет аналогичные функции для внешних DSL. Этот препроцессор берет описание семантики языка (то есть интерпретатора) и, комбинируя интерпретацию во время компиляции и генерацию кода, превращает это определение в компилятор языка программирования OCaml , а из этого языка либо в байт-код, либо в родной код.
Препроцессор общего назначения
[ редактировать ]Большинство препроцессоров предназначены для конкретной задачи обработки данных (например, компиляции языка C). Препроцессор может рекламироваться как универсальный , что означает, что он не предназначен для конкретного использования или языка программирования и предназначен для использования для широкого спектра задач обработки текста.
M4 , вероятно, является наиболее известным примером такого препроцессора общего назначения, хотя препроцессор C иногда используется в роли, не связанной с C. Примеры:
- использование препроцессора C для предварительной обработки JavaScript . [3] [4]
- использование препроцессора C для обработки дерева устройств в ядре Linux . [5]
- использование препроцессора M4 (см. пример в статье) или C [6] в качестве шаблонизатора для генерации HTML .
- imake — интерфейс make , использующий препроцессор C, написанный для системы X Window, но теперь устаревший в пользу automake .
- grompp — препроцессор для входных файлов моделирования для GROMACS (быстрый, бесплатный код с открытым исходным кодом для решения некоторых задач вычислительной химии ), который вызывает препроцессор системы C (или другой препроцессор, определенный входным файлом моделирования) для анализа топологии, используя в основном механизмы #define и #include для определения эффективной топологии во время выполнения grompp.
См. также
[ редактировать ]- Директива (программирование) — языковая конструкция, определяющая, как компилятор должен обрабатывать вводимые данные.
- Metaprogramming – Programming paradigm
- Макросы – правило замены заданного входа заданным выходом.
- Компилятор исходного кода , также известный как Transpiler — переводчик компьютерного исходного кода.
- Sass (язык таблиц стилей) —
- Stylus (язык таблицы стилей) — язык препроцессора таблицы стилей.
- Меньше (язык таблицы стилей) — динамический язык таблицы стилей.
- Фрагмент (программирование) — небольшая область повторно используемого исходного кода, машинного кода или текста.
- Механизм шаблонов — программное обеспечение, предназначенное для объединения шаблонов с моделью данных для создания результирующих документов.
- Препроцессор C — препроцессор макросов для нескольких языков программирования.
- OCaml preprocessor-pretty-printer — расширяемый набор инструментов синтаксического анализатора языка программирования.
- Препроцессор PL /I
- Препроцессор трассировки программного обеспечения Windows
- Макропроцессор общего назначения — макропроцессор, который не привязан к определенному языку или программному обеспечению и не интегрирован с ним.
Ссылки
[ редактировать ]- ^ «Что такое прекомпилятор?» .
- ^ Пересмотренный синтаксис с веб-сайта языка Caml.
- ^ Покажите, как использовать препроцессор C для файлов JavaScript. «JavaScript — это не промышленная мощь» , Т. Снайдер .
- ^ «Препроцессор C в Javascript?» . режим эспрессо .
- ^ «Kernel/Git/Stable/Linux.git — дерево стабильных версий ядра Linux» .
- ^ Покажите, как использовать C-препроцессор в качестве механизма шаблонов . «Использование препроцессора C в качестве инструмента разработки HTML» , Дж. Корпела , 2000 г.
Внешние ссылки
[ редактировать ]- Проектирование DSL на Лиспе
- Программирование снизу вверх
- Общий препроцессор
- Gema, макропроцессор общего назначения
- PIKT piktc Препроцессор текста, сценариев и файлов конфигурации
- pyexpander, макропроцессор общего назначения на базе Python
- minimac, минималистичный макропроцессор
- Препроцессор комментариев Java