Por que C não tem concorrentes em coisas de baixo nível? [duplicado]

14

Até onde eu sei, C é de longe a linguagem mais usada para coisas de baixo nível como programação de sistemas e embutida. Às vezes a montagem é usada, mas é quando você realmente precisa estar perto do hardware.

Minha pergunta é por que o C não tem concorrentes em desenvolvimento de baixo nível? Pode ser minha ignorância, mas tenho certeza que C é a escolha óbvia (ou possivelmente única) para programação de baixo nível.

Isso é diferente do desenvolvimento de alto nível, em que há muitas linguagens de programação concorrentes para escolher.

Como você pode explicar isso?

    
por Aviv Cohn 17.07.2014 / 23:34
fonte

8 respostas

21

Curiosamente, faço programação incorporada há 13 anos: 6 em Ada e 7 em C ++.

De qualquer forma, existem vários fatores que tornam o C adequado para este tipo de programação:

  • A biblioteca de tempo de execução / padrão necessária é muito pequena.
  • O gerenciamento manual de memória é muito útil quando a memória é limitada.
  • Fácil de determinar / tempo real, porque você não precisa se preocupar sobre quando um coletor de lixo será executado ou quando uma exceção será lançada.
  • É fácil atribuir uma variável a um endereço de memória específico, o que é crucial na criação de drivers.
  • Muitos códigos existentes disponíveis.
por 17.07.2014 / 23:50
fonte
9

Da mesma forma, hoje você pode pensar em portabilidade / compatibilidade do navegador (será que esse código é executado no Opera !?) pessoas de volta ao dia preocupadas com a portabilidade de CPU / arquitetura (esse código será executado no VAX !?).

Assim, todo fornecedor de CPU acabou enviando seus sistemas com um compilador C. Era relativamente simples de implementar, muitas pessoas sabiam que o C funcionava bem e você não precisava forçar os desenvolvedores da sua plataforma a se aprofundar no assembly subjacente.

Ao contrário do JavaScript, esse momento não estava "cozido" na arquitetura. C acabou ganhando impulso por causa de sua relação com o Unix e os esforços que foram feitos para tornar o Unix e o C portáteis através de CPUs. Você pode ler muito sobre isso em página da Wikipédia de C . Resumindo: o Unix foi um dos primeiros sistemas operacionais criados não em assembly, mas em uma linguagem de nível superior, C. Além disso, C foi desenvolvido explicitamente a partir de tentativas de portar o Unix para outras arquiteturas. Então, essas lições aprendidas ajudaram a tornar C uma linguagem de sistemas portátil. Os laboratórios da Bell criaram o Compilador Portátil C ou o pcc , o que facilitou muito o suporte a muitas arquiteturas de CPU.

Devido a esforços explícitos para portar o Unix em todos os lugares - C foi portado para todos os lugares. Então a linguagem foi uma das primeiras a ter portabilidade de baixo nível embutida em seus ossos e popularidade e ímpeto cresceram de lá.

    
por 18.07.2014 / 14:27
fonte
5

Porque C é o idioma de nível mais baixo que existe e é amplamente suportado.

Eu lembro que há muito tempo atrás, em alguma demonstração, havia um comentário:

C is just asm with more macros.

E é verdade. C é apenas alto o suficiente para permitir a escrita de código portátil, mas baixo o suficiente para que você possa ver exatamente o que está acontecendo no nível de bytes na memória quando você precisar e assim pode facilmente conectá-lo aos poucos bits de montagem que precisam ser específico da plataforma. E absolutamente nada acontece implicitamente, de modo que quando você não escreve nada, ele não requer ciclos, o que é importante quando você está escrevendo coisas críticas de desempenho em internos do sistema operacional, na biblioteca de threads e coisas do tipo.

Todas as outras linguagens de programação, exceto a montagem, são de nível superior. O que é ótimo para escrever aplicativos, mas para o código do sistema poder julgar como o código compilado se parece é mais importante.

C é também o mínimo denominador comum. Você pode chamar a biblioteca C de qualquer outro idioma. Outras línguas têm vários requisitos que dificultam a sua mistura.

    
por 18.07.2014 / 15:03
fonte
4

Para suplementar outras respostas, não se esqueça de que C foi escrito pela Bell Labs, principalmente para o projeto Unix. O próprio Unix foi reescrito em C no ano em que a linguagem foi lançada. As ferramentas e bibliotecas do sistema Unix eram baseadas em C e seguiam as convenções C. Resumindo, C é a linguagem oficial dos sistemas Unix, e hoje estamos todos usando derivados Unix (com exceção do pessoal do Windows).

Além disso, qualquer coisa de nível mais alto do que C começa a sacrificar a eficiência e a liberdade do programador para o objetivo frequentemente recomendável de segurança. Por exemplo, tente alocar um bloco de memória heap dinamicamente dimensionado em Ir. Enquanto o Go é considerado uma linguagem de sistemas, é difícil fazer manipulações de baixo nível; muitas vezes você não pode sem truques significativos ou sobrecarga. Os bons programadores C estão confiantes em sua habilidade de usar a linguagem corretamente, e não querem abandonar tal poder completo e controle refinado.

    
por 18.07.2014 / 17:44
fonte
3

1) ..C é de longe a linguagem mais usada para o baixo nível ... por quê?

