A linguagem de programação C ainda é usada?

92

Eu sou um programador C #, e a maior parte do meu desenvolvimento é para sites e alguns aplicativos do Windows. No que diz respeito a C, não uso há muito tempo, pois não havia necessidade disso. Foi uma surpresa quando uma das minhas amigas disse que precisava aprender C para testes, enquanto eu a ajudava a aprender C #.

Eu imaginei que alguém só aprenderia C para testar se há desenvolvimento sendo feito em C. De meu conhecimento, todo o desenvolvimento relacionado a COM e design de hardware também é feito em C ++. Portanto, aprender C não faz sentido se você precisar usar o C ++. Eu também não acredito em significância histórica, então por que desperdiçar tempo e dinheiro aprendendo C?

O C ainda é usado em qualquer tipo de desenvolvimento de software novo ou qualquer outra coisa?

    
por Monomeeth 15.09.2016 / 14:07
fonte

14 respostas

211

C tem a vantagem de ser uma linguagem relativamente pequena , o que torna fácil a implementação de um compilador C (enquanto um compilador C ++ é um monstro para escrever), e torna mais fácil aprender a linguagem . Veja também o índice TIOBE , de acordo com o qual C está ligeiramente à frente de C ++.

Em ordem decrescente de justificação (IMO), C ainda é muito usado para

  • Material incorporado
    É muito mais fácil portar um compilador C para uma plataforma pequena do que portar um compilador C ++. Além disso, os defensores de C afirmam que o C ++ "faz muito por trás de suas costas". No entanto, o IMO que é FUD.

  • Programação de sistemas
    Novamente, isso é geralmente devido a alegações de que é mais fácil "saber o que o compilador está fazendo". No entanto, muitos programas incorporados se beneficiariam, por exemplo, de modelos e outros recursos-chave de C ++.

  • Software de código aberto
    Isso é principalmente um problema de atitude, no entanto: OSS sempre preferiu C sobre C ++ (enquanto é o oposto em grandes partes da indústria). O ódio irracional de Torvalds pode realmente ser a razão mais importante para isso em Linux.

por 26.07.2017 / 11:15
fonte
117

O C é muito usado na programação de hardware embarcado, onde os recursos são escassos.

O kernel Linux é escrito em C porque, de acordo com Linus Torvalds, C ++ é uma linguagem horrível .

    
por 08.11.2017 / 10:44
fonte
93

Todas das linguagens modernas que vi podem interagir com C:

  • C ++
  • Java
  • Golang
  • C #
  • Python
  • Haskell
  • Objetivo C

A necessidade de interagir com o C deriva de:

  • C com uma ABI simples
  • C por aí por um longo tempo

Isso significa que, como esses idiomas podem se comunicar com C, eles podem:

  • aproveite suas bibliotecas
  • se comunicam entre si através de C (por exemplo, o Clang é escrito em C ++, mas oferece ligações do Python ligadas à sua interface C).

E eu apostaria que todos eles confiam em C por seus tempos de execução (a menos que eles tenham se reunido completamente? Duvidoso).

C é o Lingua Franca das linguagens de programação e um dos mais simples (ABI-wise) não ligados a uma arquitetura específica (como assembly é), vai levar uma grande mudança para obter livrar-se disso.

    
por 16.06.2016 / 09:53
fonte
43

Na minha opinião, esta é uma pergunta muito curta: "Meus amigos e eu ouvimos o Reggae. Alguém ainda ouve o Rap?".

Toda linguagem lá fora tem seu uso. Diferentes línguas definitivamente têm seus nichos. Mas perguntando sobre C! Tenho certeza de que menos pessoas usam C # do que C diariamente (do ponto de vista totalmente parcial de trabalhar em uma loja onde ninguém usa C #).

Pesquisa rápida no google sobre a popularidade relativa dos idiomas.
Tenho certeza de que nada disso é autoritativo, mas podemos usá-lo para ver tendências:

link
link

Mesmo observando a proporção de perguntas SO em tags: link

  • C #: 209845
  • 16 outras tags
  • C: 38790

Então, C é o 18 tópico mais popular em SO (e há muitos outros idiomas lá).

Nota: O índice TIOBE acima tem sido constantemente atualizado por mais de uma década (e alguns dados remontam a 3 décadas) supostamente mede os engenheiros que trabalham em cada idioma (embora eu não tenha ideia de como isso é preciso). Das 10 principais linguagens, exceto Java / Visual Basic, ela reflete o que as pessoas em minha loja sabem (embora nossas proporções sejam ligeiramente diferentes, pois temos um tamanho de amostra muito menor).

    
por 23.05.2017 / 14:40
fonte
23

