C para Programador Java? [duplicado]

possível duplicado:
devo aprender C antes de aprender C++?

como programador profissional (Java) e Utilizador de Linux pesado, sinto que é da minha responsabilidade aprender algum C (mesmo que nunca o use profissionalmente), apenas para me tornar um codificador melhor.

Duas perguntas:
  1. devo tentar C ou C++ primeiro-eu percebo que eles são diferentes linguagens com algum terreno comum. É útil aprender um pouco de ambos, ou experimenta só um? Ouvi dizer que o C++ é um pesadelo de linguagem.

  2. Quais são os melhores recursos (livros, tutoriais, programas de prática, código de referência) para um desenvolvedor Java como eu.

Obrigado.
 23
Author: Community, 2010-08-21

7 answers

C é simples de aprender, difícil de dominar. como programador Java, a barreira será memória e estrutura .. e desfazer os danos que Java pode ter feito ao algoritmo que produz partes do seu cérebro;)

Eu recomendaria familiarizar-me com o manual do GCC na sua caixa Linux, através de tutoriais na Internet. Em seguida, leia a linguagem de Programação C, e uma cópia de desenvolvimento de aplicações Linux não magoa. Além disso, no Linux glib {[11] } vai salvar - te de reinventar a roda ... mas pelo menos tente criar a sua própria lista ligada, hashmap, grafo e outras API para aprender. Aritmética de ponteiros, arrays e aprendizagem de que elementos como estruturas são apenas chamados-offets em um bloco binário são todos importantes. Passe tempo com malloc e free e memcheck. Com C, suas ferramentas e ferramentas são muito importantes e a IDE não é necessariamente seu amigo quando aprende.

Eu escolheria C em vez de C++ pois C é uma boa base para habitue - se à gestão da memória e à utilização do ponteiro de C.

A melhor coisa que você pode fazer é aplicar o que você aprende a um projeto real. Mas esteja preparado para bater a sua cabeça contra a parede allot em Valgrind e GDB . Há anos que programo C e ainda não sou nenhum Monge C.

Concordo que C é uma grande língua, mostra um mau programador. Mas lembre-se:

Qualquer programa C suficientemente complicado contém um ad hoc, informalmente especificado, com bug-ridden, implementação lenta de metade do Lisp comum.

A moral da qual é aprender outras línguas também, em vez de apenas as derivadas de C! Considere alguns dialetos Lisp, Erlang (que é legal no momento), Haskell, etc. Eles vão expandir seus horizontes a partir da célula 2x2 de Java. Considere olhar para SICP também.
 28
Author: Aiden Bell, 2010-08-22 12:06:46

Vindo de ASM, C, Depois C++, e finalmente aterrando (forçado) no território Java, pensei em dar uma opinião sobre o assunto.

Em primeiro lugar, com todo o respeito pela comunidade Java, a experiência de Negócio mostra que enquanto programadores C/C++ podem se acostumar com os princípios e programação Java (pode não ser assim tão fácil), o oposto acontece mais raramente. Em outros termos, um programador C++ terá que aprender e lidar com toneladas de regras Java (Frameworks...) mas ela será eventualmente (e normalmente) capaz de produzir um código de longo prazo, injectando muita da experiência do seu sistema no processo. Um programador Java indo para C, usado para princípios mais teóricos, e regras rígidas de estrutura podem

    Sente-se insegura porque ela tem de decidir muitas coisas, como organização do programa e estrutura.
  • sinta-se surpreendido com os ponteiros, e gestão da memória: alocação e libertação, que tem de ser pensado cuidadosamente - descobrir o mundo das fugas de memória
  • sinta-se desencorajada, pois os bugs não vão aparecer a preto e branco em um console ditado pelo JVM através de 200 linhas de traço de pilha, mas pode acontecer em um nível mais profundo / sistema, talvez pego graças a uma IDE na frente da qual o programador Java vai contemplar algum código de montagem pela primeira vez em sua vida
  • sinta-se perplexo quanto ao algoritmo e como implementá-lo, aquele que foi integrado em Java que ela nunca teve que se preocupar sobre...
