Você usaria C hoje para um projeto de software? [fechadas]


18

Se sim, onde e por que você o usaria?

Se não, forneça uma explicação sobre por que C não é aceitável para você.


10
É claro que existem aplicativos para os quais C é a escolha certa e óbvia, mas, pessoalmente, se eu nunca mais usar um bloco de memória novamente, morrerei feliz.
Adam Crossland

Sim - Cavalos para cursos.
Martijn Verburg

O que isso significa?
Luca Matteis

É um ditado antigo para quem acompanha as corridas de cavalos. Basicamente, significa que qualquer cavalo pode vencer em seu dia, contanto que o percurso (seco, lamacento, longo, curto, o que for) seja adequado. O mesmo vale para linguagens de programação - sempre depende do contexto e do domínio do problema.
Martijn Verburg

2
Não, mas apenas porque hoje não estou trabalhando em nenhum projeto para o qual C seria uma boa escolha de idioma. Me pergunte novamente amanhã.
James McNellis

Respostas:


38

C é uma ótima linguagem para programação do sistema

Eu usaria C se implementasse alguns drivers de harware. E eu usaria C se implementasse meu próprio kernel do sistema operacional ou minha própria máquina virtual.

É uma linguagem muito boa para fazer coisas de baixo nível se você precisar lidar com hardware ou APIs de SO de baixo nível para API do Windows, Linux, Mac OS X, Solaris e assim por diante ... Os sistemas embarcados geralmente oferecem um bom suporte para C com um compilador + kit de desenvolvimento.


4
Você pode apontar onde "o Mac OS é Linux"? Eu pensei que o Mac OS fosse Darwin: en.wikipedia.org/wiki/Darwin_%28operating_system%29
LennyProgrammers

1
@ Stephen Furlani: LOL - sim, isso é meio que um eufemismo. :-) Existem muitos Unices mortos, como Xenix, DYNIX e A / UX, e as versões atuais que a maioria de nós não vê como o HP-UX. A árvore genealógica é tão complicada e confusa quanto a das famílias reais européias.
Bob Murphy

4
C é uma linguagem horrível para a programação do sistema. Sabemos que há mais de 20 anos, desde o Morris Worm, e qualquer um que ainda o utilize para qualquer projeto com todos os requisitos de segurança, especialmente sistemas operacionais ou aplicativos voltados para a rede, deve enfrentar acusações de negligência criminal.
Mason Wheeler

2
@Mason Wheeler: O que devemos usar em vez disso?
Steve S

1
@Mason Wheeler: Hmm ... Eu demiti Pascal no passado, mas talvez seja hora de dar outra olhada (mais próxima). Você tem outras sugestões?
Steve S

17

Sim, claro. Eu usaria C para escrever partes críticas do sistema ou partes de comunicação de baixo nível. Por exemplo, eu usaria C para escrever NIFs no projeto Erlang apenas porque é a ferramenta certa (tm) para esse tipo de trabalho. Ou eu usaria C para escrever partes semelhantes (XS) no projeto Perl.


16

Uso C profissionalmente, quase todos os dias. De fato, C é o idioma de nível mais alto no qual eu programa regularmente.

Onde uso C: escrevo código de biblioteca de baixo nível que exige ser o mais eficiente possível. Meu código de cola é escrito em C, os loops computacionais internos são escritos em assembly.

Por que eu uso C: É muito mais simples lidar com estruturas de argumentos complexas e condições de erro do que na montagem, e a sobrecarga de desempenho para esse tipo de verificação de condição antes de iniciar o cálculo real é geralmente insignificante. Como C é uma linguagem simples e bem especificada, é fácil trabalhar com a equipe do compilador trabalhando para melhorar a geração de código sempre que vejo código compilado com riscos inaceitáveis ​​de desempenho.

A portabilidade é outra grande virtude do C. Meu código de cola é compartilhado em várias implementações específicas de hardware das bibliotecas nas quais trabalho, o que realmente simplifica a criação de suporte para novas plataformas. A maioria das plataformas não possui uma máquina virtual ou intérprete para o sabor do idioma do mês. Algumas plataformas não possuem um bom compilador C ++. Existem muito poucas plataformas que não possuem um compilador C utilizável (e, como eu tenho um bom relacionamento de trabalho com nossa equipe de compiladores, normalmente não tenho dificuldade em obter o suporte necessário).


6
Parece que você tem um trabalho muito divertido!
Paul Nathan

Este é o meu emprego dos sonhos.
rsmahanti

5

