
paulo1205
(usa Ubuntu)
Enviado em 24/01/2025 - 16:53h
thiago_c escreveu:
Agradeço pela sugestão, vou buscar me aprofundar em C primeiro mesmo, até tinha pensado em pegar aquele livro "C completo e total" que já me disseram que é excelente, talvez o mergulho seja mais fácil de forma lenta e gradual pra acostumar com a pressão. Vou colocar na lista esse livro de Assembly também. Vou deixar o tópico aberto por mais um tempo para pegar mais sugestões de materiais.
Recomendo não usar o
C Completo e Total. Apesar da eloquência do autor (que, além de ter um estilo muito fácil de ler, era uma verdadeira máquina de produzir livros sobre diferentes linguagens e dialetos de programação nas décadas de 1980 e 1990 — talvez a grande quantidade e a alta velocidade ajudem a explicar a baixa qualidade), o livro apresenta diversas práticas de programação duvidosas, conceitos errôneos, explicações incorretas, e muitos dos exemplos têm erros tão crassos que os tornam absolutamente inúteis e incompatíveis com a proposta de ensinar a programar adequadamente.
Veja a quarta mensagem neste tópico (de 2016) do fórum do VoL, onde eu apresento links para artigos e referências a respeito do livro e seu autor:
https://www.vivaolinux.com.br/topico/C-C++/Iniciante-em-programacao.
Quanto à última pergunta da mensagem original, minha opinião é que é
possível, sim, aprender Assembly ao mesmo tempo que outra linguagem. Isso pode inclusive ser muito interessante, de certa forma, com a pessoa vendo como o compilador faz para converter um código em C (ou outra linguagem de alto nível) em linguagem de máquina, através do exame do Assembly que produziria o mesmo código de máquina (por exemplo, com a opção
-S do GCC, possivelmente em conjunto com
-fverbose-asm, inclusive comparando o o resultado de uma compilação com otimização desligada e com diferentes níveis de otimização ligados). Fazendo isso, pode-se ver, entre outras coisas, como o compilador faz para enviar parâmetros a funções, como uma função pode devolver informações a quem a invocou, como funcionam variáveis globais, variáveis locais estáticas e variáveis locais automáticas (aqui, contrapondo “estática” e “automática” do mesmo modo como faz o padrão da linguagem C; outras linguagens podem usar outra terminologia), qual a diferença entre uma tripa
if/
else if/
.../
else e um
switch com múltiplos rótulos de
case e com ou sem o rótulo
default, etc.
Claro que deve existir uma certa habilidade de separar os assuntos, para que o aprendizado de uma coisa não atrapalhe o aprendizado da outra, em lugar de ajudar. Importante também é saber alguma coisa sobre a arquitetura em que se está programando, incluindo aspectos tais como a quantidade e propósito dos diferentes registradores, como os dados de diferentes tipos são representados (inteiros de 8, 16, 32, 64 ou até mais bits, se for o caso, e se/quando eles são usados com sinal ou sem sinal, formatos de ponto flutuante etc.), como funciona a pilha do processador, entre outros. E, claro, é importante que a teoria básica, incluindo algoritmos e estrutura de dados fundamentais, esteja o mais próximo possível de completamente dominada, pois o processo de engenharia reversa tende a ser muito facilitado quando não se perde muito tempo para intuir algoritmos fundamentais e estruturas de dados simples a partir das operações, pois as operações do Assembly são tão mais fundamentais do que as de linguagens de mais alto nível, que a familiaridade com os algoritmos e estruturas de dados fundamentais se torna ainda mais crítica.
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)