Препроцессор
Эта статья нуждается в дополнительных цитатах для проверки . ( февраль 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, который реализует мини-язык типа Алгола для описания сложных итераций, в то же время позволяя использовать стандартные операторы Лиспа.
Препроцессор /язык 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