Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Prezentarea mediului Java, limbaj de programare - Tehnologia Java, Descrierea limbajului Java prin comparatie cu limbajul C/C++

1. Prezentarea mediului Java

1.1. Introducere

Limbajul Java impreuna cu mediul sau de dezvoltare si executie au fost proiectate pentru a rezolva o parte dintre problemele actuale ale programarii. Proiectul Java a pornit cu scopul declarat de a dezvolta un software performant pentru aparatele electronice de larg consum. Aceste echipamente se definesc ca fiind: mici, portabile, distribuite si lucrand in timp real. De la aceste aparate, ne-am obisnuit sa cerem fiabilitate si usurinta in exploatare.

Radacinile limbajului Java se afla intr-un proiect de cercetare (proiectul "Green") al firmei SUN. Coordonator de proiect este numit James Gosling, unul din veteranii designului software-ului de retea. Menirea proiectului era aceea de a crea obiecte casnice "destepte" si de a le face sa comunice unele cu altele. Limbajul luat initial in considerare a fost C++. Se pare insa ca C++ nu a fost limbajul care sa satisfaca cerintele unui astfel de proiect. Ca urmare, James Gosling da nastere unui nou limbaj care il va face mai tarziu celebru. La inceput limbajul se numea "Oak", in cinstea arborelului din fata ferestrei lui Gosling. In urma unei demonstratii reusite a proiectului, si implicit a limbajului, firma Sun are o tentativa de a folosi acest limbaj in Interactive Television Industry, tentativa care va fi insa un esec. Aceasta se intampla in 1994. In timp ce Green si Oak isi cautau cumparatorii in domeniul Televiziunii Interactive, o noua aparitie schimba lumea Internet in primavara lui 1993: Mark Andersen, inca student, lucrand la National Center for Supercomputing Applications (NCSA) lanseaza Mosaic 1.0, primul browser WWW grafic. Pierzand cursa in domeniul televiziunii interactive, Oak incepe o alta in WWW. Echipa proiecteaza un nou browser WWW, numit Web Runner, cu capabilitati de rulare a aplicatiilor dezvoltate in limbajul Oak. E momentul in care Oak isi schimba numele in JAVA, marca Oak existand deja pe piata.



Firma Netscape ajuta lansarea limbajului Java prin cumpararea licentei si integrarea lui in browser-ele Netscape. Java intra astfel in cursa limbajelor de programare evoluate. Astfel, in noiembrie 1995 este disponibila prima versiune Beta a limbajului Java. De atunci limbajul se afla intr-o continua ascensiune trecand de la versiunea 1.0 (in 1995) la 1.1 (in 1997), la 1.2 (in 1998) si in acest moment la 1.3 (in 2000), versiunea 1.4 fiind de tip beta (vara 2001). Fiecare versiune implementeaza noi concepte si noi unelte care isi fac aparitia in lumea Java.

Rezultatul este surprinzator in lumea software. Java se profileaza ca un limbaj, un mediu de programare puternic, o tehnologie a viitoarelor dezvoltari software. In acest moment cele mai mari firme de software au cumparat licenta Java de la firma Sun in vederea dezvoltarii unor produse care considera tehnologia Java.

In primul rand, Java incearca sa ramana un limbaj simplu de folosit chiar si de catre programatorii neprofesionisti, programatori care doresc sa se concentreze asupra aplicatiilor in principal si abia apoi asupra tehnicilor de implementare a acestora. Aceasta trasatura poate fi considerata ca o reactie directa la complexitatea considerata a limbajului C++

Au fost indepartate din Java aspectele cele mai derutante din C++ precum supraincarcarea operatorilor si mostenirea multipla. A fost introdus un colector automat de gunoaie (garbage collector) care sa rezolve problema dealocarii memoriei in mod uniform, fara interventia programatorului. Colectorul de gunoaie nu este o trasatura noua, dar implementarea acestuia in Java este facuta inteligent si eficient folosind un fir separat de executie, pentru ca Java are incorporate facilitati de executie pe mai multe fire de executie implicit. Astfel, colectarea gunoaielor se face de obicei in timp ce un alt fir asteapta o operatie de intrare-iesire sau pe un semafor.

Limbajul Java este independent de arhitectura calculatorului pe care lucreaza, ceea ce ii confera portabilitate. In loc sa genereze cod nativ pentru o platforma sau alta, compilatorul Java genereaza o secventa de instructiuni ale unei masini virtuale Java. Executia aplicatiilor Java este interpretata. Singura parte din mediul de executie Java care trebuie portata de pe o arhitectura pe alta este mediul de executie cuprinzand interpretorul si o parte din bibliotecile standard care depind de sistem. In acest fel, aplicatii Java compilate pe o arhitectura SPARC de exemplu, pot fi rulate fara recompilare pe un sistem bazat pe procesoare Intel.

Una dintre principalele probleme ale limbajelor interpretate este viteza de executie, considerabil scazuta fata de cea a limbajelor compilate. Daca nu este multumitoare viteza de executie a unei astfel de aplicatii, se poate cere mediului de executie Java sa genereze automat, plecand de la codul masinii virtuale, codul specific masinii pe care se lucreaza, obtinandu-se astfel un executabil nativ care poate rula la viteza maxima. De obicei insa, in Java se compileaza doar acele parti ale programului, mari consumatoare de timp, restul ramanand interpretate pentru a nu se pierde flexibilitatea. Mediul de executie insusi este scris in C respectand standardele POSIX, ceea ce il face extrem de portabil.