Sim, eu usaria C em um sistema incorporado severamente restrito por recursos. Eu vez disso, posso usar o C ++ porque facilita a promoção de interfaces fortes entre os componentes de software, mas apenas se todos os engenheiros que trabalham no projeto entenderem que o C ++ é fácil de usar indevidamente, causando inchaço no tamanho do código (funções e modelos virtuais são exemplos de coisas a serem evitadas )

Também vi um programador em C ++ tentando criar um objeto de 10K em uma pilha de 1K, o que não é uma boa ideia.


2
na verdade, as virtualfunções são boas, pois seguem o princípio "você não paga pelo que não usa", mas, em ambiente com memória restrita, convém desativar as exceções e o RTTI.
Matthieu M.

Sinto que estou sempre apenas criando objetos singleton em C ++ para fornecer interfaces periféricas. Acho que as pessoas escolhem C ++ em vez de C em sistemas embarcados porque acham que C ++ é "melhor".
Erik

5

Eu trabalho principalmente com o hipervisor Xen, as diversas bibliotecas que ele apresenta e o kernel do Linux. Na ocasião, tenho que escrever um driver de dispositivo (ou reescrever um driver para que as máquinas virtuais nxx possam compartilhar um único dispositivo, como um HRNG). C é minha língua principal e estou muito feliz com isso.

Eu tentaria escrever um programa de planilha usando-o? De jeito nenhum. Cada ferramenta tem suas aplicações e estou feliz por ter muitas ferramentas.

Eu amo C, mas não tento bater nos parafusos com um martelo.

Se C é uma escolha sensata para um novo projeto, com certeza. Caso contrário, usarei outra coisa.


4

Eu faria para alguns projetos. Definitivamente, se eu tivesse que implementar um sistema embarcado, digamos, para o controlador de uma aeronave autônoma. Pode até diminuir o nível em algumas peças com montagem.

Se ele se encaixa no projeto, não tenho nenhum problema.

Se você deseja desenvolver um aplicativo Web, hmm, provavelmente não (ou eu precisaria ver uma justificativa muito forte e apoiada em fatos).

Eu também o usaria de outros projetos desenvolvidos principalmente com outros idiomas quando um gargalo foi claramente identificado e uma otimização pode ser implementada usando código nativo. Por exemplo, uma solução Java que precisa realizar cálculos intensivos para algumas renderizações avançadas (por exemplo, um mecanismo de renderização ou algo assim). Você pode usar como padrão uma implementação Java se não for uma plataforma suportada, mas fornecer uma implementação compilada nativamente do C para algumas plataformas suportadas e obter um bom aumento de desempenho.


Você quer um motivo para usá-lo em um aplicativo da web? O Memcached é escrito em C e é uma parte essencial de muitos aplicativos da web. Além disso, um colega meu escreveu um código referente a um site de rede social em C - uma vez que é algoritmicamente complexo, com conjuntos de dados limitados ao tamanho da RAM economicamente disponível e lidando com consultas que são executadas em média 23 vezes por renderização de página. economizamos 4 meses de salário de programadores em servidores, com um aplicativo C de 4 dias.
Qdot

@qdot: É uma razão válida. Há também uma razão pela qual existem boas estruturas para os desenvolvedores web C e C ++. Apenas não seria minha primeira escolha, se necessário, para desenvolver um aplicativo ou site da web em geral. No caso de uma estrutura como o memcached, obviamente faz todo o sentido. Da mesma forma, ter o servidor em C pode fazer sentido. Daí o provavelmente não. Memcached (e sua implementação específica em C de uma parte intensiva da computação de um aplicativo da web) são usos perfeitamente válidos do C para web dev. Mas você precisa de um bom programador C para fazer isso. Apenas não alguém que o pegasse no caminho ou esperasse problemas.
haylem

E se outras pessoas tiverem outros motivos válidos como esses, poste-os aqui! É útil para os leitores.
haylem

Se você usa C, aprende a esperar ótimo desempenho, boa experiência de aprendizado e toneladas de problemas inexplicáveis ​​no início. Eu apenas tentei incentivar as pessoas a usar o C, uma vez que isso se torna rapidamente crucial quando você deixa de ser um desenvolvedor de um em um milhão de PHP / Ruby / Python e começa a coçar a cabeça contra grandes problemas de computação.
Qdot

@ qdot: de fato. Pena que muitas pessoas não conhecem mais C, realmente.
haylem

4

Cada idioma tem um nicho de uso decente. Frequentemente, eu me pego implementando coisas em linguagens de nível superior e, gradualmente, trazendo-as para o C-land, se eu precisar delas com desempenho superior ou simplesmente mais portáteis. Existem compiladores C para quase tudo o que existe e, se você escrever em uma API universalmente disponível (como POSIX), ela poderá ser muito útil.

