Я делаю простой компилятор для простого любимого языка, который я создаю и происхожу из среды C (хотя я пишу это в Ruby), я задался вопросом, необходим ли препроцессор.
Что Вы думаете? "Немой" препроцессор все еще необходим на современных языках? Возможности условной компиляции C# считали бы "препроцессором"? Каждый современный язык, который не включает препроцессор, имеют утилиты, необходимые для надлежащей замены его? (например, препроцессор C++ является теперь главным образом устаревшим (хотя все еще зависится от) из-за шаблонов.)
Предварительная обработка C может делать действительно изящные вещи, но если вы посмотрите на то, для чего он используется, вы поймете, что часто это просто добавление еще одного уровня абстракции.
Итак, мой ответ: вам не нужен препроцессор, если ваш язык достаточно высокоуровневый *. Я бы не назвал предварительную обработку злом или бесполезным, я просто скажу, что чем более абстрактным становится язык, тем меньше причин, по которым я могу думать, что для него нужна предварительная обработка.
* Что достаточно высокого уровня? Это, конечно, полностью субъективно.
РЕДАКТИРОВАТЬ: Конечно, я действительно имею в виду только макрос . Использование препроцессоров для взаимодействия с другими файлами кода или для определения констант - зло .
Препроцессор - это дешевый способ предоставить языку неполные средства метапрограммирования в уродливой форме.
Предпочтите вместо этого истинное метапрограммирование или макросы в стиле Лиспа.
Препроцессор не нужен. Для настоящего метапрограммирования у вас должно быть что-то вроде MetaML или Template Haskell или гигиенические макросы а-ля Scheme. Для быстрых и грязных вещей, если вашим пользователям это абсолютно необходимо, всегда есть m4
.
Однако современный язык должен поддерживать эквивалент директив #line
языка Си. Такие директивы позволяют компилятору находить ошибки в исходном тексте, даже если этот текст встроен в генератор синтаксического анализатора, генератор лексера или грамотную программу. Другими словами,
Это зависит от того, какие именно другие функции вы предлагаете. Например, если у меня есть const int N, предлагаете ли вы мне принимать N переменных? Иметь N переменных-членов, принимать аргумент для создания их всех? Создавать N функций? Выполнять N операций, которые не обязательно работают в циклах (например, передавать N аргументов)? N аргументов шаблона? Условная компиляция? Константы, не являющиеся интегралами?
Препроцессор языка Си настолько абсурдно мощный в умелых руках, что нужно было бы создать очень мощный язык, чтобы не иметь права на его использование.
Я думаю, что препроцессоры - это костыль, позволяющий удерживать язык с плохой экспрессивной ходьбой.
Я видел столько злоупотреблений препроцессорами, что страстно их ненавижу.
Препроцессор - это отдельный этап компиляции. Хотя предварительная обработка может быть полезна в некоторых случаях, головные боли и ошибки, которые она может вызвать, делают ее проблемой.
В C препроцессор используется в основном для:
Итак, мой ответ - , несмотря на свою мощь, препроцессор вредит удобочитаемости и / или не является лучшим способом решения некоторых проблем . Новые языки обычно считают обслуживание кода очень важным, и по этим причинам препроцессор кажется устаревшим.
Это ваш язык, поэтому вы можете встроить любые возможности в сам язык без необходимости в препроцессоре. Я не думаю, что препроцессор должен быть необходим, и он добавляет уровень сложности и неясности поверх языка. Большинство современных языков не имеют препроцессоров, а в C ++ вы используете их только тогда, когда у вас нет другого выбора.
Кстати, я считаю, что D обрабатывает условную компиляцию без препроцессора.