Interpretorul Java este a fost initial gandit sa lucreze pe masini mici, precum ar fi procesoarele cu care sunt dotate aparatele casnice. Interpretorul plus bibliotecile standard cu legare dinamica nu depasesc 300 Kb. Chiar impreuna cu interfata grafica totul ramane mult sub 1 MB, ceea ce ii confera un imens avantaj.

Limbajul Java este pur orientat obiectual. Cu el se pot crea clase de obiecte si instante ale acestora, se pot incapsula informatiile, se pot mosteni variabilele si metodele de la o clasa la alta, etc. Singura trasatura specifica limbajelor orientate obiect care lipseste este mostenirea multipla, dar pentru a suplini aceasta lipsa, Java ofera o facilitate mai simpla, numita interfata, care permite definirea unui anumit comportament pentru o clasa de obiecte, altul decat cel definit de clasa de baza printr-o implementare specifica a unei interfete. In Java orice element este un obiect, in afara de datele primare. Din Java lipsesc functiile si variabilele globale. Ne raman desigur metodele si variabilele statice ale claselor.

Java este distribuit, avand implementate biblioteci pentru lucrul in retea care ne ofera TCP/IP, URL si incarcarea resurselor din retea. Aplicatiile Java pot accesa foarte usor reteaua, folosindu-se de apelurile catre un set standard de clase.

Java este robust. In Java legarea functiilor se face in timpul executiei si informatiile de compilare sunt disponibile pana in momentul rularii aplicatiei. Acest mod de lucru face ca sistemul sa poata determina in orice moment neconcordanta dintre tipul referit la compilare si cel referit in timpul executiei evitandu-se astfel posibile intruziuni rauvoitoare in sistem prin intermediul unor referinte falsificate. In acelasi timp, Java detecteaza referintele nule daca acestea sunt folosite in operatii de acces. Indicii in tablourile Java sunt verificati permanent in timpul executiei si tablourile nu se pot parcurge prin intermediul unor pointeri asa cum se intampla in C/C++. De altfel, pointerii lipsesc complet din limbajul Java, impreuna cu intreaga lor aritmetica, eliminandu-se astfel una din principalele surse de erori. In plus, eliberarea memoriei ocupate de obiecte si tablouri se face automat, prin mecanismul de colectare de gunoaie, evitandu-se astfel incercarile de eliberare multipla a unei zone de memorie

Java este un limbaj cu securitate ridicata. El verifica la fiecare incarcare codul prin mecanisme de CRC si prin verificarea operatiilor disponibile pentru fiecare set de obiecte. Robustetea este si ea o trasatura de securitate. La un al doilea nivel, Java are incorporate facilitati de protectie a obiectelor din sistem la scriere si/sau citire. Variabilele protejate intr-un obiect Java nu pot fi accesate fara a avea drepturile necesare, verificarea fiind facuta in timpul executiei. In plus, mediul de executie Java poate fi configurat pentru a proteja reteaua locala, fisierele si celelalte resurse ale calculatorului pe care ruleaza o aplicatie Java.

Limbajul Java are inclus suportul nativ pentru aplicatii care lucreaza cu mai multe fire de executie, inclusiv primitive de sincronizare intre firele de executie. Acest suport este independent de sistemul de operare, dar poate fi conectat, pentru o performanta mai buna, la facilitatile sistemului daca acestea exista.

Java este dinamic. Bibliotecile de clase in Java pot fi reutilizate cu foarte mare usurinta. Cunoscuta problema a fragilitatii superclasei este rezolvata mai bine decat in C++. Acolo, daca o superclasa este modificata, trebuie recompilate toate subclasele acesteia pentru ca obiectele au o alta structura in memorie. In Java aceasta problema este rezolvata prin legarea tarzie a variabilelor, late binding, doar la executie. Regasirea variabilelor se face prin nume si nu printr-un deplasament fix. Daca superclasa nu a sters o parte dintre vechile variabile si metode, ea va putea fi refolosita fara sa fie necesara recompilarea subclaselor acesteia. Se elimina astfel necesitatea actualizarii aplicatiilor, generata de aparitia unei noi versiuni de biblioteca asa cum se intampla, de exemplu, cu toate celelalte ierarhii C++.

1.2. Tehnologia Java

Tehnologia Java reprezinta pe de-o parte un limbaj de programare, pe de alta parte o platforma.


1.2.1. Limbajul de programare Java

Limbajul de programare Java este un limbaj de nivel inalt care este asa cum am aratat caracterizat de urmatoarele: simplitate, orientat pe obiecte, distribuit, interpretat, robust, sigur, neutru din punct de vedere al arhitecturii, portabil, performanta ridicata, fire multiple de executie, dinamic. Spre deosebire de alte limbaje de programare, in care avem de compilat sau de interpretat un program pentru a putea fi executat intr-un calculator, limbajul Java este mai deosebit prin faptul ca un program este compilat si interpretat. Cu compilatorul se translateaza mai intai programul intr-un limbaj intermediar denumit Java-bytecode, care este un cod independent de platforma si este interpretat de interpretorul platformei Java. Acest interpretor analizeaza si ruleaza fiecare instructiune Java-bytecode pe calculator. Compilarea se face o singura data, iar interpretarea intervine ori de cate ori este nevoie sa se execute programul. Figura 1.1. ilustreaza tot acest proces de creare a unei aplicatii Java.

