Preciso aprender C?

8

Sou aluno de doutorado em Computação Científica e, nos últimos meses, passei bastante tempo aprendendo Python e C ++ da maneira certa. Sinto que aprendi bem C ++ e posso usar o Python para fazer o que quero, se mantiver um bom livro de referência.

Eu também conheço o MATLAB o suficiente para prototipar minhas idéias e obter soluções. (Se eu estou entediado demais para codificar Python, que é minha primeira escolha).

Eu li várias vezes aqui que se deve agrupar C e C ++ em um "C / C ++" porque são linguagens extremamente diferentes com motivos diferentes e eu concordo completamente com esse ponto de vista.

Embora eu não possa afirmar "conhecer" o C ++, pois estou sempre aprendendo, mas acho que entendo muito de como devo usá-lo e como não. A primeira língua que aprendi foi C, mas faz muito tempo desde a última vez que a usei. Minha pergunta é essencialmente esta:

Dado que eu sei MATLAB, C ++ e Python; devo investir tempo aprendendo C? Meu conhecimento dos três idiomas mencionados será suficiente para eu codificar?

Minha pesquisa é mais do lado da álgebra linear numérica, mas também faço consultoria em simulação de eventos discretos / processos estocásticos. Minha intenção é trabalhar na indústria (meu orientador sugeriu que eu aprendesse C ++ para que eu permaneça empregável, embora ele não tenha preferências pessoais de idiomas).

Inquérito
fonte
A diferença entre o Fortran 60 e o Fortran 2003 é maior que entre C99 e C ++ 98. E entre 77 e 2003 é praticamente o mesmo. Ainda assim, as pessoas as chamam de "apenas" Fortran.
Misha
1
Você deve jogar todas essas outras línguas e aprender o Fortran;) o moderno Fortran tem tudo o que você precisa para o que faz.
Nasser
Qualquer que seja o idioma usado, certifique-se de documentar qualquer código que deva ser mantido e inclua alguns exemplos e testes automatizados. Se você não está fazendo isso, não conhece realmente nenhum idioma.
precisa saber é o seguinte
@Nasser, exceto se você quiser trabalhar com qualquer estrutura de código aberto de larga escala. Lammps, negócios, Trilinos, MercuryDPM, todos C ++. Eu aconselharia as pessoas a aprender tudo, menos o Fortran, mas no final isso é apenas uma questão de preferência.
BlaB 27/06/19

Respostas:

13

Abordarei apenas a comparação de C para C ++. Embora seja verdade que qualquer coisa escrita em C possa ser portada para C ++ com alguns retoques sintáticos, as comunidades têm valores diferentes. A comunidade de bibliotecas C, mais do que quase qualquer outra, valoriza a estabilidade binária . A estabilidade binária é crítica para as bibliotecas de baixo nível, para evitar infligir dor constante nas camadas acima, especialmente quando usadas com um modelo de distribuição binária e bibliotecas compartilhadas. C é a preferência esmagadora por bibliotecas que precisam apenas funcionar, com a capacidade de enviar novos lançamentos sem recompilar as camadas acima.

É possível enviar bibliotecas C ++ que operam nesse nível, mas você acaba precisando "escrever C em C ++". Por exemplo, você nunca colocaria uma definição de estrutura com membros privados ou virtuais em um cabeçalho público, nunca usaria modelos em uma interface pública e nunca teria uma API baseada na herança de classes com membros de dados. Essas restrições são necessárias para conter precisamente dependências, para que você possa modificar sua implementação sem alterar a interface binária. C tende a ser muito mais fácil de vincular a partir de diferentes linguagens, devido ao seu modelo de objeto mais simples e à ABI bem definida.

Se você estiver escrevendo código no nível do aplicativo e não no nível da biblioteca, sua interface binária não é importante; muitas dessas preocupações desaparecem. O uso de recursos da linguagem C ++, como herança e modelos, ainda tendem a produzir código mais fortemente acoplado, levando a uma recompilação mais demorada à medida que o projeto cresce. Além de mais dependências em tempo de compilação, a compilação do código C com um compilador C ++ aumenta significativamente o tempo de compilação (cerca de 2x com a maioria das cadeias de ferramentas).

Se essas preocupações lhe interessam, ou se você planeja trabalhar em bibliotecas de nível inferior, gastar tempo com C pode valer a pena. Se você gosta de usar os recursos da linguagem C ++ e não se incomoda muito com interfaces binárias e rigidez do acoplamento, talvez não seja um bom uso do tempo. Mas lembre-se de C se essas coisas começarem a incomodá-lo no futuro.

