3 ответов:
Я автор Boost.Прото, и я только недавно открыл деревья выражений C#. АФАИКТ, они схожи по замыслу, но различны как по реализации, так и по масштабу.
C# имеет языковую поддержку для записи выражения LINQ в виде динамически типизированного дерева. Это используется потребителями LINQ для оптимизации оценки запросов. Запрос к структуре данных в памяти был бы простой оценкой с помощью методов расширения LINQ, но один против удаленной базы данных будет более оптимально выполняется путем обхода выражения LINQ во время выполнения, вычисления строки T-SQL и передачи ее SQL-серверу для удаленного выполнения. В настоящее время деревья выражений C# лучше всего подходят для таких задач оптимизации.
Повышение.Прото ОТОХ имеет несколько более широкий охват. Деревья прото-выражений статически типизированы, что позволяет выполнять сложные преобразования и генерацию кода во время компиляции. Что еще более важно, Proto предоставляет инструменты для интроспекции и преобразование деревьев и создание на их основе пользовательского кода. Это может быть полезно для оптимизации, но также и для придания выражениям совершенно другой предметной семантики. Таким образом, Proto более точно мыслится как встроенный инструментарий специфичного для предметной области языка.
То же самое можно было бы сделать с деревьями выражений C#, но AFAIK в настоящее время не существует структуры для преобразования дерева и генерации кода. Возможность делать генерацию кода во время выполнения на .NET делает это привлекательным возможность. Может быть, какой-нибудь предприимчивый застройщик (вы?) был бы готов написать Proto# поверх деревьев выражений C#. :- )
Они частично перекрываются в том, что их можно использовать для написания DSL. Boost proto построен вокруг идеи построения встроенного DSL в C++, который преобразуется в C++ и компилируется во время компиляции. Деревья выражений C# были бы больше о написании внешнего DSL (или любого интерпретатора на самом деле). Поэтому boost:: Proto-это модификация и улучшение C++, а деревья выражений-это написание кода на новом языке, а не изменение C#.
Что на самом деле вы хотели спросить ? Я не понимаю вашего вопроса.
Их цели не совпадают, потому что C++ и CLR очень разные.
В C++ нельзя взять произвольный код и работать с ним как с выражением. У вас нет механизма отражения.
Выражение является функцией времени выполнения, а Boost Proto-библиотекой времени компиляции.
Comments