Figura 1.1.Etapele necesare in crearea si executia unei aplicatii Java

Java-bytecode se poate interpreta ca fiind instructiuni in limbaj masina pentru procesorul denumit Masina Virtuala Java (Java Virtual Machine - Java VM, JVM). Orice interpretor Java, chiar daca este un mediu de dezvoltare sau este un browser Web capabil sa ruleze applet-uri, este o implementare a JVM.

Java-bytecode ajuta ca sintagma "scrie o singura data, ruleaza oriunde" (write once, run anywhere) sa fie posibila compilarea unui program in Java-bytecode pe orice platforma care are un compilator Java instalat. Acest cod binar rezultat poate fi executat pe orice implementare a Java VM. Acest lucru inseamna ca atat timp cat un calculator are instalat Java VM, acelasi program poate fi rulat pe o statie cu Windows 2000, o statie Solaris, sau pe un Mac (Figura 1.2.).

Figura 1.2. Java VM pe diverse platforme

1.2.2. Platforma Java

O platforma este un mediu hardware sau software in care se executa un program. Cele mai populare platforme, de exemplu Windows 2000, Linux, Solaris, MacOS, pot fi descrise ca fiind o combinatie dintr-un sistem de operare si un sistem hardware adecvat. Platforma Java difera de celelalte platforme prin faptul ca este o platforma exclusiv software care ruleaza deasupra altor platforme bazate pe hardware.

Platforma Java este compusa din doua componente:

-Masina virtuala Java (Java VirtualMachine - Java VM)

-Interfata de programare a aplicatiilor Java (Java Application Programming Interface - Java API)

Masina virtuala Java, introdusa in sub-capitolul precedent, este baza platformei Java si a fost portata pe diverse platforme bazate pe hardware.

Java API este o colectie de componente software care furnizeaza multe posibilitati utile, cum ar fi utilitare pentru interfata grafica cu utilizatorul. Java API este grupata in biblioteci de clase si interfete, aceste biblioteci purtand numele de pachete (packages).

Figura urmatoare (Figura 1.3.) descrie un program care ruleaza pe platforma Java. Dupa cum se vede Java API si Java VM izoleaza programul de partea hardware a sistemului.



Figura 1.3. Platforma Java si dezvoltarea unei aplicatii


Codul nativ este codul care dupa compilare, (codul compilat) ruleaza pe o platforma hardware specifica. Deoarece este un mediu independent de platforma, platforma Java este mai lenta decat codul nativ, totusi, compilatoarele mai inteligente, interpretoarele bine configurate, si compilatoarele de bytecode pot sa fie suficient de rapide, aproape ca si codul nativ fara sa afectam portabilitatea programului.


1.2.3. Aplicatii in Java

Cele mai intalnite tipuri de aplicatii scrise in limbajul de programare Java sunt applet-urile si aplicatiilede sine statatoare (stand alone).

Un applet este un program care se supune unor conventii si ruleaza intr-un browser Web care suporta Java.

O aplicatie de sine statatoare este un program independent care ruleaza direct pe platforma Java.

In Java se poate realiza si un applet-aplicatie, appletcation care functie de context poate fi tratat ca si:

-applet de catre un browser sau appletviewer

-aplicatie grafica de catre interpretorul Java.

Un alt tip de aplicatii Java sunt servlet-urile. Un servlet se aseamana cu un applet, prin faptul ca ruleaza in interiorul unei alte aplicatii care suporta mediul Java, si respecta regulile impuse de aceasta. In cazul servlet-ului aplicatia este un server de Web. Servlet-urile Java sunt folosite pentru construirea de aplicatii Web interactive, fiind un inlocuitor al script-urilor CGI.

Toate aceste tipuri de aplicatii Java sunt suportate de catre Java API prin intermediul pachetelor de componente software care ofera o gama larga de functionalitati. Cele mai importante trasaturi oferite de acestea se refera la trasaturi:

-de baza, obiecte, siruri, fire de executie, lucrul cu numere, operatii input/output, structuri de date, informatii sistem, data si timpul, etc.

-applet-uri, setul de conventii folosite de applet-uri.

-retea, lucrul cu URL-uri, lucrul cu protocoalele TCP (Transmission Control Protocol), UDP (User Datagram Protocol), si IP (Internet Protocol).

-internationalizare, ajuta la scrierea de programe care pot fi localizate oriunde pe glob. Astfel programele se pot adapta automat la setarile locale si continutul va fi afisat in limba locala.

-securitate, de nivel mic sau mare, care cuprinde semnatura electronica, gestiune de chei publice si private, controlul accesului, si certificarea.

-componente software, sunt cunoscute sub denumirea de JavaBeans, sunt componente software reutilizabile care se pot integra intr-o arhitectura de componente existenta.

-serializare de obiecte, permite persistenta obiectelor si comunicatia folosind tehnologia RMI (Remote Method Invocation).