Jed Brown
fonte
Havia tantas respostas impressionantes que era difícil escolher uma, mas essa era a mais descritiva e completa na minha opinião. +1 para todos. Gostei muito de ler tantas perspectivas. Decidi continuar aperfeiçoando C ++ e aprender C conforme necessário.
Inquérito 02/02
Para garantir a integridade, convém adicionar o idioma pimpl. É uma maneira de os codificadores C ++ construirem "firewalls de compilação" para que não precisem recompilar o código do aplicativo após as alterações subjacentes na implementação.
precisa saber é o seguinte
7

Em vez de "aprender C", sugiro que você esteja em um ponto em que já fez programação suficiente e trabalhou com linguagens de programação suficientes para se concentrar em melhorar sua técnica de programação e um conhecimento mais amplo da ciência da computação. Aprenda C se e quando for necessário para um projeto específico.

Programadores experientes rapidamente escolhem novas linguagens de programação, conforme necessário para projetos específicos. Eles podem fazer isso porque entendem conceitos importantes que traduzem de um idioma para outro - a sintaxe não é um grande problema se você domina esses conceitos de nível superior. Quando você assiste os alunos tentando aprender sua segunda linguagem de programação, geralmente os vê lutando para entender algum novo conceito que não fazia parte da primeira língua. Por exemplo, os alunos que começam com o Fortran geralmente lutam com ponteiros em C. Os alunos que conhecem C geralmente lutam com os recursos orientados a objetos do C ++ e assim por diante.

Brian Borchers
fonte
6

A resposta a esta pergunta realmente depende do que você realmente faz.

Como cientista da computação que faz computação de alto desempenho , eu diria que é essencial conhecer / entender a programação em C.

Mas se você está apenas fazendo coisas em computadores, seu conhecimento de C ++ deve ser suficiente para você passar.

Mais especificamente, se você estiver realmente interessado em aspectos computacionais, ou seja, escrevendo algoritmos que tiram o máximo proveito dos computadores modernos, não poderá evitar ter que lidar com aspectos de baixo nível , como gerenciamento de memória, layouts de dados, SIMD vetorização, paralelismo em nível de instrução, paralelismo em memória compartilhada ou computação em GPU (CUDA e OpenCL são baseadas em C).

Agora, muitas dessas coisas podem ser resolvidas por compiladores (por exemplo, gerenciamento de memória, layouts de dados, vetorização) e / ou abstrações de nível superior (por exemplo, OpenMP, OpenACC, bibliotecas otimizadas). Mas apenas até certo ponto. Fazer as coisas manualmente geralmente envolve mais trabalho, mas a recompensa pode ser uma ordem de magnitude no desempenho.

Basicamente, sempre que você deseja controlar os detalhes , geralmente acaba usando o C, pois está "mais próximo do metal". A questão é, no entanto, é isso que você realmente quer?

Pedro
fonte
1
Como você pode dizer que o C ++ está mais distante do metal que o C? O que você não pode fazer em C ++ que você pode fazer em C? E você está dizendo que há recursos úteis insignificantes em C ++ para computação de baixo nível?
precisa
@ MillindR: Concedido, você pode compilar um programa C com um compilador C ++, para que o C ++ possa fazer tudo o que C faz. O problema está nos recursos extras que o C ++ fornece, por exemplo, objetos polimórficos, modelos, tubos, etc ... que não são bem mapeados para o "metal" real. Se você usar algum desses recursos do C ++, perderá o controle do que o seu programa está realmente fazendo, instrução por instrução. Esse é o ponto que eu estava tentando enfatizar, e pelo qual eu permaneço.
Pedro
Concordo com objetos polimórficos, mas como os modelos podem levá-lo mais longe do metal? Eu acho que você está se referindo às hierarquias de herança aqui. Qualquer coisa que não os use provavelmente será bem próxima do metal.
Milind R
1
@MilindR: Não. Digamos que você use uma classe de modelo para um vetor de floatou double. As operações reais nesses vetores serão implementadas de maneira ideal para um ou para o outro, mas nunca para ambos. As hierarquias de herança têm o mesmo problema que os objetos polimórficos: se você não souber o tipo exato no tempo de compilação, não terá apenas uma pequena sobrecarga na seleção da função correta, mas também não poderá incorporar a função de destino.
Pedro
É para isso que serve a especialização de modelo. Concorde em não saber o tipo no momento da compilação, resultando em sobrecarga.
Milind R
4