Você pode precisar usar C quando estiver com poucos recursos e não precisar de recursos orientados a objetos.

Muitos softwares atualmente em uso ainda são escritos em C, sem mencionar os drivers de hardware.

De acordo com o índice Tiobe , o C ainda é o idioma mais usado.

Como sugerido por tcrosley, convém dar uma olhada neste questão relacionada .

Você também deve verificar alguns artigos relacionados sobre as diferenças entre C e C ++, como este wiki ou isto por exemplo.

    
por 12.04.2017 / 09:31
fonte
20

Parece que você está tentando se convencer de que C é inútil e, portanto, pode ser ignorado. Vamos quebrar sua pergunta:

"Eu imaginei que alguém só aprenderia C para testar somente se houver desenvolvimento em C."

Não, há muitas razões para aprender C. Mesmo se você não soubesse que eu ainda evitaria usar declarações gerais como essa, especialmente em conjunto com a lógica circular. Obviamente, é necessário conhecer a linguagem em que o código está escrito para poder testá-lo / corrigi-lo adequadamente, mas isso pressupõe que o idioma ainda é usado como determinado e é verdadeiro para qualquer idioma e não apenas para C.

"No meu conhecimento, todo o desenvolvimento relacionado a COM e design de hardware também é feito em C ++."

Isso está incorreto.

"Portanto, aprender C não faz sentido se você precisa usar C ++. Eu também não acredito em significância histórica, então por que perder tempo e dinheiro aprendendo C?"

Esta é a lógica mais questionável de todas. Primeiro de tudo, o significado histórico é algo em que você deve acreditar, porque se você soubesse que C é um subconjunto de C ++ e, por causa disso, saber C pode ajudá-lo a ser um C ++ melhor programador. Claro, C também foi influente para a maioria dos idiomas que vieram depois, então os benefícios não param por aí. Além disso, porque C é tão importante, não pode ser considerado como tendo apenas significado histórico. Ainda é amplamente utilizado e, portanto, não pode ser relegado a uma posição secundária como essa. Você pode argumentar que não é uma linguagem que todo programador precisa usar e ter um conhecimento profundo e que estaria certo, mas, por favor, não construa seu argumento ao dizer que você não acredita em algo sem primeiro examinar seus verdadeiros méritos. / p>     

por 26.08.2011 / 22:51
fonte
16

Além dos sistemas embarcados, a maioria dos idiomas mais novos tem alguma forma de interagir com o C. Ao escrever uma biblioteca que você deseja ter um tempo fácil de usar em todos esses idiomas, o C é uma escolha óbvia. C ++, embora também possa interagir com algumas linguagens (como Python (somente CPython)), o C ++ não pode interagir com um número maior de idiomas devido a alguns de seus recursos (principalmente o nome mangling, mas os modelos não ajudam no problema). O C ABI é um dos mais fáceis de interagir (eu sei que você pode escrever C ++ e usar extern "C" para a interface. Eu não me importo).

Também tem o benefício de que C e C ++ são realmente as melhores linguagens para programação de sistemas e os tempos de compilação C são muito mais rápidos. Os tempos de compilação do C ++ são notavelmente os piores de qualquer linguagem que usei.

Agora, enquanto há outras línguas que querem se tornar a linguagem de sistemas populares por aí (eu sei sobre D em particular), uma grande maioria de software é escrita em C / C ++. Idiomas como D exigem que alguém crie um wrapper em torno da biblioteca C em vez de apenas usá-lo diretamente (como você faria em C ++).

    
por 26.08.2011 / 15:05
fonte
11

confira langpop.com , especialmente os gráficos do Freshmeat e do Google Code. Isso mostra que C ainda está à frente.

O C ainda é popular em sistemas nos quais você precisa se aproximar do metal (ou seja, sistema embarcado) e de aplicativos que exigem muito desempenho.

    
por 26.08.2011 / 14:40
fonte
11

Eu uso quase todo dia desenvolvendo para iPad / iPhone. Muitas bibliotecas são escritas em C e não possuem um equivalente em Objective-C. Então, sim, ainda é usado, e por um dos mais novos dispositivos no mercado.

Com o C, você pode programar muitos sistemas embarcados, é pequeno e prático e provavelmente estará disponível por muitos anos (você não está perdendo tempo nem dinheiro aprendendo)

    
por 08.03.2017 / 10:00
fonte
7

