Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Типичным примером компьютерного программирования является обработка исходного кода перед следующим этапом компиляции. В некоторых компьютерных языках (например, C и PL / I ) существует этап перевода, известный как предварительная обработка . Он также может включать обработку макросов, включение файлов и языковые расширения.

Лексические препроцессоры [ править ]

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

Препроцессор C [ править ]

Наиболее распространенный пример этого - препроцессор C , который принимает строки, начинающиеся с символа "#", как директивы . Поскольку он ничего не знает о базовом языке, его использование подвергается критике, а многие его функции встроены непосредственно в другие языки. Например, макросы, замененные агрессивным встраиванием и шаблонами, включают импорт во время компиляции (это требует сохранения информации о типе в объектном коде, что делает невозможным внедрение этой функции в язык); условная компиляция эффективно выполняется с if-then-elseустранением мертвого кода на некоторых языках. Однако важно помнить, что все директивы препроцессора должны начинаться с новой строки.

Другие лексические препроцессоры [ править ]

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

Синтаксические препроцессоры [ править ]

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

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

Настройка синтаксиса [ править ]

Хорошим примером настройки синтаксиса является наличие двух разных синтаксисов в языке программирования Objective Caml . [1] Программы могут быть написаны безразлично, используя «нормальный синтаксис» или «измененный синтаксис», и могут быть красиво напечатаны с любым синтаксисом по запросу.

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

Расширение языка [ править ]

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

Специализация языка [ править ]

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

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

Препроцессор общего назначения [ править ]

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

M4 , вероятно, является наиболее известным примером такого препроцессора общего назначения, хотя препроцессор C иногда используется в роли, не связанной с C. Примеры:

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

GPP - это лексический препроцессор общего назначения, похожий на cpp. Помимо прочего, его можно использовать для предварительной обработки файлов уценки. [6]

См. Также [ править ]

  • Директива (программирование)  - языковая конструкция, указывающая, как компилятор должен обрабатывать ввод.
  • Метапрограммирование
  • Макросы  - в информатике, краткое представление шаблона.
  • Компилятор исходного кода , также известный как Transpiler - переводчик, который берет исходный код программы и создает эквивалентный исходный код на том же или другом языке программирования.
  • Sass (язык  таблиц стилей) - язык таблиц стилей
  • Стилус (язык таблиц стилей)
  • Less (язык таблиц стилей)  - язык динамических таблиц стилей
  • Фрагмент (программирование)  - небольшая область повторно используемого исходного кода, машинного кода или текста.
  • Механизм шаблонов  - программное обеспечение, предназначенное для объединения шаблонов с моделью данных для создания результирующих документов.
  • C препроцессор  - Макро препроцессор используется в C, C ++ и Objective-C Языки программирования
  • OCaml препроцессор-довольно-принтер
  • PL / I препроцессор
  • Windows , программное обеспечение трассировки препроцессор
  • Макропроцессор общего назначения  - Макропроцессор, который не привязан к определенному языку или части программного обеспечения или не интегрирован с ним.

Ссылки [ править ]

  1. ^ Пересмотренный синтаксис с веб-сайта языка Caml
  2. ^ Показать, как использовать препроцессор C в файлах JavaScript. Т. Снайдер «JavaScript не является промышленным преимуществом» .
  3. ^ "Препроцессор C в Javascript?" . эспрессо-режим .
  4. ^ https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/commit/?id=b40b25fff8205dd18124d8fc87b2c9c57f269b5f
  5. ^ Показать, как использовать препроцессор C в качестве механизма шаблонов . "Использование препроцессора C в качестве инструмента разработки HTML" Дж. Корпела , 2000.
  6. ^ https://adityam.github.io/context-blog/post/markdown-with-gpp/

Внешние ссылки [ править ]

  • Дизайн DSL в Лиспе
  • Программирование снизу вверх
  • Generic препроцессор
  • Gema, универсальный макропроцессор
  • В Pikt piktc текст, сценарий, и конфигурационный файл препроцессор
  • pyexpander, макропроцессор общего назначения на основе Python
  • Minimac, минималистичный макропроцессор
  • Препроцессор комментариев Java