Há um pouco de copiar e colar da minha resposta a esta pergunta , com alguns detalhes extras.

Trabalho na indústria (fabricante de equipamentos de inspeção e controle de máquinas) usando processadores embarcados fracos (pense em processadores para celulares), onde cerca de 50% do grunhido computacional é gasto em cálculos numéricos - principalmente trabalhos de fusão de sensores.

Temos um matemático trabalhando para nós, que costumava trabalhar em um grupo de HPC, então este é um dos lugares mais estranhos onde você pode encontrar um emprego!

Nesse ambiente, onde você quase certamente terá um sistema operacional (por exemplo, Linux, QNX, WinCE), o C ++ é o rei. Usamos C apenas para o trabalho do kernel (ou seja, drivers de dispositivo) e para o trabalho profundamente incorporado sem um sistema operacional (micros de 8 bits). Não usamos C para nenhum trabalho numérico. De fato, não temos um compilador FORTRAN para nossa plataforma!

O alto desempenho é importante para nós, porque só temos uma CPU de 1 Watt para processamento. Embora não tenhamos alguns dos problemas "charmosos" do paralelismo, precisamos estar cientes da memória e do cache e precisamos cada vez mais estar cientes do SIMD (pense em NEON ). Além disso, ao contrário do HPC, temos que ter muita consciência da latência (este é o controle da máquina!) E de outros aspectos do sistema operacional, como agendamento e troca de contexto. A alocação de memória é especialmente desagradável nesse ambiente, pois quase certamente significa uma alternância de contexto (== latência e, em uma CPU de 400 MHz, dispendiosa em termos de tempo).

Como essas questões são independentes da escolha do idioma, discordo da resposta de @ Pedro de que C é necessário - afinal, as intrínsecas do compilador para SIMD estão disponíveis ao usar C ++. No entanto, isso significa que você deve ter muito cuidado com os recursos do C ++ que usa e o que eles custam.

Portanto, para completar a resposta, não, você não precisa do C. Usamos o MATLAB para o trabalho de análise e o python para scripts, de modo que suas duas linguagens diferentes do C ++ são boas escolhas - pelo menos no meu setor.

Damien
fonte
3

É bom conhecer C, e você pode realmente implementar muitos dos recursos OO do C ++ relevantes para a computação científica em C sem muitos problemas (é muito instrutivo dar uma olhada no código-fonte do PETSC para ver como eles funcionam. isto).

Dito isto, não há uma resposta única para essa pergunta. Existem muitos fatores na escolha de um idioma, sendo o tempo de execução um deles. Quanto tempo você gasta escrevendo, depurando e criando código de perfil é outro fator importante. No final, você quer ser o mais produtivo possível. Conhecer C será ótimo se você pretende entrar no lado de alto desempenho da pesquisa ou se prevê que seu código levará um tempo extremamente longo para ser executado (por exemplo, o tempo de execução supera o tempo de fluxo de trabalho de codificação). Caso contrário, se você conhece C ++ e essas coisas não são um problema, você deve entender o código C suficientemente bem para se comunicar com aqueles que o estão usando.

Reid.Atcheson
fonte
2
Mas C é realmente mais rápido que C ++?
Inquérito
2
Linguagens de programação não são rápidas ou lentas a priori, é o programador que escreve um bom código que determina sua eficácia. O benefício de C é que é muito simples, e escrever código eficiente é muito mais fácil do que escrever código eficiente em C ++ ou Python (supondo que você esteja fazendo pleno uso das faculdades de linguagem). Eu vi código C ++ muito rápido utilizando todos os recursos que exigiam rolar seu próprio gerenciamento de memória e fazer todo tipo de coisa desagradável com sobrecarga de operador, considere o tempo necessário para escrever isso em comparação com uma versão C equivalente para a mesma velocidade.
precisa saber é o seguinte
2
@ GeoffOxberry Alguns dos pacotes mencionados são realmente escritos para flexibilidade (dentro de um escopo) muito mais que velocidade. Os escritos para velocidade absoluta sofrem com a depuração difícil, o enorme tempo de compilação e os grandes binários inerentes ao uso de modelos por muito mais do que é realmente necessário para o desempenho. Claro que você pode escrever um pacote "C" em C ++, mas os valores da comunidade são bem diferentes.
Jed Brown
1
Além disso, por "alto desempenho" eu não quis dizer necessariamente escrever código de alto desempenho. Eu quis dizer com o lado de pesquisa do HPC, muitas vezes lidando com muitos detalhes de nível inferior. estes podem ser obscurecidos usando um estilo de programação C ++. Isso não é necessariamente uma coisa ruim, mas depende de quais são seus objetivos.
precisa saber é o seguinte
1
Em outras palavras, se você é um pesquisador de HPC, escrever código com outro pacote que por acaso é rápido não é realmente de muito valor em termos de pesquisa. As pessoas vão querer saber por que seu código é mais rápido e por que sua abordagem é eficaz, citando um pacote não é suficiente.
precisa saber é o seguinte
2

