Software

Linguagem JAVA

Java, das torradeiras à Internet

DukeMuito 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.

Um outro problema no uso de linguagens de programação tradicionais em produtos eletro-eletrônicos reside no fato de que o consumidor em geral quer uma longa vida útil para seu aparelho. De outro lado, é ponto pacífico que a maioria dos softwares são projetados já prevendo-se sua breve obsolecência, ou seja, escreva um programa hoje e em poucos meses ele estará ultrapassado. Desta forma, sempre que novos processadores para eletrodomésticos fossem desenvolvidos, eles teriam de apresentar uma espécie de compatibilidade retroativa. (Se bem que para usuários de PC, isso não é lá muito estranho, basta lembrar a compatibilidade forçada na evolução 8088-80x86 e no encadeamento DOS-Windows-Win95).

Por fim, os projetistas de software de eletrodomésticos desejavam que o software por eles fabricado fosse seguro e robusto, capaz de funcionar em um ambiente tão adverso quanto uma cozinha. E que fosse confiável também, mais ainda que um software normal, pois quando ocorre alguma falha em um aparelho eletro-eletrônico, peças mecânicas são trocadas, gerando um custo a mais pro fabricante.

No início de 1990, Naughton, Gosling e Sheridan começaram a definir as bases para o projeto de uma nova linguagem de programação, apropriada para eletrodomésticos, sem os problemas já tão conhecidos de linguagens tradicionais como C e C++. O consumidor era o centro do projeto, e o objetivo era construir um ambiente de pequeno porte e integrar esse ambiente em uma nova geração de máquinas para "pessoas comuns". A especificação da linguagem terminou em agosto de 1991, e a ela deu-se o nome de "Oak" [Carvalho]. Por problemas de copyrigth (já existia uma linguagem chamada Oak) o nome foi mudado em 1995 para Java, em homenagem à ilha de Java, de onde vinha o café consumido pela equipe da Sun.

Em 1992, Oak foi utilizada pela primeira vez em um projeto chamado Projeto Green, que tinha por propósito desenvolver uma nova interface de usuário para controlar os aparelhos de uma casa. Tal interface consistia em uma representação animada da casa, que era exibida em um computador manual [chamado star seven, bisavô dos palmtops de hoje], e que tinha uma tela sensível ao toque que permitia a manipulação dos eletrodomésticos. Essa interface era totalmente escrita em Oak, e evoluiu para um projeto de interface para redes de televisão pay-per-view. Contudo, o padrão proposto por esses dois projetos não vingou, e outros padrões, pelo menos em sistemas de TV pay-per-view vêm tomando conta do mercado. Um personagem animado desses projetos, Duke, tornou-se um dos símbolos de Java.

Em meados de 1993, pode-se dizer que Oak ia "mal das pernas". Os projetos propostos não eram economicamente viáveis, e não se via um grande futuro no desenvolvimento de aparelhos que suportassem essa nova linguagem. Justamente nessa época, a World Wide Web estava em seu nascimento, trazendo um novo horizonte para a Internet. (É importante lembrar que a Internet já existia muito antes do surgimento da WWW. A WWW nada mais é que um conjunto de protocolos que permite um acesso mais amigável aos recursos disponíveis na Internet. Dentre esses protocolos, por exemplo, o mais conhecido em geral é o de transferência de hipertexto [http]). Com o lançamento do primeiro browser do mercado, o Mosaic, ocorreu à equipe de desenvolvimento da Sun que uma linguagem independente de plataforma, segura e robusta como a que estava sendo desenvolvida para eletrodomésticos caberia como uma luva para uso na Internet, uma vez que um aplicativo gerado nessa linguagem poderia rodar nos diversos tipos de computadores ligados na Internet, rodando qualquer sistema operacional, de PCs rodando OS/2 a estações RISC rodando AIX Unix, ou SparcStations rodando Solaris, os programas escritos nessa linguagem que viria a ser conhecida por Java seriam o modelo para qualquer aplicativo Web.

Com o novo ânimo trazido pelo advento da WWW, a equipe da Sun desenvolveu um browser totalmente escrito em Java, tendo-o terminado no início de 1995 e denominado-o HotJava. O grande diferencial de HotJava para outros browsers da época (como o Mosaic, o Netscape Navigator e o Lynx) é que ele permitia a inserção de programas escritos em Java dentro de páginas HTML comuns. HotJava como browser foi um fiasco comercial, mas abriu os olhos dos desenvolvedores para um fato muito importante: as páginas HTML estariam fadadas a serem estáticas e sem ações embutidas em si, não houvesse uma linguagem padrão na qual fossem escritos programas que pudessem ser embutidos nas páginas Web. HotJava demonstrou que isso era possível (ou seja, incluir um programa, no caso escrito em Java, em uma página HTML rodando em um browser preparado para dar suporte à execução do programa, no caso o próprio HotJava). O grande "pulo do gato" de Java veio logo a seguir, quando a Netscape anunciou que sua próxima versão do browser Navigator, iria dar suporte a aplicativos Java embutidos em documentos HTML. Em seguida, a Microsoft anunciou o mesmo para o seu Internet Explorer. E Java estourou no mundo, a Sun contabilizava inúmeros downloads de seu JDK, diversas empresas desenvolveram IDEs para a programação em Java, e vieram JavaScript, JavaBeans, a briga deste com ActiveX, e...

E a Internet jamais foi a mesma.

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:

Microsoft Visual J++ - A Microsoft, que de início menosprezou todo o potencial da Internet, e que subestimou Java como uma linguagem promissora, agora "retomou o bonde" e tenta, com o seu VJ++, estabelecer um padrão para IDEs Java. Contudo, o VJ++ tem mecanismos intrincados de instalação, consome muito espaço em disco e exige a presença do Internet Explorer no computador.

Symantec Visual Café - A Symantec foi uma das poucas a acertarem em ambientes para Java. O seu Symantec Café fez grande sucesso em 1996, e o Visual Café parece ser bastante promissor. O ambiente de programação lembra o de Visual Basic.

Asymetrix SuperCede - Na tentativa de desenvolver um compilador para Java, a Asymetrix desenvolveu o SuperCede, que peca por ferir um dos principais conceitos de Java: a portabilidade. SuperCede possui um compilador próprio que não gera bytecodes, mas sim código executável, na tentativa de ganho de performance.

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


-->