Perché Donald Knuth scrive TAOCP usando il linguaggio assembly?


20

Non odio usare il linguaggio assembly, dato che ne ho scritti alcuni nel mio corso OS. Ma ovviamente, il linguaggio assembly non ha astrazione, devi prestare maggiore attenzione ai dettagli.

Il linguaggio assembly è davvero essenziale per scrivere TAOCP?


6
I dettagli sono dove si trova il diavolo.
Blrfl,

5
@Blrfl Non credo nel diavolo. (Credo nei dettagli però ... brividi )
Jimmy Hoffa,

3
Il primo volume di TAOCP fu pubblicato nel 1968. Sebbene esistessero certamente linguaggi di livello superiore, allora l'assemblatore scritto a mano era molto più importante e le risorse di elaborazione su mainframe allora potevano essere dello stesso ordine di alcuni micro a 8 bit degli anni '80. Knuth una volta ha anche discusso abbastanza seriamente di mantenere goto perché alcuni algoritmi non potevano essere scritti usando strutture di flusso di controllo nidificate senza alcuna inefficienza. In realtà non sosteneva l'ottimizzazione prematura anche allora IIRC, voleva solo l'opzione disponibile per quando l'ottimizzazione era necessaria.
Steve314,

3
@JimmyHoffa: Oh, beh, nel tuo caso, i dettagli sono dove si trova il de Ville .
Blrfl,

1
Jerry Coffin è riuscito a fare quello che volevo fare, lo ha cercato nella fonte ;-). Ho guardato nei capitoli in cui sono stati introdotti MIX e MIXAL, dove non ho trovato tali dichiarazioni ... forse un giorno dovrei ottenere una copia elettronica. Comunque, penso che il tag di risposta sarebbe più appropriato per la risposta di Jerry in questo caso.
Thomas,

Risposte:


22

Utilizza non solo MIXAL, il suo linguaggio di assemblaggio per MIX, ma anche MIX, un modello per un semplice computer (come uno che è stato utilizzato negli anni sessanta). Questo è un modello di insegnamento con il quale è, in una certa misura, indipendente dallo sviluppo nel campo.

Se avesse usato un altro linguaggio di programmazione (quale, a proposito, pensi che sarebbe stato adatto?), Dire NPL (nifty linguaggio di programmazione), avrebbe dovuto abbandonare l'idea di usare MIX o introdurre un compilatore di alcuni linguaggi di scelta del computer (che è una cosa molto più complessa di quella con cui ha a che fare in Vol 1). In questo modo non sarebbe diventato TAOCP ma TAONPLP. Il primo è indipendente da tale scelta e, per questo motivo, senza tempo in un modo che pochi libri sulla programmazione saranno mai. Il secondo probabilmente sarebbe ormai dimenticato ...

Inoltre, fintanto che i computer funzionano in linea di principio come fa il suo MIX, è una buona cosa tenerne conto se si è veramente interessati a imparare a lavorare con loro.


Si noti che "Tecniche del compilatore" è ufficialmente l'argomento del volume proiettato 7. Potrebbe ancora succedere, ma penso che tutti siano contenti che Knuth non abbia aspettato che avesse un compilatore per iniziare a pubblicare.
Kilian Foth,

@KilianFoth si lo so. Ma mi aspetto che in un libro del genere vengano utilizzati linguaggi di programmazione artificiali. Probabilmente il targeting di un MMIX (il secondo M non è un errore di battitura :-) basato su computer. ETA di vol. 5 è il 2020 ....
Thomas,

56

A volte voi giovani whippersnapper mi stupite. Troppo spesso non hai idea che sia successo qualcosa prima di iniziare la scuola. (Ho lo stesso problema. Mi ci è voluto molto tempo per capire che 15 anni erano in realtà un tempo molto breve, da un punto di vista degli adulti. Questo è all'incirca l'arco di tempo tra Hiroshima e la crisi dei missili cubani. Per me, la Seconda Guerra Mondiale è solo storia, ma mio padre ci ha combattuto e mia madre era alle medie durante.)

