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).
fonte
Respostas:
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.
fonte
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.
fonte
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?
fonte
float
oudouble
. 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.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.
fonte
É 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.
fonte
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.
fonte
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.
fonte
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).
fonte
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 ++.
fonte