Introducere

Scurt istoric
Ce este Java?
Despre această carte
Convenții utilizate în această carte
Sugestii și reclamații
Alte surse de informații
Mulțumiri

Scurt istoric

Limbajul Java împreună cu mediul său de dezvoltare și execuție au fost proiectate pentru a rezolva o parte dintre problemele actuale ale programării. Proiectul Java a pornit cu scopul declarat de a dezvolta un software performant pentru aparatele electronice de larg consum. Aceste echipamente se definesc ca: mici, portabile, distribuite și lucrând în timp real. De la aceste aparate, ne-am obișnuit să cerem fiabilitate și ușurință în exploatare.

Limbajul luat inițial în considerare a fost C++. Din păcate, atunci când s-a încercat crearea unui mediu de execuție care să respecte toate aceste condiții s-a observat că o serie de trăsături ale C++ sunt incompatibile cu necesitățile declarate. În principal, problema vine din faptul că C++ este prea complicat, folosește mult prea multe convenții și are încă prea multe elemente de definiție lăsate la latitudinea celor care scriu compilatoare pentru o platformă sau alta.

În aceste condiții, firma Sun a pornit proiectarea unui nou limbaj de programare asemănător cu C++ dar mult mai flexibil, mai simplu și mai portabil. Așa s-a născut Java. Părintele noului limbaj a fost James Gostling care vă este poate cunoscut ca autor al editorului emacs și al sistemului de ferestre grafice NeWS. Proiectul a început încă din 1990 dar Sun a făcut publică specificația noului limbaj abia în 1995 la SunWorld în San Francisco.

Numele inițial al limbajului a fost Oak, numele unui copac care crește în fața biroului lui James Gostling. Ulterior, s-a descoperit că numele fusese deja folosit în trecut pentru un alt limbaj de programare așa că a fost abandonat și înlocuit cu Java, spre deliciul programatorilor care iubesc cafenelele și aromele exotice. ^

Ce este Java?

În primul rând, Java încearcă să rămână un limbaj simplu de folosit chiar și de către programatorii neprofesioniști, programatori care doresc să se concentreze asupra aplicațiilor în principal și abia apoi asupra tehnicilor de implementare a acestora. Această trăsătură poate fi considerată ca o reacție directă la complexitatea considerabilă a limbajului C++.

Au fost îndepărtate din Java aspectele cele mai derutante din C++ precum supraîncărcarea operatorilor și moștenirea multiplă. A fost introdus un colector automat de gunoaie care să rezolve problema dealocării memoriei în mod uniform, fără intervenția programatorului. Colectorul de gunoaie nu este o trăsătură nouă, dar implementarea acestuia în Java este făcută inteligent și eficient folosind un fir separat de execuție, pentru că Java are încorporate facilități de execuție pe mai multe fire de execuție. Astfel, colectarea gunoaielor se face de obicei în timp ce un alt fir așteaptă o operație de intrare-ieșire sau pe un semafor.

Limbajul Java este independent de arhitectura calculatorului pe care lucrează și foarte portabil. În loc să genereze cod nativ pentru o platformă sau alta, compilatorul Java generează o secvență de instrucțiuni ale unei mașini virtuale Java. Execuția aplicațiilor Java este interpretată. Singura parte din mediul de execuție Java care trebuie portată de pe o arhitectură pe alta este mediul de execuție cuprinzând interpretorul și o parte din bibliotecile standard care depind de sistem. În acest fel, aplicații Java compilate pe o arhitectură SPARC de exemplu, pot fi rulate fără recompilare pe un sistem bazat pe procesoare Intel.

Una dintre principalele probleme ale limbajelor interpretate este viteza de execuție, considerabil scăzută față de cea a limbajelor compilate. Dacă nu vă mulțumește viteza de execuție a unei astfel de aplicații, puteți cere mediului de execuție Java să genereze automat, plecând de la codul mașinii virtuale, codul specific mașinii pe care lucrați, obținându-se astfel un executabil nativ care poate rula la viteză maximă. De obicei însă, în Java se compilează doar acele părți ale programului mari consumatoare de timp, restul rămânând interpretate pentru a nu se pierde flexibilitatea. Mediul de execuție însuși este scris în C respectând standardele POSIX, ceea ce îl face extrem de portabil.

Interpretorul Java este gândit să lucreze pe mașini mici, precum ar fi procesoarele cu care sunt dotate aparatele casnice. Interpretorul plus bibliotecile standard cu legare dinamică nu depășesc 300 Kocteți. Chiar împreună cu interfața grafică totul rămâne mult sub 1 Moctet, exact ca-n vremurile bune.

