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?
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?
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.
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!
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.
Knuth também atualizou sua lógica :
Por que ter uma linguagem de máquina?
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.