26 de dezembro de 2006

Java ou C?


Bom, continuando a seção tira-dúvidas...

Uma pergunta bastante comum entre estudantes da área de computação é: "qual a melhor linguagem, Java ou C?"

Não há uma resposta simples pra essa questão. Na verdade, não há uma só resposta; as duas linguagens podem ser uma melhor que a outra, dependendendo das circunstâncias.

C é uma linguagem relativamente antiga ("relativamente" porque, na tecnologia, nada consegue se manter novo por mais do que alguns dias). De acordo com a Wikipedia, a linguagem foi criada em 1972, por Dennis Ritchie (atenção amantes da programação: vale a pena clicar no site desse cara!).

É uma linguagem procedural - ou seja, seu foco está não nos dados, mas nas ações (ou procedimentos) sobre esses dados. Por ser eficiente e gerar programas que rodam com bom desempenho, C se tornou rapidamente popular, e até hoje é muito usada, principalmente na programação de sistemas operacionais, já que as rotinas executadas por esses sitemas - como escalonamento de processos, alocação de memória, interfaceamento de dispositivos, etc - exigem o máximo de rapidez e simplicidade. Muitos a consideram não apenas uma, mas a linguagem de programação.

Para o tipo de desenvolvimento de software aplicativo utilizado nos anos 70, C era suficiente. No entanto, com o aumento da complexidade dos programas e com a perpepção de que milhares de linhas de código envolvendo centenas de funções não são nada fáceis de entender, manter e modificar, ganhou força o conceito de Programação Orientada a Objetos.

(Esse conceito já existia há bastante tempo, e baseava-se em um tripé que praticamente transformou o mundo da programação: o encapsulamento, a herança e o polimorfismo.)

É interessante, portanto, acrescentar à "disputa" uma terceira linguagem de programação. Por volta de 1980, Bjarne Stroustrup (não é preciso entender o nome) criou uma espécie de linguagem C "adaptada" para a orientação a objetos, que ele inicialmente chamou de "C com classes". Mais tarde ela recebeu o nome de C++. C++ possui as mesmas funcionalidades de C, mas com a vantagem de suportar a programação genérica, a orientação a objetos e a abstração de dados. De acordo com o próprio Bjarne Stroustrup, C++ é basicamente uma "linguagem C melhor que a linguagem C".

Java, por sua vez, é mais "novinha". Nasceu por volta de 1990, na Sun Microsystems.

Apesar de ter uma sintaxe bastante semelhante à das linguagens C e C++, Java possui algumas características que a tornam única.

A mais conhecida delas é a portabilidade. Todos os programas escritos em Java (chamados de classes) são compilados em códigos chamados de bytecodes, que por sua vez rodam em cima da Java Virtual Machine (JVM) - ou Máquina Virtual Java, em português. A JVM é, basicamente, um programa de computador que traduz os bytecodes, em tempo real, para instruções da máquina sobre a qual o programa deve rodar. Para cada arquitetura de processadores existente no mercado, desde o mais simples telefone celular até os potentes processadores com núcleo duplo, existe uma implementação da JVM.

Para os bytecodes, a máquina é sempre a mesma. Um inteiro tem sempre X bits, um número de ponto flutuante tem sempre Y bits, e as instruções são sempre as mesmas. É a JVM que se encarrega de manipular esses parâmetros, para que os bytecodes de fato funcionem. E é isso que permite que uma classe Java rode tão bem num Pentium II quanto num Atlhon 64.

No entanto, para fazer essa "tradução" em tempo real (ou interpretação) de bytecodes para a linguagem de máquina real, a JVM também consome tempo e processamento; por isso, os programas Java geralmente têm um desempenho inferior, em termos de velocidade de execução, a programas similares escritos em C ou C++.

Mas, se Java é mais "lenta", por assim dizer, porquê é que ela conquistou tanto espaço entre os programadores?

Bem, a portabilidade não é a única característica que se destaca em Java. Java é também uma linguagem 100% orientada a objetos. Isso significa que qualquer programa, até mesmo o mais simples "Hello world!", é definido como um objeto. Esse paradigma força o programador a escrever códigos mais curtos, divididos em classes, que são muito mais fáceis de entender, manter e modificar. E isso é bastante atraente.

As classes Java também são facilmente reutilizáveis. Por exemplo: um engenheiro pode escrever uma biblioteca de classes Java que executem o cálculo de integrais e derivadas, transformações lineares, etc, para utilizá-las no projeto de um aplicativo voltado à engenharia. Mais tarde, se um matemático pedir que um programador escreva um aplicativo que execute esses mesmos cálculos, basta que o programador "empreste" a biblioteca e escreva uma intrerrface mais voltada ao problema em questão.

