Pergunta

Nesta época de muitas línguas, parece haver uma grande linguagem para praticamente todas as tarefas e encontro-me profissionalmente lutando contra um mantra de " nada, mas C é rápido ", onde rápido é realmente a intenção de significar "rápido o suficiente". Eu trabalho com pessoas de mente aberta muito racionais, que gostam de comparar números, e tudo o que tenho são os pensamentos e opiniões. Você poderia me ajudar a encontrar meu caminho passado opiniões subjetivas e para o "mundo real"?

Você me ajudaria a encontrar a pesquisa, como o que se quaisquer outras línguas poderiam ser usados ??para incorporado e sistemas (Linux) de programação? Eu poderia muito bem estar empurrando uma hipótese falsa e gostaria muito de receber pesquisas para me mostrar isso. Você poderia por favor ligar ou incluir bons números, a fim de ajudar a manter o "isso é só seu / sua opinião", comenta a um mínimo.


Então, essas são as minhas necessidades específicas

  • memória não é uma restrição séria
  • portabilidade não é uma preocupação séria
  • este não é um sistema em tempo real
Foi útil?

Solução

"Nothing but C é rápido [o suficiente]" é uma otimização cedo e errado para todos os motivos que os primeiros otimizações estão errados. Se o seu sistema tem complexidade suficiente para que algo diferente de C é desejável, em seguida, haverá partes do sistema que deve ser "suficientemente rápido" e peças com restrições mais leves. Se escrever o seu código, por exemplo, em Python vai ter o projeto concluído mais rapidamente, com menos erros, então você pode acompanhar com alguns C ou assembly de código para acelerar as partes de tempo crítico.

Mesmo se se verificar que todo o código deve ser escrito em C ou conjunto para atender aos requisitos de desempenho, criação de protótipos em uma linguagem como Python pode ter benefícios reais. Você pode ter o seu protótipo Python trabalhando e, gradualmente, substituir as peças com código C até atingir o desempenho necessário.

Então, use as ferramentas que lhe permitem obter o trabalho de desenvolvimento feito mais corretamente e mais rapidamente, em seguida, utilizar dados reais para determinar onde você precisa para otimizar. Pode ser que C é o instrumento mais adequado para começar às vezes, mas certamente não sempre, mesmo em sistemas embarcados.

Outras dicas

Na minha experiência, usando C para programação de sistemas embarcados e não é necessariamente um problema de desempenho - é muitas vezes uma questão de portabilidade. C tende a ser o, idioma suportado bem mais portátil em praticamente todas as plataformas, especialmente em plataformas de sistemas embarcados.

Se você quiser usar algo mais em um sistema embarcado, muitas vezes é uma questão de descobrir quais opções estão disponíveis, em seguida, determinar se o desempenho, o consumo de memória, suporte de biblioteca, etc, são "suficientemente bom" para a sua situação.

Usando C para sistemas embarcados tem algumas muito boas razões, das quais "performance" é apenas um do menor. Incorporado está muito perto do hardware, você necessidade de memória manual adressing para se comunicar com hardware. Todas as APIs e SDKs estão disponíveis para C na maior parte.

Existem apenas algumas plataformas que podem ser executados a VM para Java ou Mono que é parcialmente devido às implicações de desempenho, mas também devido aos custos de implementação caros.

Além de desempenho, há uma outra consideração: você provavelmente vai ser lidar com APIs de baixo nível que foram projetados para ser usado em C ou C ++ .

Se você não pode usar alguns SDK, você só vai arranjar problemas ao invés de poupar tempo com o desenvolvimento usando uma linguagem de alto nível. No mínimo, você vai acabar refazer um monte de declarações de função e definições constantes.

Para C:

  • C é muitas vezes a única língua que é suportado por compiladores por processadores.
  • A maioria do código bibliotecas e exemplo é a probabilidade também em C.
  • A maioria dos desenvolvedores de sistemas embarcados têm anos de experiência C, mas muito pouca experiência em qualquer outra coisa.
  • Permite hardware direta interface e gerenciamento de memória manual.
  • Fácil integração com a linguagem assembly.

C vai ser em torno de muitos anos. No desenvolvimento de sistemas embarcados é um monopólio que sufoca qualquer tentativa de mudança. Uma linguagem que precisa de uma VM como Java ou Lua nunca vai ir dominante no ambiente incorporado. A linguagem compilada pode ter uma chance se fornecem convincentes novas funcionalidades C.

Existem várias referências na web entre diferentes linguagens. A maioria deles você vai encontrar uma implementação C ou C ++ no topo como eles dão-lhe mais controle para as coisas realmente otimizar.

Exemplo:. A Linguagem Informática Benchmarks Jogo

É difícil discutir contra C (ou outras linguagens de procedimento como Pascal, Modula-2, Ada) e montagem para embutido. Há uma grande história de sucesso com esses idiomas. Geralmente, você deseja remover o risco do desconhecido. Tentando usar qualquer coisa que não seja C ou montagem, na minha opinião, é uma incógnita. Dito isto, não há nada de errado com um modelo misto onde você usar um dos esquemas que vão para C, ou Python ou Lua ou JavaScript como uma linguagem de script.

O que você quer é a capacidade de rápida e facilmente ir para C quando você tem que.

Se você convencer a equipe para ir com algo que não está provada a eles, o projeto é o seu cookie. Se ele se desintegra, ele provavelmente vai ser visto como culpa sua.

Este artigo (por Michael Barr) fala sobre o uso de C, C ++, montador e outros idiomas em sistemas embarcados, e inclui um gráfico que mostra o uso relativo de cada um deles.

