Java e C++

Recebi por email a um tempo atras… tava fuçando hoje e achei interessante.


1.1 CARACTERÍSTICAS DA LINGUAGEM

Os parágrafos que seguem mostram várias características de Java e fazem comparações com outras linguagens como C, C++ e SmallTalk.

1.1.1 Semelhança com C e C++

A linguagem Java tem uma sintaxe semelhante a C++, embora não seja contemplada todas as características da linguagem C++ (herança múltipla, por exemplo). Por este motivo muitos autores conceituaram, no início, Java como C+±-. Na verdade, existem certas restrições que Java impõe, tal como: restrição ao acesso a hardware, sem esta característica não existiria a portabilidade da linguagem.

Outro ponto importante é que a linguagem C++ é híbrida; permite livremente que o programador implemente problemas de forma procedural (C++ é um superconjunto da linguagem C) ou orientado a objeto. Java é uma linguagem mais dedicada a orientação a objeto, muito embora, a orientação a objeto seja um dom do projetista. Na verdade não existe uma linguagem que obrigue ao projetista de software realizar uma boa programação orientada a objeto (POO).

1.1.2 PortABILIDADE

Java foi criada para ser portável. O código Java pode ser transportado entre plataformas distintas sem sofrer ajustes. Não é necessário recompilar um programa para que ele rode em máquinas com sistemas operacionais diferentes, ao contrário do que acontece, por exemplo, com programas escritos em qualquer outra linguagem. Como exemplo de portabilidade pode se observar os tipos de dados: em Java um inteiro tem sempre 32 bits, independentemente da arquitetura; já em C, o inteiro tem o tamanho da palavra da máquina que será executado o programa. Esta portabilidade é importante para a criação de aplicações para a heterogênea Internet.

1.1.3 Compilada e Interpretada

Um programa em Java é compilado para uma linguagem assembly composta por bytecodes. O bytecode é um código de uma máquina Java idealizada pelos criadores da linguagem. Para a maioria dos computadores que não reconhecem o bytecode é necessário executar o programa Java sobre uma máquina virtual (JVM - Java Virtual Machine). A JVM é um programa executado na máquina real (o computador) e que interpreta os bytecodes.

Devido a característica da linguagem ser interpretada, o leitor pode deduzir que, na maioria dos casos, o uso da linguagem Java leva a implementações mais lentas que os programas descritos em outras linguagens, tais com C++. Isto porque os compiladores C++, não tem preocupação com portabilidade a nível de executável. Um programa em C, quando compilado, gera código para a linguagem assembly da própria máquina real. Para minimizar os problemas de velocidade, Java pode utilizando técnicas como JIT (Just In Time), que permite interpretar apenas parte do código, pois certos trechos de código já estão compilados para a máquina real. Outra solução é utilizar máquinas reais Java, tais como o NC (Network Computer).

Algumas empresas, tais como a Sun Microsystems e a Symantec lançaram produtos um tanto controvertidos, trata-se do Code Generator e Java Café, respectivamente. Estes programas tem o objetivo de gerar a partir da linguagem Java, o assembly para a máquina real. A grande vantagem é o desempenho devido ao fato de não ser mais necessário interpretar os bytecodes. O problema associado a isto é a inevitável perda de portabilidade em nível de código gerado, deixando a portabilidade apenas em nível de linguagem Java.

1.1.4 Orientada a Objetos

Java é uma linguagem voltada para a programação orientada a objetos, onde todo o código e todos os dados residem dentro de classes e objetos.

Quando se compara Java com outras linguagens de programação orientada a objeto, pode se perguntar se Java é uma linguagem orientada a objeto pura, tal como a linguagem SmallTalk, onde todos os aspectos da linguagem são baseados em objetos. Na verdade Java é praticamente uma linguagem de programação orientada a objeto pura, a exceção ocorre devido a herança dos tipos básicos do C, tais como int e double. Porém, mesmo estes tipos podem ser substituídos classes da linguagem, tais como Integer e Double, sendo assim manipulados exatamente como objetos.

Java permite herança simples. A ausência de herança múltipla pode ser compensada pelo uso da herança simples e interfaces, onde uma classe herda o comportamento de sua superclasse além de oferecer uma implementação para uma ou mais interfaces.

1.1.5 Ausência de Ponteiros

Uma das grandes vantagens de certas linguagens como C é a ganho em desempenho e flexibilidade dado pelo uso da aritmética de ponteiros. Esta aparente vantagem traz em geral muita dor de cabeça para os programadores, principalmente quando os programas começam a crescer muito, não é difícil ver o acesso inadequado a uma área de memória. Pela própria característica da portabilidade Java troca aritmética de ponteiros por referência a objetos; desta forma o controle das áreas de memória nunca é do programador e sim da máquina Java. Com insto perde-se um pouco de desempenho, mas ganha-se muito em segurança.

1.1.6 Segura

Um dos grandes problemas para os programadores de linguagens como C e C++ é a alocação de memória e correspondente liberação. Java eliminou este problema com o Garbage Collection (coletor automático de lixo), que evita erros comuns que os programadores cometem quando são obrigados a gerenciar diretamente a memória. A eliminação do uso de ponteiros, em favor do uso de vetores, objetos e outras estruturas substitutivas traz benefícios em termos de segurança. O programador é proibido de obter acesso a memória que não pertence ao seu programa.

Há um rígido controle de acesso a posições de arrays. Isto previne um possível acesso inadequado a uma áreas de memória não pertencente ao array.

Ser fortemente tipada também é uma vantagem em termos de segurança, que está aliada a eliminação de conversões implícitas de tipos, tal como ocorre em C++.

A presença de mecanismos de tratamento de exceções torna as aplicações mais robustas, não permitindo que elas abortem, mesmo quando rodando sob condições anormais, tais como falhas de transmissão e formatos incompatíveis de arquivos.

1.1.7 Amplo Pacote de Classes

A filosofia da JavaSoft é criar uma grande quantidade de pacotes de classes que suportem as mais diversas aplicações, tais como interfaces gráficas (através da JFC - Java Foundation Class, com os pacotes da AWT e Swing), acesso a banco de dados com JDBC, operações de com máquinas remotas (RMI, Sockets, CORBA, etc.).

1.1.8 Suporte À Concorrência

Java inclui a capacidade interna de multithreading, que otimiza os períodos de inatividade do processador, executando código em paralelo. O programador pode escrever código que implemente vários threads, permitindo tratar, por exemplo, som e imagem separadamente, criando um processamento paralelo.

1.1.9 Código Pequeno

Java, originalmente, foi criada para ser usada em pequenos aparelhos eletro-eletrônicos com um hardware limitado, por este motivo o código gerado utiliza pouca memória. Em geral, os arquivos Java tem tamanhos muito pequenos, se comparados a arquivos executáveis gerados por outras linguagens.

1.1.10 Impossibilidade de Acessar o Hardware da Máquina Real

Devido as características de segurança e portabilidade, Java não permite o acesso ao hardware de uma máquina. Operações de baixo nível devem ser efetuadas com outra linguagem, que acesse diretamente a máquina real.

O processo de um programa Java chamar uma ou mais rotinas implementadas em outra linguagem é denominado de chamada a métodos nativos. É claro que ao chamar um método nativo as características de portabilidade e talvez segurança deixam de existir.

Cabe salientar que Java não foi feita para implementar firmware, mas são poucas as exceções em que a linguagem não se aplica