Atualmente, estou estudando engenharia em telecomunicações e eletrônica e migramos de montador para C em programação de microprocessador. Tenho dúvidas de que seja uma boa ideia. Quais são algumas vantagens e desvantagens de C em comparação com a montagem?
As vantagens / desvantagens que vejo são:
Vantagens:
- Eu posso dizer que a sintaxe C é muito mais fácil de aprender do que a sintaxe do Assembler.
- C é mais fácil de usar para criar programas mais complexos.
- Aprender C é de alguma forma mais produtivo do que aprender assembler, porque há mais coisas em desenvolvimento em torno de C que Assembler.
Desvantagens:
- O Assembler é uma linguagem de programação de nível inferior ao C, portanto, é uma boa opção para programar diretamente no hardware.
- É muito mais flexível, aludindo você a trabalhar com memória, interrupções, micro-registros, etc.
Respostas:
Aqui estão algumas respostas de estouro de pilha que podem ajudá-lo (essas são as principais respostas, respostas aceitas):
Vantagens
/programming/143561/is-there-a-need-to-use-assembly-these-days (apenas para usuários de 10 KB) ou Archive
Desvantagens
/programming/2684364/why-arent-programs-written-in-assembly-more-often
Exemplo
A última postagem abaixo é uma postagem de estouro de pilha, descrevendo um cenário que mostrará um exemplo de montagem mais rápido que C (ao executar a mesma função).
/programming/577554/when-is-assembler-faster-than-c
fonte
C é mais fácil de programar em comparação com o Assembly. Existem razões óbvias que não valem a pena revisar.
Sendo mais fácil de usar, C permite que você escreva programas mais rapidamente. Geralmente esses programas também são mais fáceis de depurar e mais fáceis de manter. Além disso, é mais fácil gerenciar programas grandes e complexos em C.
Muitas vezes, o código gerado por um compilador é tão bom (em termos de velocidade e eficiência) quanto o montador escrito à mão - se não melhor.
C é bastante baixo, e é raro que você queira ir muito mais baixo. Ter uma camada adicional de abstração raramente é uma coisa ruim.
Quando você precisar ir mais baixo, poderá usar o Assembly, caso contrário, o C.
Você pode escrever Assembly no código C, mas não C no código do assembly.
fonte
O programa CA pode ser compilado para diferentes arquiteturas de microprocessador.
fonte
Não tema, ninguém mais desenvolve novos programas em montador 100%. Atualmente, o C pode ser usado mesmo para as arquiteturas de 8 bits mais minúsculas e ruins. No entanto , conhecer algum montador faz de você um programador C significativamente melhor. Além disso, sempre há alguns pequenos detalhes ou dois em um programa que precisam ser escritos no assembler.
Sim, a sintaxe é mais fácil, certamente. No entanto, aprender toda a linguagem C com todos os detalhes irritantes é muito mais complexo do que aprender todos os detalhes de um assembler em particular. C é uma linguagem muito maior e mais ampla. Mas, novamente, talvez você não precise aprender todos os detalhes.
De fato, C fornece mecanismos para o design modular do programa, como encapsulamento e escopos locais / variáveis locais. EC tem uma biblioteca padrão, além de uma enorme quantidade de recursos escritos nos últimos 30 anos. E o mais importante, C é portátil.
O C possui muitas funcionalidades, bibliotecas e recursos pré-fabricados, portanto haverá menos reinventação da roda. Mas, além disso, sua afirmação é subjetiva. Eu acredito que é uma questão de preferência pessoal.
Por exemplo, eu sou um programador C experiente, ocasionalmente programando C ++. Eu me sinto muito menos produtivo em C ++, porque não conheço essa linguagem tão bem quanto conheço C. Mas só porque me sinto assim, não significa necessariamente que a programação em C seja mais produtiva do que a programação em C ++. Um programador C ++ experiente certamente teria a opinião oposta.
E há muitos aspectos para "produtivo". Um aspecto muito importante é o tempo de manutenção e, principalmente, o tempo necessário para corrigir bugs induzidos pela manutenção. C é muito mais fácil de manter do que o assembler.
A programação de hardware pode ser feita diretamente em qualquer idioma. As únicas coisas que você não pode fazer em C são acessar ponteiros de pilha e registros de condição, etc., do próprio núcleo da CPU. Portanto, se por programação de hardware você quer falar com sua própria CPU, sim, o assembler permite um pouco mais do que C. Se você quer acessar o hardware externo, o assembler não tem nenhum benefício sobre o C. Mas talvez seja uma desvantagem, pois geralmente é mais difícil escrever código genérico do assembler para um dispositivo externo específico, que código C genérico.
Isso não está correto. C permite que você faça tudo isso também, embora você precise confiar no código C específico do compilador, como a palavra-chave interrupt.
No final, você precisa conhecer os dois idiomas para programar MCUs, com ênfase em C.
fonte
a = b[i] + c;
é muito menos complicado do que as instruções para carregarb[i]
(o que exige computação) e osc
registros (que devem ser disponibilizados), adicionar e armazenar.Dependendo do quão incorporado você precisa, o C produzirá programas grandes e lentos. O que aumentará visivelmente o custo dessa parte do produto. Pode ser uma gota no oceano para o produto em geral ou pode mudar radicalmente o produto. Sim, alguns podem dizer que os esforços de desenvolvimento e manutenção de software são mais baratos, mais uma vez, podem ser verdadeiros ou falsos, se forem profundamente incorporados e visarem uma parte com baixo consumo de energia, pequena e barata que você não está falando sobre muito código. Esse código é principalmente específico para esse fornecedor ou para esse chip específico, portanto, estar em C tem zero benefícios de portabilidade, você precisa reescrever cada destino de qualquer maneira. Com a série córtex-m da ARM, agora estamos começando a ser capazes de fazer o C competir com o asm, não que as pessoas não usem o C ou outras linguagens de nível superior em seus produtos incorporados,
O debate C vs ASM, profissionalmente, sempre se resume a escrevê-lo em C e usar o ASM onde você pode justificá-lo. E você pode justificar isso. No mundo incorporado, há desempenho e tamanho.
Você precisa incluir o alvo nesta discussão. Embora muitos tenham usado C com Microchip (as fotos mais antigas, e não a pic32, que é mips) a um custo enorme, é um conjunto de instruções horrível para compiladores, conjunto de instruções muito educativo e interessante, mas um compilador hostil. msp430, avr, braço, polegar, mips, tudo de bom para compiladores. 8051 também é ruim.
Ainda mais que o idioma das ferramentas. Nos casos em que a preocupação com o desenvolvimento e o gerenciamento de código é um argumento, você precisa de ferramentas para estar presente hoje e amanhã. Ter uma única ferramenta de origem, mesmo incluindo um único mod gcc, gerenciado por um grupo, é arriscado do ponto de vista comercial. É provável que você encontre mais de um montador, e qualquer pessoa digna de pertencer a essa equipe poderá criar um montador em um fim de semana (desde que o assembly que você escreva não seja uma diretiva de ghee whiz e macro feliz). Para asm e C, você gostaria de usar ferramentas de código aberto (ou as suas próprias ferramentas internas), nas quais você tem uma chance melhor, mesmo que isso signifique usar uma máquina virtual para executar uma distribuição linux de 10 anos, de ter ferramentas disponíveis para a vida do produto.
A linha inferior, novamente, use / aprenda / ensine C e asm, comece com C e use asm onde você puder justificá-lo.
fonte
Para montagem, há um compromisso inevitável entre a manutenção e o desempenho do código. Você pode escrever uma montagem fácil de ler / manter ou escrever um código altamente otimizado; mas você não pode fazer as duas coisas.
Para C, o comprometimento não desaparece completamente, mas é muito menos perceptível - você pode escrever / ler / manter fácil o C, razoavelmente bem otimizado.
Um excelente programador de linguagem assembly será capaz de derrotar o compilador quase o tempo todo, mas na maioria das vezes eles escolherão deliberadamente escrever código de fácil leitura / manutenção; e, portanto, um excelente programador de linguagem assembly será derrotado por um compilador na maioria das vezes.
A maneira inteligente é usar o assembly e o C (em vez de apenas o assembly ou apenas o C) - por exemplo, use C para partes do código em que um excelente programador de linguagem assembly teria escolhido escrever código de manutenção / lento e usar assembly para o restante (onde "altamente otimizado e difícil de manter" é realmente justificado).
fonte
fonte