Здравствуйте, gandjustas, Вы писали:
G>Ну ок, возьми не C#, а любой другой статически типизированный язык. В любом языке все придет к формированию деревьев выражений на основе конструкций языка, которые потом надо будет отобразить на метаданные классов и на базе этого построить SQL. Так что накладные расходы также будут присутствовать.
Вот конкретный пример:
compile-time template engineАвтор: Evgeny.Panasyuk
Дата: 12.10.14
В compile-time делается анализ строки, и на основе этого генерируется определённая последовательность вызовов, результирующий ASM код получается идентичным тому, который соответствует полностью ручному оптимальному коду.
То есть из вот этого:
{
int counter = 2;
char character = '!';
double value = 0.5;
for_each_part
(
auto x,
"val = $value$, cnt = $counter$, ch = $character$, again v=$value$;\n",
counter, character, value
)
{
print_it(x);
};
}
Получается ASM код идентичный этому:
{
int counter = 2;
char character = '!';
double value = 0.5;
print_it("val = ");
print_it(value);
print_it(", cnt = ");
print_it(counter);
print_it(", ch = ");
print_it(character);
print_it(", again v=");
print_it(value);
print_it(";\n");
}
Можно производить и более сложные трансформации (в том числе и производить оптимизацию SQL) — compile-time вычисления на C++ полны по Тьюрингу.
Причём формирование деревьев выражений на основе конструкций языка это более простая задача чем анализ строк — и в C++ это было доступно аж с первой версии стандарта C++98. И на основе этого (compile-time обход деревьев выражений на основе конструкций языка) создано уже много разных EDSL (Embedded Domain Specific Language) библиотек.