Uma Introdução ao Mundo do Java



Introdução

A World Wide Web (WWW) transformou a Internet. Os usuários não estavam mais restritos a sistemas de informação em modo texto, pois a Web com seu sistema de hipertexto e hipermídia não só dá ao usuário um alto grau de seletividade como também abre diversas opções para informação em outras mídias. Usando a Web, pode-se acessar informação sob a forma de gráficos, textos, sons e até mesmo vídeos. No entanto, a Web não possui interatividade real, ou seja, uma interação entre o usuário e a aplicação em tempo real, dinâmica e visual.

É dentro deste contexto que surge o Java. Java veio trazer a interatividade que falta na Web. Com um Web Browser suportando Java, pode-se ter animações e aplicações interativas, e ainda programas em Java que implementam protocolos de informação e novos formatos de mídia. As características do Java enriquecem a comunicação, informação e interação na Web, por possibilitar ao usuário a distribuição de conteúdos executáveis, ao invés de apenas páginas em HTML e arquivos multimídia.

Com origem no trabalho da Sun Microsystems para construir uma linguagem de programação com o intuito de criar software que pudesse ser executado em diferentes arquiteturas, surgiu o Java, que se propõe a ser uma linguagem para distribuição de conteúdo executável através da Web. Java traz um novo interesse as páginas da Web através de aplicações que podem dar ao usuário um retorno imediato, e aceitar entrada do mesmo continuamente através do teclado e do mouse.

Java e CGI

CGI(Common Gateway Interface) é a interface usada pelos HTTP Web Servers para interagir com programas e utilitários do servidor. O uso mais comum para este tipo de programação é a manipulação de formulários utilizados em páginas HTML.

Tipicamente o processo ocorre da seguinte forma:

- É trazida uma página contendo um formulário no browser.

- Preenche-se o formulário e o envia para o servidor.

- O servidor passa a requisição do formulário para um programa/utilitário (usualmente via stdio).

- O utilitário recebe informação a respeito da requisição, do requisitante e do servidor via CGI.

- O utilitário passa uma resposta (usualmente via stdio) de volta para o servidor. Geralmente este retorno é na forma de um documento HTML.

- O servidor passa a resposta de volta ao browser.

CGI define como a informação é passada entre o servidor e o utilitário. Enquanto CGI define como isto é feito, muitas implementações de servidores HTTP tem manipulado isto de forma diferente, sendo que na maior parte das vezes estas diferenças são devidas a limitações do sistema operacional.

Em algumas implementações, a informação é passada através de argumentos na linha de comando, outros utilizam as convenções de stdio, e ainda outros utilizam variáveis de ambiente. Muitos suportam uma combinação dos três métodos.

Os utilitários que suportam CGI podem ser programas compilados, interpretados, shell scripts ou mesmo arquivos batch do DOS. Como as implementações de CGI suportam stdio, qualquer utilitário que possa ler/escrever via stdio pode ser um back-end para formulários HTML.

Diferença entre Programação Java e CGI

Com hipertexto, a base para organização da informação está em selecionar a informação que se deseja ver. Programas utilizando CGI podem utilizar estes arquivos de hipertexto na Web como interface. Quando se utiliza uma página Web com estes programas de gateway associados, pode-se acessar bases de dados ou receber respostas customizadas baseadas em consultas.

O conteúdo executável do Java traz a oportunidade de uma página Web envolver o usuário em uma interação contínua, complexa e em tempo-real. Este conteúdo executável é literalmente carregado para o computador do usuário onde pode-se rodar uma animação, realizar algum tipo de processamento, ou guiar o usuário através de mais informação em sites remotos na rede.

A Máquina Virtual do Java

A linguagem Java foi criada para desenvolvimento de programas em ambientes heterogêneos ligados em rede. Desde que o objetivo inicial da linguagem era ser utilizado em sistemas isolados com quantidade mínima de memória, a linguagem Java foi projetada para ser pequena e utilizar uma pequena quantidade de recursos do sistema.

O compilador Java gera arquivos de classe, os quais tem um formato binário neutro com relação a arquitetura. Dentro dos arquivos de classe estão os bytecodes, os quais são implementações para cada um dos métodos das classes, escritos em um conjunto de instruções da máquina virtual. O formato do arquivo de classe não tem dependência na ordem dos bytes, no tamanho de ponteiro, e no sistema operacional que está rodando abaixo da máquina virtual.

