Здравствуйте, Sinclair, Вы писали:
S>Хочется-то иметь компактный, понятный, легко отлаживаемый пользовательский код. А уж разворачиванием его в килобайты бинаря под конкретную архитектуру пусть занимается тупая машина.
S>Может быть, и на С++ тоже можно написать какой-то подобный аналог.
Кончено — есть compile-time EDSL'и — например expresion templates, на них например построен Eigen — пользовательский высокоуровневый код работающий с матрицами, оптимизируется библиотекой на этапе компиляции, причём на разных уровнях, начиная с того как эффективней расставить скобки в выражении, и заканчивая разкруткой циклов, параллелизацей и векторизацией под конкретную платформу.
Эта техника вообще старше C#:
статья из 1995. И даже есть не просто библиотеки использующие expression templates, а есть библиотеки для построения таких библиотек:
https://www.boost.org/doc/libs/1_74_0/doc/html/proto.html
In short, Proto is an EDSL for defining EDSLs.
Также есть варианты построения runtime-EDSL'ей, они ещё более выразительные, в бэкенде дёргается обычный компилятор, здесь возможности вообще безграничны, вплоть до оптимизации кода под конкретные runtime данные. Это всё например реализовано в библиотеке
TaskGraph.
Собственно ты это и делаешь — самописная трансляция из EDSL'я в векторные инструкции. Только для этого Linq не нужен — runtime дерево выражений строится практически на любом языке на минимальном наборе языковых фич — смотри например SymPy. Если бы ты сам себя не ограничивал Linq'ом — получилось намного более выразительней и мощнее