Я не ненавижу использование ассемблера, так как я написал кое-что в моем курсе os. Но очевидно, что ассемблеру не хватает абстракции, вам нужно больше внимания уделять деталям.
Является ли ассемблер действительно важным для написания TAOCP?
Я не ненавижу использование ассемблера, так как я написал кое-что в моем курсе os. Но очевидно, что ассемблеру не хватает абстракции, вам нужно больше внимания уделять деталям.
Является ли ассемблер действительно важным для написания TAOCP?
Ответы:
Он не только использует MIXAL, его язык ассемблера для MIX, но также и MIX, модель для простого компьютера (например, модель, которая использовалась в шестидесятых годах). Это модель обучения, с которой он в какой-то степени не зависит от развития в данной области.
Если бы он использовал другой язык программирования (какой, кстати, вам подойдет?), Скажем NPL (отличный язык программирования), ему пришлось бы либо отказаться от идеи использования MIX, либо ввести компилятор какого-либо компьютерного языка по выбору (что гораздо сложнее, чем то, с чем он имеет дело в томе 1). Таким образом, он стал бы не TAOCP, а TAONPLP. Первый из них не зависит от такого выбора, и по этой причине вечен, как мало когда-либо книг о программировании. Второй, вероятно, уже будет забыт ...
Кроме того, если компьютеры работают в принципе так же, как его MIX, это хорошо, если вы действительно заинтересованы в том, чтобы научиться работать с ними.
Вы, молодые болтуньи, иногда поражаете меня. Вы слишком часто не подозреваете, что что-то случилось до того, как вы пошли в школу. (У меня та же проблема. Мне потребовалось много времени, чтобы понять, что 15 лет были очень короткими с точки зрения взрослого. Это примерно расстояние от Хиросимы до кубинского ракетного кризиса. Для меня Вторая мировая война - это просто история, но мой отец боролся в этом, и моя мать была в младших классах во время этого.)
TAOCP, vol. 1, «Фундаментальные алгоритмы», 1-е издание, впервые было напечатано в 1968 году. Это 45 лет назад. Кнут начал планировать сериал задолго до этого.
Для справки: Intel 8086 впервые появился в 1978 году, десять лет спустя. Язык PASCAL впервые появился в 1971 году; Книга Дженсена и Вирта о второй версии языка вышла в 1974 году. Первоначальная разработка C была в 1969-1973 годах: K & R была опубликована в 1978 году.
Кнут задумал сериал покрыть поле. Затем он установил стиль, чтобы быть полезным для практикующих ТОГДА. Он никогда не ожидал, что этот сериал станет буквально произведением его жизни, или его сочинение охватит то, что, вероятно, будет более чем через полвека, когда он наконец закончит.
Язык ассемблера сегодня, возможно, не так критичен, как тогда, но он все же гораздо важнее, чем хотелось бы всем вам верить Java / C ++ / Javascript / Python / Perl.
Теперь выйди из моего закона!
Кнут обсуждает свои рассуждения в предисловии. Я процитирую только несколько кусочков:
... Мне нужно было решить, использовать ли алгебраический язык, такой как ALGOL или FORTRAN, или использовать машинно-ориентированный язык для этой цели. Возможно, многие из сегодняшних компьютерных экспертов не согласятся с моим решением использовать машинно-ориентированный язык, но я убедился, что это был определенно правильный выбор по следующим причинам:
- Алгебраические языки больше подходят для численных задач, чем для нечисленных задач, рассматриваемых здесь. [...]
- ... При написании на машинно-ориентированном языке программист будет стремиться использовать гораздо более эффективный метод; это намного ближе к реальности.
- Программы, которые нам нужны, за редким исключением, все довольно короткие ...
- Человек, который более чем случайно интересуется компьютерами, должен хорошо изучать машинный язык ...
- Некоторый машинный язык был бы необходим в любом случае ...
Хотя он не указывает на это прямо, я думаю, что его упоминание об Алголе и Фортране указывает на другую проблему, которую он избежал, которая может быть даже более важной. Давайте предположим, что он выбрал Algol (в любом случае, он явно лучше подходит для нечисловых программ, чем Fortran). Я бы сказал, что Algol, вероятно, будет даже более чуждым большинству современных программистов, чем выбранный им язык ассемблера.
В третьем издании он перепроектировал MIX для более тесной совместимости с современными процессорами, и ему пришлось переписать код для него. Однако я бы сказал, что если бы он использовал язык более высокого уровня, переписывание было бы значительно больше - и все причины, которые он привел, также остались бы.
Кнут также обновил свое объяснение :
Почему машинный язык?
Многие читатели, несомненно, думают: «Почему Кнут заменяет MIX на другую машину вместо того, чтобы просто придерживаться языка программирования высокого уровня? В наши дни почти никто не пользуется ассемблерами ».
Такие люди имеют право на свое мнение, и им не нужно беспокоиться о прочтении частей моих книг на машинном языке. Но причины машинного языка, которые я привел в предисловии к тому 1, написанному в начале 1960-х годов, остаются в силе и сегодня:
- Одна из главных целей моих книг - показать, как на машинах реализованы высокоуровневые конструкции, а не просто показать, как они применяются. Я объясняю сопрограммную связь, древовидную структуру, генерацию случайных чисел, высокоточную арифметику, преобразование с помощью радиуса, упаковку данных, комбинаторный поиск, рекурсию и т. Д. С нуля.
- Программы, необходимые в моих книгах, как правило, настолько короткие, что их основные положения легко понять.
- Люди, которые более чем небрежно интересуются компьютерами, должны иметь хоть какое-то представление о том, на что похоже базовое оборудование. В противном случае программы, которые они пишут, будут довольно странными.
- Машинный язык необходим в любом случае, как вывод многих программ, которые я описываю.
- Выражение базовых методов, таких как алгоритмы сортировки и поиска на машинном языке, позволяет проводить содержательные исследования влияния размера кэша и ОЗУ и других характеристик оборудования (скорость памяти, конвейерная обработка, многократные выпуски, внешние буферы, размер блоков кэша, и т. д.) при сравнении разных схем.
Кроме того, если бы я использовал язык высокого уровня, каким языком он должен быть? В 1960-х годах я бы, вероятно, выбрал Algol W; в 1970-х мне пришлось бы переписывать свои книги, используя Паскаль; в 1980-х я наверняка изменил бы все на C; в 1990-х мне пришлось бы перейти на C ++, а затем, вероятно, на Java. В 2000-х, без сомнения, еще один язык будет de rigueur. Я не могу позволить себе переписать мои книги, поскольку языки входят и выходят из моды; языки - не главное в моих книгах, главное, что вы можете делать на своем любимом языке. Мои книги посвящены вечным истинам.
Поэтому я буду продолжать использовать английский в качестве языка высокого уровня в TAOCP, и я буду продолжать использовать язык низкого уровня, чтобы указать, как машины фактически вычисляют. Читатели, которые хотят видеть только алгоритмы, которые уже упакованы в подключаемый модуль, используя модный язык, должны покупать книги других людей.
Хорошей новостью является то, что программирование для машин RISC приятно и просто, когда машина RISC имеет красивый чистый дизайн. Поэтому мне не нужно останавливаться на таинственных мелочах, отвлекающих внимание от основных моментов. В этом отношении MMIX будет значительно лучше, чем MIX.