Geralmente, o sistema embarcado C ainda é amplamente usado.

Esta pergunta fornece outro exemplo.

O índice Tiobe , que tenta classificar o idioma por popularidade / uso , consistentemente coloca C nos primeiros lugares.

    
por 12.04.2017 / 09:31
fonte
7

Portabilidade.

Faça uma lista de todos os sistemas que você acha que executará o código C e, em seguida, uma lista semelhante para todos os outros idiomas de que você gosta.

Se você tiver a mesma resposta que eu, a conclusão é sim.

    
por 27.08.2011 / 12:21
fonte
5

Bem, eu acho que C é o idioma mais poderoso Devido às seguintes razões!

1) No primeiro C, é uma linguagem de sistemas (o que significa que pode ser usado para fazer programação de baixo nível com o mínimo ou nenhum tempo de execução).

2) Velocidade da aplicação resultante. O código-fonte C pode ser otimizado muito mais do que as linguagens de nível mais alto, porque o conjunto de idiomas é relativamente pequeno e muito eficiente. É o mais próximo que você pode chegar da programação em linguagem assembly, sem programar em assembly. e você pode até usar assembly e C juntos!

3) C tem sua aplicação na programação de firmware (hardware). Isso se deve à sua capacidade de usar / trabalhar com montagem e se comunicar diretamente com controladores, processadores e outros dispositivos.

4) C é um bloco de construção para muitos outros idiomas atualmente conhecidos. Procure a história de C e você descobrirá que já existe há algum tempo (como as linguagens de programação, de qualquer maneira). Dê uma olhada no Python, por exemplo, uma linguagem de programação de alto nível totalmente orientada a objetos. Está escrito em C (talvez C ++ também). Isso diz a você se você quer saber o que está acontecendo em outras línguas; entender C e como funciona é essencial.

Uma linguagem de aplicativos é usada para programação de alto nível, por exemplo escrevendo um processador de texto ou jogo. Exemplos de linguagens de aplicativos são Java, C #. A razão é porque eles contêm coleta de lixo, digitação automática, validação em tempo de execução, etc. - onde o foco é a produtividade.

Uma linguagem de sistemas é usada para programação de baixo nível. por exemplo. Um microcontrolador, um driver e um kernel do sistema operacional. Os exemplos incluem montagem, C. Eles exigem pouco ou nenhum tempo de execução para executar o código diretamente no hardware, e o foco é que o programador tenha controle direto sobre o hardware.

No geral, está diminuindo como uma linguagem de aplicativos, mas ainda mantendo-se strong como uma linguagem de sistemas.

    
por 28.08.2011 / 09:09
fonte
1

Ah sim, é usado. Eu trabalho no campo do processamento de pacotes de rede. Eu tenho estado em duas empresas diferentes onde processamos pacotes de rede. Então, estamos operando no nível Ethernet ou IP, não no nível acima do TCP.

Curiosamente, nas duas empresas, o C foi escolhido em relação ao C ++. Em uma das empresas, um dos dois produtos foi construído sobre o kernel do Linux, enquanto o outro produto foi construído no espaço do usuário do Linux. O produto do kernel obviamente usou C como o kernel do Linux está programado em C, mas eles também escolheram usar o C para o produto do espaço do usuário. Ambos os produtos foram desenvolvidos a partir do ano 2000 (o produto kernel um pouco antes de 2000 e o produto userspace um pouco depois de 2000).

Na empresa em que fui depois disso, o produto foi construído em C, não em C ++. Na verdade, é uma continuação de um projeto de meados da década de 1990, embora devido a recentes demandas de melhoria de desempenho, foi decidido que essencialmente tudo será reescrito. Nós tivemos uma opção para selecionar C ++ devido a esta reescrita, mas não o fez.

No campo do processamento de pacotes de rede, o desempenho conta muito. Então, eu quero implementar minha própria tabela de hash com maior desempenho do que as tabelas de hash existentes. Eu, não o autor da tabela de hash, sou quem seleciona qual função hash deve ser usada. Talvez eu queira performance e escolha MurMurHash3 . Talvez eu queira segurança e vá para SipHash . Alocadores de memória são obviamente personalizados. Na verdade, todas as estruturas de dados importantes que usamos foram implementadas de forma personalizada para o melhor desempenho possível.

