Действительно ли препроцессоры являются устаревшими на современных языках?

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

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

6
задан Earlz 30 May 2010 в 21:38
поделиться

7 ответов

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

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

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

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

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

8
ответ дан 8 December 2019 в 05:53
поделиться

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

Предпочтите вместо этого истинное метапрограммирование или макросы в стиле Лиспа.

7
ответ дан 8 December 2019 в 05:53
поделиться

Препроцессор не нужен. Для настоящего метапрограммирования у вас должно быть что-то вроде MetaML или Template Haskell или гигиенические макросы а-ля Scheme. Для быстрых и грязных вещей, если вашим пользователям это абсолютно необходимо, всегда есть m4.

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

  • проектируйте свой язык так, чтобы не нуждаться в препроцессоре.
  • Не комплектуйте свой язык благословенным препроцессором.
  • Но если у других есть свои причины для использования препроцессора (генерация парсера - популярная причина), обеспечьте поддержку точных сообщений об ошибках.
5
ответ дан 8 December 2019 в 05:53
поделиться

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

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

0
ответ дан 8 December 2019 в 05:53
поделиться

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

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

2
ответ дан 8 December 2019 в 05:53
поделиться

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

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

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

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

0
ответ дан 8 December 2019 в 05:53
поделиться

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

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

0
ответ дан 8 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: