Почему Дональд Кнут пишет TAOCP на ассемблере?


20

Я не ненавижу использование ассемблера, так как я написал кое-что в моем курсе os. Но очевидно, что ассемблеру не хватает абстракции, вам нужно больше внимания уделять деталям.

Является ли ассемблер действительно важным для написания TAOCP?


6
Подробности в том, где дьявол.
Blrfl

5
@Blrfl Я не верю в дьявола. (Я верю в детали, хотя ... дрожать )
Джимми Хоффа

3
Первый том TAOCP был опубликован в 1968 году. Хотя языки более высокого уровня, безусловно, существовали, рукописный ассемблер был гораздо важнее, и тогда вычислительные ресурсы на мэйнфреймах могли быть того же порядка, что и некоторые 8-битные микросхемы 1980-х годов. Кнут также однажды довольно серьезно высказался за сохранение goto, потому что некоторые алгоритмы не могли бы быть написаны с использованием вложенных структур потока управления без некоторой неэффективности. Он даже не защищал преждевременную оптимизацию даже тогда, когда IIRC, он просто хотел, чтобы вариант был доступен, когда необходима оптимизация.
Steve314

3
@JimmyHoffa: О, хорошо, в вашем случае, детали, где де Виль .
Blrfl

1
Джерри Коффину удалось сделать то, что я хотел, он нашел это в источнике ;-). Я заглянул в главы, где представлены MIX и MIXAL, где я не нашел таких заявлений ... может быть, мне стоит однажды получить электронную копию. Во всяком случае, я думаю, что тег ответа будет более подходящим для ответа Джерри в этом случае.
Томас

Ответы:


22

Он не только использует MIXAL, его язык ассемблера для MIX, но также и MIX, модель для простого компьютера (например, модель, которая использовалась в шестидесятых годах). Это модель обучения, с которой он в какой-то степени не зависит от развития в данной области.

Если бы он использовал другой язык программирования (какой, кстати, вам подойдет?), Скажем NPL (отличный язык программирования), ему пришлось бы либо отказаться от идеи использования MIX, либо ввести компилятор какого-либо компьютерного языка по выбору (что гораздо сложнее, чем то, с чем он имеет дело в томе 1). Таким образом, он стал бы не TAOCP, а TAONPLP. Первый из них не зависит от такого выбора, и по этой причине вечен, как мало когда-либо книг о программировании. Второй, вероятно, уже будет забыт ...

Кроме того, если компьютеры работают в принципе так же, как его MIX, это хорошо, если вы действительно заинтересованы в том, чтобы научиться работать с ними.


Обратите внимание, что «методы компиляции» официально являются темой прогнозируемого тома 7. Это может все же произойти, но я думаю, что все рады, что Кнут не дождался, когда у него будет компилятор, чтобы начать публикацию.
Килиан Фот

@KilianFoth да, я знаю. Но я ожидаю, что искусственные языки программирования будут использоваться в такой книге. Вероятно, нацелена на MMIX (второй M - не компьютер, основанный на опечатках :-). И ЭТА том. 5 это 2020 ....
Томас

56

