Quais são algumas vantagens / desvantagens do uso de C sobre assembly? [fechadas]

15

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.
Daniel Conde Marin
fonte
17
Bem-vindo ao novo século. Você vai gostar daqui. Temos microcontroladores executando .NET , Java , Linux e até pessoas usando python para programar PICs .
ZJR
@ZJR Como você usa o Python para programar um PIC? Qual foto?
detly
2
@detly Não é python de pleno direito, apenas um subconjunto do núcleo. Uma camada de sintaxe python sobre a funcionalidade do controlador , se você desejar. pyastra é o primeiro exemplo que pesquisei no Google, mas lembro-me de ter lido documentos de outro, que também usavam ATMELs.
ZJR
4
Para ser honesto, com a complexidade dos processadores modernos, eu ficaria surpreso se muitos programadores pudessem escrever um assembler mais apertado e mais eficiente do que um compilador C moderno pode gerar de qualquer maneira. Detestaria tentar programar uma CPU de arquitetura EPIC no assembler, por exemplo - Mel estaria em casa com o Itanium . * 8 ')
Mark Booth
5
@ZJR Este novo século parece emocionante! Estou curioso, em que idioma foi escrito o tempo de execução do .NET, Java VM e Linux, para esses microcontroladores? Como em que linguagem foi realizada a programação real do microcontrolador? Oh ... C ou assembler deste século também ...

Respostas:

17

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

  • Assembly é usado nos estágios iniciais do gerenciador de inicialização. Quando a CPU não está disponível na pilha e é difícil impedir que o compilador C tente salvar as coisas na pilha. No entanto, a maior parte do carregador de inicialização é escrita em C, assim que a primeira inicialização é feita.
  • Assembly é usado para escrever primitivas de bloqueio mutex. É essencialmente impossível obter um compilador C para emitir instruções de barreira de memória nos locais necessários.
  • Rotinas como memset () ou memcpy () geralmente são feitas em assembly. Por exemplo, escrevi um memset () com um loop grande e desenrolado, que calcula dinamicamente um endereço de ramificação para pular no meio desse loop para uma iteração final. A rotina de CA geraria mais código, perdendo mais US $ 1. Da mesma forma, os conjuntos de instruções da CPU geralmente incluem o carregamento da linha de cache ou outras instruções que podem acelerar drasticamente o memcpy (), que o compilador C não utilizará.

Desvantagens

/programming/2684364/why-arent-programs-written-in-assembly-more-often

  • O ASM tem pouca legibilidade e não é realmente sustentável em comparação com idiomas de nível superior.
  • Além disso, há muito menos desenvolvedores ASM do que em outros idiomas mais populares, como C.
  • Além disso, se você usa um idioma de nível superior e novas instruções ASM se tornam disponíveis (SSE, por exemplo), você só precisa atualizar seu compilador e seu código antigo pode facilmente usar as novas instruções.

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

jmq
fonte
20
  • 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.

BBB
fonte
6
Eu diria, pode vezes você vai ver compilador C código de máquina otimizado é melhor do que o seu código assembly escrito à mão
usuário
@ crucified - essa já era uma reivindicação comum (e geralmente justificada) em meados do final dos anos 90. Um compilador aplica otimizações de forma confiável e sistemática - não apenas quando percebe a oportunidade.
Steve314
15

O programa CA pode ser compilado para diferentes arquiteturas de microprocessador.

gaivota
fonte
4

nós migramos do assembler para o C na programação do microprocessador. Tenho dúvidas de que seja uma boa ideia

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.

Eu posso dizer que a sintaxe C é muito mais fácil de aprender do que a sintaxe do 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.

C é mais fácil de usar para criar programas mais complexos.

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.

Aprender C é de alguma forma mais produtivo do que aprender assembler, porque há mais coisas em desenvolvimento em torno de C que Assembler.

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.

O Assembler é uma linguagem de programação de nível inferior ao C, portanto, é uma boa opção para programar diretamente no hardware.

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.

