C++ Templates are Turing Complete

12 grudnia 2008

Wzorce języka C++ spełniają wszystkie założenia maszyny Turinga.

Przemyślenia i próby udowodnienia powyższego sformułowania można znaleźć w pracy „C++ Templates are Turing Complete” autorstwa Todd L. Veldhuizen.

Małą ciekawostkę na temat limitów w wzorcach możemy znaleźć na końcu artykułu:

[...] the C++ standards committee allows conforming compilers to limit the depth of „recursively nested template instantiations,” with a recommended minimum limit of 17. Compilers have adopted this limit, many with an option to increase it.

This limit does not translate into any reliable time or space bound on compiles, though; it is straightforward to construct C++ programs which instantiate k^17 templates (i.e. within the recommended limit) for any arbitrarily large k; [...]

Poniżej przykład wzorca (pochodzący z w/w dokumentu) z k=5, który wygeneruje 5^17 = 762 939 453 125 instancji wzorca:

template<int Depth, int A, typename B>
struct K17 {
	static const int x =
		K17<Depth+1, 0, K17<Depth,A,B> >::x +
		K17<Depth+1, 1, K17<Depth,A,B> >::x +
		K17<Depth+1, 2, K17<Depth,A,B> >::x +
		K17<Depth+1, 3, K17<Depth,A,B> >::x +
		K17<Depth+1, 4, K17<Depth,A,B> >::x
};
 
template<int A, typename B>
struct K17<16,A,B> {
	static const int x = 1;
};
 
static const int z = K17<0,0,int>::x;

Kompilacja tego kodu może być długa i męcząca :P

Aby dobrze wyważyć skomplikowanie kodu do czasu jego kompilacji w kontekście wykorzystania wzorców, należy dogłębnie poznać tajniki i idiomy programowania i metaprogramowania z ich wykorzystaniem.

Na stronie autora w/w dokumentu dowodzącego kompletności Turinga dla wzorców, można znaleźć kilka ciekawych artykułów poruszających wykorzystanie wzorców w programowaniu:

Zgromadzone tam informacje mogą okazać się bardzo przydatne dla początkujących adeptów sztuki metaprogramowania i wykorzystania wzorców, natomiast średniozaawansowanym zapewne będą znane przedstawione tam techniki, triki i idiomy.

Podobne notatki:

Może zainteresują Cię również następujące, pododbne notatki:

Komentarze i nawiązania (2)

Kanał RSS komentarzy

  1. Dobry wpis ;-)

    Warto też wspomnieć o wspaniałej książce „Nowoczesne projektowanie w C++” http://www.wnt.com.pl/product.php?action=0&prod_id=656&hot=1

    autor stworzył również bibliotekę Loki http://sourceforge.net/projects/loki-lib/

    Jakiś czas temu również pisałem o tym na blogu. Opisałem wtedy jak napisać na szablonach program generujący zbiór Mandelbrota.

  2. Ksiazka Alexandresca fajna, zdarza mi sie do niej czasem zerkac, ale jakos nigdy nie znalazlem czasu, aby ja cala „przerobic”.

Dodaj swój komentarz

Możesz użyć tych tagów XHTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Jeśli chcesz wstawić kilku linijkowy fragment kodu, użyj tagów <pre lang="x"></pre> (gdzie x język kodu np. cpp, perl, html). W ten sposób kod zostanie odpowiednio sformatowany i pokolorowany przez system.

Uwaga!

Na tym blogu działa system cache oraz filtr antyspamowy. Twój komentarz może być widoczny na stronie z pewnym opóźnieniem. Proszę o cierpliwość. Jeśli utraciłeś już wszystkie jej zasoby poinformuj mnie o tym, być może system uznał Cię za spamera ;)