Limbajul Java este orientat obiect. Cu el se pot crea clase de obiecte și instanțe ale acestora, se pot încapsula informațiile, se pot moșteni variabilele și metodele de la o clasă la alta, etc. Singura trăsătură specifică limbajelor orientate obiect care lipsește este moștenirea multiplă, dar pentru a suplini această lipsă, Java oferă o facilitate mai simplă, numită interfață, care permite definirea unui anumit comportament pentru o clasă de obiecte, altul decât cel definit de clasa de bază. În Java orice element este un obiect, în afară de datele primare. Din Java lipsesc funcțiile și variabilele globale. Ne rămân desigur metodele și variabilele statice ale claselor.

Java este distribuit, având implementate biblioteci pentru lucrul în rețea care ne oferă TCP/IP, URL și încărcarea resurselor din rețea. Aplicațiile Java pot accesa foarte ușor rețeaua, folosindu-se de apelurile către un set standard de clase.

Java este robust. În Java legarea funcțiilor se face în timpul execuției și informațiile de compilare sunt disponibile până în momentul rulării aplicației. Acest mod de lucru face ca sistemul să poată determina în orice moment neconcordanța dintre tipul referit la compilare și cel referit în timpul execuției evitându-se astfel posibile intruziuni răuvoitoare în sistem prin intermediul unor referințe falsificate. În același timp, Java detectează referințele nule dacă acestea sunt folosite în operații de acces. Indicii în tablourile Java sunt verificați permanent în timpul execuției și tablourile nu se pot parcurge prin intermediul unor pointeri așa cum se întâmplă în C/C++. De altfel, pointerii lipsesc complet din limbajul Java, împreună cu întreaga lor aritmetică, eliminându-se astfel una din principalele surse de erori. În plus, eliberarea memoriei ocupate de obiecte și tablouri se face automat, prin mecanismul de colectare de gunoaie, evitându-se astfel încercările de eliberare multiplă a unei zone de memorie.

Java este un limbaj cu securitate ridicată. El verifică la fiecare încărcare codul prin mecanisme de CRC și prin verificarea operațiilor disponibile pentru fiecare set de obiecte. Robustețea este și ea o trăsătură de securitate. La un al doilea nivel, Java are incorporate facilități de protecție a obiectelor din sistem la scriere și/sau citire. Variabilele protejate într-un obiect Java nu pot fi accesate fără a avea drepturile necesare, verificarea fiind făcută în timpul execuției. În plus, mediul de execuție Java poate fi configurat pentru a proteja rețeaua locală, fișierele și celelalte resurse ale calculatorului pe care rulează o aplicație Java.

Limbajul Java are inclus suportul nativ pentru aplicații care lucrează cu mai multe fire de execuție, inclusiv primitive de sincronizare între firele de execuție. Acest suport este independent de sistemul de operare, dar poate fi conectat, pentru o performanță mai bună, la facilitățile sistemului dacă acestea există.

Java este dinamic. Bibliotecile de clase în Java pot fi reutilizate cu foarte mare ușurință. Cunoscuta problemă a fragilității superclasei este rezolvată mai bine decât în C++. Acolo, dacă o superclasă este modificată, trebuie recompilate toate subclasele acesteia pentru că obiectele au o altă structură în memorie. În Java această problemă este rezolvată prin legarea târzie variabilelor, doar la execuție. Regăsirea variabilelor se face prin nume și nu printr-un deplasament fix. Dacă superclasa nu a șters o parte dintre vechile variabile și metode, ea va putea fi refolosită fără să fie necesară recompilarea subclaselor acesteia. Se elimină astfel necesitatea actualizării aplicațiilor, generată de apariția unei noi versiuni de bibliotecă așa cum se întâmplă, de exemplu, cu MFC-ul Microsoft (și toate celelalte ierarhii C++). ^

Despre această carte

Această carte a fost scrisă pentru a veni în sprijinul acelora care doresc să programeze în limbajul Java. Spre deosebire de majoritatea cărților existente la ora actuală pe piața internațională, nu prea multe de altfel, cartea de față se focalizează asupra facilităților pe care le oferă noul limbaj, lăsând pe planul al doilea descrierea bibliotecilor standard, impresionante de altfel, definite de către Sun și colaboratorii acestuia. Alegerea a fost făcută din convingerea că bibliotecile vin și trec, se dezvoltă, în timp ce limbajul rămâne.

Cartea se adresează în același timp începătorilor și programatorilor profesioniști. Începătorii vor găsi în prima parte noțiuni fundamentale necesare oricărui programator. Profesioniștii, în schimb, vor găsi o referință completă a limbajului Java.

Prima parte a cărții își introduce cititorul pas cu pas în fundamentele funcționării și programării calculatoarelor tratând la un nivel accesibil noțiuni precum memoria și procesorul, datele și instrucțiunile, clasele de obiecte împreună cu trăsăturile fundamentale ale programării orientate obiect.