-acces la baze de date, JDBC (Java Database Connectivity) asigura accesul la o gama foarte larga de baze de date relationale.

Platforma Java mai cuprinde si API-uri pentru grafica 2D si 3D, accesibilitate, servere, colaborare, telefonie, tehnica vorbirii, animatie, si multe altele. Figura urmatoare (Figura 1.4.) arata modul de alcatuire a platformei Java 2 SDK (Software Development Kit) Standard Edition.

Figura 1.4. Java 2 SDK, Standard Edition, versiunea 1.3.

Mediul de executie Java 2 (JRE - Java Runtime Environment) este compus din masina virtuala Java, clasele nucleu, si alte fisiere. Java 2 SDK include JRE si instrumentele de dezvoltare cum ar fi compilatoarele si debuggerele.

1.2.3.1. Descrierea pachetului JDK

Este important ca inainte sa trecem la realizarea unei aplicatii Java sa discutam despre uneltele si bibliotecile de care dispunem.

La baza dezvoltarii unui program Java sta mediul de dezvoltare pus la dispozitie de firma Sun. Acesta este Java Developer Kit (JDK) si trebuie considerat ca mediu de referinta in programarea Java. Acest kit a evoluat, incepand ce versiunea JDK 1.0 si apoi JDK 1.1, JDK 1.2, pana la versiunea JDK 1.3, actualmente aparand versiunea beta pentru 1.4.

Se considera important ca un programator Java sa cunoasca mai intai uneltele standard si apoi sa treaca la utilizarea uneltelor mai performante.

Mediul JDK contine pe de-o parte o serie de biblioteci de clase Java necesare scrierii unui program si pe de alta parte un set de utilitare necesare compilarii, testarii, executiei si documentarii unei aplicatii Java.

Un fisier cu extensia *.class, reprezinta unitatea fundamentala a unui program executabil Java. O biblioteca de clase cuprinde o serie de clase ce au un numitor comun. O astfel de biblioteca este cunoscuta in Java sub numele de package. JDK-ul include cateva package-uri fundamentale, care contin clase fara de care nu se pot dezvolta aplicatii Java performante. Package-urile Java incluse in JDK, formeaza principalul API- Application Programming Interface numit si Java Core. Orice alt mediu care poate executa aplicatii Java diferit de mediul JDK trebuie sa includa acest API. Pe langa aceste pachete fundamentale grupate in Java Core utilizatorul poate folosi si altele dezvoltate de catre utilizatori. Trebuie insa sa se asigure ca aceste pachete aditionale, sunt disponibile si pe platforma pe care aplicatia se executa, nu numai unde aceasta a fost creata.

1.2.3.2. Pachete de baza JDK 1.3.


JDK 1.3. contine urmatoarele package-uri de baza:

package java.applet

Contine clase necesare dezvoltarii unui applet, a unui program Java care se executa in cadrul unui browser WWW sau este rulat cu appletviewer-ul.

package java.awt, java.awt.datatransfer, java.awt.event, java.awt.image

Sunt utilizate pentru dezvoltarea de interfete grafice standard.

package java.beans

Acesta include clasele necesare lucrului cu stream-uri (comunicare cu device-uri Input/Output, comunicare cu consola, accesul la fisiere, etc.).

package java.lang

Contine clasele fundamentale fara de care nici un program Java nu poate exista. Utilizarea unei clase din oricare alt pachet decat java.lang intr-un program Java, se specifica in clar prin directiva import nume_pachet. . Acest pachet este inclus automat de catre compilator fara a fi nevoie de precizari suplimentare.

package java.lang.reflect

Este utilizat pentru a putea face o verificare a entitatilor Java, a claselor/obiectelor Java. Aceasta verificare este foarte utila in cazul dezvoltarii de aplicatii flexibile si dinamice.

package java.math

Se foloseste pentru utilizarea de functii matematice standard implementate.

package java.net

Este utilizat pentru programarea in retea si contine o sumedenie de clase pentru aceasta.

package java.rmi, java.rmi.dgc, java.rmi.registry, java.rmi.server

Aceste pachete sunt utilizate pentru crearea unor aplicatii Java ce lucreaza in sisteme distribuite ( RMI - Remote Method Invocation ). Faciliteaza apelul unor metode din obiecte disponibile pe fiecare din calculatoarele conectate in retea.

package java.security, java.security.acl, java.security.interfaces

Sunt pachete ce privesc asigurarea unui mecanism de securitate al sistemului software dezvoltat.

package java.sql

Este utilizat pentru lucrul cu bazele de date.

package java.text

Este utilizat pentru lucrul cu texte.

package java.util

Ofera suport pentru lucrul cu liste, vectori, dictionare, informatii legate de data si timp, etc.

package java.util.zip, java.util.jar

Sunt pachete necesare atuci cand se lucreaza cu algoritmi de compresie si decompresie.

package java.awt.color

Furnizeaza clase pentru lucrul cu culori.

package java.awt.font

Clase pentru lucrul cu fonturi.

package java.awt.geom

Frunizeaza clase 2D pentru lucrul cu geometrie bidimensionala.

package java.awt.im

Clase si interfate pentru metode de intrare.

