Sztuka programowania (The Art of Computer Programming) - fundamentalna monografia autorstwa Donalda Knutha dotycząca analizy algorytmów.
W 1962, kiedy stał się poproszony przez wydawnictwo Addison-Wesley o napisanie książki, był już uznanym specjalistą od kompilatorów. Do 1966 notatki sporządzone przez Knutha do książki o kompilatorach urosły do 3000 stron. Knuth postanowił wydać siedmiotomowe dzieło - Sztuka programowania - traktujące o analizie algorytmów. Materiał dotyczący kompilatorów ma być zawarty w tomie VII. W 1968 wydano pierwszy tom, a kolejne w latach 1969, 1973. Z części IV Knuth opublikował na razie fragmenty (są one także dostępne na jego stronie), części V, VI oraz VII jeszcze nie napisał.
W 1976, kiedy przygotowywał nowe wydanie Sztuki programowania, postanowił napisać program do składu tekstu TEX oraz system do projektowania znaków METAFONT, albowiem ówczesne rozwiązania nie były dla niego zadowalające. Po ośmiu latach zakończył pracę oraz TEX jest aktualnie używany do składania tekstów przez matematyków oraz fizyków na całym świecie.
Części
- Tom I - Algorytmy podstawowe
Tom I to wprowadzenie do analizy algorytmów, jest tu omówiony repertuar matematyczny używany w kolejnych tomach. Rozdział 1. da się traktować jako podręcznik do matematyki dyskretnej. Omówione jest tu też programowanie w języku maszynowym oraz komputer MIX. W rozdziale drugim Knuth omówił podstawowe struktury danych - listy liniowe oraz drzewa.
- Tom II - Algorytmy seminumeryczne
Rozdział 3. poświęcony jest liczbom losowym, metodom ich generowania oraz testowania. W rozdziale 4. autor omówił systemy liczbowe, konwersje pomiędzy nimi, arytmetykę liczb całkowitych, liczb zmiennopozycyjnych, wymiernych.
- Tom III - Sortowanie oraz wyszukiwanie
Tom III traktuje o sortowaniu wewnętrznym, optymalnym oraz zewnętrznym. Szczegółowo omówione są rodzaje wyszukiwań elementów w zbiorach oraz tablicach. Dodatkowo autor na przykładzie algorytmów sortowania oraz wyszukiwania odpowiada na takie pytania jak: W jaki sposób tworzyć dobre algorytmy? Jak matematycznie analizować efektywność algorytmów? Co to znaczy, że algorytm jest "najlepszy z możliwych"?
- Tom IV - Algorytmy kombinatoryczne
- Rozdział 7 - Wyszukiwanie kombinatoryczne
- Rozdział 8 - Rekurencja
Tom IV nie stał się jeszcze wydany w całości. Aktualnie Knuth planuje wydać Algorytmy kombinatoryczne w trzech albo czterech podtomach - Tom 4A - Enumeracja oraz Backtracking, Tom 4B - Grafy oraz Algorytmy sieciowe, Tom 4C oraz prawdopodobnie 4D - Optymalizacja oraz Rekursja. Dotychczas z tomu IV autor wydał 5 zeszytów obejmujących swoim zakresem cząstka rozdziału 7, których wydanie jako tom 4A planowane jest na rok 2010.
- Tom V - Algorytmy składniowe
- Rozdział 9 - Analiza leksykalna
- Rozdział 10 - Analiza składniowa
Tom jeszcze nie wydany. Nie są jeszcze znane szczegóły dotyczące tego tomu. Autor planuje zakończyć pracę nad tym tomem do roku 2015, wtedy też ma zamiar przeprowadzić rewizję tomów 1-3 w ostatecznej edycji. Następnie zamierza wydać skróconą formę tomów 1-5 w jednej książce.
Planowany. Nad tomem VI oraz VII Knuth ma zamiar rozpocząć pracę po ostatecznym zakończeniu prac nad tomami 1-5 oraz jeśli uzna, że materiał będzie wciąż istotny do omówienia.
Planowany.
Zawartość
Autor zakłada u czytelnika znajomość podstaw programowania, wiedzę na temat podstawowych technik obliczeniowych (pętle, podprogramy), znajomość poniektórych pojęć żargonowych (pamięć, przepełnienie, zmiennopozycyjny). Jak sam Knuth twierdzi: Czytelnik powinien posiadać na swoim koncie przynajmniej cztery napisane oraz przetestowane programy. Matematyka na poziomie szkoły średniej dopuszcza na zrozumienie podstaw materiału matematycznego książek, jednak do pełnego zrozumienia wymagana jest znajomość analizy matematycznej.
Książki zawierają dużą liczbę ćwiczeń o różnym stopniu trudności wraz z odpowiedziami. Każde zadanie jest ocenione ze względu na trudność w skali od 00 do 50, przy czym ocena 00 to zadanie trywialne, a 50 to prawdopodobnie jeszcze nierozwiązany problem badawczy. Dodatkowo oznaczone są zadania wymagające znajomości matematyki na poziomie wyższym.
Przeważajaca ilość przykładów w książkach posługuje się archaicznym już językiem zwanym MIXAL (MIX Assembly Language), który jest uruchamiany na hipotetycznym komputerze MIX. Aktualnie MIX jest zastępowany przez MMIX, wersję maszyny RISC, która zostanie wprowadzona w ostatecznym - czwartym - wydaniu Sztuki programowania. Pewni ludzie czytelnicy są zakłopotani użyciem asemblera, jednak Knuth uważa to za konieczne oraz słuszne z kilku powodów, m. in. języki wysokiego poziomu nie dopuszczają przedstawienia szczegółów niskopoziomowych omawianych w książkach oraz wychodzą z mody mniej więcej co pięć lat. Istnieją darmowe emulatory MIX (GNU MDK), dostępne do pobrania w Internecie.
W 1999 miesięcznik naukowy American Scientist umieścił tę pracę na liście najlepszych dwunastu prac z dziedziny nauk przyrodniczych XX wieku, pośród dzieł m. in. Einsteina, Mandelbrota, Diraca, Neumanna, Wienera, Feynmana.
Sławna oferta Knutha przyznania nagrody pieniężnej w wysokości 2 dolarów 56 centów za wszelkie znalezione błędy typograficzne, techniczne czy historyczne spowodowała, że praca jest w wysokim stopniu dopracowana oraz stanowi fundament programistyczny długo po jej pierwszej edycji. W świecie informatyków mówi się, że bardzo mała liczba czeków wystawionych przez Knutha była zrealizowana.
Edycje polskojęzyczne
- Tom I: Algorytmy podstawowe. (Wydawnictwa Naukowo-Techniczne, Warszawa 2002), xxiv+679 s. ISBN 83-204-2540-9
- Tom I, Zeszyt 1: MMIX - Komputer na nowe tysiąclecie. (Wydawnictwa Naukowo-Techniczne, Warszawa 2008), 148 s. ISBN 978-83-204-3373-9
- Tom II: Algorytmy seminumeryczne. (Wydawnictwa Naukowo-Techniczne, Warszawa 2002), xviii+820 s. ISBN 83-204-2553-0
- Tom III: Sortowanie oraz wyszukiwanie. (Wydawnictwa Naukowo-Techniczne, Warszawa 2002), xviii+838 s. ISBN 83-204-2554-9
- Tom IV, Zeszyt 2: Generowanie wszystkich krotek oraz permutacji. (Wydawnictwa Naukowo-Techniczne, Warszawa 2007), 138 s. ISBN 978-83-204-3293-0
Dostępne jest wydanie zbiorcze, trzytomowe - ISBN 83-204-2539-5
Powyższe wydania są tłumaczeniem najnowszych, trzeciej edycji (Tom I oraz II) oraz drugiej (Tom III) wydania anglojęzycznego. Tom I przetłumaczył Grzegorz Jakacki, Tom II - Adam Malinowski, Tom III - Krzysztof Diks oraz Adam Malinowski.
Edycje anglojęzyczne
- Volume 1: Fundamental Algorithms. Third Edition (Reading, Massachusetts: Addison-Wesley, 1997), xx+650 s. ISBN 0-201-89683-4
- Volume 1, Fascicle 1: MMIX -- A RISC Computer for the New Millennium. (Addison-Wesley, 14 lutego 2005) ISBN 0-201-85392-2 (zawarte będzie w czwartej edycji tomu I)
- Volume 2: Seminumerical Algorithms. Third Edition (Reading, Massachusetts: Addison-Wesley, 1997), xiv+762 s. ISBN 0-201-89684-2
- Volume 3: Sorting and Searching. Second Edition (Reading, Massachusetts: Addison-Wesley, 1998), xiv+780 s. + wkładka. ISBN 0-201-89685-0
- Volume 4, Fascicle 0: Introduction to Combinatorial Algorithms and Boolean Functions (Addison-Wesley Professional, 28 kwietnia 2008) vi+240 s. ISBN 0-321-53496-4
- Volume 4, Fascicle 1: Bitwise tricks and techniques and Binary Decision Diagrams (Addison-Wesley Professional, 27 marca 2009) 272 s. ISBN 0-321-58050-8
- Volume 4, Fascicle 2: Generating All Tuples and Permutations, (Addison-Wesley, 14 lutego 2005) v+127 s. ISBN 0-201-85393-0
- Volume 4, Fascicle 3: Generating All Combinations and Partitions. (Addison-Wesley, 26 lipca 2005) vi+150 s. ISBN 0-201-85394-9
- Volume 4, Fascicle 4: Generating all Trees -- History of Combinatorial Generation, (Addison-Wesley, 6 lutego 2006) vi+120 s. ISBN 0-321-33570-8
Linki zewnętrzne