Problem zaczyna się już od terminu „szablony wyrażeń (ET)”. Nie wiem, czy istnieje na to dokładna definicja. Ale w powszechnym użyciu w jakiś sposób łączy „sposób kodowania wyrażeń algebry liniowej” i „sposób obliczania”. Na przykład:
Kodujesz operację wektorową
v = 2*x + 3*y + 4*z; // (1)
I jest obliczany przez pętlę
for (int i=0; i<n; ++i) // (2)
v(i) = 2*x(i) + 3*y(i) + 4*z(i);
Moim zdaniem są to dwie różne rzeczy i należy je oddzielić: (1) to interfejs i (2) jedna możliwa implementacja. Mam na myśli, że jest to powszechna praktyka w programowaniu. Pewnie (2) może być dobrą domyślną implementacją, ale ogólnie chcę móc korzystać ze specjalistycznej, dedykowanej implementacji. Na przykład chcę, aby ta funkcja była jak
myGreatVecSum(alpha, x, beta, y, gamma, z, result); // (3)
zostań wywołany, gdy koduję (1). Może (3) po prostu używa wewnętrznie pętli jak w (2). Jednak w zależności od rozmiaru wektora inne implementacje mogą być bardziej wydajne. W każdym razie, jakiś ekspert od wysokiej wydajności może wdrożyć i dostroić (3) w jak największym stopniu. Jeśli więc (1) nie można zmapować na wywołanie (3), raczej unikam cukru syntaktycznego (1) i od razu wywołuję (3).
To, co opisuję, nie jest niczym nowym. Wręcz przeciwnie, to jest idea stojąca za BLAS / LPACK:
- Wszystkie operacje krytyczne dla wydajności w LAPACK są wykonywane przez wywołanie funkcji BLAS.
- BLAS właśnie definiuje interfejs dla tych często używanych wyrażeń algebry liniowej.
- Dla BLAS istnieją różne zoptymalizowane implementacje.
Jeśli zakres BLAS nie jest wystarczający (np. Nie zapewnia funkcji takiej jak (3)), wówczas można rozszerzyć zakres BLAS. Tak więc ten dinozaur z lat 60. i 70. dzięki swojemu narzędziu z epoki kamiennej dokonuje czystego i ortogonalnego rozdziału interfejsu i implementacji. To zabawne, że (większość) numerycznych bibliotek C ++ nie osiąga tego poziomu jakości oprogramowania. Chociaż sam język programowania jest o wiele bardziej wyrafinowany. Nic więc dziwnego, że BLAS / LAPACK wciąż żyje i aktywnie się rozwija.
Więc moim zdaniem ET nie są złe same w sobie. Jednak sposób, w jaki są one powszechnie stosowane w bibliotekach numerycznych C ++, przyniósł im bardzo złą reputację w naukowych kręgach komputerowych.