O que digo frequentemente às pessoas que estão interessadas em aprender programação hoje é garantir que, em algum momento, aprendam C e se sintam confortáveis ​​com ela. Você pode se encontrar em circunstâncias em que precisa. Em mais de uma ocasião, eu tive que compilar um pequeno programa de "reinicialização rápida" estaticamente vinculado e usar o scp para colocá-lo em um disco RAM em um servidor onde o subsistema de disco foi completamente desativado. (Servidores baratos e baratos, sem redundância online e apenas a capacidade de carregar um pequeno programa? C é o caminho a seguir.)

Além disso, aprender a trabalhar em C sem dar um tiro no pé pode contribuir significativamente para a capacidade de escrever com eficiência em outros idiomas e ambiente. Pelo menos essa tem sido a minha experiência.

Embora eu certamente não o use para tudo, ou mesmo para a maioria das coisas, ele tem o seu lugar e é praticamente universal: então sim, eu o usei no passado e o usarei no futuro (embora não o faça saber quando no momento).


4

Sim, eu faço isso o tempo todo.

Se você não chamar nenhuma biblioteca, o código gerado a partir de C não precisará de suporte do SO. Também oferece controle fino sobre a linguagem de máquina gerada. Portanto, é ótimo para escrever drivers ou outro código que mora nos espaços do kernel e outras situações restritas, como muitos tipos de sistemas incorporados funcionam. É também o idioma principal para projetos de código aberto com os quais trabalho, como X Windows, GTK + e Clutter.

Enquanto você pode fazer tudo em C em C ++, os mecanismos do C ++ tornam mais rápido e fácil a criação de código. Adoro OOP e a maneira como as classes C ++ encapsulam a funcionalidade e adoro RAII. O uso cuidadoso da invocação automática de destruidor quando um objeto fica fora do escopo elimina a maioria dos vazamentos de memória e recursos que são prejudiciais à programação em C. O STL é basicamente uma biblioteca gigante de algoritmos e estruturas de dados altamente otimizados; se você quiser usá-los em C, precisará escrevê-los ou comprá-los em algum lugar.

Infelizmente, por razões que não entendi, o sistema de tempo de execução no Linux requer uma biblioteca de objetos compartilhados especial (equivalente a DLL no Windows, dylib no Mac) para executar qualquer C ++, e não é encontrado quando você executa um programa em C. Portanto, não posso fazer um dos meus truques favoritos para Mac e Windows, que é escrever um objeto compartilhado baseado em C ++ com uma API baseada em C e chamá-lo em um programa em C.

Então, aqui está o meu processo de tomada de decisão:

  1. Estou trabalhando em uma situação restrita como um driver de dispositivo? Use C.
  2. Estou escrevendo uma biblioteca Linux que mais alguém precisará usar? Use C.
  3. Estou trabalhando dentro do código que já está escrito em C? Use C.
  4. Estou escrevendo uma biblioteca para Mac ou Windows ou apenas uma biblioteca Linux que usarei? Escreva os internos em C ++, mas exponha apenas uma interface C para evitar o problema frágil da interface binária.
  5. Use C ++.

Uma coisa boa é que, como o C ++ pode compilar C, se você realmente precisar de controle refinado sobre o código gerado para uma situação específica, basta escrever C para isso e C ++ para o restante e compilar tudo com o compilador C ++ .


Você não pode "compilar tudo isso com um compilador C" por causa do problema do malloc com o C ++ - é necessário transmitir em C ++, mas não em C. É claro que tudo bem se você transmitir o código C que é perfeitamente legal, mas irritante .
alternativa

1
@mathepic: Sim, C ++ é decididamente mais rigoroso que C em muitas coisas, incluindo a atribuição de ponteiros nulos a ponteiros digitados. No entanto, estou corrigindo erros em alguns projetos herdados, em parte compilando arquivos C com C ++. Eu estou achando tipo de fundição os resultados de malloc para ser um pequeno preço a pagar para ter os bugs do compilador C ++ uncover sutis devido ao código que é perfeitamente legal em C.
Bob Murphy

3

Sim, mas depende do projeto. C é muito bom para alguns projetos de baixo nível ou parte da maior solução.

Por exemplo. Para a lógica de negócios, ok, mas não para a interface do usuário.


2

se tem que ser ambos

  • rápido e
  • portátil

então eu uso C. Talvez C ++.


Rápido e portátil, também pode ser Java ou C #.
Jonas