Os bytecodes são executados em termos de um sistema de runtime, um emulador para o conjunto de instruções da máquina virtual. Os mesmos bytecodes podem rodar em qualquer plataforma.

Características da Linguagem Java

Introdução

Java é uma linguagem de programação orientada a objeto que é usada em conjunto com Browsers que suportam Java. Estes Browsers podem interpretar os bytecodes criados pelo compilador Java. O design técnico da linguagem Java é neutro com relação a arquitetura. O termo arquitetura neste sentido se refere ao hardware do computador. Programadores podem criar programas em Java sem se preocupar com a arquitetura do computador do usuário. Ao invés disto, o browser é customizado para a arquitetura do mesmo. O browser interpreta os bytecodes para arquitetura particular do usuário.

Java

Dada a seguinte definição para a linguagem Java: Linguagem simples, orientada a objeto, distribuída, interpretada, robusta, segura, de arquitetura neutra, portável, de alta performance, multithreaded e dinâmica, pode-se caracterizar este sistema através destes adjetivos. A seguir, apresenta-se o motivo da atribuição de cada adjetivo a linguagem, e os problemas que estas características se propõe a resolver.

Simples

Os desenvolvedores da linguagem Java basearam-se na linguagem de programação C++, mas removeram muitas das características de orientação a objeto que são raramente usadas, ou são usadas parcamente. C++ é uma linguagem para programação orientada a objeto, e oferece características poderosas. No entanto, como é o caso para muitas linguagens projetadas para serem poderosas, algumas características ocasionalmente causam problemas aos programadores, tais como criar código que regularmente contém erros e é de difícil compreensão. A maior parte do custo da Engenharia de Software é grande parte das vezes relacionado a manutenção do código em contraposição a criação. Portanto, pode-se ajudar a reduzir o custo do software se o código for mais compreensível, ao invés de poderoso, mas de difícil compreensão.

Mais especificamente, Java difere de C++ nas seguintes características:

- Java não suporta os seguintes tipos de dados: struct, union e pointer.

- Java não suporta #define e nem typedef.

- Java difere na manipulação de certos operadores e não permite overloading de operador

- Java não suporta múltipla herança.

- Java manipula argumentos da linha de comando de forma diferente de C , C++.

- Java possui uma String Class como parte do Package Java.Lang.

- Java possui um sistema automático para alocação e dealocação de memória (Garbage Collection).

Orientado a Objeto

Como C++, Java suporta a escrita de um software utilizando paradigma orientado a objeto. Idealmente, projetos utilizando orientação a objeto permite a criação de código que pode ser reutilizado.

Programação orientada a objeto é baseada na modelagem do mundo real em termos de componentes de software denominados objetos. Um objeto consiste de dados e operações chamadas de métodos que podem ser realizadas sobre os dados. Estes métodos encapsulam, ou protegem, os dados do objeto porque os métodos são a única maneira de mudar o estado do dado.

Outro aspecto da orientação a objeto é a herança. Objetos podem utilizar características de outros objetos sem ter que reproduzir a funcionalidade daquele objeto. Herança, portanto, colabora com a reutilização do software. Outro benefício da herança corresponde a organização do software. Tendo objetos organizados de acordo com classes, significa que cada objeto em uma classe herda características de objetos parentes. Isto faz com que o trabalho de documentar, compreender e se beneficiar de versões anteriores do software mais fácil, porque a funcionalidade do software é crescente incrementalmente, conforme mais objetos são criados. Objetos no fim de uma longa cadeia de herança podem ser bastante especializado e poderosos.

Distribuído

Diferente de C e C++, Java é especificamente projetado para trabalhar dentro um ambiente de redes. Java possui uma grande biblioteca de classes para comunicação utilizando o conjunto de protocolo TCP/IP da Internet, incluindo protocolos tais como HTTP e FTP. Código em Java pode manipular recursos via URLs tão facilmente quanto os programadores estão acostumados a acessar um arquivo local utilizando C ou C++.

Interpretado

Quando um compilador Java traduz um arquivo fonte de classe em Java para bytecodes, este arquivo que contém os bytecodes da classe pode rodar em qualquer máquina que possua um browser suportando Java, ou seja, que possua uma máquina virtual para esta arquitetura. Isto permite que o código em Java possa ser escrito independente da plataforma, e elimina os ciclos de compilar e rodar no cliente porque os bytecodes não são especificos de uma dada máquina, mas interpretados.