TAOCP, vol. 1, "Algoritmi fondamentali", 1a edizione, è stato stampato per la prima volta nel 1968. 45 anni fa. Knuth ha iniziato a pianificare la serie molto prima di allora.

Per riferimento: Intel 8086 apparve per la prima volta nel 1978, dieci anni dopo. Il linguaggio PASCAL è apparso per la prima volta nel 1971; il libro di Jensen & Wirth, sulla seconda versione della lingua, uscì nel 1974. Lo sviluppo iniziale di C fu 1969-1973: K&R fu pubblicato nel 1978.

Knuth intendeva che la serie coprisse il campo. Ha impostato lo stile, POI, per essere utile ai praticanti POI. Non si era mai aspettato che quella serie diventasse letteralmente il lavoro della sua vita, o che la sua scrittura potesse abbracciare quello che probabilmente sarà ben oltre mezzo secolo quando alla fine finirà.

Il linguaggio assembly non è probabilmente così critico oggi come lo era allora, ma è ancora molto più importante di quanto i maveni Java / C ++ / Javascript / Python / Perl vorrebbero farvi credere.

Ora SCENDI IL MIO PRATO!


Knuth ha implementato un compilatore ALGOL nel 1960 e ALGOL doveva essere adatto alla pubblicazione di algoritmi, quindi non credo che questo risponda davvero alla domanda.
Peter Taylor,

10
Non sono davvero convinto che il ragionamento fosse la disponibilità del tempo. LISP era disponibile se voleva che avesse un alto livello di astrazione come la matematica. Penso che sia andato con l'assemblea a causa della prima parola del titolo; Fondamentale. Niente è più fondamentale per gli algoritmi delle istruzioni passo passo per una semplice macchina stupida; ti costringe a rompere completamente l'algoritmo piuttosto che a ragionare ad alto livello, che non era il suo scopo nel libro.
Jimmy Hoffa,

1
Questo è il motivo per cui la mia scuola ha offerto una lezione di informatica storica in cui puoi programmare un Altair e alcuni PDP.
Rig

@Rig - sul serio? Adesso mi sento vecchio. Sebbene non siano vecchi quanto spiegare HPGL a un nuovo assunto e scoprire che non avevano mai visto o sentito parlare di un plotter a penna!
Martin Beckett,

6
+1 a causa del rant divertente e informazioni pertinenti.
Luser droog

43

Knuth discute il suo ragionamento nella Prefazione. Citerò solo alcuni frammenti:

... Avevo bisogno di decidere se usare un linguaggio algebrico come ALGOL o FORTRAN, o usare un linguaggio orientato alla macchina per questo scopo. Forse molti degli esperti di computer di oggi non saranno d'accordo con la mia decisione di usare un linguaggio orientato alla macchina, ma sono convinto che sia stata sicuramente la scelta giusta, per i seguenti motivi:

  1. Le lingue algebriche sono più adatte ai problemi numerici rispetto ai problemi non numerici considerati qui. [...]
  2. ... Scrivendo in un linguaggio orientato alla macchina, il programmatore tenderà ad usare un metodo molto più efficiente; è molto più vicino alla realtà.
  3. I programmi che richiediamo sono, con poche eccezioni, tutti piuttosto brevi ...
  4. Una persona che è più che casualmente interessata ai computer dovrebbe essere ben istruita nel linguaggio automatico ...
  5. Un certo linguaggio macchina sarebbe comunque necessario ...

Anche se non lo indica direttamente, penso che la sua menzione di ALGOL e FORTRAN indichi un altro problema che ha evitato che potrebbe essere ancora più importante. Supponiamo che abbia scelto Algol (chiaramente più adatto ai programmi non numerici di Fortran). Suppongo che Algol sarebbe probabilmente ancora più estraneo alla maggior parte dei programmatori di oggi rispetto al linguaggio assembly che ha scelto.

