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?
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?
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ć.
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!
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ż.
Knuth również zaktualizował swoje uzasadnienie :
Dlaczego mam język maszynowy?
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.