Dúvida: Quando O C Fica Limitado E O Assembly Começa A Agir?
Bom em sistemas como o Linux é comum encontrar pelo menos 3% feito em assembly, acredito que isso não é por causa de desempenho ou algo assim e sim porque esses são 3% que o C não pode fazer ou fica meia boca, mas então o que é essa parte? O que esse assembly desempenha que o C não pode?
Em parte é desempenho sim. Tem situações bem pontuais que é muito difícil conseguir extrair o máximo do C, fica mais fácil fazer em Assembly.
Há o caso de iniciar a execução do código que foi produzido pelo C, o que chama-se bootstrap, então precisa algo mais bruto, mas é um código pequeno demais.
Tem casos que é a interação com o hardware que não se consegue fazer, pelo menos de forma eficiente, com os mecanismos existentes em C. Para criar uma forma de fazer isso em C, daria muito trabalho e atenderia praticamente um caso de uso, então é melhor fazer em Assembly.
Tem código que é para interagir com o processador específico, então precisa de algo específico que o compilador C não pode gerar. Novamente, até poderia, mas não compensa fazer.
Tudo daria para criar em C, só não faz sentido infestar o compilador com isso. Afinal o compilador gera um código de máquina (Assembly é só um texto para humano entender melhor esses códigos), então não tem nada que seja impossível, só não está pronto.
É mais uma decisão que uma impossibilidade, embora isso aconteça em algo bem pontual.
O que não é, e muita gente acha que é, porque o Assembly é mais rápido que C. O Assembly tem mais condições de permitir que o programador faça algo mais rápido em algumas situações, embora costume ser mais difícil ou é algo muito fora do padrão. O Assembly não é inerentemente mais rápido que C. C não é que C++, que não é mais que C#. Há uma tendência a ser, desde que o programador faça bom uso e em alguns casos trabalhe bem mais duro. E olha que estou falando das implementações. É possível ter Assembly interpretado e ficará bem lento, só para citar um exemplo exagerado.
Tem dados que confirmam esses 3%? Eu imaginava que era inferior ou pouco acima de 1%.
Faz sentido para você?
Espero ter ajudado.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).
Alguns dispositivos precisavam de inicialização ou comandos específicos em assembly, como por exemplo uma memória EEPROM que requer que você puxe uma sequência de bytes pra um registrador ou área da memória específica.
Quando você compila o seu programa em C, o compilador determina a sequência de opcodes do assembly gerado, o que pode não bater com o que você precisa. Por isso algumas implementações são feitas na mão.
Se você procurar pela keyword "asm" em C, vai ver trechos de códigos que fazem isso. Esse é o famoso inline assembly.
Em dispositivos embarcados, as vezes é mais eficiente escrever certos codigos em Assembly pra otimizar, pois o compilador acaba fazendo de forma mais burra.
Você só desce para uma linguagem de nível mais baixo com uma justificativa muito plausível e se souber o que está fazendo. Não faz sentido descer o nível se o nível que você já está implementando produz o mesmo resultado e com o mesmo desempenho.