Per la terza edizione, ha ridisegnato il MIX per adattarsi più strettamente ai processori moderni e ha dovuto riscrivere il codice per esso. Immagino, tuttavia, che se avesse usato un linguaggio di livello superiore, la riscrittura sarebbe stata sostanzialmente maggiore - e anche tutti i motivi che ha fornito sarebbero rimasti.


Inoltre, i compilatori erano in genere costosi a quei tempi. Anni dopo l'uscita del volume 1 del TAOCP, ho intervistato in un posto che non voleva spendere soldi per uno (e, a dire il vero, l'assemblatore IBM 370 non era poi così male), e mia moglie ha lavorato in un negozio di lingue di assemblaggio parecchi anni dopo.
David Thornley,

2
come posso valutare il punto 4 ??
Javier,

5
@Javier prendine una copia e scrivi +1 a margine.
Luser droog

29

Anche Knuth ha aggiornato la sua logica :

Perché avere un linguaggio automatico?

Molti lettori pensano senza dubbio: `` Perché Knuth sostituisce MIX con un'altra macchina invece di attenersi a un linguaggio di programmazione di alto livello? Oggigiorno quasi nessuno usa assemblatori. ''

Queste persone hanno diritto alle loro opinioni e non devono preoccuparsi di leggere le parti in linguaggio automatico dei miei libri. Ma le ragioni del linguaggio macchina che ho dato nella prefazione al volume 1, scritto all'inizio degli anni '60, rimangono valide oggi:

  • Uno dei principali obiettivi dei miei libri è mostrare come le costruzioni di alto livello sono effettivamente implementate nelle macchine, non semplicemente mostrare come vengono applicate. Spiego collegamento coroutine, strutture ad albero, generazione di numeri casuali, aritmetica ad alta precisione, conversione radix, impacchettamento di dati, ricerca combinatoria, ricorsione, ecc., Da zero.
  • I programmi necessari nei miei libri sono generalmente così brevi che i loro punti principali possono essere facilmente compresi.
  • Le persone che sono più che casualmente interessate ai computer dovrebbero avere almeno un'idea di come sia l'hardware sottostante. Altrimenti i programmi che scrivono saranno piuttosto strani.
  • Il linguaggio macchina è necessario in ogni caso, come output di molti dei programmi software che descrivo.
  • L'espressione di metodi di base come algoritmi per l'ordinamento e la ricerca in linguaggio macchina consente di effettuare studi significativi sugli effetti della dimensione della cache e della RAM e di altre caratteristiche hardware (velocità della memoria, pipelining, problema multiplo, buffer lookaside, dimensione dei blocchi della cache, ecc.) quando si confrontano diversi schemi.

Inoltre, se usassi una lingua di alto livello, quale lingua dovrebbe essere? Negli anni '60 avrei probabilmente scelto Algol W; negli anni '70, avrei dovuto riscrivere i miei libri usando Pascal; negli anni '80, avrei sicuramente cambiato tutto in C; negli anni '90 avrei dovuto passare al C ++ e probabilmente a Java. Negli anni 2000, un'altra lingua sarà senza dubbio di rigore. Non posso permettermi il tempo di riscrivere i miei libri man mano che le lingue passano di moda; le lingue non sono il punto dei miei libri, il punto è piuttosto quello che puoi fare nella tua lingua preferita. I miei libri si concentrano su verità senza tempo.

Pertanto continuerò a utilizzare l'inglese come lingua di alto livello in TAOCP e continuerò a utilizzare una lingua di basso livello per indicare come le macchine effettivamente calcolano. I lettori che vogliono vedere solo algoritmi che sono già impacchettati in modo plug-in, usando un linguaggio di tendenza, dovrebbero acquistare i libri di altre persone.

La buona notizia è che la programmazione per le macchine RISC è piacevole e semplice, quando la macchina RISC ha un bel design pulito. Quindi non ho bisogno di soffermarmi su dettagli arcani e ostili che distraggono dai punti principali. A questo proposito, MMIX sarà significativamente migliore di MIX.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.