Embora não haja nada que impeça o uso de C ++, geralmente é uma má idéia. Uma única exceção lançada por pacote deixará a taxa de processamento de pacotes em níveis inaceitáveis! Portanto, não podemos usar as exceções do C ++. Muito devagar. Já estamos usando o tipo de código C orientado a objeto implementando estruturas de dados como estruturas e, em seguida, implementando funções operando nessas estruturas. C ++ permitiria ter funções virtuais, mas, novamente, as chamadas de função virtual matariam o desempenho se fossem usadas em todos os lugares. Portanto, é melhor ser explícito e ter um ponteiro de função se as chamadas de função virtual forem necessárias.

O C ++ fará muitas coisas pelas suas costas: alocação de memória, etc. Por outro lado, em C isso geralmente não acontece. Você pode escrever uma função que aloque memória, mas geralmente é aparente a partir da interface da função que a alocação está acontecendo.

Como exemplo do tipo de micro-otimizações que você pode fazer ao programar em C, dê uma olhada na macro container_of no kernel do Linux. Claro, você poderia usar container_of em código C ++, mas quem faz isso? Quer dizer, é totalmente aceitável na maioria dos programas em C, mas os programadores típicos de C ++ imediatamente propõem outra coisa, como uma lista encadeada que aloca os nós de link como blocos separados. Nós não queremos isso porque cada bloco de memória alocado é ruim para o desempenho.

Talvez a única coisa que nos beneficiaria em C ++ seja que o C ++ permita a metaprogramação de modelos, o que significa que você pode, às vezes, evitar chamadas de função virtual enquanto ainda tem um parâmetro de função e permitir que o compilador inline as funções. Mas a metaprogramação de template é complicada, e conseguimos atender a todos os requisitos em C, então o benefício desse recurso em C ++ não é tão crítico.

Em uma das empresas, tivemos uma linguagem compilada personalizada na qual parte dos recursos foram implementados. Adivinhe qual era o idioma de destino do compilador? Montagem? Não, nós tivemos que suportar arquiteturas de 32 e 64 bits. C ++? Certamente você está brincando. Obviamente, foi C com goto computado do GCC. Então, a linguagem customizada foi compilada para C (ou, na verdade, a variante gcc de C que suportava goto computado), e o compilador C produzia o assembly.

    
por 26.07.2017 / 19:41
fonte
0

Eu ainda uso C diariamente e uma das principais razões é a interoperabilidade com outras linguagens e um SDK projetado para ser usado por plugins construídos por todos os tipos de compiladores em vários idiomas.

Eu não posso escrever uma API C ++ que use classes com construtores e destruidores e vtables, sobrecarga de funções, gera exceções, etc. que podem ser usados a partir de Lua, C #, Python, C, etc. usando compiladores e configurações diferentes da nossa.

Não consigo escrever um SDK C # que possa ser chamado a partir do Python, por exemplo, ou um SDK do Python que possa ser chamado de C #.

C é a única linguagem aqui que me permite criar uma API que pode ser chamada de qualquer um desses idiomas. Dito isso, muitas vezes eu uso o C ++ para implementar essas interfaces C (embora às vezes eu apenas as implemente em C).

Além disso, às vezes acho o C a linguagem mais fácil de se trabalhar para coisas como estruturas de dados de baixo nível e alocadores de memória. Todo o tipo extra de segurança que você ganha em C ++ não ajuda se você estiver escrevendo um alocador de memória projetado para agrupar bits e bytes alinhados. E contra o rico sistema de tipos e o tratamento de exceções do C ++, não é fácil desenvolver suas próprias estruturas de dados - basta observar quanto esforço é necessário para escrever uma estrutura de dados tão trivial quanto std::vector se você quiser torná-la isenta de exceções e evite invocar ctors e dtors em elementos que você não inseriu no container (estou falando como alguém que implementou toda a biblioteca padrão C ++). Quando apenas um array expansível é muito difícil de implementar, imagine o trabalho necessário para implementar um BVH com qualidade de produção.

Eu prefiro o C ++ ao C quando eu quiser usar estruturas de dados existentes ou implementar estruturas de alto nível usando as existentes, mas se eu estiver implementando uma estrutura de dados de baixo nível o núcleo de um mecanismo que não tem uso para estruturas de dados existentes, C definitivamente torna isso muito mais fácil de fazer com seu sistema de tipo simplista que permite que você apenasmemcpy as coisas aqui e memmove as coisas, malloc a contíguo block e realloc lá, sem se preocupar com construtores, destruidores e exceções sendo lançados.

    
por 17.01.2018 / 17:55
fonte