O valor de c, como é hoje em dia, é que obriga você a se familiarizar com o funcionamento do computador em um baixo nível de abstração (comparado com, digamos, python). Agora, o c ++ possui todos os recursos de baixo nível de c e pode permanecer da mesma forma, mas a maioria das pessoas é incentivada ao se inclinar no c ++ para evitar as abstrações de nível mais baixo e contar com as de alto nível (bem testadas e depuradas); coisas como a biblioteca de contêineres, ponteiros inteligentes, polimorfismo e assim por diante.

Faz sentido para a maioria dos programadores passar a maior parte do tempo jogando em áreas de alta abstração, porque podem gastar mais tempo mental e energia escrevendo o que querem dizer do que lidar com os pequenos detalhes exigentes de como você o realiza.

O custo dessa atitude é um risco de abstrações com vazamentos morder você quando você menos espera , mas quase certamente aumenta a eficiência geral da programação.

Portanto, se você estiver satisfeito com o que sabe sobre o funcionamento de baixo nível do seu computador, poderá adiar c com segurança e, mesmo se não estiver, poderá usar um conjunto restrito de c ++ para realizar a mesma coisa.

dmckee --- gatinho ex-moderador
fonte
1

Eu respondi uma pergunta semelhante uma vez no Stack Overflow. A resposta óbvia é aprender tudo o que puder, certo?

Então, vamos olhar para o ponto de vista negativo. Você já é mais proficiente em três idiomas que eu consideraria mais valioso que C para programação científica. No meu trabalho de consultoria, escrevendo software científico, usei MATLAB, Python, FORTRAN e Java. Eu nunca precisei usar C ou C ++, mas observe que todo o meu trabalho foi em novos projetos. Eu não aconselharia um cliente a iniciar um grande projeto em C / C ++, mas recomendaria Java ou mesmo Scala, a menos que houvesse algum motivo convincente para usar C / C ++. Para um projeto menor, eu provavelmente usaria o Python. No seu caso, parece que você poderia lidar com C conforme necessário.

Eu esperaria que aprender mais sobre os domínios nos quais você trabalhará pague mais do que ser um linguista. No final, é a solução do problema, não a ferramenta, que importa. A visão de Knuth sobre "otimização prematura" se aplica também à preparação para uma carreira.

Glenn
fonte
1

Provavelmente não vale a pena.

C ++ e C tendem a ocupar os mesmos nichos na ciência da computação (talvez sistemas embarcados sejam uma exceção). Costumava acontecer que os compiladores C eram melhores (mais recursos completos, melhores na otimização) do que os compiladores C ++, mas pelo que entendi agora, esse não é mais o caso.

Claro, C é uma linguagem maravilhosa (e eu prefiro C ++), e se você tiver tempo e vontade, recomendo aprendê-la, mas se você estiver com pouco tempo, não vejo outra razão convincente além de "I precisa trabalhar em um projeto que está sendo escrito em C "(e mesmo assim, grande parte do seu conhecimento em C ++ será transferida).

Geoff Oxberry
fonte
0

Eu acho que algum conhecimento de C é útil, principalmente para aprender sobre como compilar coisas com o vínculo "externo C" para que você possa puxar as bibliotecas C / Fortran herdadas (por exemplo, lapack) para novos projetos em C ++. Eu não investiria muito tempo aprendendo as bibliotecas C herdadas, essas coisas podem ser buscadas / pesquisadas no Google conforme necessário ou, às vezes, substituídas por funcionalidades equivalentes no stdlib C ++.

rchilton1980
fonte