A minha tarefa é ajudá-lo a sentir-se seguro, confiante e motivado antes de aprender C/C++!

O meu conselho é começar com C, Porque

  • O C por si só possui todos os conceitos que nunca tiveste de enfrentar com o Java
  • como programador Java, você já tem uma classe 'approach', e começando com C++, você pode ser tentado a manter os princípios java OO
  • Os princípios C estão limitados a alguns. C parece o último humano. coisa antes de entrar no mundo negro da linguagem de montagem.
O que eu enfatizaria durante o estudo C é, por exemplo,
  • Pointers Java usa pointers, é claro, mas esconde seu acesso ao passar classes para métodos como pointers. Em C, você terá que aprender a diferença entre por value e por reference. Além disso, a diferença mais sutil entre char x[3] e char *x = "ab". E como os ponteiros convenientes devem passar por um array etc... tu sabes. *++x ou *x++. Muito tem sido dito sobre ponteiros, meu conselho seria

      Mantenha sempre o controle, ou seja, não coloque muitos indiretos quando não for necessário.
    1. não typedef ponteiros, como typedef int *pointerToInt ; parece mais fácil, ao primeiro (pointerToInt pi em vez de int *pi) depois de alguns níveis, eu prefiro contar as estrelas do que a 'pointerTo' [algumas grandes cies de fazer isso. Excepto talvez as indicações para funções, ilegíveis de qualquer maneira.
  • Memória quando precisas de memória, tu aloca - o, e quando já não precisas dele, liberta-o. Facil. A questão é atribuir o montante certo, e não libertá-lo duas vezes... Tenho de me habituar a isso. E habitua-te à pilha, à pilha... E quando o seu programa correr e endereço NULL (0) você pode ter uma exceção visível. Talvez não.

  • Estrutura de dados então, deseja usar um HashMap conveniente? Claro, depois de o teres desenvolvido. Ou há algumas bibliotecas que você pode ligar que fazem esse tipo de coisa, apenas escolher certa. Para ser justo, ao programar em C, você [tem que] pensar diferente, e pode encontrar um algoritmo mais apropriado do que um mapa para um dado problema.

Ao todo, você vai se sentir desorientado no início, mas eventualmente (a menos que você tenha pesadelos) você vai encontrar diante de você um monte de espaço para diversão e prazer. C permite que uma pessoa programe com completa liberdade: C Vai de acordo com suas idéias, não o oposto.
 25
Author: Ring Ø, 2010-08-21 21:42:24

Se o objectivo é tornar-te um codificador melhor, aponta para línguas que realmente tentam ser diferentes. Java, C++ E C estão todos intimamente relacionados.

Verdadeiras, uma é basicamente uma linguagem de programação procedural, tenta-se realmente difícil para fingir ser OOP, e é uma mistura de pelo menos 4 paradigmas diferentes, mas todos eles são linguagens imperativas, todos eles compartilham um monte de sintaxe, e, basicamente, eles são todos parte da mesma família de línguas.

Aprender C não te vai ensinar nada. dramaticamente novo. It might te ensinar um pouco sobre layout de memória e tal, mas você pode aprender isso de muitas outras maneiras, e simplesmente não é muito relevante para um programador Java.

Por outro lado, a linguagem é relativamente fácil de pegar, e amplamente utilizada para um monte de software Linux, então se você quiser contribuir para qualquer um desses, aprender C é uma boa idéia. Não te fará um programador Java muito melhor.

Quanto a c++, chama - lhe um "pesadelo de uma linguagem" provavelmente não está longe da verdade. É grande e complexo e cheio de armadilhas e armadilhas estranhas para o novato. Mas também tem algumas qualidades redentoras. Por um lado, é uma das únicas linguagens a suportar o paradigma de programação genérica, e isso permite expressar muitos conceitos avançados de forma muito concisa, e com um alto grau de flexibilidade e reutilização de código. É uma linguagem que provavelmente vos fará odiar o C++ por serem uma confusão tão desgastada. todas as outras linguagens para funcionalidades C++ que faltavam, teriam tornado o seu código muito mais simples.

Novamente, aprender C++ não fará grande diferença para você como programador Java, exceto que revelará uma série de falhas em Java que você não sabia até agora.

Aprender uma língua é bom,mas o melhor é aprender algo diferente.

Aprender SML ou Scheme ou Haskell. Ou Ruby, Python ou Smalltalk. Que tal Erlang ou Occam? Ou Prologo.

Aprenda algo que não é nem o irmão nem o ancestral de Java, algo que é projetado do zero para não ter nada em comum com Java. Aprenda uma linguagem funcional como o SML, ou um tipo dinamicamente digitado como o Python, ou um que muda radicalmente a forma como você lida com a concorrência, como o Erlang.

 11
Author: jalf, 2010-08-21 21:17:21
  1. depende do que você Quer aprender. Acho que é melhor sentares-te e pensares porque queres mesmo fazer isto. Se Java faz o que você quer, e você está apenas fazendo isso por algum senso de dever errado, eu acho que há provavelmente melhores maneiras de gastar seu tempo. A reputação do C++ como um "nightmare behemoth" é espalhada principalmente por programadores Java inseguros tentando justificar o que, em seus corações, eles sabem ter sido uma segunda taxa escolha1.
  2. Existem alguns livros especificamente escritos para programadores Java que aprendem C e / ou C++. Embora não seja especificamente para programadores Java, Se você decidir Em C++ em vez de C, eu consideraria C aclamado++.

1Estou, pelo menos, a brincar, claro, mas há um número quase incrível de programadores Java que parecem ter um chip no seu ombro. Se você disser a alguém que usa Python ou Ruby (para apenas um par de exemplos) que é lento, a reação típica é que eles parecem um pouco intrigados e dizendo algo como: "se você diz isso -- parece rápido o suficiente para mim."Sugerir o mesmo sobre Java é praticamente garantido para produzir alegações de que você é obviamente ignorante e expressando nada além de ódio cego.

Editar: no que diz respeito à escolha entre C E C++, para alguém acostumado a Java, C será simplesmente um exercício de frustração. A diferença de Língua exigiria uma ajuste de qualquer maneira, mas mover de uma biblioteca do tamanho de Java para um do tamanho de C simplesmente resultará em destruir sua produtividade por um bom tempo, e é mais provável que apenas prejudicá-lo novamente todas as linguagens com "C" no nome do que ajudá-lo realmente a aprender qualquer coisa.

Mover-se directamente de Java para C é como levar alguém cuja ideia de carro desportivo é quando ele conduz o Lincoln Town Car em vez de ser motorista na limusine, e quando ele decide que a corrida é fixe, tu ... atira-o directamente para o banco de um carro de sprint fora-da-Lei. Dar-lhe uma chance em (não só muito mais seguro, mas realmente mais rápido) street-legal Carro Desportivo primeiro...
 7
Author: Jerry Coffin, 2010-08-22 00:22:31
Em relação a (1), eu provavelmente diria C. É muito mais estranho. Uma vez que seu objetivo é ser multilíngue para seu próprio bem, avançar para uma linguagem que é muito diferente de Java provavelmente será mais útil do que aprender C++, O que provavelmente vai deixá-lo com raiva. C++ recebe muita porcaria das pessoas, e não é necessariamente horrível, mas a principal razão é que ele está tentando forçar um novo paradigma para a estrutura de C, que não funciona tão bem como uma linguagem que começa com isso paradigma em primeiro lugar.

Para (2), eu recomendaria Muito, Muito K&r. Ele assume alguma familiaridade de programação, é breve, ao ponto, mas também é profundo o suficiente para explicar conceitos. Não inclui exercícios, no entanto, que você terá que encontrar em outro lugar. Eu aprendi C no trabalho, eu tenho medo (e ainda pagar por isso! por isso, não posso dar-te ajuda educada lá.

 5
Author: spencer nelson, 2010-08-21 18:49:44
Uma vez que estás a fazer isto por auto-realização e aprendizagem, eu digo para não dar nas vistas e dar uma tentativa ao C++.

Um pequeno prefácio antes de eu elaborar: eu costumava trabalhar principalmente com C++ e nunca trabalhei com código C de qualquer tamanho significativo. Agora eu trabalho com C# na maioria das vezes, apenas usando C++ Em raras ocasiões.

Acho que o C++ é uma opção melhor porque:

  • é um super-conjunto parcial de C: os programas C geralmente não compilam como programas C++, mas o a sobreposição entre as duas línguas é substancial o suficiente para que não seja difícil para você redirecionar suas habilidades para trabalhar com o código C, Se necessário.
  • O C++ irá apresentá-lo a mais conceitos: você vai ter toda a diversão da Gestão da memória e de bit twiddling que você pode fazer em C. Mas você também vai conseguir ver genéricos como você nunca os viu antes, como algoritmos podem ser escritos independentemente de containers, como fazer polimorfismo de tempo de compilação, como herança múltipla pode ser realmente útil às vezes, etc.
  • Você vai aprender a apreciar muito mais o design da linguagem Java: o C++ é uma linguagem complicada com muitos casos de gotchas e edge (veja o FAQ e o FQA para alguns exemplos). Ao experimentá-los por si mesmo, você será capaz de entender melhor muitas das decisões de design que foram para fazer tanto Java e c#.
[1] resume-se a isto: quanto mais você aprender, mais você será capaz de aprender. E c++ obriga a aprender muito sobre você, definitivamente mais do que C. e isso é uma coisa boa.
 4
Author: Mhmmd, 2010-08-22 02:14:23

O C++ provavelmente sentir-se-á mais familiar do que o C, e provavelmente será mais fácil de ser produtivo sem problemas. No entanto, C é uma linguagem muito menor e deve ser razoavelmente simples de aprender (embora cuidado; ao aprender C você corre o risco de danos cerebrais permanentes). Minha referência pessoal é "C: A Reference Manual" de Harbison & Steele (atualmente 5ª edição). Para C++, Só uso o livro o'Reilly nutshell.

Como programador C com alguma experiência em C++ e atualmente fazendo a transição para Java, posso dizer-lhe as coisas sobre C que provavelmente vão tropeçá-lo quase imediatamente:

  • C tem muito pouco na forma de abstrações; ponteiros e fluxos de bytes são praticamente isso. Não existem tipos de contêineres padrão (listas, mapas, etc.). Você quer qualquer coisa mais sofisticada do que um array de comprimento fixo, você terá que rolar o seu próprio (ou usar uma biblioteca desenvolvida por outra pessoa).
  • Não existe lixo. colecção em C. cada 'byte' que atribuir dinamicamente (via malloc() ou calloc()) está no anzol para a desalocação (via free()).
  • Arrays in C do not behave like arrays in Java; there are some funky rules regarding array types that at first blush do not make sense (and won't until sufficient brain damage has set in). Não há limites na verificação de arrays, e algumas funções de biblioteca padrão (notavelmente gets() e scanf()) fazem com que a superação de buffer expluda um risco real.
  • C a sintaxe de declaração pode ficar bastante distorcida. Embora você provavelmente não verá nada tão feio, declarações como int *(*(*(*f)())[10])(); são possíveis (f é um ponteiro para uma função retornando um ponteiro para um conjunto de 10 elementos de ponteiros para funções retornando ponteiro para int`.
  • Os limites de implementação de C podem variar de plataforma para plataforma; por exemplo, a norma de linguagem apenas mandatos os intervalos mínimos para tipos como short, int, e long, mas podem ser mais largos do que o mínimo requisito. Se você espera que um int seja sempre do mesmo tamanho independentemente da plataforma, você está dentro para algumas surpresas.
  • o processamento de texto Em C é uma chatice . Seriamente. C não tem um tipo de cadeia como tal.
 2
Author: John Bode, 2010-08-22 02:35:00