¿Por qué Donald Knuth escribe TAOCP usando lenguaje ensamblador?

20

No odio usar lenguaje ensamblador, ya que he escrito algunos en mi curso de sistema operativo. Pero obviamente, el lenguaje ensamblador carece de abstracción, hay que prestar más atención a los detalles.

¿Es realmente esencial el lenguaje ensamblador para escribir TAOCP?

Lucas Li
fuente
66
Los detalles son donde está el diablo.
Blrfl
55
@Blrfl No creo en el diablo. (Aunque creo en los detalles ... escalofríos )
Jimmy Hoffa
3
El primer volumen de TAOCP se publicó en 1968. Aunque los lenguajes de nivel superior ciertamente existían, el ensamblador escrito a mano era mucho más importante entonces, y los recursos informáticos en mainframes en ese entonces podrían ser del mismo orden que algunos micros de 8 bits de la década de 1980. Knuth también argumentó una vez bastante en serio por mantener goto porque algunos algoritmos no se podían escribir usando estructuras de flujo de control anidadas sin alguna ineficiencia. En realidad, no abogó por la optimización prematura incluso en el IIRC, solo quería la opción disponible para cuando la optimización fuera necesaria.
Steve314
3
@JimmyHoffa: Oh, bueno, en tu caso, los detalles están donde está el de Ville .
Blrfl
1
Jerry Coffin logró hacer lo que quería hacer, lo buscó en la fuente ;-). Miré en los capítulos donde se presentan MIX y MIXAL, donde no encontré tales declaraciones ... tal vez debería obtener una copia electrónica algún día. De todos modos, creo que la etiqueta de respuesta sería más apropiada para la respuesta de Jerry en este caso.
Thomas

Respuestas:

22

No solo usa MIXAL, su lenguaje ensamblador para MIX, sino también MIX, un modelo para una computadora simple (como una que se usaba en los años sesenta). Este es un modelo de enseñanza con el que es, hasta cierto punto, independiente del desarrollo en el campo.

Si hubiera usado otro lenguaje de programación (¿cuál, por cierto, crees que hubiera sido adecuado?), Digamos NPL (ingenioso lenguaje de programación), habría tenido que abandonar la idea de usar MIX o introducir un compilador de algún lenguaje de computadora de elección (que es algo mucho más complejo de lo que está tratando en el Vol. 1). De esa manera no se habría convertido en TAOCP sino TAONPLP. El primero es independiente de tal elección y, por esta razón, es atemporal de una manera que pocos libros sobre programación alguna vez serán. El segundo probablemente ya estaría olvidado ...

Además, siempre que las computadoras funcionen, en principio, de la forma en que lo hace su MIX, es bueno tener eso en cuenta si está realmente interesado en aprender a trabajar con ellas.

Thomas
fuente
Tenga en cuenta que "Técnicas de compilación" es oficialmente el tema del volumen proyectado 7. Todavía podría suceder, pero creo que todos están contentos de que Knuth no haya esperado hasta que tuviera un compilador para comenzar a publicar.
Kilian Foth
@KilianFoth sí, lo sé. Pero esperaría que se usen lenguajes de programación artificiales en ese libro. Probablemente dirigido a un MMIX (la segunda M no es un error tipográfico :-). Y ETA de vol. 5 es 2020 ...
Thomas
56

Ustedes jóvenes látigos me sorprenden a veces. Con demasiada frecuencia no tienes idea de que algo sucedió antes de comenzar la escuela. (Tengo el mismo problema. Me tomó mucho tiempo comprender que 15 años fueron en realidad muy poco tiempo, desde el punto de vista de un adulto. Eso es aproximadamente el lapso desde Hiroshima hasta la crisis de los misiles cubanos. Para mí, la Segunda Guerra Mundial es solo historia, pero mi padre luchó en él, y mi madre estaba en la secundaria durante el mismo).

TAOCP, vol. 1, "Algoritmos fundamentales", primera edición, se imprimió por primera vez en 1968. Eso fue hace 45 años. Knuth comenzó a planificar la serie mucho antes de eso.

Como referencia: Intel 8086 apareció por primera vez en 1978, diez años después. El lenguaje PASCAL apareció por primera vez en 1971; el libro de Jensen & Wirth, sobre la segunda versión del lenguaje, salió en 1974. El desarrollo inicial de C fue 1969-1973: K&R se publicó en 1978.

Knuth pretendía que la serie cubriera el campo. Estableció el estilo, ENTONCES, para ser útil para los practicantes ENTONCES. Nunca esperó que esa serie se convirtiera literalmente en el trabajo de su vida, o que su escritura abarcara lo que probablemente será más de medio siglo cuando finalmente termine.

Podría decirse que el lenguaje ensamblador no es tan crítico hoy como lo era entonces, pero sigue siendo mucho más importante de lo que los expertos en Java / C ++ / Javascript / Python / Perl quisieran que todos creyeran.

¡Ahora sal de mi césped!

John R. Strohm
fuente
Knuth implementó un compilador ALGOL en 1960, y ALGOL estaba destinado a ser adecuado para publicar algoritmos, por lo que no creo que esto realmente responda la pregunta.
Peter Taylor
10
Realmente no estoy convencido de que el razonamiento fuera la disponibilidad del tiempo. LISP estaba disponible si quería que tuviera un alto nivel de abstracción como las matemáticas. Creo que fue con la asamblea por la primera palabra del título; Fundamental. Nada es más fundamental para los algoritmos que las instrucciones paso a paso para una simple máquina estúpida; te obliga a romper el algoritmo completamente en lugar de razonar sobre él a un alto nivel, lo cual no era su propósito en el libro.
Jimmy Hoffa
1
Es por eso que mi escuela ofreció una clase de computación histórica en la que puedes programar un Altair y algunos PDP.
Plataforma
@Rig: ¿en serio? Ahora me siento viejo. ¡Aunque no es tan viejo como explicar HPGL a un nuevo empleado y descubrir que nunca habían visto ni oído hablar de un trazador de plumas!
Martin Beckett el
66
+1 debido a la graciosa diversión así como a la información relevante.
luser droog
43