É tão amplamente utilizado devido à sua idade. De acordo com Wikipedia - C (linguagem de programação) , tem 42 anos de idade . Isso significa 42 * number_of_programmers man-years do trabalho realizado. Como o C está incluído em cursos de programação básica em qualquer escola de programação séria, o número de programadores que falam C em todo o mundo é muito grande e a quantidade de código C agora disponível é muito grande.

2) ..por que C não tem concorrentes em desenvolvimento de baixo nível? ..

sua reivindicação "não tem concorrentes" não é verdadeira, por isso não tem nenhuma resposta disponível.

O VHDL (iniciado em link ) é um idioma de baixo nível muito mais eficiente para o nível mais baixo coisa. por exemplo. para expressar o paralelismo que pode ser compilado diretamente no projeto de circuitos de hardware ou "interpretado" com alta velocidade e eficiência no campo chips de hardware de matriz de portas programáveis (FPGA) .

Esta linguagem não é tão difundida como não é tão antiga, normalmente não é ensinada em cursos de programação de propósito geral, requer processadores especiais (embora baratos) para rodar. É mais exigente para a disciplina do programador e não é uma linguagem para escrever uma aplicação de "hello world" que apenas pisca com poucos LEDs ligados à porta COM ou para imprimir algumas sofisticadas tabelas de arte ASCII.

O VHDL é um concorrente C sério e muito strong para o desenvolvimento de baixo nível. Não é "apenas mais um montador". É uma mudança de paradigma

3)

Na categoria de "mínimo denominador comum", linguagens que podem substituir C, algo que seria capaz de expressar / compilar com eficiência em MMIX ( pronunciado em-mix) é uma arquitetura RISC de 64 bits projetada por Donald Knuth pode se tornar um concorrente.

Mas!

Atualmente, quem investe tempo e esforço para inventar uma nova linguagem eficiente com ferramentas, etc., escrevendo um compilador para ela, etc. Quem precisa de um tremendo esforço hoje? Que problemas resolveria ? Até os programadores querem criar filhos, querem ter vidas. Para tornar essa nova linguagem difundida, não é mais solucionável como um hobby-show-time-hobby-project. Basta comparar as bases de código de vários compiladores / IDEs com algo que você sabe, algo que você mesmo escreve - e você verá outra resposta para o porquê

    
por 18.07.2014 / 21:47
fonte
2

Existem idiomas competindo com C (para baixo nível ou programação do sistema): Rust, Cyclone, ... e talvez Go (que provavelmente é um pouco mais alto).

E há mais idiomas acadêmicos competindo com o C.

    
por 18.07.2014 / 17:58
fonte
0

Bem, a questão é o que você define como incorporado ...

O Raspberry Pi ainda é um sistema embarcado? Se sim, então há competição ... Você pode instalar o Node.JS nele e executar o JavaScript nele, ele é de alto desempenho? Um pouco? Você se importa com todos os círculos? (Para 10 usuários (não realmente) (

Então, digamos que só temos 33Mhz Você se importa com os círculos? sim Provavelmente você poderia escrever um Rust - ou um GoCode. Mas isso lhe daria alguns ciclos de troca .. (verificações de segurança, coleta de lixo (etc))

Devemos nos preocupar com os ciclos de GHz ou MHz o tempo todo? Sim e Não:)

    
por 19.07.2014 / 00:00
fonte
0

(Fonte: desenvolvedor incorporado.)

Em primeiro lugar, você precisa de uma linguagem que compila as instruções da máquina, e não algumas instruções intermediárias (por exemplo, Python, Java). Se seu compilador constrói para bytecodes de Java, o que executa os bytecodes?

O requisito de código compilado para máquina elimina muitos, muitos idiomas de alto nível.

Em segundo lugar, seu idioma precisa ser compilado para instruções de máquina de várias plataformas. OK, então o Haskell pode compilar o x86 e o ARM. Como sobre as outras dezenas de CPUs lá fora?

O vinculador de C me dá uma quantidade louca de poder. Eu posso colocar o código em um local específico. Digamos que meu processador inicialize em 0x08000. Eu posso dizer ao vinculador para armazenar o código naquele local. Eu posso dizer ao vinculador para armazenar determinado código em determinados segmentos. O carregador colocará esses segmentos em um local específico. Isso é útil se eu tiver código que eu quero ficar sem flash vs código para ficar sem RAM. O kernel do Linux coloca o código de inicialização em um pedaço de memória que é liberado posteriormente, recuperando a memória do código que é executado apenas uma vez, nunca.

Eu posso chamar assembly de C e C da montagem. A inicialização da CPU está toda em montagem. O material de baixo nível baixo é feito na montagem porque o ambiente C pode não ter sido inicializado ainda! (Algo tem que chamar main ().) As construções múltiplas de sincronização de CPU de nível muito baixo (semáforos, exclusões mútuas, etc) geralmente estão em assembly porque requerem instruções específicas da CPU. Caches, MMUs, etc, geralmente são configurados em pequenos pedaços de montagem. (O ARM é carregado com instruções específicas para configurar o cache, MMU.)

C é uma camada fina sobre montagem. C é mais rápido que a montagem. Então, o C ganha por coisas de baixo nível. C ganha porque ninguém mais surgiu com um concorrente.

    
por 21.07.2014 / 21:46
fonte