O problema já começa com o termo 'modelos de expressão (ET)'. Não sei se existe uma definição precisa para isso. Mas em seu uso comum, de alguma forma, combina 'como você codifica expressões de álgebra linear' e 'como ele é computado'. Por exemplo:
Você codifica a operação vetorial
v = 2*x + 3*y + 4*z; // (1)
E é calculado por um loop
for (int i=0; i<n; ++i) // (2)
v(i) = 2*x(i) + 3*y(i) + 4*z(i);
Na minha opinião, são duas coisas diferentes e precisam ser dissociadas: (1) é uma interface e (2) uma implementação possível. Quero dizer, isso é uma prática comum em programação. Certamente (2) pode ser uma boa implementação padrão, mas em geral eu quero poder utilizar uma implementação especializada e dedicada. Por exemplo, eu quero que uma função como
myGreatVecSum(alpha, x, beta, y, gamma, z, result); // (3)
ser chamado quando estou codificando (1). Talvez (3) apenas use internamente um loop como em (2). Mas, dependendo do tamanho do vetor, outras implementações podem ser mais eficientes. De qualquer forma, algum especialista em alto desempenho pode implementar e ajustar (3) o máximo possível. Portanto, se (1) não pode ser mapeado para uma chamada de (3), evito o açúcar sintático de (1) e chamo diretamente (3) imediatamente.
O que eu descrevo não é novidade. Pelo contrário, é a ideia por trás do BLAS / LPACK:
- Todas as operações críticas de desempenho no LAPACK são feitas chamando as funções BLAS.
- O BLAS apenas define uma interface para as expressões de álgebra linear que são comumente necessárias.
- Para o BLAS, existem diferentes implementações otimizadas.
Se o escopo do BLAS não for suficiente (por exemplo, ele não fornece uma função como (3)), pode-se estender o escopo do BLAS. Portanto, este dinossauro dos anos 60 e 70 percebe, com sua ferramenta da idade da pedra, uma separação limpa e ortogonal da interface e implementação. É engraçado que (a maioria) das bibliotecas numéricas C ++ não atinjam esse nível de qualidade de software. Embora a própria linguagem de programação seja muito mais sofisticada. Portanto, não é de surpreender que o BLAS / LAPACK ainda esteja vivo e se desenvolva ativamente.
Então, na minha opinião, os ETs não são maus por si só. Mas como eles são comumente usados em bibliotecas numéricas C ++ ganharam uma reputação muito ruim nos círculos científicos da computação.