Pergunte ao Hackaday: aprenda a montagem primeiro, por último ou nunca?
LarLar > blog > Pergunte ao Hackaday: aprenda a montagem primeiro, por último ou nunca?

Pergunte ao Hackaday: aprenda a montagem primeiro, por último ou nunca?

Jul 15, 2023

Há alguns dias, encontrei um post online onde alguém apontou o livro “Aprenda a Programar com Assembly” e perguntou se alguém já havia aprendido linguagem assembly como primeira linguagem de programação. Tive que sorrir porque, se você tem uma certa idade, sua primeira linguagem pode muito bem ter sido assembly, mesmo que tenha sido assembly para máquinas que nunca existiram.

Claro, isso foi há muito tempo. É mais provável que hoje em dia, se você tiver mais de 40 anos, tenha aprendido o BASIC primeiro. Seja mais jovem e você começará a se inclinar para Java, Javascript ou mesmo C. Isso me fez pensar: as pessoas deveriam aprender assembly e, em caso afirmativo, quando?

Não sou estranho às linguagens assembly, mas não tenho certeza se conheço uma resposta moderna e defensável para essa pergunta. Você pode encontrar muitos tutoriais, é claro (incluindo alguns meus). Existem muitos casos em que algumas linhas de montagem incorporada podem fazer uma grande diferença em um programa. Depurar um compilador defeituoso também pode exigir recursos de montagem. Então parece que pelo menos algumas pessoas ainda precisam aprender montagem. Isso deixa a questão de quando aprender e, como corolário, quem precisa aprender.

Minha resposta tradicional seria que todos deveriam aprender o mais rápido possível. Mas pode ser porque foi assim que fiz anos atrás. Não estou convencido de que essa seja a resposta certa para todos hoje. No entanto, vou defender o meu caso.

Se você estiver satisfeito em escrever código para validar CEPs em Javascript, provavelmente não precisará aprender assembly. Mas se você quiser realmente ser um programador de ponta, terá que enfrentar isso mais cedo ou mais tarde. Aprender cedo traz alguns benefícios. Se você entende o que realmente está acontecendo no nível da CPU, um ponteiro em C não parece um conceito difícil. Ser capaz de observar a saída de um compilador e entender o que isso significa costuma ser esclarecedor quando você está tentando aprender algo novo.

O único problema é que a linguagem assembly moderna é difícil. Os conjuntos de instruções da CPU são estranhos e há problemas com CPUs que executam execução fora de ordem. Depois, há o código relocável e outros detalhes que são fáceis de encontrar e não são muito úteis para se saber muito.

Portanto, há dois caminhos a seguir. Primeiro, escolha uma CPU mais antiga. Algo como o Z80, o 1802 ou o 6502 não é tão difícil de aprender e há muitos recursos disponíveis. Não tem nenhum hardware assim? Quem se importa? Use um emulador. Você provavelmente pode até encontrar alguns que rodam no navegador e possuem excelentes recursos de depuração não disponíveis no hardware real. Programei em dezenas de CPUs e todas são bem parecidas. Dada a estranheza do 1802, talvez eu não o recomende, embora eu mesmo o ame. Por outro lado, é muito simples de aprender. O PDP-8 ou o PDP-11 são outros bons candidatos, embora hoje em dia raramente se veja como os minicomputadores fazem as coisas.

Ou escolha uma máquina que não existe. A maioria deles foi feita para aprendizado, o que é uma vantagem, e muitos deles também possuem emuladores modernos. Se você fosse escolher um, eu sugeriria Mix. Os livros de Knuth são clássicos e usam Mix. Eles influenciaram a todos, então você verá ecos das ideias de Knuth em todos os sistemas de computador que você tocar. (Esse não é um computador quântico, pelo menos.)

Só não volte muito atrás. Programar o EDSAC, o TUTAC ou o 4004 provavelmente não é representativo da computação moderna. Honestamente, nenhuma dessas CPUs é. Mas eles podem ajudar a preparar o terreno para lidar com processadores mais avançados, se necessário. Como diz o velho ditado: você tem que engatinhar antes de andar e andar antes de correr.

Você poderia facilmente discutir o outro lado também. Talvez a linguagem assembly faça mais sentido quando você entender por que precisa de ponteiros para criar listas vinculadas e por que o salto condicional é uma coisa. Se você já programa há algum tempo, algumas ideias como números hexadecimais e endereços já podem ser familiares.

Provavelmente o momento errado para aprender isso é quando você tem um bug intratável e suspeita que o compilador está otimizando seu código incorretamente. Ou à meia-noite antes de um prazo final, quando você precisa reduzir um pouco mais do seu código.