Java também possui regras rígidas com relação à segurança dos dados. Manipulações por meio de ponteiros, por exemplo, não são permitidas.

Outro recurso interessante de Java é o "coletor automático de lixo" (garbage collector), que se encarrega de verificar, em tempo de execução, se existem referências a variáveis que não estejam sendo mais utilizadas (e, portanto, desperdiçando memória); quando o garbage collector encontra alguma dessas referências, ele a descarta automaticamente, liberando a memória que estava sendo desperdiçada. Ou seja, ao mesmo tempo em que perde desempenho por causa da necessidade de interpretação dos bytecodes, Java utiliza de forma mais eficiente a memória disponível.

Enfim, não há como definir a "melhor" linguagem de programação entre Java e C ou C++.

Java possui grande portabilidade (em tempos de Internet isso é bastante importante), mas C e C++ oferecem acesso a recursos de hardware que Java não oferece. Java é organizada, mas o excesso de regras pode aborrecer alguns programadores.

O fato é que essas três linguagens continuam sendo utilizadas a todo vapor, e não há perspectiva de que tão cedo elas sejam abandonadas.

Para entender mais sobre cada uma delas, recomendo os livros abaixo (há vários outros, mas estes foram os que me vieram primeiro à cabeça), que podem ser emprestados em bibliotecas universitárias ou adquiridos nas boas livrarias (edições mais recentes):

C Completo e Total 3a Edição - Herbert Schildt

C++ How to Program, 5/e (Deitel & Associates)

Java How to Program, Sixth Edition (Deitel & Associates)


Na internet há também vasta quantidade de informação sobre o assunto. Dennis Ritchie disponibiliza em seu site bastante informação sobre a linguagem C. No site de Bjarne Stroustrup encontra-se tudo sobre a linguagem C++. E, na página de Java da Sun Microsystems pode-se encontrar vários artigos e tutoriais sobre a linguagem.

10 comentários:

  1. Anônimo12:12 PM

    Parabéns pelo blog!
    Boa matéria, essa é uma discussão que não tem fim.

    ResponderExcluir
  2. Eu concordo com vc gustavo, para mim cada linguagem tem sua superioridade em determinada situação.

    ResponderExcluir
  3. Anônimo3:20 PM

    Hiya!
    Dude, eu creio que seu BLOG seja sobre computação e você manje de praticamente a maioria das coisas... Eu sou novo nesse ramo..
    Tenho 14 anos, sei VB e Flash, Photoshop...
    Você poderia me dar uma dica do que começar a pesquisar etc...?
    Tenho um blog
    Da uma passada lá pra responder? vlw cara... Qualquer coisa xeluexela@gmail.com
    VLW dude

    ResponderExcluir
  4. Anônimo11:51 AM

    Um dos requisitos para um bom profissional da área é não se apaixonar por tecnologia alguma. Mas saber o momento certo para utilziar aquela que lhe dará vantagens específicas em determinadas situações. Argumento que C é muito bom para iniciar o aprendizado de programação porque, por ter características de baixo nível, requer que o estudante esteja atento aos conceitos fundamentais de arquitetura da máquina, saiba dos recursos disponíveis, como tirar vantagens diretamente deles, mas também dos limites práticos da máquina. C, como mostrado no post, é fundamental para programar software básico, também. Considero indispensável aprender os mais variados tipos de lingagens de programação, os paradigmas que as norteiam e onde aplicar cada uma.

    ResponderExcluir
  5. Parabéns!!! Consegui tirar minhas duvidas...meu contato com o JAVA começou há pouco tempo, mas já por 5 anos que trabalho com Javascript. Mas agora estou me dedicando mais ao JAVA justamente por causa da oferta de trabalho que está surgindo...muito obrigado pelas sugestões.

    ResponderExcluir
  6. Parabens pelo seu blog , queria começar a aprender java , ja fiz um curso de asp , mas quero mesmo é aprender java , vc teria alguma dica para me dar de como começar ? ,algum livro? obg add ai marcos_bras3@hot..

    ResponderExcluir
  7. Parabéns!!! É por isso que a internet só pode ficar melhor.

    Um Grande Abraço.
    Marco Ramos- Engenheiro

    ResponderExcluir
  8. Parabéns!!! É por isso que a internet só pode ficar melhor.

    Um Grande Abraço.
    Marco Ramos- Engenheiro

    ResponderExcluir
  9. Parabéns, gostei muito do seu blog! É difícil haver alguém de exatas que escreva bem, e você escreve. Parabéns mesmo, ótima postagem, me ajudou bastante e você ganhou mais um leitor.

    ResponderExcluir
  10. Aprenda C C++ e Java ,depois SQL

    ResponderExcluir