É muito mais flexível, aludindo você a trabalhar com memória, interrupções, micro-registros, etc.

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
De que maneira a linguagem C inteira é mais complexa do que algumas das linguagens de máquina mais misteriosas? Tendo feito as duas coisas, acho que C sem as bibliotecas é consideravelmente menos complexo. Se você está se referindo à Biblioteca Padrão C, também precisa de algo assim no assembler para fazer algo útil. C pode ser um idioma maior e mais amplo, mas você não precisa conhecê-lo com o mesmo nível de detalhe. a = b[i] + c;é muito menos complicado do que as instruções para carregar b[i](o que exige computação) e os cregistros (que devem ser disponibilizados), adicionar e armazenar.
David Thornley
1
@DavidThornley Quanto mais você aprende sobre C, mais percebe como é complexo. Você conhece todas as centenas de casos de comportamento indefinido / não especificado / definido por implemento? Você conhece todas as regras implícitas de promoção de tipos em detalhes (promoções com números inteiros, conversões aritméticas comuns)? Todas as regras e sintaxe peculiares sobre os especificadores de tipo? Todas as várias formas de matrizes multidimensionais estáticas / dinâmicas, incluindo ponteiros de matriz (não confundir com ponteiros para o 1º elemento de uma matriz) Todos os recursos de C99 e C11? E assim por diante.
1
@Lundin: O importante em C é que você é capaz de fazer todas essas perguntas e encontrar respostas concretas. Compiladores em conformidade com o padrão são necessários para documentar como eles se comportam para os 62 comportamentos (não "centenas") definidos pela implementação. A pura simplicidade da montagem faz dela uma proposta do tipo traga seu próprio almoço, que, por sua vez, descarrega a complexidade com a qual C lida com seu próprio código. Eu poderia contestar seu argumento perguntando quantas bibliotecas de ponto flutuante foram escritas no assembly para qualquer arquitetura e por que o comportamento deles é definido pela implementação.
Blrfl
1
@Lundin: 62 é o número de comportamentos definidos pelo compilador listados na seção 4 do manual do GCC. Deixar de fora o que é definido pela biblioteca faz uma comparação de maçãs para maçãs, já que não há biblioteca padrão para montagem. O requisito para documentar é a primeira frase do §J.3. O GCC e um punhado de compiladores comerciais que comprei ou usei desde que o C89 foi ratificado (Intel, Sun, IBM, Portland Group), portanto o seu "maior" que não se incomoda não pode se chamar de conformista. Falando em padrões, como a montagem do x86 escrita com a sintaxe da Intel em um assembler com a sintaxe da AT&T funciona para você?
Blrfl
1
@Lundin: Meu carro está ótimo, obrigado. O volante, o acelerador, o freio, a embreagem e a haste do pisca-pisca estão todos em locais padrão, têm comportamento padrão e os outros controles estão todos claramente marcados com símbolos da norma ISO. Todas as coisas definidas pela implementação, como sistema de entretenimento, HVAC, nav, controle de cruzeiro, etc., estão documentadas em um livro grosso no porta-luvas. O conjunto é como o meu Plymouth de 1973: não havia muito, mas, na forma bruta, não era nem de longe tão capaz quanto o que estou dirigindo agora. Montagem é da mesma maneira; a complexidade vem do que você adiciona a ela.
Blrfl
1

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.

old_timer
fonte
Esses argumentos me parecem antiquados. Se você estiver usando um compilador moderno que foi escrito nos últimos 10 anos, acredito que será difícil escrever um programa assembler que seja significativamente mais eficaz que um programa em C. A não ser, talvez, você está usando alguns 30 anos arquitetura antiga dinossauro como PIC ou 8051, então você vai ter um programa lento, não importa o que você faz ...
É bastante trivial corrigir a montagem lenta gerada pelo mais moderno gcc e llvm. O 4.x gcc produz um código mais lento e menos eficiente do que a série 3.x (para alguns destinos, pelo menos os que eu avaliei, ARM, por exemplo). Eu acho que é importante dissipar a noção de que o compilador está se saindo melhor que os humanos porque não está. E mesmo quando o faz, somente quando o humano sabe o que está fazendo. "conheça suas ferramentas" se você quiser usá-las efetivamente. Comece com C e uso ASM quando necessário se você pode justificá-la ...
old_timer
Como o gcc é de código aberto, é um animal estranho. Talvez essa porta em particular seja mal feita. Todas as otimizações de código devem ser feitas para a plataforma específica, isso não é uma tarefa trivial. Seria mais justo comparar o desempenho do montador manual versus um compilador comercial para essa plataforma.
O gcc é multi-alvo, por isso faz um bom trabalho em média, mas não um ótimo para qualquer alvo em particular. E é isso que se espera. mas o seu ponto de vista sobre um compilador moderno, nos últimos 10 anos, etc. Simplesmente não se aplica, os compiladores não estão melhorando no que diz respeito ao código produzido, mas sim no que diz respeito a idiomas, destinos e recursos ao custo do código produzido. A noção de que qualquer compilador moderno torna o melhor código possível é simplesmente falsa. É verdade que, em média, é muito melhor que codificado mão assembler, difícil fazer qualquer projeto de tamanho decente em asm melhor do que C
old_timer
é por isso que a maioria das pessoas diz usar C até que haja um problema e, em seguida, repare o problema manualmente, se você puder justificá-lo. Você realmente precisa desse pequeno ganho de desempenho? É realmente onde está o seu problema de desempenho. Deseja manter esse código com asm? Você continuará verificando cada compilador futuro para ver se sua saída é reparada ou reduz o problema? para um nível aceitável etc.
old_timer 19/03/12
1

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).

Brendan
fonte
-3
  1. Relativamente bom para a eficiência da programação.
  2. É fácil programar usando a linguagem c em vez de usar assembly.
  3. A linguagem C pode ser bem mais rápida que a linguagem assembly.
  4. É possível escrever a montagem no código C, mas não C no código da montagem.
Kiran Sapkale
fonte
3
somente vantagens ....
Kiran Sapkale
3
Esta é apenas uma versão reformulada de Quais são algumas vantagens / desvantagens do uso de C sobre assembly? ; você não adicionou nada de novo à discussão aqui.
Martijn Pieters