Являются ли препроцессоры устаревшими в современных языках? - PullRequest
6 голосов
/ 31 мая 2010

Я делаю простой компилятор для простого языка домашних животных, который я создаю и исходил из C-фона (хотя я пишу его на Ruby). Я подумал, нужен ли препроцессор.

Что ты думаешь? Нужен ли «тупой» препроцессор в современных языках? Будут ли возможности условной компиляции C # считаться «препроцессором»? Есть ли в каждом современном языке, который не включает препроцессор, утилиты, необходимые для его правильной замены? (например, препроцессор C ++ теперь в основном устарел (хотя все еще зависит от) из-за шаблонов.)

Ответы [ 8 ]

8 голосов
/ 31 мая 2010

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

  • Предварительная обработка для разных операций на разных платформах? Это в основном слой абстракции для независимости от платформы.
  • Предварительная обработка для простого добавления сложного кода? Абстракция, потому что язык недостаточно универсален.
  • Предварительная обработка для добавления расширений в ваш код? Абстракция, потому что ваш код / ​​ваш язык недостаточно гибок.

Итак, мой ответ: вам не нужен препроцессор, если ваш язык достаточно высокоуровневый *. Я бы не назвал предварительную обработку злом или бесполезным, я просто говорю, что чем более абстрактным становится язык, тем меньше у меня причин думать, что ему нужна предварительная обработка.

* Что достаточно высокого уровня? Это, конечно, совершенно субъективно.

РЕДАКТИРОВАТЬ: Конечно, я действительно имею в виду только макросов . Использование препроцессоров для взаимодействия с другими файлами кода или для определения констант является злом.

7 голосов
/ 31 мая 2010

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

Вместо этого предпочитайте истинное метапрограммирование или макросы в стиле Lisp.

5 голосов
/ 31 мая 2010

Препроцессор не обязателен . Для реального метапрограммирования у вас должно быть что-то вроде MetaML или Template Haskell или гигиенических макросов & agrave; Схема. Для быстрого и грязного материала, если ваши пользователи обязательно должны его иметь, всегда есть m4.

Однако, современный язык должен поддерживать эквивалент директив C #line. Такие директивы позволяют компилятору находить ошибки в исходном источнике, даже если этот источник встроен в генератор синтаксического анализатора или Генератор лексеров или грамотная программа. Другими словами,

  • Создайте свой язык так, чтобы не нуждался в препроцессоре.
  • Не связывайте свой язык с благословенным препроцессором.
  • Но если у других есть свои причины для использования препроцессора (генерация синтаксического анализатора является популярной), обеспечьте поддержку точных сообщений об ошибках.
2 голосов
/ 31 мая 2010

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

Я видел столько злоупотреблений препроцессорами, что ненавижу их со страстью.

0 голосов
/ 02 января 2016

Я бы сказал, что хотя вам следует избегать препроцессора для большинства всего, что вы обычно делаете, это все же необходимо.

Например, в C ++ для написания библиотеки модульного тестирования, такой как Catch , абсолютно необходим препроцессор. Они используют его двумя различными способами: один для расширения утверждений 1 и один для вложенных разделов в тестовых случаях 2 .

Но препроцессор не следует злоупотреблять для выполнения вычислений во время компиляции в C ++, где могут использоваться выражения const и шаблонное метапрограммирование.


Извините, у меня недостаточно репутации, чтобы публиковать более двух ссылок, поэтому я выкладываю это здесь:

  1. github.com / philsquared / Стопор / блоб / ведущий / документы / assertions.md
  2. github.com / philsquared / Стопор / BLOB / Master / Docs / test-cases-and-sections.md
0 голосов
/ 31 мая 2010

Это зависит от того, какие именно функции вы предлагаете. Например, если у меня есть const int N, вы предлагаете мне взять N переменных? Есть N членов переменных, взять аргумент, чтобы построить их все? Создать N функций? Выполнить N операций, которые не обязательно работают в циклах (например, передать N аргументов)? N шаблонных аргументов? Условная компиляция? Константы, которые не являются интегральными?

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

0 голосов
/ 31 мая 2010

Это ваш язык, поэтому вы можете встраивать любые возможности в сам язык без необходимости в препроцессоре.Я не думаю, что препроцессор должен быть необходим, и это добавляет слой сложности и неясности поверх языка.Большинство современных языков не имеют препроцессоров, и в C ++ вы используете его только тогда, когда у вас нет другого выбора.

Кстати, я считаю, что D обрабатывает условную компиляцию без препроцессора.

0 голосов
/ 31 мая 2010

Препроцессор - это отдельная фаза компиляции. Хотя предварительная обработка может быть полезна в некоторых случаях, головные боли и ошибки могут вызвать проблемы.

В C препроцессор используется в основном для:

  1. Включение данных. Несмотря на мощные, наиболее распространенные сценарии использования не нуждаются в такой мощности, а использование «импорта» / «использования» (как в Java / C #) намного удобнее в использовании, и немногим людям нужны остальные случаи ;
  2. Определение констант - почему бы просто не предоставить выражение "const"
  3. Макросы. Несмотря на то, что макросы в стиле C очень мощные (они могут включать такие выражения, как возврат), они также вредят читабельности. Дженерики / Шаблоны более чистые, и, хотя они и несколько менее эффективны, их легче понять.
  4. Условная компиляция - это, возможно, самый законный вариант использования препроцессоров, но, опять же, это болезненно для читабельности. Разделение кода, специфичного для платформы, в исходном коде, специфичном для платформы, и использование общих операторов if в конечном итоге становится более читабельным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...