Minha primeira linguagem de programação foi PHP ( gasp ). Depois disso, comecei a trabalhar com JavaScript. Eu fiz recentemente trabalho em c #.
Nunca vi línguas de nível baixo ou médio como C.
O consenso geral na comunidade de programação em geral é que "um programador que não aprendeu algo como C, francamente, simplesmente não consegue lidar com conceitos de programação como ponteiros, tipos de dados, passar valores por referência etc."
Eu não concordo. Eu argumento que:
- Como as linguagens de alto nível são facilmente acessíveis, mais "não programadores" mergulham e fazem uma bagunça
- Para realmente fazer qualquer coisa em uma linguagem de alto nível, é preciso entender os mesmos conceitos semelhantes com os quais a maioria dos defensores do "aprenda primeiro de baixo nível" evangeliza.
Algumas pessoas precisam conhecer C; essas pessoas têm trabalhos que exigem que eles escrevam códigos de nível baixo a médio. Tenho certeza de que C é incrível e de alguns programadores ruins que conhecem C.
Por que o viés? Como um programador bom, honesto e com fome, se eu tivesse que aprender C (por algum motivo imprevisto), eu aprenderia C. Considerando a multiplicidade de idiomas por aí, bons programadores não deveriam se concentrar em aprender o que nos avança? Não devemos aprender o que nos interessa? Não devemos utilizar nosso tempo finito para avançar ? Por que alguns programadores discordam disso?
Acredito que buscar a excelência no que você faz é a característica determinística fundamental entre bons programadores e maus.
Alguém tem exemplos do mundo real de como algo escrito em uma linguagem de alto nível - como Java, Pascal, PHP ou JavaScript - realmente se beneficiou de um conhecimento prévio de C? Exemplos seriam muito apreciados.
fonte
Respostas:
A vantagem de conhecer C é que você tem uma idéia muito boa de como um computador funciona. Não apenas como seu modelo de programação funciona, mas como a memória é organizada e afins.
O único nível abaixo de C é a montagem falada por uma CPU específica.
(Eu acrescentaria que conhecer C também permite que você aprecie quanto menos trabalho você precisa fazer em um idioma de nível superior. E, esperançosamente, uma apreciação do custo envolvido no trabalho nesse idioma de nível superior.)
fonte
Eu não acho que nenhuma das respostas aqui seja realmente o que o OP estava procurando, então vou jogar na minha própria opinião.
Olha, sou um esnobe desapaixonado de C. Minha atitude é que, se você não conhece C, até certo ponto não sabe realmente o que está fazendo como programador. Então, acho que sou o tipo de pessoa "tendenciosa" que você está falando aqui.
No entanto, na prática, se você realmente sabe ou não o que está fazendo como programador, não necessariamente o impede de desenvolver um software realmente incrível e útil usando ferramentas de alto nível. Quero dizer, o criador do Stack Overflow, Jeff Atwood, aparentemente nem conhece C, e ainda assim eu diria que o Stack Overflow é um aplicativo da Web muito bom.
Se você decide ou não aprender C (ou C ++, ou assembly) depende de que tipo de programador você deseja ser. Se você quiser apenas para desenvolver legal aplicações web ou aplicativos de negócios, isso é bom - não há necessidade real de aprender C. Mas se você quiser realmente se destacar no que faz - se você quiser trabalhar em realmente interessantes projectos que empurram o estado da arte, você realmente precisa se levar a sério o suficiente como programador para realmente entender como os computadores funcionam. Como C é essencialmente a língua franca do sistema operacional, bem como a linguagem que alimenta praticamente tudo o mais (do kernel do Linux à maioria das VMs Java, aos intérpretes Python e Ruby, bancos de dados SQL, servidores da Web e praticamente todos os drivers de dispositivo) , uma compreensão íntima do idioma é um longo caminho.
Sem mencionar que conhecer C (ou C ++) abre uma enorme oportunidade para contribuir com grandes projetos de código aberto que impactam milhões (ou centenas de milhões) de pessoas. Deseja trabalhar para melhorar o intérprete Python ou o navegador Chromium? Bem, você precisa conhecer C para o primeiro e C ++ para o último.
É por isso que comparar C com idiomas naturais mortos, como o latim ou tecnologias desatualizadas, como o cavalo e a carruagem, está completamente errado. Uma grande parte de nossa infraestrutura de software do século XXI é alimentada por código C, e é por isso que C permanece tão relevante hoje como sempre.
Portanto, se você deve ou não aprender C realmente depende do que deseja da sua carreira como programador.
fonte
Uma regra prática é que você precisa entender pelo menos um nível de abstração abaixo daquele em que normalmente trabalha. Considere que seu intérprete PHP ou JavaScript pode realmente ser implementado em C ou C ++. Eventualmente, você atingirá um bug no intérprete ou mesmo um erro de tempo de execução em C. Se você não entende C, ficará limitado a enviar um relatório de bug ao mantenedor, esperando que ele possa reproduzi-lo e se preocupar com ele, e depois mexer nos polegares. Se você conhece C, pode dizer exatamente onde está o problema e qual é.
Isso também significa que, se você trabalha em C / C ++, deve poder ler pelo menos a montagem em sua plataforma.
Quanto ao aprendizado de C quando você precisar: minha observação é que a maioria dos programadores pode aprender Perl / Python / Javascript sob demanda, mas o assembler / C / Lisp parece exigir muito mais tempo, por isso vale a pena aprender pelo menos alguns conceitos básicos antes da necessidade surge.
fonte
Não concordo que você precise aprender C primeiro , mas acredito que você deve aprender C eventualmente . Todas as abstrações estão vazias e o entendimento de C facilita a compreensão do que realmente está acontecendo quando você usa alguma abstração sofisticada de alto nível. Dito isto, também acho que todos os programadores sérios deveriam eventualmente aprender a ler pelo menos o assembler, pelo mesmo motivo.
Aprender esses conceitos de baixo nível oferece uma capacidade surpreendente de raciocinar sobre coisas de alto nível. Por exemplo, em C ++ e D, os argumentos padrão para funções virtuais são determinados pelo tipo estático (tempo de compilação) do objeto, não pelo tipo dinâmico (tempo de execução). Isso não faz sentido, a menos que você entenda como as vtables e as convenções de chamada funcionam e por que seria extremamente difícil implementar funções virtuais da maneira oposta.
fonte
All abstractions are leaky
afirmação flagrantemente falsa .O viés é um status quo. Antigamente (anos 80 e anteriores), o C / C ++ era praticamente um requisito para aplicativos de desempenho. Isso mudou, mas os desenvolvedores seniores geralmente vêm desse contexto antigo e vêem coisas nesse contexto.
Para o desenvolvimento real, outras linguagens são usadas - o C # é popular, assim como o Java, enquanto o PHP e o Python são populares para projetos internos e é sempre útil ter alguém disponível com pelo menos conhecimento básico nessa área, caso você escolha uma opção aberta. projeto PHP de origem para, digamos, seu sistema de rastreamento de bugs. No entanto, as especificações de trabalho ainda parecem vir desse modelo padrão que foi escrito há 25 anos.
fonte
Por mais que eu odeie postar o post obrigatório no blog de Joel, concordo com ele aqui . C é a língua franca da programação. Não consigo pensar em nenhuma linguagem de alto nível que não possa interagir com ela de alguma forma. Por causa disso, C ainda é uma escolha popular para coisas do tipo programação de sistemas. Você simplesmente não pode interagir com algumas coisas no nível do sistema operacional sem C.
Além disso, o que você planeja fazer quando seu idioma de alto nível não é rápido o suficiente? Saber escrever C é especialmente importante quando você está usando uma linguagem de alto nível e dinâmica, como Ruby, Python ou PHP. Mas mesmo os programadores de Java e C # precisam passar para o C de tempos em tempos.
fonte
Que grande festa de lesmas! (Como eles supostamente dizem: é uma luta particular ou alguém pode participar?)
Eu era professor e o que descobri (depois de algumas tentativas e erros) foi que era muito mais fácil conduzir os alunos pelos intrincados conceitos de programação se eles entendessem, no nível básico, exatamente o que um computador estava fazendo. Não em todos os detalhes, mas no princípio básico, como o que é a memória, o que são as instruções etc. O que eu mais gosto no C é que ele está perto da máquina.
Isso não quer dizer que outros professores vieram para o mesmo lugar. Eles começaram na linguagem de alto nível (BASIC :-) e seguiram em frente a partir daí, sem efeitos negativos óbvios.
Portanto, Stephen, você pode estar certo. Eu não pensaria assim, mas já estive errado antes.
fonte
Eu acho que isso é progresso.
Vinte anos atrás, a sabedoria convencional era que você precisava aprender assembler para entender o que estava ganhando com linguagens de nível superior como C (e é por isso que eu tive que fazer uma aula de assembler na faculdade usando o VAX Macro; acho que é útil acabou por se formar).
Existe uma superstição de que, como C é um pouco difícil de aprender e que quase não fornece abstrações (ponteiros e fluxos de bytes são praticamente isso), aprendê-lo de alguma forma fará de você um programador melhor ou fornecerá uma melhor compreensão de como as coisas funcionam no hardware nível.
Isto não é necessariamente verdade. O padrão C não o aproxima mais do metal do que qualquer outro 3GL (Pascal, Fortran, etc.). Algumas implementações de C podem fornecer ganchos que oferecem maior acesso a algumas áreas, mas, em geral, ponteiros nus são o mais próximo possível, o que não é nem um pouco fechado. Você não pode acessar diretamente registros ou palavras de status, por exemplo.
No final, tudo se resume aos modos de código e opcode, portanto, se você estiver realmente interessado em como as coisas funcionam no nível inferior, seria melhor aprender aprendendo assembler sobre C.
Por si só, aprender C não (necessariamente) fará de você um programador melhor. Definitivamente, você apreciará os tipos reais de strings e as bibliotecas de contêineres padronizadas.
fonte
Uma linguagem é uma ferramenta. Se você só precisa escrever páginas da Web e coisas do tipo, tenho certeza de que pode se safar sem precisar aprender C, da mesma maneira que, se você criar kits de modelos de plástico, precisará apenas de uma faca e cola afiadas, normalmente não é necessária uma chave.
Eu escrevo código para sistemas embarcados com recursos de memória altamente restritos (o maior que fiz recentemente é 16kbyte e isso foi ENORME). Nesse mercado, C ou assembler são as únicas opções e qualquer uma das linguagens fofas de nível superior simplesmente não funciona.
fonte
Na minha experiência, por um tempo o C / C ++ foi um bom buffer que separou os bons programadores dos codificadores VB6. Depois de fazer cinco anos ímpares de C / C ++, consegui um emprego trabalhando no VB6. Fiquei impressionado com a qualidade (ou a falta dela) dos codificadores. Eles tinham pouco interesse nas entranhas da linguagem, no design ou no desempenho. Infelizmente, quando a empresa mudou para .Net, os codificadores C / C ++ e .Net estavam usando as mesmas ferramentas. Os codificadores VB eram ainda piores codificadores VB.Net. A situação piorou quando todo o desenvolvimento foi para o ASP.NET. De repente, qualquer um que pudesse arrastar e soltar um controle era um programador.
No mercado de trabalho, porém, não havia muito o que diferenciar os codificadores de hard-core (ex C / C ++) e os turistas.
Assim, ter C ou C ++ em seu currículo pode ajudar a diferenciá-lo do riff-raff.
fonte
Perguntativamente, perguntou: Você está pedindo uma confirmação de que não precisa aprender C? Se você aprender C puro (não necessariamente C ++), obterá um entendimento completo do modelo de execução de um computador. Especialmente sobre memória e alocação. Esse material também é importante para as pessoas que programam em idiomas de nível superior.
Para um programador PHP, é apenas menos transparente como o código é executado na máquina especificada. Pode não ser importante para o programador PHP, já que a transferência de rede é o gargalo no aplicativo, etc.
O PHP / Python / C # simples possui muitas camadas de abstração entre a linguagem e a CPU. essas camadas são tão grossas que não permitem que você as veja. Quando você aprende C, há uma folha fina entre você e a CPU e o sistema operacional. Isso não facilita a programação (e pode até não ser melhor). Mas você é capaz de aprender como a CPU funciona. Depois de conhecer o C "intermediário", você pode realmente começar a vincular esse conhecimento para o idioma de nível superior. Este é o benefício imediato que você obterá.
Na minha opinião, um programador sempre deveria dedicar algum tempo aprendendo diferentes conceitos de programação. Definitivamente vale a pena dar uma olhada no C, mas também dar uma olhada nas linguagens de programação de nível ainda mais alto, como Clojure, Haskell, Prolog.
Você não precisa se tornar um mestre neles, eles apenas ensinam a lição de que "níveis" de linguagens de programação não são binários, mas existem muitos níveis. Conheça-os, de cima para baixo (Assembler). Isso fará de você um programador melhor.
fonte
Você precisa conhecer C suficiente para ler o código escrito em C, devido à grande quantidade de código muito importante escrito no idioma. Isso é tudo o que você evita de passar por um manual completo sobre o assunto (usei a "programação em C" de Kochan) sem realmente precisar codificar na linguagem. Se você acabar em uma situação que exige o uso extensivo do idioma, terá uma boa base para desenvolver. Você provavelmente deseja estudar algo como o livro da Assembléia de Duntemanns, se a máquina é uma caixa preta para você. Eu também recomendo o "Código" de Petzold.
Fora isso - alfabetização básica em C e familiaridade básica com a máquina subjacente - seria melhor gastar seu tempo de estudo com coisas reais, como SICP, TCP / IP Illustrated ou livros sobre matemática concreta, algoritmos ou estrutura de dados . As coisas reais.
Passar muito tempo estudando C enquanto codifica em PHP simplesmente não vale o custo de oportunidade. Há coisas mais úteis para aprender. C realmente é apenas outro idioma que você pode aprender bem apenas estudando e usando, mas pode aprender quando precisa.
Suar as coisas difíceis.
fonte
C é o idioma usado para escrever outros idiomas. Ele permite que você fique tão íntimo com a CPU e outro hardware quanto desejar.
Se você não conhece C, não sabe como os outros idiomas alcançam os resultados que alcançam.
Abstração é um conceito importante, é claro, e nem todos precisam saber como sua estrutura de escolha está alcançando os resultados que promete. Você não precisa passar 20 anos escrevendo C, ou pensando no que acontece com suas vtables quando você usa herança múltipla, para escrever um bom código.
Agora, você pode dirigir um carro sem entender como funciona um motor a 4 tempos ou mesmo sem poder usar um câmbio manual (caixa de câmbio manual).
No entanto, se você entender o que está acontecendo sob o capô, poderá, de tempos em tempos, obter resultados excepcionais que alguém sem esse conhecimento terá dificuldade em reproduzir.
fonte
C (e possivelmente C ++) é o mar em que você está nadando. O sistema operacional que executará seu código provavelmente está codificado em C (e C ++). Portanto, sua API nativa para acessar os serviços do SO estará em C.
Se você pode fazer sem saber o que há abaixo, não há necessidade de conhecer C. No entanto, a maioria dos programadores precisa mergulhar em níveis mais baixos em algum momento de suas vidas.
Também é baseado na sua especialização em áreas de desenvolvimento. Por exemplo, um desenvolvedor web que escreve HTML, Javascript e alguns scripts no servidor pode nunca precisar saber nada sobre C, mas um desenvolvedor de sistema ou jogo distribuído precisará.
Nunca é demais passar algumas semanas aprendendo algo tão fundamental para sua profissão.
fonte
C tem muitas vantagens:
fonte