Muito hoje em dia é falado sobre Java e toda a revolução que ela vem provocando no way-of-life de programadores, analistas e internautas. Mas o que é Java, afinal? Quais são suas origens e seus propósitos? De onde vem todo esse sucesso?
Java é uma linguagem de programação
orientada a objetos, desenvolvida por uma pequena equipe de pessoas na
Sun Microsystems. Inicialmente elaborada para ser a linguagem-base
de projetos de software para produtos eletrônicos, Java teve seu
grande boom em 1995, devido ao sucesso mundial da World Wide
Web. Mas o que tem Java a ver com a WWW?
Como foi dito, o propósito inicial do desenvolvimento
de Java foi para funcionar em processadores de eletrodomésticos.
Os projetistas de sistemas de controle desses processadores, descontentes
com linguagens convencionais de programação, como C,
propuseram a criação de uma linguagem específica
para uso em processadores de aparelhos domésticos, como geladeiras
e torradeiras. Todo o descontentamento dos projetistas residia no fato
de que programas escritos e compilados em C são fortemente dependentes
da plataforma para a qual foram desenvolvidos.
Como o ramo de eletro-eletrônicos
está em constante evolução, a cada novo liquidificador
lançado no mercado com um novo processador embutido, um novo programa
deveria ser escrito e compilado para funcionar no novo compilador, ou
então, na melhor das hipóteses, para reaproveitar o antigo
programa, no mínimo ele teria de ser re-compilado para o novo processador.
Características do Java
Java é uma linguagem de alto nível,
com sintaxe extremamente similar à do C++, e com
diversas características herdadas de outras linguagens,
como Smalltalk e Modula-3. É antes
de tudo uma linguagem simples (é mesmo!), fortemente
tipada, independente de arquitetura, robusta, segura, extensível,
bem estruturada, distribuída, multithreaded e com
garbage collection.
SIMPLICIDADE: Java, é muito
parecida com C++, mas muito mais simples. Java não
possui sobrecarga de operadores, structs, unions, aritmética
de ponteiros, herança múltipla, arquivos .h,
diretivas de pré-processamento e a memória
alocada dinamicamente é gerenciada pela própria
linguagem, que usa algoritmos de garbage collection para
desalocar regiões de memória que não
estão mais em uso.
ORIENTAÇÃO A OBJETOS:
Ao contrário de C++, que é uma linguagem híbrida,
Java é uma linguagem orientada a objetos que segue
a linha purista iniciada por Smalltalk. Com a exceção
dos tipos básicos da linguagem (int, float, etc.),
a maior parte dos elementos de um programa Java são
objetos. (A título de curiosidade, Smalltalk já
é considerada puramente O.O. [orientada a
objeto], pois absolutamente tudo em Smalltalk são
objetos, não há tipos básicos em Smalltalk.)
O código é organizado em classes, que podem
estabelecer relacionamentos de herança simples entre
si. Somente a herança simples é permitida
em Java. (Há uma forma de "simular" herança
múltipla em Java com o uso interfaces, que veremos
em outros passos do curso).
PROCESSAMENTO DISTRIBUÍDO: Chamadas
a funções de acesso remoto (sockets) e os
protocolos Internet mais comuns (HTTP, FTP, Telnet, etc.)
são suportadas em Java, de forma que a elaboração
de aplicativos baseados em arquiteturas cliente-servidor
é facilmente obtida.
MULTITHREADING: A maior parte dos sistemas
operacionais hoje no mercado dão suporte à
multitarefa, como o Windows, OS/2 e Unix, ou seja, o computador
é capaz e executar diversas tarefas ao mesmo tempo.
Cada um desses sistemas tem o seu tipo de multitarefa, preemptiva
ou não, com ou sem multiprocessamento. Java tem o
suporte a multitarefa embutido na linguagem: um programa
Java pode possuir mais de uma linha de execução
(thread). Por exemplo, cálculos extensos, que em
geral demandam muito tempo do processador, podem ser escritos
em uma thread, e a parte de interface com o usuário,
que depende mais dos periféricos de I/O que do processador,
pode ser executada em outra thread. Programação
concorrente em geral é uma tarefa difícil,
mas Java fornece diversos recursos de sincronização
de processos que tornam a programação mais
simples.
EXCEÇÕES: Todo programador
em geral está bastante acostumado com o computador
"travando" por causa de um erro em um programa.
Em C++, por exemplo, a simples tentativa de abertura de
um arquivo inexistente pode obrigar ao programador a reiniciar
o computador. Programas Java, contudo, não "dão
pau" no computador, já que a máquina
virtual Java faz uma verificação em tempo
de execução quanto aos acessos de memória,
abertura de arquivos e uma série de eventos que podem
gerar uma "travada" em outras linguagens, mas
que geram exceções em programas Java. Em geral,
ao escrever programas Java utilizando-se de herança
de classes predefinidas, força-se em geral ao programador
escrever algumas rotinas de tratamento de exceção,
um trabalho que, se de início pode parecer forçado,
irá poupar o programador de bastante dor de cabeça
no futuro.
GARBAGE COLLECTOR: Em Java, os programadores
não necessitam preocupar-se com o gerenciamento de
memória como em C++. Em C++, todo bloco de memória
alocado dinamicamente (com new, malloc ou função
similar) deveria ser liberado quando não fosse mais
usado (com free, delete e parentes próximos). Isso
acarretava diversos problemas mesmo ao programador mais
experiente, que tinha que manter sempre um controle das
áreas de memória alocadas para poder liberá-las
em seguida. Java, ao contrário, utiliza-se de um
conceito já explorado por Smalltalk, que é
o de garbage collection (coleta de lixo). Sua função
é a de varrer a memória de tempos em tempos,
liberando automaticamente os blocos que não estão
sendo utilizados. Se por um lado isso pode deixar o aplicativo
um pouco mais lento, por manter uma thread paralela que
dura todo o tempo de execução do programa,
evita problemas como referências perdidas e avisos
de falta de memória quando sabe-se que há
megas e megas disponíveis na máquina.
MACHINE INDEPENDENT: Uma das características
de Java que tornou-a ideal para seu uso na elaboração
de aplicativos distribuídos foi a sua independência
de plataforma. Afinal, a Internet é uma grande "salada"
de computadores de todos os tipos, dotados dos mais diversos
sistemas operacionais e ambientes gráficos que se
possa imaginar. Java consegue essa independência devido
ao fato de que o compilador Java não gera instruções
específicas a uma plataforma, mas sim um programa
em um código intermediário, denominado bytecode,
que pode ser descrito como uma linguagem de máquina
destinada a um processador virtual que não existe
fisicamente. Na realidade, existe. A Sun está desenvolvendo,
já com alguns resultados práticos, microprocessadores
cuja linguagem nativa é o Java: o picojava, microjava
e ultrajava. O código Java compilado pode então
ser executado por um interpretador de bytecodes, a JVM -
Java Virtual Machine, que é um emulador de processador.
Arquitetura e Ferramentas
Como compilar e executar um programa
Java?
O processo de compilação de
um programa Java é feito de acordo com os seguintes
passos: o código fonte (extensão .java) é
compilado e armazenado em um arquivo de extensão
.class. De cara, percebe-se a impossibilidade de utilizar-se
de DOS como sistema operacional para a elaboração
de aplicativos Java, uma vez que o mesmo tem um suporte
limitado a nomes de arquivos. Mas essa limitação
quanto ao nome dos arquivos é somente a razão
aparente da não-portabilidade de Java para DOS. A
grande razão reside no fato de que Java foi projetada
para sistemas de 32 bits, e só foram escritas Máquinas
Virtuais Java para ambientes de 32 bits.
A portabilidade de Java depende fortemente
da existência de JVMs que rodem em diversas plataformas.
Um programa Java rodará em um computador se existir
uma JVM que nele rode. Ao contrário de programas
Java, as JVMs devem ser programas feitos e compilados para
máquinas específicas, de forma que serão
as JVMs as responsáveis pela tradução
de bytecodes Java para as linguagens nativas das máquinas.
O conjunto de instruções da
Máquina Virtual Java é otimizado para ser
pequeno e compacto, tendo sido elaborado para ser uma espécie
de processador RISC virtual: a rapidez da interpretação
às vezes é sacrificada para garantir esse
reduzido conjunto de instruções.
O compilador mais utilizado para a transformação
de arquivos-fonte java (.java) em arquivos de bytecodes
é o javac da Sun (há diversos outros compiladores
no mercado, mas o javac foi o primeiro e é o mais
popular ainda hoje).
Uma vez gerado o arquivo .class, ele deve
ser passado à JVM instalada no computador. No caso
mais comum, a JVM utilizada é a distribuída
pela Sun em seu JDK (Java Developers Kit), denominada java.
Isso no caso de aplicativos. No caso de Applets, os browsers
que suportam Java já contêm em si uma JVM que
interpreta os bytecodes das Applets.
Ferramentas para desenvolvimento em Java
A Sun, ao lançar a linguagem Java,
pôs à disposição gratuitamente
o pacote JDK - Java Developer's Kit, que inclui, entre outros:
Javac - o compilador de arquivos .java
para bytecodes .class;
Java - a JVM específica para
a plataforma;
Appletviewer - visualizador de applets,
sem a necessidade de execução das mesmas num
browser.
Diversas empresas desenvolveram ambientes
para programação em Java, mas por enquanto
nenhum deles firmou-se no mercado. Alguns IDEs (Integrated
Development Environments) disponíveis para shareware
ou para compra são mostrados a seguir:
Java e a Internet
Como sabemos, a Internet é uma gigantesca
"rede" (conceitualmente falando) que liga "zilhares"
de computadores entre si. É uma rede heterogênea,
já que diversos tipos de computadores estão
ligados a ela. Todos esses computadores utilizam-se do protocolo
TCP/IP para comunicarem-se. Como eles são
distintos, eles precisam de uma linguagem que não
esteja necessariamente amarrada a uma plataforma de hardware/software
específica. Como já vimos, Java mostra-se
ideal quanto a esse fator.
Uma vez que os programa Java são transmitidos
como bytecodes, eles podem rodar em qualquer computador
sem necessitar uma nova recompilação, independente
da plataforma na qual ele será executado. Programas
Java sempre são carregados no computador cliente
e nele executado.
Há dois tipos básicos de programas
Java: Aplicativos, que são programas como
outros quaisquer, e Applets, programas especialmente
confeccionados para executarem dentro de uma página
HTML. Ao abrir uma página HTML que tenha inserida
em si uma applet Java, esta é automaticamente descarregada
para seu computador e executada. Daí vem a pergunta:
há riscos de um vírus infectar o seu computador
cliente??? Isso não ocorre, devido a uma série
de limitações que os projetistas de Java impuseram
às applets, por razões de segurança
puramente, de forma que nenhuma applet Java seja capaz de
"roubar" informações ou danificar
dados do computador. A razão de toda essa segurança
reside no fato de que programas Java são compilados
em bytecodes que são verificados. Instruções
bytecode são muito similares a outros conjuntos de
instruções projetados para plataformas específicas,
com a diferença de que bytecodes são conferidos
através de informações adicionais que
eles carregam em si informando a legitimidade ou não
do arquivo.
Programas C++ em geral chamam funções
por endereço. Como o endereço é um
número simples que pode ser construído de
qualquer forma, o programa pode utilizar-se de qualquer
número para executar uma função. Java,
ao contrário, tem uma abordagem muito diferente.
Métodos e variáveis não são
acessados por endereço, mas sim por nomes. É
a esse processo de verificar quais métodos e variáveis
que serão realmente usados e que chamamos verificação,
que é necessário para garantir que os bytecodes
não sofram qualquer adulteração e que
continuem obedecendo às restrições
de Java. Uma vez verificado o bytecode, a JVM irá
traduzir enfim os nomes de funções para endereços.
Escrito por I. F. Silveira - Publicado em 30/06/2003
Nenhum comentário:
Postar um comentário