package javax.naming, javax.naming.directory, javax.naming.event, javax.naming.ldap, javax.naming.spi

Furnizeaza o interfata pentru dezvoltarea metodelor de intrare care pot fi utilizate cu orice JRE.

package javax.sound.midi

Furnizeaza interfete si clase pentru secvente audio de intrare/iesire.

package javax.sound.sampled

Furnizeaza interfete si clase pentru captarea, prelucrarea si rularea fisierelor audio.

package javax.swing

Furnizeaza un set de componente grafice pentru toate limbajele Java, care lucreaza la fel pe orice platforma.

package org.omg.CORBA

Furnizeaza maparea API-ului OMG CORBA in limbajul de programare Java , incluzand clasa ORB care este implementata pentru ca un programator sa o poata utiliza complet ca si un Object Request Broker (ORB).

Pe langa API-ul Java Core pachetul JDK pune la dispozitia programatorului o serie de unelte necesare dezvoltarii, testarii, analizei si documentarii programelor.

Principalele unelte utilizate in Java sunt:

javac - Java Language Compiler

Este compilatorul Java care transforma sursele text avand extensia *.java scrise in limbaj de programare Java, in cod executabil pe masina virtuala Java (JVM), in bytecode, adica fisiere de tip class.

Exemplu

javac nume_fisier.java

java - Java Interpreter

Interpretorul Java executa programele Java, realizand nivelul de JVM deasupra platformei reale. Prin lansarea in executie a acestui utilitar se porneste de fapt JVM. Programul emuleaza JVM convertind instructiunile JVM din bytecode in instructiuni ale masinii reale.

Observatie: Aceasta unealta este utila doar pentru aplicatiile stand- alone sau appletcation.

javadoc

Acest program genereaza documentatia programelor Java in format html. Documentarea se face pa baza comentariilor specifice Java din program si acest program se aplica doar asupra fisierelor sursa Java.



Exemplu:

javadoc nume_fisier.java

Orice masina virtuala Java (fie interpretor fie browser) se presupune ca are acces la fisierele bytecod existente in mediul JDK. Aceasta in cazul in care se formeaza versiuni. Variabila de mediu CLASSPATH este cea care defineste caile de acces la biblioteci.

1.3. Descrierea limbajului Java prin comparatie cu limbajul C/C++

Limbajul C si limbajul Java sunt foarte asemanatoare.

Cuvintele cheie si operatorii sunt mosteniti de Java din C, in mod particular tipurile de date, fluxurile de control, toti operatorii constituie corpul tuturor aplicatiilor.

Restul aplicatiei Java este reprezentat de constructii orientate obiect si se refera mai mult la cadrul de lucru si proiectare al aplicatiei si mai putin la implementare.

O aplicatie Java este formata doar din clase, o singura clasa implementand metoda main. Spre deosebire de C++, limbajul Java este in intregime orientat pe obiecte (OOP - Object Oriented Programming). Java este robust, marind gradul de siguranta al codului, existand doua nivele de verificare: unul la compilare si unul la rulare.

Accesul la tablourile Java este verificat la rulare, eliminand astfel accesul accidental sau malitios in afara domeniului tabloului.

Pentru a crea si a lansa in executie o aplicatie sunt necesare mai multe operatii.

In continuare sunt prezentate etapele necesare dezvoltarii si lansarii in executie a unei aplicatii stand- alone. Acestea sunt:

-scrierea codului

-compilarea

-interpretarea si lansarea in executie

Aceste etape sunt reprezentate sugestiv in diagrama din Figura 1.1.

Editarea unui program Java se face utilizand orice editor simplu de text, care salveaza datele in format text. Este important ca fisierul in care se salveaza programul sa aiba numele clasei respective (doar in cazul in care clasa este declarata publica). Iar in cazul dezvoltarii aplicatiilor stand-alone este obligatoriu ca in clasa sa fie metoda main() de forma:

public static void main(String args[] )

Aceasta metoda trebuie sa existe in orice aplicatie Java, fiind prima metoda apelata de interpretor cand se lanseaza in executie un program Java.

Exemplu de program:

class AplicatieJava


Acest program va fi salvat cu numele AplicatieJava.java insa nu obligatoriu pentru ca, clasa nu este publica.

In continuare se va realiza compilarea programului prin comanda:

javac AplicatieJava.java

Daca compilarea se face cu succes va rezulta un fisier cu extensia class: AplicatieJava.class, fisier care contine programul executabil (bytecod) Java.

Dupa ce am obtinut fisierul cu extensia class se lanseaza in executie folosind interpretorul Java cu comanda:

java AplicatieJava

In urma acestei comenzi se va afisa la consola:

"Aplicatie demonstrativa !"

Vom face in continuare o scurta trecere in revista a principalelor componente comune intre limbajul C si Java.

Cuvintele cheie si operatorii dau simtul si expresivitatea unui limbaj de programare ele fiind luate de Java din C. Java retine elementele coincise lipsite de posibile erori si compacte ce duc la dezvoltarea aplicatiilor eficiente.

Cuvintele cheie comune celor doua limbaje constituie nucleul aplicatiei. Aceste cuvinte cheie impreuna cu operatorii determina majoritatea constructiilor folosite in realizarea functiilor dorite.

