Quase todo mundo agora diz a bênção:
desempenho !
Ok, C permite escrever código atlético. Mas existem outros idiomas que podem fazer isso, afinal! E o poder de otimização dos compiladores modernos é impressionante. Does C tem algumas vantagens que nenhuma outra língua tem? Ou simplesmente não há necessidade de instrumentos mais flexíveis no domínio?
programming-languages
c
embedded-systems
videiras
fonte
fonte
Respostas:
Isso faz parte disso; o uso determinístico de recursos é importante em dispositivos com recursos limitados, mas existem outros motivos.
fonte
O C foi projetado para modelar uma CPU, porque o C foi criado para tornar o Unix portátil em várias plataformas, em vez de apenas escrever a linguagem assembly.
Isso significa que os programas C funcionam bem como uma linguagem de programação para programas que precisam ter um nível de abstração muito próximo da CPU real, que é o caso do hardware incorporado.
Nota: C foi projetado por volta de 1970 e as CPUs eram mais simples.
fonte
Uma razão para a dominação é que ela possui o tipo certo de ferramentas para a tarefa. Depois de ter desenvolvido em plataformas incorporadas em Java e C / C ++, posso dizer que a abordagem básica do C ++ é apenas mais natural. Salvar o desenvolvedor de sentir que ele está pulando nos aros porque a linguagem é de nível muito alto é uma coisa bastante irritante. Um bom exemplo é a ausência de variáveis não assinadas em Java.
E os recursos úteis de VM / linguagens interpretadas geralmente não são viáveis e são deixados de fora da implementação, por exemplo, coleta de lixo.
fonte
C requer muito pouco suporte de tempo de execução por si só, portanto a sobrecarga é muito menor. Você não gasta memória ou armazenamento no suporte ao tempo de execução, gasta tempo / esforço para minimizar esse suporte ou precisa permitir isso no design do seu projeto.
fonte
switch
es são horríveis e as mesmas máquinas construídas com hierarquias de classe são agradáveis e sustentáveis.switch
, você poderia dizer) ainda é usada em muitos aplicativos incorporados. Mais fácil de depurar, mais fácil de verificar.Como mencionado em outras respostas, o C foi desenvolvido no início dos anos 70 para substituir a linguagem assembly em uma arquitetura de minicomputador. Naquela época, esses computadores geralmente custavam dezenas de milhares de dólares, incluindo memória e periféricos.
Atualmente, você pode obter a mesma ou maior potência do computador com um microcontrolador incorporado de 16 bits que custa quatro dólares ou menos em quantidades únicas - incluindo RAM incorporada e controladores de E / S. Um microcontrolador de 32 bits custa talvez um dólar ou dois a mais.
Quando estou programando esses pequenos, que é o que faço 90% do tempo em que não estou projetando as placas em que elas se assentam, gosto de visualizar o que o processador fará. Se eu pudesse programar rápido o suficiente no assembler, eu o faria.
Não quero todos os tipos de camadas de abstração. Costumo depurar percorrendo uma lista de dissimuladores na tela. É muito mais fácil fazer isso quando você escreve o programa em C, para começar.
fonte
Ele não domina inteiramente, pois o C ++ está sendo cada vez mais usado, pois os compiladores melhoraram e o desempenho do hardware aumentou. No entanto, C ainda é muito popular por alguns motivos;
Amplo suporte. Praticamente todo fornecedor de chips fornece um compilador de corrente alternada e qualquer código de exemplo e drivers provavelmente serão escritos em c. Os compiladores C ++ são cada vez mais comuns, mas não um certificado morto para um determinado chip, e geralmente são mais complicados. Você também sabe que qualquer engenheiro incorporado poderá trabalhar em c. É a lingua franca da indústria.
Atuação. Sim, você disse isso. O desempenho ainda é fundamental e em um ambiente em que as rotinas principais ainda são escritas no assembler, ou pelo menos otimizadas em c com referência à saída do assembly, nunca subestimam a importância disso. Muitas vezes, os alvos incorporados têm um custo muito baixo e têm memórias muito pequenas e poucos mips.
Tamanho. C ++ tende a ser maior. Certamente, qualquer coisa usando o STL será maior. Geralmente, tanto em termos de tamanho do programa quanto em tamanho da memória.
Conservadorismo. É uma indústria muito conservadora. Em parte porque os custos da falha geralmente são mais altos e a depuração geralmente é menos acessível, em parte porque não precisa ser alterada. Para um pequeno projeto incorporado c faz o trabalho bem.
fonte
Para sistemas embarcados, o principal é desempenho . Mas, como você disse, por que C e não outra linguagem de desempenho?
Até agora, muitas pessoas mencionaram a disponibilidade dos compiladores , mas ninguém mencionou a disponibilidade dos desenvolvedores . Muito mais desenvolvedores já conhecem C do que, digamos, OCaml.
Esses são os três figurões.
fonte
O software incorporado é muito diferente.
Em um aplicativo de desktop, abstrações e bibliotecas economizam muito tempo de desenvolvimento. Você tem o luxo de jogar outros megabytes ou gigabytes de RAM ou alguns núcleos de CPU de 2 + GHz e 64 bits em um problema, e outra pessoa (usuários) está pagando por esse hardware. Talvez você não saiba em quais sistemas o aplicativo será executado.
Em um projeto incorporado, os recursos geralmente são muito limitados. Em um projeto em que trabalhei (processadores da série PIC 17X), o hardware tinha 2Kwords de memória de programa, 8 níveis de pilha (no hardware) e 192 bytes (<0,2kB) de RAM. Diferentes pinos de E / S tinham recursos diferentes e você configurou o hardware conforme necessário, gravando nos registros de hardware. A depuração envolve um osciloscópio e analisador lógico.
No incorporado, as abstrações geralmente atrapalham e gerenciam (e custam) recursos que você não possui. Por exemplo, a maioria dos sistemas embarcados não possui sistema de arquivos. Os fornos de microondas são sistemas embarcados. Controladores de motor de carro. Algumas escovas de dente elétricas. Alguns fones de ouvido com cancelamento de ruído.
Um fator muito importante para mim no desenvolvimento de sistemas embarcados é conhecer e controlar o que o código traduz em termos de instruções, recursos, memória e tempo de execução. Frequentemente, a sequência exata de instruções controla, por exemplo, o tempo para as formas de onda da interface de hardware.
Abstrações e 'mágica' nos bastidores (por exemplo, um coletor de lixo) são ótimas para aplicativos de desktop. Os coletores de lixo economizam muito tempo procurando vazamentos de memória, quando a memória é / pode ser alocada dinamicamente.
No entanto, no mundo incorporado em tempo real, precisamos saber e controlar quanto tempo as coisas demoram, às vezes até nanossegundos, e não podemos jogar mais alguns meg de RAM ou uma CPU mais rápida em um problema. Um exemplo simples: ao fazer o escurecimento dos LEDs por software, controlando o ciclo de trabalho (a CPU tinha apenas o controle liga / desliga dos LEDs), NÃO está OK o processador desligar e fazer, por exemplo, coleta de lixo por 100ms, pois a tela seria visivelmente visível. piscar brilhante ou sair.
Um exemplo mais hipotético é um controlador de motor que aciona diretamente velas de ignição. Se essa CPU desligar e coletar lixo por 50ms, o motor será interrompido por um momento ou disparará na posição errada do virabrequim, potencialmente paralisando o motor (ao passar?) Ou danificando-o mecanicamente. Você pode matar alguém.
fonte