Robusto

Software robusto significa que o mesmo não "quebra" facilmente devido a bugs de programação. Uma linguagem de programação que encoraja software robusto, em geral impõe mais restrições ao programador quando este está escrevendo o código fonte. Estas restrições incluem aquelas com relação aos tipos de dados e ao uso de ponteiros. A linguagem de programação C é notoriamente relaxada com relação a checagem de compatibilidade entre tipos de dados durante a compilação e runtime. C++ foi projetado para ser menos relaxado com relação a compatibilidade entre os tipos de dados. Apesar disto, C++ ainda retém algumas características de relaxamento com relação a este tipo de compatibilidade. Em java, a compatibilidade entre os tipos de dados é mais rigorosa: um programador não pode transformar um dado inteiro em um ponteiro através de um type cast, por exemplo.

Ainda, Java não suporta aritmética de ponteiros, mas possui arrays. Esta simplificação elimina alguns dos macetes que programadores em C podiam utilizar para acessar determinadas áreas de memória. Em particular, Java não permite ao programador escrever diretamente na memória ou corromper outros dados através de ponteiros. Em contraste, um programador em C ocasionalmente, ou intencionalmete, pode corromper ou sobrepor dados.

Seguro

Devido a Java trabalhar em um ambiente de rede, a questão da segurança deve ser de interesse de todos os desenvolvedores. Java permite a construção de sistemas livres de vírus. As técnicas de autenticação de dados são baseadas em public-key encryption.

Existe um forte intercâmbio entre robusto e seguro. Por exemplo, as mudanças para a semântica de ponteiros impossibilita para aplicações forjar acesso a estruturas de dados ou acesso a dados privados em objetos ao qual o programa tem acesso. Isto fecha as portas para a maior parte das atividades de vírus.

Neutro com relação a arquitetura

Java foi projetado para suportar aplicações baseadas em rede. Em geral, redes são compostas de uma variedade de sistemas com uma variedade de arquiteturas de CPU e sistemas operacionais. Para habilitar a uma aplicação Java a executar em qualquer lugar na rede, o compilador gera um formato de arquivo objeto. O código compilado pode ser, portanto, executado em qualquer processador, dada a presença de um sistema runtime Java.

Isto é útil não apenas para redes, mas também para distribuição de software em sistema único. No mercado de computação pessoal atual, os desenvolvedores de aplicação tem que produzir versões das suas aplicações que são compatíveis com IBM PC e com Apple Macintosh. Com o mercado do PC (através do Windows/NT) diversificando através de diversas arquiteturas de CPU, e a Apple se afastando do chip Motorola 68000, indo para o PowerPC, isto faz com que a produção de software para diversas plataformas quase impossível. Com Java, a mesma versão da aplicação roda em diversas plataformas.

O compilador Java, como já foi mencionado acima, faz isto através da geração de bytecodes de instrução, que não possui nenhum vínculo com nenhuma arquitetura em particular. Ao contrário, são designados para ser ambos de fácil interpretação em qualquer máquina e facilmente codificado para o código da máquina nativa on the fly.

Portável

A qualidade de ser neutro com relação à arquitetura permite uma grande portabilidade. No entanto, outro aspecto da portabilidade é como o hardware interpreta operações aritméticas. Em C e C++, o código fonte pode rodar ligeiramente diferente em diferentes plataformas de hardware devido a como estas plataformas implementam as operações aritméticas. Em Java, isto foi simplificado. Um tipo inteiro em Java, int, é um inteiro com sinal de 32-bit complemento a dois. Um número real, float, é sempre um número de ponto flutuante de 32-bit definido pelo padrão IEEE 754.

Alta Performance

Devido aos bytecodes de Java serem interpretados, a performance, as vezes não é tão rápida quanto se fosse uma compilação direta e posterior execução em uma determinada plataforma de hardware. A compilação em Java inclui uma opção para traduzir os bytecodes em código de máquina para uma determinada plataforma de hardware. Isto pode dar a mesma eficiência que uma compilação tradicional e processo de carregamento. De acordo com teste da Sun Microsystems, a performance deste bytecode para tradução em código de máquina é comparável a compilação direta de programass em C ou C++.

Multithreaded

