November 7th, 2012

flow

Макросы и нотации

Готовится к выходу следующий релиз языка Scala, в котором вводится поддержка макросов. Реакция аудитории неоднозначна. Встречается критика не только конкретной реализации, но и самой идеи метапрограммирования через макросы. Прочитать об этом можно в http://xeno-by.livejournal.com/79953.html

Я целиком и полностью поддерживаю идею дизайна искусственных языков в форме микроядро+макросы. Есть сложности, связанные с интеграцией такого подхода в уже существующий язык, но направление авторами Scala выбрано правильное. И единственное жизнеспособное из возможных. Сейчас расскажу, почему это так.

Создание отдельных DSL экономически невыгодно, хотя и может быть полезно в учебных целях. Создание EDSL выгодно и разумно, но применение для этого экзотических/перегруженных операторов и особенностей системы типов превращает ваш Ruby/Haskell/C++/whatever в адскую перловку. Формально хост-язык остаётся, но в его рамках вводится новый синтаксис, новая нотация.

Пример EDSL из комментария migmit к посту xeno-by:
printf ("Integer: " %+ int %+ "String: " %+ string) 100500 "Hello world"

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

Пример применения макроса:
print "Integer: " (100000+500) ", String: " greeting

Нельзя заранее предусмотреть все ситуации. Будут разные предметные области сверху и разные целевые платформы снизу. Макросы это новые ситуации без потерь удобочитаемости и выразительности языка.

А изменение синтаксиса это потери. Вредная традиция. Большинство операций пришло в языки программирования из (несовместимых между собой) математических нотаций. С заменой знака умножения на звёздочку, сравнений на хзчто, а также прочими последствиями применения дурной телеграфной кодировки. Но основные искажения в другом. Математические, химические и многие другие нотации не являются текстом. Их выразительность обеспечивается тем, что это компактные графические представления. Сама идея "введения нового символа" это идея обособленных графических нотаций. Которая в текстовых приводит не к выразительности, а к вопросам "как это читать" и "как это совместимо с другими символами".

Пользователи языков программирования уже привыкли работать с инфиксной арифметикой, сравнениями и логикой в специфике ASCII. Не идеально, но стабильно и практично. Для остального есть слова. Или картинки. Желательно не путать.