Cadrul de realizare a aplicatiei poate fi obiectual dar implementarea este foarte aproape de cea din C.

Limbajul Java foloseste si cuvinte cheie specifice C++ avand si propriile cuvinte cheie (package, import, extends, instanceOf, super, etc.)

Operatorii sunt clasificati in acelas mod ca si cei din limbajul C dar sunt mai clar definiti. Daca in limbajul C se permite a converti o valoare numerica in una booleana expresia (x=10) fiind convertita in valoarea booleana true, in limbajul Java acest lucru nu este posibil. In limbajul Java se determina un cost pornind de la un tabel de costuri cu 16 intrari care permite conversia intre tipuri de date. Costul 0 (zero) este pentru conversia unui tip in el insusi. Daca costul este mai mare de 10 atunci precizia se pierde semnalizandu-se un avertisment.

Compararea a doua obiecte din punct de vedere al continutului lor se face cu metoda equals(), operatorul de comparatie, == comparand doar adresele obiectelor respective. In plus Java introduce operatorul >>> ca si operator de deplasare dreapta fara extensia semnului.

Nu se folosesc operatorii sizeof pentru determinarea dimensiunii, indirectare *, adresare &, acces -> iar operatorul virgula , ca si evaluare secventiala se mai poate folosi doar in structuri de control de tip for.

Exista patru modalitati de a considera variabilele in Java:

-declarare;

boolean ok;

float aria;

-asignare, ce permite asignarea unei valori la o variabila declarata in prealabil:

aria=10.5;

-initializari, ce sunt asignari combinate cu declaratii;

boolean ok=true;

-cast-uri, daca dorim sa plasam o valoare de un tip intr-o variabila de alt tip lucru ce e permis doar pentru tipuri compatibile:

int iaria = (int) aria;

Se observa ca si in acest caz Java este mai robust.

Identificatorii respecta aceleasi reguli ca si in limbajul C lungimea lor fiind ori cat de mare recomandandu-se ca:

-numele clasei, a variabilelor din metode si a parametrilor sa inceapa cu litera mica

-numele metodelor sa inceapa cu _

-constantele sa se scrie cu litere mari.

Constantele se declara in afara corpului functiilor din cadrul claselor in general fiind prefixate de cuvintele cheie public static si final insemnand ca asignarea e finala publica si nu poate fi modificata. Fiind statice accesul la aceste constante se va face prefixandu-le cu numele clasei si operatorul punct.

Constanta de tip caracter se mai poate reprezenta si ca o notatie de tip Unicode de forma: 'uxxxx'. Exista unele modificari de asemenea la secventele escape.

O expresie este ori ce combinatie de operatori si operanzi care trebuie sa fie evaluata pentru a produce o valoare. Java a adoptat puterea si facilitatile expresiilor din C/C++ cu unele diferente tinand cont de faptul ca Java este independent de platforma si international. De aceea tipurile de date primitive sunt erxtrem de clar si precis definite fata de limbajul C ele fiind:

-byte, reprezinta 1 octet ca o valoare cu semn

-boolean, este pe bit avand doua valori, true si false neputand fi convertit in alt tip de data si nu poate fi obtinut din alt tip de data

-char se reprezinta pe 2 octeti in Unicode respectand regulile de conversie la intregi din C

-short, int, long sunt intregi cu semn pe 16, 32 si 64 biti impartirea cu zero activand exceptia ArithmeticException

-double, float sunt reali pe 64 respectiv 32 de biti. Exista constante predefinite:

-POSITIVE_INFINITY

-NEGATIVE_INFINITY ce apar la cazurile de depasire cand nu se declanseaza exceptii.

Java a adoptat standardul IEEE 754 prin care toate tipurile de date au o lungime fixa evitand ambiguitati si independenta fata de platforma.

Limbajul Java ofera de asemenea pentru fiecare tip elementar cate o clasa ale caror instante reprezinta obiecte similare valorilor cu tipuri elementare. (Short, Integer, Float, Boolean, etc.) Metodele din aceste clase permit diverse operatii ce pot fi efectuate cu obiectele respective.

Structurile de control din Java ofera abilitatea de a selecta diferite ramuri de urmat functie de unele puncte de decizie precum si efectuarea de cicluri in program. Aceste structuri de control au fost adoptate de Java din C cu urmatoarele observatii:

-conditia pe baza careia se ia decizia trebuie sa fie o expresie de tip boolean

-instructiunile break si continue pot avea si variabile ca si etichete permitand fortarea iesirii nu neaparat imediat dupa ea respectiv reluarea unui ciclu exterior avand eticheta precizata

-s-a eliminat instructiunea goto rezervandu-se insa cuvantul, etc.

Pentru tratarea exceptiilor s-au introdus pe langa instructiuni specifice C++ si alte instructiuni Java. Astfel se folosesc instructiunile try, catch, throw, throws si finally.

Alte instructiuni specifice limbajului Java sunt synchronized, package si import.

Tablourile si sirurile de caractere sunt tratate in Java ca niste obiecte de clasa primara ce nu sunt insa supuse la erori si confuzii ca cele din C++.

Tablourile in Java pot deci pastra la fiecare indice un obiect sau o valoare primitiva toate datele fiind insa de acelas tip. Tablourile in Java :