11
@ Jonas: não. Portátil não significa apenas 'Windows ou Linux' ;-)
Steven A. Lowe

1
@ Jonas: Rápido e portátil, isso não seria Java nem C #. O C ++ é portátil em várias plataformas e dispositivos incorporados, como o microcontrolador, e o C é até portátil (como funções externas) para outros idiomas. Ambos são mais rápidos que os idiomas não-funcionais e, portanto, baseados em pilha, mas ainda assim coletados de lixo. Você não precisa dos dois: uma pilha e um coletor de lixo.
comonad

2
@ Jonas: leia; observe as advertências e, novamente, "portátil" não significa apenas Windows / Linux. A pergunta pergunta quando você usaria C; a resposta é: quando precisa correr rápido em qualquer lugar . Eu amo Java e C #, mas eles são marretas, e os sistemas mais antigos / incorporados não têm tempos de execução. Muitos deles nem sequer têm espaço para manter um tempo de execução!
Steven A. Lowe

2
@ Jonas: Agradeço sua paixão, mas "novas plataformas" não são o assunto. Deixe-me dar um exemplo mais específico, para ver se isso ajuda: os microprocessadores que fornecem suporte de controle de incêndio para tanques no campo de batalha têm compiladores C. Eles não têm, nem nunca terão uma JVM.
Steven A. Lowe

2

Sim, de fato eu tenho recentemente!

Gosto de programar em C. Faço a maior parte da minha programação em python, mas há momentos em que preciso de código rápido e realmente aprecio a elegância que advém da simplicidade da linguagem.

O projeto no qual estou trabalhando agora é um banco de dados que, como você pode imaginar, é crítico para o desempenho. No momento, estou usando C e algum python, mas acabará sendo predominantemente, se não inteiramente C.


2

Sim!

C é uma linguagem de baixo nível e há situações em que C é quase a única opção, como eu uso C, para programar microcontroladores, ou juntar algum código para interagir com dispositivos de portas clássicas como Parallel, Serial ou até Modem!


2

Sim. Passei a maior parte da minha carreira programando C ++, mas agora escrevo a maior parte do meu código em Ruby e, se precisar de desempenho ou acesso a coisas de baixo nível, escrevo uma extensão em C. É o futuro, cara!


Algumas respostas abordaram portabilidade e velocidade como os benefícios do código C, mas a ligação é outra característica importante. É relativamente fácil vincular código "estrangeiro" escrito em C devido à sua simples disciplina de pilha "clássica". Muitos compiladores C permitirão que o "montador em linha", como uma conveniência, vá para um nível muito baixo em uma arquitetura (obviamente sacrificando a portabilidade no ato).
hardmath

1

Eu usaria C se estivesse escrevendo um sistema operacional. Como isso não vai acontecer nos próximos vinte anos, a menos que eu chegue à loteria e não tenha mais nada a fazer além de fazer minha própria incrível distribuição Linux, provavelmente vou me ater a C #, Java, Python, etc, etc. usei C há muito tempo, mas sempre gostei de usá-lo; Eu acho que, atualmente, minha cabeça está tão enrolada em torno de OO se eu tiver que voltar para isso, levaria um pouco para rolar novamente.


0

O C ++ é portátil em plataformas e dispositivos incorporados, como microcontroladores. (C ++ pode ser compilado em C, portanto, microcontroladores.)

C é até portátil (como funções estrangeiras) para outros idiomas. Portanto, se eu programar bibliotecas de baixo nível, desejo mais compatibilidade que C ++.

Haskell é portátil em várias plataformas (o ARM será lançado em breve), mas NÃO dispositivos incorporados, como microcontroladores. Sua velocidade é comparável a C e C ++; mas, por ser funcional, usa um coletor de lixo em vez de uma pilha de tempo de execução; portanto, pode ser mais rápido e mais lento que C em momentos diferentes (coleta de lixo) e em diferentes situações (continuações em vez de chamadas sub-rotineiras).


Eu escolhi a linguagem mais abstrata possível, porque a velocidade do programa não difere, mas o tempo de desenvolvimento e a taxa de erros. C e C ++ diferem muito, mas não do ponto de vista de Haskell.

Eu não prefiro outras línguas, mesmo sabendo que uma ou duas mãos estão cheias. ... exceto em alguns casos, bem, festança .


0

Os sistemas embarcados freqüentemente não têm mais do que alguns kilobytes de RAM e talvez algumas dúzias de kilobytes de flash, com uma taxa de clock do processador de alguns MHz. C é a única opção que faz sentido em um ambiente tão bare-metal.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.