E aqui está outro artigo, apropriadamente intitulado, razões pobres para rejeitar C ++ .

Há situações onde você precisa de desempenho em tempo real, especialmente em sistemas embarcados. Você também tem restrições de memória graves. A linguagem como C dá-lhe maior controle sobre o tempo de execução e espaço de execução.

Então, dependendo do que você está fazendo, C pode muito bem ser "melhor" ou mais adequada.

Confira os seguintes artigos

Ada é uma linguagem de programação de alto nível que foi projetado para sistemas embarcados e sistemas de missão crítica.

É uma linguagem rápido e seguro que tem verificação de dados construídos em toda parte. É o que os pilotos de automóveis em aviões estão programados na.

Na este link você tem uma comparação entre Ada e C.

Você pode querer olhar para a linguagem de programação D . Ele poderia usar algum ajuste de desempenho, uma vez que existem algumas áreas Python pode superar isso. Eu realmente não posso apontar-lhe o benchmarking comparações desde não foram mantendo uma lista, mas como apontado por Peter Olsson, Benchmarks & implementações de linguagem tem D digital Mars.

Você provavelmente também quer olhar para estas perguntas encantadoras:

C é onipresente, disponível para quase qualquer arquitetura, geralmente a partir do dia um de disponibilidade de um processador. C ++ é um segundo próximo. Se o seu sistema pode suportar C ++ e você tem o conhecimento necessário, usá-lo em detrimento de C - é tudo o que C é, e muito mais, por isso há poucas razões para não usá-lo

.

C ++ é uma linguagem de maior, e há construções e técnicas compatíveis que podem consumir recursos ou se comportar de maneiras inaceitáveis ??em um sistema embarcado, mas isso não é uma razão para não usar a linguagem, mas sim como usá-lo de forma adequada.

Java e C # (em Micro.Net ou WinCE) podem ser alternativas viáveis ??para não-tempo-real.

Eu não sou realmente uma sistemas / programador incorporado, mas parece-me que os programas embutidos geralmente precisam de desempenho determinista - que imediatamente exclui muitas linguagens de lixo coletado, porque eles são não determinista em geral . No entanto, tem havido trabalho sobre coleta de lixo determinística (por exemplo, Metronome for Java: http://www.ibm.com/developerworks/java/library/j-rtj4/index.html )

A questão é um dos constrangimentos -. Fazer as línguas / runtimes atender o uso determinista, memória, etc requisitos

C realmente é sua melhor escolha.

Há uma diferença para escrever código C portátil e ficando muito profundamente no ghee whiz características de um compilador ou canto específico casos da linguagem (que deve ser evitado). Mas portabilidade entre compiladores e versões do compilador. O número de funcionários que será capaz de desenvolver para ou manter o código. Os compiladores vão ter um tempo mais fácil com ele e produzir melhor, mais limpo e código mais confiável.

C não vai a lugar nenhum, com todas as novas línguas sendo projetado para corrigir as falhas em todas as línguas anteriores. C, com todas as falhas destes novos idiomas estão tentando consertar, ainda está forte.

Aqui estão algumas artigos que comparam C # para C ++:

http://systematicgaming.wordpress.com/ 2009/01/03 / performance-c-vs-c /

http: //journal.stuffwithstuff. com / 2009/01/03 / desmascarando-c-vs-c-performance /

Não é exatamente o que você pediu, como ele não tem um foco em programação C incorporado. Mas é interessante no entanto. O primeiro demonstra o desempenho do C ++ e os benefícios do uso de código "inseguro" para tarefas de processamento intensivo. O segundo um pouco desmascara o primeiro e mostra que se você escrever o código C # um pouco diferente, em seguida, o desempenho é quase o mesmo.

Então, eu vou dizer que C ou C ++ pode ser o vencedor claro em termos de desempenho em muitos casos. Mas muitas vezes a margem é pequena. Se usar C ou não é outro assunto completamente. Na minha opinião ele realmente deve depender da tarefa em mãos. Mas em sistemas embarcados muitas vezes você não tem muita escolha.

Algumas pessoas mencionaram Lua. Pessoas que eu conheço que já trabalharam com sistemas embarcados têm dito Lua é útil, mas não é realmente a sua própria língua em si, mas mais de uma biblioteca que pode ser incorporado em C. É direcionados para o uso em sistemas embarcados e geralmente você vai querer para chamar código Lua a partir de C. Mas C puro marcas para mais simples (embora não necessariamente mais fácil) a manutenção, já que todo mundo sabe disso.

Dependendo da plataforma embarcada, se restrições de memória são um problema, você provavelmente necessidade de usar um não-lixo coletado linguagem de programação.

C a este respeito é provavelmente o mais bem conhecido pela equipe e os mais amplamente apoiada com bibliotecas e ferramentas disponíveis.

A verdade é - nem sempre.

Parece .NET runtime (mas qualquer outro tempo de execução pode ser tomado como um exemplo) impõe vários MBs de sobrecarga de tempo de execução. Se isso é tudo que você tem (na RAM), então você está fora de sorte. JavaME parece ser mais compacto, mas ainda tudo depende de recursos que tem à sua disposição.

compiladores C são muito mais rápidos, mesmo em sistemas desktop, porque da forma como langage algumas características não são comparados com C ++, então eu imagino que a diferença não é trivial em sistemas embarcados. Isso se traduz em mais rápido iteração vezes, embora OTOH você não tem as conveniências de C ++ (como coleções), que pode atrasá-lo no longo prazo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top