-se declara oferind o referinta

-se creeaza alocandu-se spatiu de memorie dinamic

-se asigneaza valori tabloului

-se distrug cand nu mai sunt folosite.

Tablourile difera fata de cele din limbajul C prin urmatoarele:

-se creeaza folosind operatorul new, dimensiunea tabloului fiind introdusa doar in expresia new,

int iTablou[]= new int[5];

-fiind derivate direct din clasa Object aceasta clasa radacina a ierarhiei defineste mai multe metode si date astfel incat toate tablourile memoreaza lungimea de alocare intr-o variabila numita length care poate fi accesata ori cand astfel,

int lungTabl= iTablou.length;

-ele sunt protejate la depasirea indicilor atat inferior cat si superior decansandu-se o intrerupere Java ArrayIndexOutOfBoundException

-tablorile multidimensionale se declara ca si tablouri de tablouri putand aloca dimensiune specifica fiecarei coloane ulterior

-copierea tablourilor se face folosind metoda arraycopy().

Desi nu avem pointeri in Java cand se da ca si parametru intr-o metoda un tablou practic se transfera referinta catre acel tablou si nu valoarea componentelor.

Asa cum am mai spus sirurile de caractere reprezinta obiecte derivate din clasa Object. Ele se implementeaza cu ajutorul claselor:

-String, pentru siruri constante



-StringBuffer, pentru siruri modificabile

-StringTokenizer, permite impartirea unui sir pe componente pentru a putea fi extrase.

Un obiect al clasei String poate fi privit ca si un tablou de caractere reprezentate in Unicode el nefiind terminat printr-un octet cu valoarea 0 ca si in limbajul C.

Toate aceste clase specifice sirurilor de caractere din Java poseda diverse metode ce permit prelucrarea lor.

Daca tablourile odata ce au fost create isi pastreaza dimensiunea, in cadrul clasei Vector putem adauga sau elimina in continuare elemente. Vectorii se folosesc in locul tablourilor atunci cand:

-avem un numar variabil de elemente si vrem sa adaugam sau sa stergem unele elemente

-elementele trebuie sa fie obiecte iar datele primare pot fi convertite usor in obiecte folosind clasele Java

-dorim sa determinam usor unde e plasat un obiect si care e pozitia lui.

Vectorii reprezinta o facilitate extrem de utila oferita de catre limbajul Java in realizarea unor aplicatii care utilizeaza date variabile sau transfera un numar variabil de argumente la o functie.

Metodele (functiile) din Java sunt foarte asemanatoare cu cele din limbajul C/C++ doar ca Java a simplificat lucrurile prin faptul ca metodele sunt incluse doar in clase. In acest mod metodele normale vor fi invocate folosind un obiect instantiat iar cele statice prin intermediul numelui clasei in care au fost definite. Metodele statice permit definirea de functii utilitare care pot fi de sine statatoare daca declaram si clasa publica.

Si in limbajul Java metoda main() permite utilizarea argumentelor in linia de comanda avand un singur argument de tip tablou de siruri de caractere. Practic nu este nevoie de un alt parametru care sa specifice numarul de argumente, acesta fiind pastrat in variabila length asociata tabloului iar argumentul dependent de sistemul de operare a fost eliminat pentru a pastra facilitatea multiplatforma a limbajului. Argumentele se preiau ca si siruri de caractere urmand a fi apoi convertite la alte tipuri cu metode oferite de catre limbaj. Java nu mai transfera ca prim argument numele aplicatiei.

Pointerii nu exista in limbajul Java ei creand multe probleme in limbajul C in cazul in care ei nu erau bine gestionati de catre programatori. Numele unor tablouri sau obiectele neinstantiate din Java sunt insa similare ca si functionalitate cu pointerii din C. Aproape toate cerintele se pot rezolva asfel privind accesul la date prin adrese cu urmatoarele exceptii:

-nu se poate realiza transferul datelor in cadrul metodelor prin adresa desi tablorile si obiectele sunt transferate prin adresa, implicit in functia apelata facandu-se o copie a lor. Daca se doreste o modificare a unor valori se vor folosi metode care returneaza valori.

-nu se pot folosi pointeri la functii, aceasta functionalitate putand fi obtinuta cu ajutorul functiilor virtuale sau a mostenirii. Tabelele de pointeri spre functii pot fi realizate cu ajutorul variabilelor neinstantiate ale clasei Object precum si cu ajutorul identificatorilor de tip run-time.

Intre bibliotecile standard oferite de catre limbajul C si ierarhia de clase oferita de catre limbajul Java exista similaritati functionale, clasele Java adaugand multe alte facilitati.

Daca in limbajul C++ clasele au fost adaugate peste un limbaj secvential, limbajul C, limbajul Java este un limbaj pur obiectual totul fiind implementat in cadrul claselor. Pentru a lucra cu un obiect este nevoie de o clasa care sa descrie structura si functionalitatea obiectului. Astfel definirea unei clase in Java se face dupa cum urmeaza:


[lista_modoficatori] class idClasa [extends idClasaBaza] [implements lista_ interface]

Din definitie se observa ca obligatoriu pentru a defini o clasa trebuie sa avem cuvantul cheie class.

