В чем разница между макросом и плагином компилятора?

Что может сделать макрос, что плагин компилятора не может, и наоборот?

Под "не могу" я подразумеваю, что невозможно достичь той же цели, а не то, что ее можно достичь другим способом.

Например, макрос может impl некоторая черта для структуры, плагин компилятора может derive некоторая черта для структуры. Оба они могут автоматически impl черта для структуры.

1 ответ

Решение

Макросы плагинов компилятора могут делать все macro_rules! Макросы могут сделать, и многое другое. Плагины компилятора могут регистрировать макросы деривации, синтезировать новые идентификаторы, деконструировать узлы AST, анализировать строки, выполнять IO файлов и т. Д. И т. Д. Перечислять все будет бессмысленно, поскольку это будет равносильно воспроизведению внутреннего API компилятора, который меняется на регулярной основе.,

Единственное главное ограничение заключается в том, что они могут получить доступ только к тому, с чем они вызваны, или что может быть получено из того, с чем они вызываются (кроме некоторой дополнительной, уже существующей контекстной информации): они не могут получить доступ или работать с чем-либо, что не существует Как типы, или что означают имена, или какое значение имеет выражение.

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

Другие вопросы по тегам