Препроцессор - Preprocessor
эта статья нужны дополнительные цитаты для проверка.Февраль 2013) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
В Информатика, а препроцессор это программа который обрабатывает свои входные данные для получения выходных данных, которые используются в качестве входных данных для другой программы. Выход называется предварительно обработанный форма входных данных, которая часто используется некоторыми последующими программами, такими как компиляторы. Объем и вид обработки зависят от характера препроцессора; некоторые препроцессоры способны выполнять только относительно простые текстовые замены и макрос расширения, в то время как другие обладают мощью полноценного языки программирования.
Типичный пример из компьютерное программирование обработка выполняется на исходный код перед следующим этапом компиляции. компьютерные языки (например., C и PL / I ) есть фаза перевод известный как предварительная обработка. Он также может включать обработку макросов, включение файлов и языковые расширения.
Лексические препроцессоры
Лексические препроцессоры - это препроцессоры самого нижнего уровня, поскольку они требуют только лексический анализ, то есть они работают с исходным текстом до любого разбор, выполнив простую замену токенизированный последовательности символов для других токенизированных последовательностей символов в соответствии с определенными пользователем правилами. Обычно они исполняют макрозамена, текстовое включение других файлов, а также условную компиляцию или включение.
Препроцессор C
Самый распространенный пример этого - Препроцессор C, который принимает строки, начинающиеся с '#' как директивы. Поскольку он ничего не знает о базовом языке, его использование подвергается критике, а многие его функции встроены непосредственно в другие языки. Например, макросы, замененные агрессивным встраиванием и шаблонами, включают импорт во время компиляции (это требует сохранения информации о типе в объектном коде, что делает невозможным внедрение этой функции в язык); условная компиляция эффективно достигается с помощью если-то-еще
и устранение мертвого кода на некоторых языках. Однако важно помнить, что все директивы препроцессора должны начинаться с новой строки.
Другие лексические препроцессоры
Другие лексические препроцессоры включают универсальный м4, чаще всего используется в кроссплатформенных системах сборки, таких как autoconf, и GEMA, макропроцессор с открытым исходным кодом, который работает с шаблонами контекста.
Синтаксические препроцессоры
Синтаксические препроцессоры были введены с Лисп семья языков. Их роль заключается в преобразовании синтаксических деревьев в соответствии с рядом определенных пользователем правил. Для некоторых языков программирования правила написаны на том же языке, что и программа (отражение во время компиляции). Так обстоит дело с Лисп и OCaml. Некоторые другие языки полагаются на полностью внешний язык для определения преобразований, например XSLT препроцессор для XML, или его статически типизированный аналог CDuce.
Синтаксические препроцессоры обычно используются для настройки синтаксиса языка, расширения языка путем добавления новых примитивов или встраивания предметно-ориентированный язык программирования (DSL) внутри языка общего назначения.
Настройка синтаксиса
Хорошим примером настройки синтаксиса является наличие двух разных синтаксисов в Цель Caml язык программирования.[1] Программы могут быть написаны безразлично, используя «нормальный синтаксис» или «измененный синтаксис», и могут быть красиво напечатаны с использованием любого синтаксиса по запросу.
Аналогичным образом, ряд программ, написанных на OCaml настроить синтаксис языка, добавив новые операторы.
Расширение языка
Лучшие примеры расширения языка с помощью макросов можно найти в Лисп семья языков. Хотя сами по себе языки представляют собой простые функциональные ядра с динамической типизацией, стандартные дистрибутивы Схема или Common Lisp разрешить императивное или объектно-ориентированное программирование, а также статическую типизацию. Почти все эти возможности реализованы с помощью синтаксической предварительной обработки, хотя следует отметить, что этап компиляции «макрорасширения» выполняется компилятором в Лиспе. Это все еще можно рассматривать как форму предварительной обработки, поскольку она выполняется до других фаз компиляции.
Специализация языка
Одна из необычных особенностей Лисп Семейство языков - это возможность использования макросов для создания внутреннего DSL. Обычно в большом Лисп -проект, модуль может быть написан на множестве таких миниязыки, возможно, используя SQL на основе диалекта Лисп, другой написан на диалекте, специализирующемся на GUI или красивая печать и т. д. Common Lisp Стандартная библиотека содержит пример этого уровня синтаксической абстракции в виде макроса LOOP, который реализует похожий на Алгол мини-язык для описания сложных итераций, при этом позволяя использовать стандартные операторы Лиспа.
В MetaOCaml препроцессор / язык предоставляет аналогичные функции для внешних DSL. Этот препроцессор принимает описание семантики языка (то есть интерпретатора) и, комбинируя интерпретацию времени компиляции и генерацию кода, превращает это определение в компилятор для OCaml язык программирования - и с этого языка либо в байт-код, либо в собственный код.
Препроцессор общего назначения
Большинство препроцессоров предназначены для конкретной задачи обработки данных (например, составление язык C). Препроцессор может быть продвинут как общее назначение, что означает, что он не нацелен на конкретное использование или язык программирования и предназначен для использования для широкого спектра задач обработки текста.
M4 вероятно, самый известный пример такого препроцессора общего назначения, хотя препроцессор C иногда используется в роли, не связанной с C. Примеры:
- используя препроцессор C для JavaScript предварительная обработка.[2]
- использование препроцессора C для обработки дерева устройств в Ядро Linux.[3]
- с помощью M4 (см. пример в статье) или препроцессор C[4] как шаблонизатор, чтобы HTML поколение.
- я делаю, а сделать интерфейс с использованием препроцессора C, написанного для X Window System но теперь устарел в пользу автопроизводитель.
- grompp, препроцессор для входных файлов моделирования для GROMACS (быстрый, бесплатный, открытый исходный код для некоторых проблем в вычислительная химия ), который вызывает системный препроцессор C (или другой препроцессор, как определено входным файлом моделирования) для анализа топологии, используя в основном механизмы #define и #include для определения эффективной топологии во время выполнения grompp.
- с помощью GPP для предварительной обработки файлов уценки[5]
Смотрите также
- Директива (программирование) - Конструкция языка, указывающая, как компилятор должен обрабатывать ввод
- Метапрограммирование
- Макросы - В информатике - краткое представление шаблона.
- Компилятор исходного кода, также известный как Transpiler - переводчик, который берет исходный код программы и создает эквивалентный исходный код на том же или другом языке программирования.
- Sass (язык таблиц стилей) - Язык таблиц стилей
- Стилус (язык таблиц стилей)
- Меньше (язык таблиц стилей) - Язык динамических таблиц стилей
- Сниппет (программирование) - Небольшая область повторно используемого исходного кода, машинного кода или текста
- Шаблонизатор - Программное обеспечение, предназначенное для объединения шаблонов с моделью данных для создания документов результатов
- В Препроцессор C
- В Препроцессор-красивый-принтер OCaml
- В Препроцессор PL / I
- В Препроцессор трассировки программного обеспечения Windows
- Макропроцессор общего назначения - Макропроцессор, который не привязан к определенному языку или части программного обеспечения и не интегрирован с ним.
использованная литература
- ^ Обновленный синтаксис с веб-сайта языка Caml
- ^ Покажи, как пользоваться C-препроцессор в файлах JavaScript. «JavaScript не является сильной стороной промышленности» Т. Снайдер.
- ^ https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?id=b40b25fff8205dd18124d8fc87b2c9c57f269b5f
- ^ Покажи, как пользоваться C-препроцессор так как шаблонизатор.«Использование препроцессора C в качестве инструмента разработки HTML» Дж. Корпела, 2000.
- ^ https://adityam.github.io/context-blog/post/markdown-with-gpp/