Partea a doua a cărții prezintă limbajul Java în detaliu împreună cu o serie de exemple simple. Această parte este concepută pentru a fi în același timp o introducere în sintaxa Java pentru cei care au programat deja și o introducere în constrângerile sintactice și semantica unui limbaj de programare pentru începători.

Partea a treia a cărții prezintă câteva dintre aspectele fundamentale ale programării în Java precum aplicațiile, apleturile, pachetele de clase, firele de execuție și tratarea excepțiilor. Această parte este concepută de sine stătătoare și poate servi ca exemplu de programare în Java. Fiecare secțiune din această parte conține exemple extinse de aplicații scrise în Java, comentate în sursă și în afara acesteia.

Cititorul începător în ale programării trebuie să parcurgă cartea de la început până la sfârșit pentru a putea intra treptat în tainele programării în general și ale limbajului Java.

Pentru cititorii avansați, prima parte nu constituie un interes major și poate fi sărită fără implicații majore în înțelegerea materialului din părțile următoare. Acești cititori pot să treacă direct la partea a treia pentru a urmări exemplele și abia după aceea să revină la partea a doua pentru informații detaliate asupra sintaxei și facilităților Java. Partea a doua poate fi folosită și pe post de referință.

O singură excepție: ultima secțiune din prima parte introduce noțiunea de interfață, puțin cunoscută programatorilor în alte limbaje decât Java. Este util ca această secțiune să fie consultată de către toți cititorii, indiferent de nivelul de pregătire în care se află. ^

Convenții utilizate în această carte

Pentru descrierea sintacticii limbajului Java, am apelat la următoarele convenții obișnuite de reprezentare a regulilor gramaticale:

  • Cuvintele rezervate ale limbajului Java sunt scrise în caractere îngroșate, ca: while, do, final.
  • Cuvintele care țin locul construcțiilor reale ale programului sunt scrise cu caractere oblice, ca în:
     if(Condiție) Instrucțiune1 else Instrucțiune2

    Condiție, Instrucțiune1 și Instrucțiune2, care apar în descriere, trebuiesc înlocuite cu condițiile adevărate, respectiv cu instrucțiunile adevărate care trebuiesc executate în funcție de condiție. De exemplu, o construcție reală, care respectă descrierea de mai sus ar putea fi:

if( i < j )
min = i; 
else
min = j;
  • O listă de termeni separați prin caractere |, se poate înlocui cu oricare dintre termenii listei.

    De exemplu:

    public | private | protected

    înseamnă că în locul acestui termen poate să apară oricare dintre cuvintele rezervate specificate în listă, public, private sau protected.

  • Un termen pus între paranteze pătrate este opțional. De exemplu, în descrierea:

    Tip NumeVariabilă [Inițializator] ;

    Partea de Inițializator poate să lipsească.

  • Dacă, după un termen apare caracterul *, acesta reprezintă faptul că termenul se poate repeta de un număr arbitrar de ori, eventual niciodată. De exemplu, în:

    class NumeClasă ClauzăImplements*

    caracterul * reprezintă faptul că termenul notat prin ClauzăImplements se poate repeta de un număr arbitrar de ori, eventual niciodată.

    Pe marginea din stânga a paginii, veți întâlni o serie de simboluri grafice, cu specificație precisă, care vă vor permite să navigați mai ușor în interiorul cărții. Iată semnificația acestora:

Semnul din stânga reprezintă faptul că în paragraful marcat introduce definiția unui nou termen. Termenul nou introdus este reprezentat în interiorul semnului și este scris cu caractere oblice în textul paragrafului. În cazul de față cuvântul nou introdus este cuvântul definiția. Atunci când găsiți o trimitere la un paragraf pentru explicații, căutați acest semn pe margine pentru a găsi mai repede definiția noțiunii dorite.

Semnul din stânga reprezintă o trimitere înapoi către o noțiune deja prezentată în partea de fundamente. Această trimitere conține deasupra simbolului grafic numele noțiunii pe care trebuie să îl căutați într-un simbol de definiție, și sub simbolul grafic numărul paragrafului unde se află definiția. Cititorul începător ca și cel avansat poate urma aceste trimiteri pentru a-și împrospăta cunoștințele sau pentru a se familiariza cu cuvintele sau expresiile folosite pentru a desemna noțiuni greu traductibile.

Semnul din stânga reprezintă o referire în avans a unei noțiuni care va fi introdusă mai târziu. Acest semn este destul de rar în interiorul cărții, dar este totuși nevoie de el pentru a face referire la anumite facilități care își găsesc cel mai bine locul în paragraful în care apare semnul. Puteți sări fără probleme aceste precizări la prima citire a capitolului și să le luați în seamă doar atunci când folosiți cartea pe post de referință pentru limbajul Java.

