Por que Donald Knuth escreve o TAOCP usando a linguagem assembly?
20
Eu não odeio usar a linguagem assembly, pois escrevi alguns no meu curso de SO. Mas, obviamente, a linguagem assembly não tem abstração, é preciso prestar mais atenção aos detalhes.
A linguagem assembly é realmente essencial para escrever TAOCP?
@ Blrfl Eu não acredito no diabo. (Eu acredito nos detalhes embora ... arrepio )
Jimmy Hoffa
3
O primeiro volume do TAOCP foi publicado em 1968. Embora certamente existissem linguagens de nível superior, o assembler escrito à mão era muito mais importante e os recursos de computação nos mainframes da época podiam ser da mesma ordem que alguns micros de 8 bits da década de 1980. Knuth também certa vez argumentou com seriedade por manter o goto porque alguns algoritmos não podiam ser escritos usando estruturas de fluxo de controle aninhadas sem alguma ineficiência. Na verdade, ele não defendia a otimização prematura mesmo no IIRC, ele só queria a opção disponível para quando a otimização era necessária.
Steve314
3
@ JimmyHoffa: Oh, bem, no seu caso, os detalhes são onde está o de Ville .
Blrfl
1
Jerry Coffin conseguiu fazer o que eu queria, ele procurou na fonte ;-). Procurei nos capítulos onde MIX e MIXAL são apresentados, onde não encontrei essas declarações ... talvez deva receber uma cópia eletrônica algum dia. De qualquer forma, acho que a etiqueta de resposta seria mais apropriada para a resposta de Jerry neste caso.
Thomas
Respostas:
22
Ele não apenas usa o MIXAL, sua linguagem assembly para o MIX, mas também o MIX, um modelo para um computador simples (como um que foi usado nos anos sessenta). Este é um modelo de ensino com o qual ele é, até certo ponto, independente do desenvolvimento no campo.
Se ele tivesse usado outra linguagem de programação (qual, a propósito, você acha que seria adequada?), Digamos NPL (linguagem de programação bacana), ele teria que abandonar a ideia de usar o MIX ou introduzir um compilador de alguma linguagem de computador de sua escolha (que é uma coisa muito mais complexa do que a que ele está lidando no Vol. 1). Dessa forma, não teria se tornado TAOCP, mas TAONPLP. O primeiro é independente de tal escolha e, por esse motivo, atemporal de uma maneira que poucos livros sobre programação serão. O segundo provavelmente já estaria esquecido agora ...
Além disso, desde que os computadores funcionem em princípio da maneira que o MIX dele, é bom levar isso em consideração se você estiver realmente interessado em aprender a trabalhar com eles.
Observe que "Técnicas do compilador" é oficialmente o tópico do volume projetado 7. Ainda pode acontecer, mas acho que todo mundo está feliz por Knuth não ter esperado até que ele tivesse um compilador para começar a publicar.
Kilian Foth
@KilianFoth sim, eu sei. Mas eu esperaria que linguagens de programação artificiais fossem usadas nesse livro. Provavelmente, visando um MMIX (o segundo M não é um computador com erro de digitação :-). E ETA do vol. 5 é 2020 ...
Thomas
56
Vocês, jovens trapaceiros, me surpreendem às vezes. Você muitas vezes não tem idéia de que algo aconteceu antes de começar a escola. (Eu tenho o mesmo problema. Demorei muito tempo para entender que 15 anos eram realmente muito pouco tempo, do ponto de vista adulto. Esse é aproximadamente o período de Hiroshima à crise dos mísseis cubanos. Para mim, a Segunda Guerra Mundial é apenas história, mas meu pai lutou nela e minha mãe estava no ensino médio durante isso.)
TAOCP, vol. 1, "Algoritmos fundamentais", 1ª edição, foi impresso pela primeira vez em 1968. Isso foi há 45 anos. Knuth começou a planejar a série bem antes disso.
Para referência: o Intel 8086 apareceu pela primeira vez em 1978, dez anos depois. A língua PASCAL apareceu pela primeira vez em 1971; o livro de Jensen & Wirth, sobre a segunda versão da linguagem, foi lançado em 1974. O desenvolvimento inicial de C foi 1969-1973: a K&R foi publicada em 1978.
Knuth planejou a série para cobrir o campo. Ele definiu o estilo, ENTÃO, para ser útil aos praticantes ENTÃO. Ele nunca esperava que essa série se tornasse literalmente o trabalho de sua vida, ou seus escritos abrangerão o que provavelmente será bem mais de meio século quando ele finalmente terminar.
A linguagem assembly não pode ser tão crítica hoje como era na época, mas ainda é muito mais importante do que os especialistas em Java / C ++ / Javascript / Python / Perl gostaria que todos acreditassem.
Knuth implementou um compilador ALGOL em 1960, e o ALGOL foi projetado para ser adequado para a publicação de algoritmos, então eu não acho que isso realmente responda à pergunta.
Peter Taylor
10
Realmente não estou convencido de que o raciocínio fosse a disponibilidade do tempo. O LISP estava disponível se ele queria um alto nível de abstração, como a matemática. Eu acho que ele foi com a assembléia por causa da primeira palavra do título; Fundamental. Nada é mais fundamental para os algoritmos do que as instruções passo a passo para uma simples máquina estúpida; obriga a quebrar o algoritmo completamente, em vez de raciocinar sobre ele em um nível alto, que não era o objetivo dele no livro.
Jimmy Hoffa
1
É por isso que minha escola ofereceu uma aula de computação histórica onde você pode programar um Altair e alguns PDPs.
Rig
@Rig - a sério? Agora eu me sinto velho. Embora não sejam tão antigos quanto explicar a HPGL a um novo contratado e descobrir que nunca haviam visto ou ouvido falar de um plotter de caneta!
Martin Beckett
6
+1 por causa do discurso divertido e das informações relevantes.
Luser droog
43
Knuth discute seu raciocínio no Prefácio. Vou citar apenas alguns trechos:
... Eu precisava decidir se deveria usar uma linguagem algébrica como ALGOL ou FORTRAN ou usar uma linguagem orientada a máquina para esse fim. Talvez muitos dos especialistas em computação de hoje discordem da minha decisão de usar uma linguagem orientada a máquinas, mas fiquei convencido de que essa era definitivamente a escolha correta, pelos seguintes motivos:
Linguagens algébricas são mais adequadas para problemas numéricos do que os problemas não numéricos considerados aqui. [...]
... Ao escrever em uma linguagem orientada à máquina, o programador tenderá a usar um método muito mais eficiente; está muito mais perto da realidade.
Os programas que precisamos são, com poucas exceções, todos bastante curtos ...
Uma pessoa que está mais do que casualmente interessada em computadores deve ser bem treinada em linguagem de máquina ...
Alguma linguagem de máquina seria necessária de qualquer maneira ...
Embora ele não aponte diretamente, acho que sua menção a ALGOL e FORTRAN aponta para outro problema que ele evitou que pode ser ainda mais importante. Vamos supor que ele tenha escolhido Algol (claramente mais adequado a programas não numéricos do que o Fortran). Eu diria que Algol provavelmente seria ainda mais estranho para a maioria dos programadores de hoje do que a linguagem assembly que ele escolheu.
Para a terceira edição, ele redesenhou o MIX para se adaptar mais aos processadores modernos e teve que reescrever o código para ele. Eu diria, no entanto, que se ele tivesse usado uma linguagem de nível superior, a reescrita teria sido substancialmente maior - e todos os motivos que ele forneceu permaneceriam também.
Além disso, os compiladores eram geralmente caros naqueles dias. Anos após o lançamento do volume 1 do TAOCP, entrevistei um local que não queria gastar o dinheiro em um (e, para ser honesto, o montador IBM 370 não era tão ruim), e minha esposa trabalhou em uma loja de linguagem de montagem alguns anos depois disso.
Muitos leitores, sem dúvida, estão pensando: `` Por que Knuth substitui o MIX por outra máquina, em vez de apenas se apegar a uma linguagem de programação de alto nível? Quase ninguém usa montadores hoje em dia ''.
Essas pessoas têm direito a suas opiniões e não precisam se incomodar em ler as partes em linguagem de máquina dos meus livros. Mas as razões para a linguagem de máquina que eu dei no prefácio do Volume 1, escritas no início dos anos 60, permanecem válidas hoje:
Um dos principais objetivos dos meus livros é mostrar como as construções de alto nível são realmente implementadas nas máquinas, e não apenas mostrar como elas são aplicadas. Eu explico a ligação da corotina, estruturas de árvores, geração de números aleatórios, aritmética de alta precisão, conversão de radix, compactação de dados, pesquisa combinatória, recursão etc., desde o início.
Os programas necessários em meus livros são geralmente tão curtos que seus pontos principais podem ser facilmente compreendidos.
As pessoas que estão mais do que casualmente interessadas em computadores devem ter pelo menos uma idéia de como é o hardware subjacente. Caso contrário, os programas que eles escreverão serão bem estranhos.
A linguagem de máquina é necessária em qualquer caso, como saída de muitos dos programas de software que descrevo.
A expressão de métodos básicos, como algoritmos para classificação e pesquisa em linguagem de máquina, possibilita a realização de estudos significativos dos efeitos do tamanho do cache e da RAM e de outras características do hardware (velocidade da memória, pipelining, vários problemas, buffers externos, tamanho dos blocos de cache, etc.) ao comparar diferentes esquemas.
Além disso, se eu usasse um idioma de alto nível, que idioma deveria ser? Nos anos 60, eu provavelmente teria escolhido Algol W; na década de 1970, eu teria que reescrever meus livros usando Pascal; na década de 1980, eu certamente teria mudado tudo para C; nos anos 90, eu teria que mudar para C ++ e, provavelmente, para Java. Nos anos 2000, outra língua será sem dúvida de rigueur. Não tenho tempo para reescrever meus livros à medida que as línguas entram e saem de moda; idiomas não são o ponto principal dos meus livros, o ponto é o que você pode fazer no seu idioma favorito. Meus livros se concentram em verdades eternas.
Portanto, continuarei usando o inglês como o idioma de alto nível no TAOCP e continuarei usando um idioma de baixo nível para indicar como as máquinas realmente calculam. Os leitores que desejam apenas ver algoritmos já empacotados de forma plug-in, usando uma linguagem moderna, devem comprar livros de outras pessoas.
A boa notícia é que a programação para máquinas RISC é agradável e simples, quando a máquina RISC possui um design limpo e agradável. Portanto, não preciso me debruçar sobre pequenos detalhes misteriosos que distraem os pontos principais. A este respeito, o MMIX será significativamente melhor que o MIX.
Respostas:
Ele não apenas usa o MIXAL, sua linguagem assembly para o MIX, mas também o MIX, um modelo para um computador simples (como um que foi usado nos anos sessenta). Este é um modelo de ensino com o qual ele é, até certo ponto, independente do desenvolvimento no campo.
Se ele tivesse usado outra linguagem de programação (qual, a propósito, você acha que seria adequada?), Digamos NPL (linguagem de programação bacana), ele teria que abandonar a ideia de usar o MIX ou introduzir um compilador de alguma linguagem de computador de sua escolha (que é uma coisa muito mais complexa do que a que ele está lidando no Vol. 1). Dessa forma, não teria se tornado TAOCP, mas TAONPLP. O primeiro é independente de tal escolha e, por esse motivo, atemporal de uma maneira que poucos livros sobre programação serão. O segundo provavelmente já estaria esquecido agora ...
Além disso, desde que os computadores funcionem em princípio da maneira que o MIX dele, é bom levar isso em consideração se você estiver realmente interessado em aprender a trabalhar com eles.
fonte
Vocês, jovens trapaceiros, me surpreendem às vezes. Você muitas vezes não tem idéia de que algo aconteceu antes de começar a escola. (Eu tenho o mesmo problema. Demorei muito tempo para entender que 15 anos eram realmente muito pouco tempo, do ponto de vista adulto. Esse é aproximadamente o período de Hiroshima à crise dos mísseis cubanos. Para mim, a Segunda Guerra Mundial é apenas história, mas meu pai lutou nela e minha mãe estava no ensino médio durante isso.)
TAOCP, vol. 1, "Algoritmos fundamentais", 1ª edição, foi impresso pela primeira vez em 1968. Isso foi há 45 anos. Knuth começou a planejar a série bem antes disso.
Para referência: o Intel 8086 apareceu pela primeira vez em 1978, dez anos depois. A língua PASCAL apareceu pela primeira vez em 1971; o livro de Jensen & Wirth, sobre a segunda versão da linguagem, foi lançado em 1974. O desenvolvimento inicial de C foi 1969-1973: a K&R foi publicada em 1978.
Knuth planejou a série para cobrir o campo. Ele definiu o estilo, ENTÃO, para ser útil aos praticantes ENTÃO. Ele nunca esperava que essa série se tornasse literalmente o trabalho de sua vida, ou seus escritos abrangerão o que provavelmente será bem mais de meio século quando ele finalmente terminar.
A linguagem assembly não pode ser tão crítica hoje como era na época, mas ainda é muito mais importante do que os especialistas em Java / C ++ / Javascript / Python / Perl gostaria que todos acreditassem.
Agora saia do meu gramado!
fonte
Knuth discute seu raciocínio no Prefácio. Vou citar apenas alguns trechos:
Embora ele não aponte diretamente, acho que sua menção a ALGOL e FORTRAN aponta para outro problema que ele evitou que pode ser ainda mais importante. Vamos supor que ele tenha escolhido Algol (claramente mais adequado a programas não numéricos do que o Fortran). Eu diria que Algol provavelmente seria ainda mais estranho para a maioria dos programadores de hoje do que a linguagem assembly que ele escolheu.
Para a terceira edição, ele redesenhou o MIX para se adaptar mais aos processadores modernos e teve que reescrever o código para ele. Eu diria, no entanto, que se ele tivesse usado uma linguagem de nível superior, a reescrita teria sido substancialmente maior - e todos os motivos que ele forneceu permaneceriam também.
fonte
Knuth também atualizou sua lógica :
fonte