Dlaczego Donald Knuth pisze TAOCP przy użyciu języka asemblera?
20
Nie nienawidzę używać języka asemblera, ponieważ napisałem trochę na moim kursie. Ale oczywiście w asemblerze brakuje abstrakcji, musisz zwracać większą uwagę na szczegóły.
Czy język asemblera jest naprawdę niezbędny do pisania TAOCP?
@Blrfl Nie wierzę w diabła. (Wierzę jednak w szczegóły ... dreszcz )
Jimmy Hoffa
3
Pierwszy tom TAOCP został opublikowany w 1968 roku. Chociaż z pewnością istniały języki wyższego poziomu, asembler odręczny był wtedy znacznie ważniejszy, a zasoby obliczeniowe na komputerach mainframe w tamtym czasie mogły być tego samego rzędu, co niektóre 8-bitowe mikroskopy z lat 80. Knuth również kiedyś dość poważnie argumentował za utrzymaniem goto, ponieważ niektóre algorytmy nie mogły zostać napisane przy użyciu zagnieżdżonych struktur sterowania bez pewnej nieefektywności. W rzeczywistości nie opowiadał się za przedwczesną optymalizacją nawet wtedy IIRC, chciał tylko, aby opcja była dostępna, gdy potrzebna była optymalizacja.
Steve314,
3
@ JimmyHoffa: Oh, cóż, w twoim przypadku szczegóły są tam, gdzie jest de Ville .
Blrfl 26.04.13
1
Jerry Coffinowi udało się zrobić to, co chciałem, sprawdził w źródle ;-). Zajrzałem do rozdziałów, w których przedstawiono MIX i MIXAL, w których nie znalazłem takich stwierdzeń ... może kiedyś powinienem otrzymać kopię elektroniczną. W każdym razie myślę, że tag odpowiedzi byłby bardziej odpowiedni dla odpowiedzi Jerry'ego w tym przypadku.
Thomas
Odpowiedzi:
22
Używa nie tylko MIXAL, swojego języka asemblera dla MIX, ale także MIX, model dla prostego komputera (takiego jak ten, który był używany w latach sześćdziesiątych). Jest to model nauczania, dzięki któremu jest on w pewnym stopniu niezależny od rozwoju w tej dziedzinie.
Gdyby użył innego języka programowania (który, nawiasem mówiąc, uważasz, że byłby odpowiedni?), Powiedzmy NPL (fajny język programowania), musiałby porzucić pomysł użycia MIXa lub wprowadzić kompilator jakiegoś wybranego języka komputerowego (co jest znacznie bardziej złożoną rzeczą niż ta, z którą ma do czynienia w tomie 1). W ten sposób nie stałby się TAOCP, ale TAONPLP. Pierwszy jest niezależny od takiego wyboru iz tego powodu jest ponadczasowy w taki sposób, że niewiele książek o programowaniu będzie kiedykolwiek. Drugi prawdopodobnie zostanie już zapomniany ...
Ponadto, dopóki komputery działają w zasadzie tak, jak działa jego MIX, dobrze jest wziąć to pod uwagę, jeśli naprawdę chcesz nauczyć się z nimi pracować.
Zauważ, że „Techniki kompilatora” jest oficjalnie tematem przewidywanego tomu 7. Może się to zdarzyć, ale myślę, że wszyscy cieszą się, że Knuth nie czekał, aż będzie miał kompilatora do publikacji.
Kilian Foth,
@KilianFoth tak wiem. Ale spodziewałbym się, że w takiej książce będą używane sztuczne języki programowania. Prawdopodobnie celowanie w MMIX (drugi M nie jest komputerem opartym na literówce :-). I ETA vol. 5 to 2020 ...
Thomas
56
Wy, młodzi bicze, czasem mnie zadziwiacie. Zbyt często nie masz pojęcia, że coś się stało przed rozpoczęciem szkoły. (Mam ten sam problem. Dużo czasu zajęło mi zrozumienie, że 15 lat to tak naprawdę bardzo krótki czas, z dorosłego punktu widzenia. To mniej więcej czas od Hiroszimy do kubańskiego kryzysu rakietowego. Dla mnie II wojna światowa jest po prostu historia, ale mój ojciec walczył w niej, a moja matka była w tym czasie w gimnazjum.)
TAOCP, vol. 1, „Algorytmy fundamentalne”, 1. wydanie, po raz pierwszy wydrukowano w 1968 r. To jest 45 lat temu. Knuth zaczął planować serial już wcześniej.
Dla porównania: Intel 8086 pojawił się po raz pierwszy w 1978 roku, dziesięć lat później. Język PASCAL pojawił się po raz pierwszy w 1971 roku; książka Jensen & Wirth, o drugiej wersji języka, ukazała się w 1974 roku. Początkowy rozwój C to 1969–1973: K&R opublikowano w 1978 roku.
Knuth zamierzał, aby serial objął pole. Ustawił styl, TO, aby był przydatny dla praktykujących, TO. Nigdy nie spodziewał się, że serial ten stanie się dosłownie dziełem jego życia lub jego pisaniem obejmującym prawdopodobnie ponad pół wieku, kiedy w końcu skończy.
Język asemblerowy nie jest dziś tak krytyczny jak wtedy, ale nadal jest o wiele ważniejszy niż ludzie w Javie / C ++ / JavaScript / Python / Perl, w których wszyscy chcielibyście wierzyć.
Knuth zaimplementował kompilator ALGOL w 1960 roku, a ALGOL miał być odpowiedni do publikowania algorytmów, więc nie sądzę, że to naprawdę odpowiada na pytanie.
Peter Taylor
10
Naprawdę nie jestem przekonany, że powodem była dostępność czasu. LISP był dostępny, jeśli chciał, aby miał wysoki poziom abstrakcji, tak jak matematyka. Myślę, że poszedł na zgromadzenie z powodu pierwszego słowa tytułu; Fundamentalny. Nic nie jest bardziej fundamentalne dla algorytmów niż instrukcje krok po kroku dla prostej głupiej maszyny; zmusza cię to do całkowitego złamania algorytmu zamiast do rozumowania go na wysokim poziomie, co nie było jego celem w książce.
Jimmy Hoffa
1
Właśnie dlatego moja szkoła zaoferowała klasę komputerów historycznych, w której można zaprogramować Altair i kilka PDP.
rig
@Rig - poważnie? Teraz czuję się stary. Chociaż nie jest tak stary, jak wyjaśnianie HPGL nowemu pracownikowi i odkrycie, że nigdy nie widzieli ani nie słyszeli o ploterze!
Martin Beckett,
6
+1 ze względu na zabawny rant, a także istotne informacje.
luser droog
43
Knuth omawia swoje rozumowanie we Wstępie. Przytoczę tylko kilka drobiazgów:
... Musiałem zdecydować, czy użyć języka algebraicznego, takiego jak ALGOL lub FORTRAN, czy też użyć do tego celu języka zorientowanego maszynowo. Być może wielu dzisiejszych ekspertów komputerowych nie zgodzi się z moją decyzją o użyciu języka maszynowego, ale przekonałem się, że był to zdecydowanie właściwy wybór z następujących powodów:
Języki algebraiczne są bardziej odpowiednie dla problemów numerycznych niż rozważane tutaj problemy nieliczbowe. [...]
... Pisząc w języku zorientowanym maszynowo, programiści będą mieli tendencję do używania znacznie bardziej wydajnej metody; jest znacznie bliżej rzeczywistości.
Programy, których potrzebujemy, z kilkoma wyjątkami, są raczej krótkie ...
Osoba, która bardziej niż przypadkowo interesuje się komputerami, powinna być dobrze przeszkolona w języku maszynowym ...
W każdym razie niezbędny byłby jakiś język maszynowy ...
Chociaż nie wskazuje tego bezpośrednio, myślę, że jego wzmianka o ALGOL i FORTRAN wskazuje na inny problem, którego unikał, który może być jeszcze ważniejszy. Załóżmy, że wybrał Algol (i tak lepiej nadaje się do programów nienumerycznych niż Fortran). Sądzę, że Algol byłby prawdopodobnie bardziej obcy dla większości dzisiejszych programistów niż wybrany przez niego język asemblera.
W trzeciej edycji przeprojektował MIX, aby lepiej pasował do nowoczesnych procesorów i musiał przepisać kod. Sądzę jednak, że gdyby użył języka wyższego poziomu, przepisywanie byłoby znacznie większe - i wszystkie powody, które podał, pozostałyby również.
Ponadto kompilatory były w tamtych czasach zazwyczaj drogie. Wiele lat po ukazaniu się numeru 1 TAOCP przeprowadziłem wywiad w miejscu, w którym nie chciałem wydawać pieniędzy na jeden (i, szczerze mówiąc, asembler IBM 370 nie był taki zły), a moja żona pracowała w sklepie z językiem asemblera kilka lat później.
Wielu czytelników bez wątpienia myśli: `` Dlaczego Knuth zastępuje MIX inną maszyną zamiast po prostu trzymać się języka programowania wysokiego poziomu? W dzisiejszych czasach mało kto używa asemblerów.
Tacy ludzie mają prawo do swoich opinii i nie muszą zawracać sobie głowy czytaniem części maszynowych moich książek. Ale powody języka maszynowego, które podałem we wstępie do tomu 1, napisanego na początku lat 60., pozostają aktualne:
Jednym z głównych celów moich książek jest pokazanie, w jaki sposób konstrukcje wysokiego poziomu są faktycznie wdrażane w maszynach, a nie tylko pokazanie, w jaki sposób są stosowane. Wyjaśniam powiązanie koroutynowe, struktury drzew, generowanie liczb losowych, arytmetykę o wysokiej precyzji, konwersję podstawników, pakowanie danych, wyszukiwanie kombinatoryczne, rekurencję itp., Od podstaw.
Programy potrzebne w moich książkach są na ogół tak krótkie, że ich główne punkty można łatwo uchwycić.
Ludzie, którzy bardziej niż przypadkowo interesują się komputerami, powinni mieć przynajmniej pojęcie o tym, jaki jest podstawowy sprzęt. W przeciwnym razie programy, które piszą, będą dość dziwne.
Język maszynowy jest w każdym razie niezbędny, ponieważ jest to wynik wielu programów, które opisuję.
Wyrażenie podstawowych metod, takich jak algorytmy sortowania i wyszukiwania w języku maszynowym, umożliwia przeprowadzenie znaczących badań wpływu pamięci podręcznej i rozmiaru pamięci RAM oraz innych cech sprzętowych (szybkość pamięci, potok, wiele problemów, bufory przeglądowe, rozmiar bloków pamięci podręcznej, itp.) przy porównywaniu różnych schematów.
Co więcej, jeśli użyłem języka wysokiego poziomu, jaki to powinien być język? W latach 60. prawdopodobnie wybrałbym Algola W.; w latach 70. musiałbym przepisać moje książki przy użyciu Pascala; w latach 80. z pewnością zmieniłbym wszystko na C; w latach 90. musiałbym przejść na C ++, a potem prawdopodobnie na Javę. W latach 2000. kolejnym językiem będzie bez wątpienia de rigueur. Nie mogę pozwolić sobie na czas na przepisywanie moich książek, gdy języki wchodzą i wychodzą z mody; języki nie są przedmiotem moich książek, chodzi raczej o to, co możesz zrobić w swoim ulubionym języku. Moje książki koncentrują się na ponadczasowych prawdach.
Dlatego będę nadal używać języka angielskiego jako języka wysokiego poziomu w TAOCP i będę nadal używać języka niskiego poziomu, aby wskazać, w jaki sposób maszyny faktycznie obliczają. Czytelnicy, którzy chcą tylko zobaczyć algorytmy, które są już spakowane w formie wtyczki, używając modnego języka, powinni kupować książki innych osób.
Dobrą wiadomością jest to, że programowanie maszyn RISC jest przyjemne i proste, gdy maszyna RISC ma ładny, czysty wygląd. Nie muszę się więc zastanawiać nad tajemniczymi, drobiazgowymi szczegółami, które odwracają uwagę od głównych punktów. Pod tym względem MMIX będzie znacznie lepszy niż MIX.
Odpowiedzi:
Używa nie tylko MIXAL, swojego języka asemblera dla MIX, ale także MIX, model dla prostego komputera (takiego jak ten, który był używany w latach sześćdziesiątych). Jest to model nauczania, dzięki któremu jest on w pewnym stopniu niezależny od rozwoju w tej dziedzinie.
Gdyby użył innego języka programowania (który, nawiasem mówiąc, uważasz, że byłby odpowiedni?), Powiedzmy NPL (fajny język programowania), musiałby porzucić pomysł użycia MIXa lub wprowadzić kompilator jakiegoś wybranego języka komputerowego (co jest znacznie bardziej złożoną rzeczą niż ta, z którą ma do czynienia w tomie 1). W ten sposób nie stałby się TAOCP, ale TAONPLP. Pierwszy jest niezależny od takiego wyboru iz tego powodu jest ponadczasowy w taki sposób, że niewiele książek o programowaniu będzie kiedykolwiek. Drugi prawdopodobnie zostanie już zapomniany ...
Ponadto, dopóki komputery działają w zasadzie tak, jak działa jego MIX, dobrze jest wziąć to pod uwagę, jeśli naprawdę chcesz nauczyć się z nimi pracować.
źródło
Wy, młodzi bicze, czasem mnie zadziwiacie. Zbyt często nie masz pojęcia, że coś się stało przed rozpoczęciem szkoły. (Mam ten sam problem. Dużo czasu zajęło mi zrozumienie, że 15 lat to tak naprawdę bardzo krótki czas, z dorosłego punktu widzenia. To mniej więcej czas od Hiroszimy do kubańskiego kryzysu rakietowego. Dla mnie II wojna światowa jest po prostu historia, ale mój ojciec walczył w niej, a moja matka była w tym czasie w gimnazjum.)
TAOCP, vol. 1, „Algorytmy fundamentalne”, 1. wydanie, po raz pierwszy wydrukowano w 1968 r. To jest 45 lat temu. Knuth zaczął planować serial już wcześniej.
Dla porównania: Intel 8086 pojawił się po raz pierwszy w 1978 roku, dziesięć lat później. Język PASCAL pojawił się po raz pierwszy w 1971 roku; książka Jensen & Wirth, o drugiej wersji języka, ukazała się w 1974 roku. Początkowy rozwój C to 1969–1973: K&R opublikowano w 1978 roku.
Knuth zamierzał, aby serial objął pole. Ustawił styl, TO, aby był przydatny dla praktykujących, TO. Nigdy nie spodziewał się, że serial ten stanie się dosłownie dziełem jego życia lub jego pisaniem obejmującym prawdopodobnie ponad pół wieku, kiedy w końcu skończy.
Język asemblerowy nie jest dziś tak krytyczny jak wtedy, ale nadal jest o wiele ważniejszy niż ludzie w Javie / C ++ / JavaScript / Python / Perl, w których wszyscy chcielibyście wierzyć.
A teraz Zejdź z mojego prawnika!
źródło
Knuth omawia swoje rozumowanie we Wstępie. Przytoczę tylko kilka drobiazgów:
Chociaż nie wskazuje tego bezpośrednio, myślę, że jego wzmianka o ALGOL i FORTRAN wskazuje na inny problem, którego unikał, który może być jeszcze ważniejszy. Załóżmy, że wybrał Algol (i tak lepiej nadaje się do programów nienumerycznych niż Fortran). Sądzę, że Algol byłby prawdopodobnie bardziej obcy dla większości dzisiejszych programistów niż wybrany przez niego język asemblera.
W trzeciej edycji przeprojektował MIX, aby lepiej pasował do nowoczesnych procesorów i musiał przepisać kod. Sądzę jednak, że gdyby użył języka wyższego poziomu, przepisywanie byłoby znacznie większe - i wszystkie powody, które podał, pozostałyby również.
źródło
Knuth również zaktualizował swoje uzasadnienie :
źródło