Вы, молодые болтуньи, иногда поражаете меня. Вы слишком часто не подозреваете, что что-то случилось до того, как вы пошли в школу. (У меня та же проблема. Мне потребовалось много времени, чтобы понять, что 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 в 1960 году, и ALGOL был предназначен для публикации алгоритмов, поэтому я не думаю, что это действительно отвечает на этот вопрос.
Питер Тейлор

10
Я действительно не уверен, что причина была в наличии времени. LISP был доступен, если он хотел, чтобы у него был высокий уровень абстракции, как у математики. Я думаю, что он пошел со сборкой из-за первого слова названия; Фундаментальная. Нет ничего более фундаментального для алгоритмов, чем пошаговые инструкции для простой глупой машины; это заставляет вас сломать алгоритм вниз полностью , а не рассуждать об этом на высоком уровне, что не было его целью в книге.
Джимми Хоффа

1
Вот почему моя школа предложила исторический компьютерный класс, где вы можете программировать Altair и некоторые PDP.
Рог

@Rig - серьезно? Теперь я чувствую себя старым. Хотя и не так стар, как объяснять HPGL новому наему и обнаруживать, что они никогда не видели и не слышали о ручном плоттере!
Мартин Беккет

6
+1 из-за забавной напыщенной речи и соответствующей информации.
luser droog

43

Кнут обсуждает свои рассуждения в предисловии. Я процитирую только несколько кусочков:

... Мне нужно было решить, использовать ли алгебраический язык, такой как ALGOL или FORTRAN, или использовать машинно-ориентированный язык для этой цели. Возможно, многие из сегодняшних компьютерных экспертов не согласятся с моим решением использовать машинно-ориентированный язык, но я убедился, что это был определенно правильный выбор по следующим причинам:

  1. Алгебраические языки больше подходят для численных задач, чем для нечисленных задач, рассматриваемых здесь. [...]
  2. ... При написании на машинно-ориентированном языке программист будет стремиться использовать гораздо более эффективный метод; это намного ближе к реальности.
  3. Программы, которые нам нужны, за редким исключением, все довольно короткие ...
  4. Человек, который более чем случайно интересуется компьютерами, должен хорошо изучать машинный язык ...
  5. Некоторый машинный язык был бы необходим в любом случае ...

Хотя он не указывает на это прямо, я думаю, что его упоминание об Алголе и Фортране указывает на другую проблему, которую он избежал, которая может быть даже более важной. Давайте предположим, что он выбрал Algol (в любом случае, он явно лучше подходит для нечисловых программ, чем Fortran). Я бы сказал, что Algol, вероятно, будет даже более чуждым большинству современных программистов, чем выбранный им язык ассемблера.

В третьем издании он перепроектировал MIX для более тесной совместимости с современными процессорами, и ему пришлось переписать код для него. Однако я бы сказал, что если бы он использовал язык более высокого уровня, переписывание было бы значительно больше - и все причины, которые он привел, также остались бы.


Кроме того, компиляторы обычно были дорогими в те дни. Спустя годы после выхода первого тома TAOCP я провел собеседование в месте, где не хотел тратить деньги на один (и, если честно, ассемблер IBM 370 был не так уж плох), а моя жена работала в магазине ассемблера через несколько лет после этого.
Дэвид Торнли

2
как я могу поднять пункт 4 ??
Хавьер

5
@Javier получите копию и напишите +1 на полях.
luser droog

29

Кнут также обновил свое объяснение :

Почему машинный язык?

Многие читатели, несомненно, думают: «Почему Кнут заменяет MIX на другую машину вместо того, чтобы просто придерживаться языка программирования высокого уровня? В наши дни почти никто не пользуется ассемблерами ».

Такие люди имеют право на свое мнение, и им не нужно беспокоиться о прочтении частей моих книг на машинном языке. Но причины машинного языка, которые я привел в предисловии к тому 1, написанному в начале 1960-х годов, остаются в силе и сегодня:

  • Одна из главных целей моих книг - показать, как на машинах реализованы высокоуровневые конструкции, а не просто показать, как они применяются. Я объясняю сопрограммную связь, древовидную структуру, генерацию случайных чисел, высокоточную арифметику, преобразование с помощью радиуса, упаковку данных, комбинаторный поиск, рекурсию и т. Д. С нуля.
  • Программы, необходимые в моих книгах, как правило, настолько короткие, что их основные положения легко понять.
  • Люди, которые более чем небрежно интересуются компьютерами, должны иметь хоть какое-то представление о том, на что похоже базовое оборудование. В противном случае программы, которые они пишут, будут довольно странными.
  • Машинный язык необходим в любом случае, как вывод многих программ, которые я описываю.
  • Выражение базовых методов, таких как алгоритмы сортировки и поиска на машинном языке, позволяет проводить содержательные исследования влияния размера кэша и ОЗУ и других характеристик оборудования (скорость памяти, конвейерная обработка, многократные выпуски, внешние буферы, размер блоков кэша, и т. д.) при сравнении разных схем.

Кроме того, если бы я использовал язык высокого уровня, каким языком он должен быть? В 1960-х годах я бы, вероятно, выбрал Algol W; в 1970-х мне пришлось бы переписывать свои книги, используя Паскаль; в 1980-х я наверняка изменил бы все на C; в 1990-х мне пришлось бы перейти на C ++, а затем, вероятно, на Java. В 2000-х, без сомнения, еще один язык будет de rigueur. Я не могу позволить себе переписать мои книги, поскольку языки входят и выходят из моды; языки - не главное в моих книгах, главное, что вы можете делать на своем любимом языке. Мои книги посвящены вечным истинам.

Поэтому я буду продолжать использовать английский в качестве языка высокого уровня в TAOCP, и я буду продолжать использовать язык низкого уровня, чтобы указать, как машины фактически вычисляют. Читатели, которые хотят видеть только алгоритмы, которые уже упакованы в подключаемый модуль, используя модный язык, должны покупать книги других людей.

Хорошей новостью является то, что программирование для машин RISC приятно и просто, когда машина RISC имеет красивый чистый дизайн. Поэтому мне не нужно останавливаться на таинственных мелочах, отвлекающих внимание от основных моментов. В этом отношении MMIX будет значительно лучше, чем MIX.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.