Pentru a defini o clasa dintr-o alta clasa de baza sau supreclasa se foloseste cuvantul cheie extends urmat de numele clasei de baza. In Java spre deosebire de C++ poate exista o singura clasa de baza.

O interfata in Java reprezinta un fel de clasa abstracta in care nici una din metode nu a fost definita ele fiind doar declarate fara a utiliza cuvantul cheie abstract (lipseste corpul metodei dar s-a declarat metoda).

Ca si concluzie corpul clasei contine o lista de declaratii atribute, metode si constructori. Totalitatea atributelor caracterizeaza starea unui obiect din acea clasa.

Totalitatea metodelor reprezinta interfatarea clasei si caracterizeaza functionalitatea clasei. Constructorii unei clase au un scop bine definit in initializarea unui obiect din acea clasa.

Diferentele principalele intre clasele Java si cele C++ constau din:

-omiterea operatorului de scop, ::, la definirea functiilor membre

-abilitatea din C++ de a folosi variabile multiple folosind un singur specificator de acces

-utilizarea cuvantului cheie extends in Java pentru procesul de derivare

-utilizarea cuvantului cheie super in Java pentru apelul constructorilor sau a altor metode si variabile din clasa aflata mai sus in ierarhie

-prin utilizarea conceptului de package Java a schimbat scopul modificatorului protected astfel incat clasele din acelas package au acces la variabilele protected ca sunt sau nu derivate ele fiind considerate friendly.

In Java se poate utiliza metoda finalize() care daca se declara in cadrul unei clase ea va fi apelata chiar inainte ca procesul de garbagecollection sa distruga obiectul din memorie. Aici practic se pot inchide fisiere care au fost uitate deschise sau elibera alte resurse cum ar fi soclurile, socket-uri.

Operatorul instanceOf ne arata daca un obiect apartine sau nu unei clase.

Daca dorim ca o clasa sa nu mai poata fi derivata ea se declara de tip final, compilatorul putand efectua diferite optimizari. In acest caz si metodele pot fi declarate de tip final ceea ce inseamna ca ele vor fi legate in mod static adica stau pe postul functiilor de tip inline din C++.

In cazul mostenirii upcastingul permite crearea unui obiect referit de o clasa derivata prin instantierea unui obiect folosind clasa de baza. Downcastingul se face doar prin folosirea operatorului cast permitand conversia unui tip de baza intr-unul derivat.

Java permite folosirea unor pachete predefinite dar si crearea unor pachete proprii in cazul in care se doreste a oferi o mai mare functionalitate procesului de dezvoltare a unei aplicatii.

Grafica in programare s-a impus pornind de la consideratia ca o imagine inseamna mai mult decat 1000 de cuvinte. Initial grafica in Java folosind pachetul AWT (Abstract Window Toolkit) s-a bazat pe ideea folosirii unui singur standard GUI (Graphic User Interface) standard ce a pornit de la dezvoltatorii Unix fiind cunoscut sub numele CDE, Common Desktop Environment. AWT foloseste principiul Common Functionality Specific Implementation derivat din CDE urmarind sa conserve asa numitul look and feel caracteristic platformei specifice. Acest pachet a suferit cele mai mari modificari pornind de la versiunile Java dezvoltate de-a lungul timpului. Versiunea 1.0 cu pachetul java.awt se baza pe asa numitele handlere definite in interiorul componentelor grafice iar de la versiunea 1.1 pachetul java.awt.event permite definirea handlere-lor in alte clase asocierea facandu-se cu diferite metode. Grafica bazata pe swing-uri ofera un nou nivel mai profesional in realizarea aplicatiilor grafice.

Acest mecanism al utilizarii graficii il intalnim si in limbajul C++ unde dupa cum se stie grafica nu este standardizata.

Lucrarea de fata considera noile elemente introduse de Java odata cu utilizarea noului concept Java 2 Enterprise Edition. Se vor prezenta principalele facilitati J2EE precum si unele exemple privind dezvoltarea de aplicatii dedicate domeniului procesarii imaginilor si domeniului multimedia.

1.4. Bibliografie

  1. Irina Atanasiu, B. Costinescu, O. A. Dragoi, F.I. Popovici, Limbajul Java o perspectiva pragmatica, Computer Libris Agora, 1998

  1. William Buchanan, Mastering Java, MacMillan, 1998

  1. Judy Bishop, Java Gently +Programming Principles Explained, 1996

  1. F. Mircea Boian, Programarea distribuita in Internet. Metode ii aplicatii, Editura Albastra, 1997

  1. M. Daconta, Java for C/C++ Programmers, John Wiley &Sons, 1996

  1. N. Fawcet, Terry Ridge, Java a Practical Guide, Butterworth Heinemann, 1997

  1. Cay Horstmann, Computing Concepts with Java, John Wiley&Sons, 1998

  1. Laura Lemay, Teach Yourself Java in 21 Days, SAM, 1998

  1. Mircea-Florin Vaida, Procesarea Imaginilor Medicale. Ingineria programarii in vederea dezvoltarii de aplicatii in domeniul bio-medical, Cartea Cartii de Stiinta, 2000

  1. Calin Vaduva, Programarea in Java, Editura Albastra, 1999

  1. Russel Winder, Graham Roberts, Developing Java Software, John Wiley &Sons, 1998