Knuth discute su razonamiento en el Prefacio. Citaré solo algunas partes:

... Necesitaba decidir si usar un lenguaje algebraico como ALGOL o FORTRAN, o usar un lenguaje orientado a máquina para este propósito. Quizás muchos de los expertos en informática de hoy no estarán de acuerdo con mi decisión de utilizar un lenguaje orientado a máquinas, pero me he convencido de que definitivamente era la elección correcta, por las siguientes razones:

  1. Los lenguajes algebraicos son más adecuados para problemas numéricos que los problemas no numéricos considerados aquí. [...]
  2. ... Al escribir en un lenguaje orientado a la máquina, el programador tenderá a utilizar un método mucho más eficiente; Está mucho más cerca de la realidad.
  3. Los programas que requerimos son, con pocas excepciones, todos bastante cortos ...
  4. Una persona que está más que casualmente interesada en las computadoras debe estar bien educada en lenguaje de máquina ...
  5. Algún lenguaje de máquina sería necesario de todos modos ...

Aunque no lo señala directamente, creo que su mención de ALGOL y FORTRAN apunta a otro problema que evitó que puede ser aún más importante. Supongamos que eligió Algol (claramente más adecuado para programas no numéricos que Fortran de todos modos). Yo diría que Algol probablemente sería aún más extraño para la mayoría de los programadores de hoy que el lenguaje ensamblador que eligió.

Para la tercera edición, rediseñó el MIX para que se ajustara más a los procesadores modernos, y tuvo que reescribir el código. Sin embargo, diría que si hubiera usado un lenguaje de nivel superior, la reescritura habría sido sustancialmente mayor, y todas las razones que dio seguirían siendo así.

Jerry Coffin
fuente
Además, los compiladores eran típicamente caros en esos días. Años después de que saliera el volumen 1 de TAOCP, me entrevisté en un lugar que no quería gastar el dinero en uno (y, para ser honesto, el ensamblador de IBM 370 no era tan malo), y mi esposa trabajaba en una tienda de lenguaje ensamblador bastantes años después de eso.
David Thornley
2
¿Cómo puedo votar el punto 4?
Javier
55
@Javier consigue una copia y escribe +1 en el margen.
luser droog
29

Knuth también ha actualizado su lógica :

¿Por qué tener un lenguaje de máquina?

Sin duda, muchos lectores piensan: `` ¿Por qué Knuth reemplaza MIX por otra máquina en lugar de limitarse a un lenguaje de programación de alto nivel? Casi nadie usa ensambladores en estos días ''.

Dichas personas tienen derecho a sus opiniones, y no necesitan molestarse en leer las partes de mis libros en lenguaje máquina. Pero las razones para el lenguaje de máquina que di en el prefacio del Volumen 1, escrito a principios de la década de 1960, siguen siendo válidas hoy en día:

  • Uno de los objetivos principales de mis libros es mostrar cómo se implementan realmente las construcciones de alto nivel en las máquinas, no simplemente mostrar cómo se aplican. Explico el enlace de rutina, las estructuras de árbol, la generación de números aleatorios, la aritmética de alta precisión, la conversión de radix, el empaque de datos, la búsqueda combinatoria, la recursividad, etc., desde cero.
  • Los programas necesarios en mis libros son generalmente tan cortos que sus puntos principales se pueden entender fácilmente.
  • Las personas que están más que casualmente interesadas en las computadoras deberían tener al menos una idea de cómo es el hardware subyacente. De lo contrario, los programas que escriben serán bastante extraños.
  • El lenguaje de máquina es necesario en cualquier caso, como resultado de muchos de los programas de software que describo.
  • Expresar métodos básicos como algoritmos para ordenar y buscar en lenguaje máquina hace posible realizar estudios significativos de los efectos del tamaño de la memoria caché y la RAM y otras características del hardware (velocidad de memoria, canalización, problema múltiple, buffers laterales, el tamaño de los bloques de memoria caché, etc.) al comparar diferentes esquemas.

Además, si utilicé un lenguaje de alto nivel, ¿qué idioma debería ser? En la década de 1960 probablemente habría elegido Algol W; en la década de 1970, habría tenido que reescribir mis libros usando Pascal; en la década de 1980, seguramente habría cambiado todo a C; en la década de 1990, habría tenido que cambiar a C ++ y luego probablemente a Java. En la década de 2000, sin duda, otro idioma será de rigor. No puedo darme el tiempo para reescribir mis libros a medida que los idiomas pasan de moda; los idiomas no son el punto de mis libros, el punto es más bien lo que puedes hacer en tu idioma favorito. Mis libros se centran en verdades eternas.

Por lo tanto, continuaré usando el inglés como idioma de alto nivel en TAOCP, y continuaré usando un idioma de bajo nivel para indicar cómo las máquinas realmente calculan. Los lectores que solo quieran ver algoritmos que ya están empaquetados de forma complementaria, utilizando un lenguaje moderno, deben comprar los libros de otras personas.

La buena noticia es que la programación para máquinas RISC es agradable y simple, cuando la máquina RISC tiene un diseño limpio y agradable. Así que no necesito detenerme en pequeños detalles arcanos y complicados que distraen de los puntos principales. A este respecto, MMIX será significativamente mejor que MIX.

Alan Shutko
fuente