Java é uma linguagem que pode ser utilizada para criar aplicações nas quais múltiplas linhas de execução podem ocorrer ao mesmo tempo. Baseado em um sistema de rotinas que permite para múltiplos threads de eventos baseados no paradigma de variável de condição e monitor de C.A.R Hoare, Java apresenta ao programador uma forma de se suportar comportamento interativo e em tempo real nos programas. Entretanto este comportamento é limitado pela plataforma: ambientes onde se roda Java stand-alone tem-se um bom comportamento. Rodando sobre outros sistemas como Unix, Windows, System 7 ou Windows NT, limita-se a sensibilidade de tempo real ao sistema sob o Java.

Dinâmico

De certa forma, a linguagem Java é mais dinâmica que C ou C++. Java foi desenvolvida para adaptar-se a um ambiente em desenvolvimento. Por exemplo, um grande problema em C++ em ambiente de produção é um efeito colateral devido ao modo como o código é implementado. Se a companhia A produz a biblioteca de classes A (uma biblioteca de componentes PnP) e a companhia B compra esta biblioteca e a usa em seus produtos, então se A muda sua biblioteca e distribui uma nova versão, B quase certamente terá que recompilar e redistribuir seu próprio software. Em um ambiente onde o usuário pega o software de A e de B independentemente (por exemplo A é um vendedor de SO e B é um vendedor de aplicações) podem ocorrer problemas.

Ou seja, diferentemente de código em C++, o qual ocasionalmente requer uma recompilação completa se uma classe parente for mudada, Java utiliza um método de interfaces para liberar esta dependência. O resultado é que programas em Java permitem novos métodos e variáveis instanciadas em uma biblioteca de objetos sem afetar seus objetos clientes dependentes.

Contruções em Linguagem Java

Java é uma linguagem de programação utilizada no desenvolvimento de aplicações executáveis e distribuídas para disponibilizar a browsers que suportam Java e para o interpretador Java:

- Applets : programas que são incluídos em páginas HTML através do item

<applet code></applet> e mostrados em browsers que suportam Java.

- Aplicações : programas escritos em Java executados independentemente de um browser suportando Java. Isto é feito utilizando-se o interpretador Java, que é distribuído junto com o compilador.

- Manipuladores de Protocolo : programas que são carregados pelo browser do usuário e interpretam um protocolo. Estes protocolos incluem protocolos padrão, tais como HTTP, ou protocolos definidos pelo usuário.

- Manipuladores de Conteúdo : programas que são carregados pelo browser do usuário, os quais interpretam arquivos definidos pelo programador. O programador fornece o código necessário para o usuário do browser mostrar ou interpretar este formato especial.

- Métodos Nativos : métodos que são declarados em uma classe em Java mas implmentados em C. Estes métodos nativos permitem ao programador de Java acessar código em C a partir de um código em Java.

- Interfaces : conjunto de métodos que classes em Java podem implementar.

- Package : conjunto de classes com uma função de alto nível declarada com a palavra chave package.

Novos Conceitos

Remote Method Invocation e Object Serialization

Object Serialization define interfaces para escrita e leitura de objetos e classes que implementam estas interfaces. Quando se escreve um objeto em um stream de saída de objeto, um stream de bytes é gerado. O stream de bytes pode ser lido por um correpondente stream de entrada de objeto para criar um novo objeto que é equivalente ao objeto original. Object Serialization permite recriar esquemas de objetos. Não é necessário escrever código especial para permitir que uma classe seja escrita, basta "setar"um flag na classe. Um mecanismo default para recriar é fornecido para classes com flag setado, caso não seja fornecido um.

Remote Method Invocation(RMI) permite que se escreva objetos que tem seus métodos invocados por código Java rodando em outra Máquina Virtual, incluindo aquelas que estão rodando em outros computadores. Referências a estes objetos podem ser passados como parâmetros em chamadas RMI. RMI utiliza Object Serialization para passagem de parâmetros.

JOE

Com a introdução da linguagem de programação Java, a Sun Microsystems foi pioneira em um novo padrão de interatividade nos browsers da Web. A introdução do Solaris NEO forneceu o ambiente de objetos em rede CORBA para construção e gerenciamento de aplicações comerciais. Com o JOE, existe a união entre o Java e o NEO em um ambiente para a criação de aplicações robustas, escaláveis e altamente interativas para a Web, que tiram vantagem da infraestrutura de computação existente nas corporações.