Semnul din stânga reprezintă referirea unei noțiuni care nu este descrisă în carte. Acest semn apare atunci când se face o referință la una din clasele standard ale mediului Java. Puteți găsi informații exacte despre clasa respectivă la adresa www.javasoft.com, sau puteți încărca din Internet o documentație completă prin ftp de la adresa ftp.javasoft.com, directorul /docs.

Semnul din stânga reprezintă o trimitere către altă carte, în care noțiunile din paragraf sunt prezentate mai pe larg. Am folosit acest semn doar de două ori, pentru a trimite către o carte disponibilă la aceeași editură cu cartea prezentă, despre HTML, scrisă de Dumitru Rădoiu. O puteți găsi pe prima poziție în bibliografie. ^

Sugestii și reclamații

Posibilele erori care s-au strecurat în această carte cad în sarcina exclusivă a autorului ei care își cere pe această cale scuze în avans. Orice astfel de eroare sau neclaritate cu privire la conținutul cărții poate fi comunicată direct autorului pe adresa erotariu@agora.ro sau:

Eugen Rotariu
Computer Press Agora
Str. Tudor Vladimirescu, Nr. 63/1, Cod. 4300, Târgu Mureș
România

În Internet, puteți să contactați editura Computer Press Agora la adresa www.agora.ro. Pe server există o pagină separată dedicată acestei cărți. Puteți verifica periodic această pagină pentru eventuale corecturi, exemple suplimentare sau adăugiri la conținutul cărții. ^

Alte surse de informații

Subiectul Java este departe de a fi încheiat în această carte așa că, dacă reacția dumneavoastră este pozitivă, voi încerca să construiesc o a doua carte dedicată claselor standard Java, mediilor de dezvoltare, din ce în ce mai numeroase, ierarhiilor de bază de date, obiecte distribuite și așa mai departe care și-au făcut apariția de la Sun sau din altă parte în ultimul timp. Nu ezitați să-mi dați de știre dacă veți considera utilă o asemenea continuare.

Până atunci însă, puteți consulta cărțile listate în secțiunea de bibliografie de la sfârșitul acestei cărți. Numai cărți în limba engleză în acest domeniu deocamdată, dar mă aștept ca situația să se schimbe dramatic în perioada imediat următoare. Noi cărți de Java dedicate cititorilor români nu vor întârzia să apară.

Internet-ul este de asemenea o sursă interminabilă de informații, situri Java există și vor continua să apară în întreaga lume. Adresa de bază este probabil www.javasoft.com, adresă care vă pune în legătură directă cu firma care a creat și întreține în continuare dezvoltarea Java. În plus, puteți consulta revista electronică JavaWorld de la adresa www.javaworld.com care conține întotdeauna informații fierbinți, cursuri, apleturi și legături către alte adrese unde vă puteți îmbogăți cunoștințele despre Java. Pentru documentații, exemple și noutăți în lumea Java puteți consulta și www.gamelan.com sau www.blackdown.org.

Pentru cei care doresc să dezvolte apleturi pe care să le insereze în propriile pagini HTML, recomand în plus citirea cărții lui Dumitru Rădoiu, HTML - Publicații Web, editată de asemenea la Computer Press Agora.

În fine, nu încetați să cumpărați revistele PC Report și Byte România ale aceleiași edituri, pentru că ele vor conține ca de obicei informații de ultimă oră, cursuri și reportaje de la cele mai noi evenimente din lumea calculatoarelor. ^

Mulțumiri

Mulțumesc tuturor celor care, voit sau nu, au făcut posibilă această carte. Mulțumesc celor de la editura Computer Press Agora și managerului ei Romulus Maier pentru că mi-au facilitat publicarea acestei cărți. Fără munca lor, cartea s-ar fi aflat în continuare în vitrina proprie cu visuri nerealizate. Mulțumesc celor care mi-au dăruit o parte din timpul lor prețios pentru a citi și comenta primele versiuni ale cărții: Iosif Fettich, Mircea și Monica Cioată, Alexandru Horvath. Mulțumesc celor cu care am discutat de atâtea ori despre soarta calculatoarelor, programelor, României și lumii în general. Ei au făcut din mine omul care sunt acum: Mircea Sârbu, Dumitru Rădoiu, Szabo Laszlo, Mircea Pantea. Mulțumesc celor care s-au ocupat de designul și tehnoredactarea acestei cărți în frunte cu Adrian Pop și Octav Lipovan. Cel dintâi lucru care v-a atras la această carte este munca lor. Carmen, îți mulțumesc că nu te-ai dat bătută. Va veni și vremea în care sărbătorim cu calculatoarele oprite. ^

[cuprins]
(C) IntegraSoft 1996-1998