JOE inclui um Object Request Broker, o qual conecta Applets Java com Objetos NEO remotos rodando em qualquer máquina através da Internet ou da Intranet. O ORB JOE é automaticamente carregado nos Web Browsers com os Applets Java. JOE então estabelece e gerencia conexões entre objetos Java locais e objetos NEO remotos. JOE inclui ainda um compilador de Object Management Group(OMG) Interface Definition Language(IDL), o qual automaticamente gera classes Java associadas de definições de interface de objetos NEO. Devido a JOE ser implementado na linguagem Java , programas podem acessar serviços de rede simplesmente adicionando algumas linhas de código Java nos Applets existentes.

Conclusão

Java é uma linguagem de programação desenvolvida para fornecer conteúdo executável através da rede. Java possibilita um novo tipo de interação na Web, em termos do tipo informação mostrada em forma de animação, e de aplicações interativas.

Ao invés de fornecer somente conteúdo informativo, Java suporta um conteúdo interativo sob a forma de software que pode ser carregado e rodado no terminal do usuário com o ambiente de interpretação Java instalado.

O seu desenvolvimento está baseado em idéias sobre código executável independente da plataforma. Java foi desenvolvido para ser um sistema robusto de programação e fornecimento de informação para ser utilizado na Web. Este sistema torna possível animação, interação, processamento, aplicações distribuídas e novas formas de comunicação. Através de manipuladores de protocolo e de conteúdo, Java tem o potencial de fornecer novos formatos e protocolos através da Web.

Outras características do Java permitem a criação de aplicações distribuídas dentro de grandes corporações. Ao contrário do funcionamento das redes corporativas ao modo antigo, onde esta se separa da Internet, com JOE pode se criar clientes Web para mover aplicações cliente/servidor para a Web, que antes apareciam somente dentro da rede corporativa.

Portanto, Java transforma a Web em um sistema de fornecimento de aplicações onde os usuário tem coisas para fazer, ao invés de apenas lugares para ir. O conceito de navegar pela Web muda, no sentido de que agora existe uma verdadeira interação no conteúdo que é distribuído através da Internet/Intranet.

Bibliografia

  1. - "The Java Language : A White Paper"
    URL : http://java.sun.com/1.0alpha3/doc/overview/java/index.html
  2. - "Introduction to JavaScript"
    URL : http://rummelplatz.uni-mannheim.de/~skoch/js/javascr.htm#what
  3. - "Netscape JavaScript"
    URL : http://home.netscape.com/comprod/products/navigator/version_2.0/script/index.html
  4. - "CGI Info"
    URL : http://www.graphcom.com/info/cgi.html
  5. - "JOE - Client/Server Applications for the Web"
    URL : http://www.sun.com/sunsoft/neo/external/prod_specs/JOE_Overview.html
  6. - "JOE - Developing Client/Server Applications for the Web"
    URL : http://www.sun.com/sunsoft/neo/external/whitepapers/Joe-wp-new.html
  7. - "NEO Concepts"
    URL : http://www.sun.com/sunsoft/neo/external/xplor/neo-concepts.html
  8. - "Joe Overview"
    URL : http://www.sun.com/sunsoft/neo/external/neo-joe.html
  9. - "JOE - Internet/Intranet Solutions"
    URL : http://www.sun.com/960325/cover/facts/joe.html
  10. - "Object Serialization - Overview"
    URL : http://chatsubo.javasoft.com/current/doc/serial-spec/serial-arch.doc.html
  11. - "Remote Method Invocation - Overview"
    URL : http://chatsubo.javasoft.com/current/doc/rmi-spec/rmi-intro.doc.html
  12. - "Object Serialization - Index"
    URL : http://chatsubo.javasoft.com/current/serial/index.html
  13. - "Remote Method Invocation - Index"
    URL : http://chatsubo.javasoft.com/current/rmi/index.html
  14. - "HotJava : The Security Story"
    URL : http://java.sun.com/java.sun.com/1.0alpha3/docs/security/security.html
  15. - "Low Level Security in Java"
    URL : http://java.sun.com/java.sun.com/sfaq/verifier.html
  16. - "Providing Your Own Security Manager"
    URL : http://java.sun.com/java.sun.com/tutorial/networking/security/index.html
  17. - "Handling Errors using Exceptions"
    URL : http://java.sun.com/java.sun.com/tutorial/java/exceptions/index.html
  18. - December, John : "Presenting Java" - Sams Net, 1995