Java (limbaj de programare)

Java
siglă
Date de bază
Paradigme : Limbaj de programare orientat pe obiecte
Anul publicării: 1995
Proiectant: James Gosling , Sun Microsystems
Dezvoltator: Sun Microsystems , Oracle
Versiunea actuală  Java SE 16.0.1   (20 aprilie 2021)
Tastare : puternic , static
Influențată de: C ++ , C , Ada , Simula 67, Smalltalk , Objective-C , Object Pascal , Oberon , Eiffel , Modula-3 , Mesa , Simula , C # , UCSD Pascal , tip de obiect, funcție variadică , adnotare (Java) , Niklaus Wirth , Patrick Naughton, pentru fiecare buclă
Afectat: Groovy , Clojure , C # , Scala , Vala , ActionScript , Seed7 , Kotlin , JavaScript
Sistem de operare : platforma independenta
Licență : Licență publică generală GNU
www.oracle.com/java/

Java este un limbaj de programare orientat obiect și o marcă înregistratăa Sun Microsystems , care a fost achiziționată de Oracle în2010. Limbajul de programare este o componentă a tehnologiei Java - în esență constă din instrumentul de dezvoltare Java( JDK ) pentru crearea de programe Java și mediul de execuție Java (JRE) pentru executarea acestora. Mediul de rulare în sine cuprinde mașina virtuală ( JVM ) și bibliotecile furnizate. Java ca limbaj de programare nu ar trebui să fie echivalat cu tehnologia Java; Mediile de execuție Java execută codul de cod care poate fi compilatatât din limbajul de programare Java, cât și din alte limbaje de programare, cum ar fi Groovy , Kotlin și Scala . În principiu, orice limbaj de programare ar putea fi folosit ca bază pentru codul secundar Java, dar în majoritatea cazurilor nu există compilatoare de coduri secundare corespunzătoare.

Limbajul de programare Java este utilizat în principal în tehnologia Java pentru a formula programe. Acestea sunt disponibile inițial ca text pur, ușor de înțeles de către om , așa-numitul cod sursă . Acest cod sursă nu este executabil direct; Numai compilatorul Java, care face parte din instrumentul de dezvoltare, îl traduce în cod bytec Java ușor de înțeles. Mașina care execută acest bytecode, totuși, este de obicei virtuală - adică codul nu este de obicei executat direct de hardware (de exemplu un microprocesor ), ci de un software adecvat de pe platforma țintă.

Scopul acestei virtualizări este independența platformei : programul ar trebui să poată rula pe orice arhitectură a computerului fără alte modificări dacă este instalat acolo un mediu de rulare adecvat . Oracle în sine oferă medii de rulare pentru sistemele de operare Linux , macOS , Solaris și Windows . Alți producători au propriile medii de rulare Java certificate pentru platforma lor . Java este, de asemenea, utilizat în mașini, sisteme hi-fi și alte dispozitive electronice.

Pentru a crește viteza de execuție, sunt utilizate concepte precum compilarea just-in-time și optimizarea hotspot-ului . În raport cu procesul de execuție propriu-zis, JVM poate interpreta bytecode-ul , dar îl poate compila și optimiza , dacă este necesar .

Java este unul dintre cele mai populare limbaje de programare. În indexul TIOBE publicat din 2001, Java a fost întotdeauna pe primul sau al doilea loc în clasament , concurând cu C. Conform indexului limbajului de programare RedMonk 2019, Java și Python se află pe locul al doilea după JavaScript .

Noțiuni de bază

Proiectarea limbajului de programare Java a avut cinci obiective principale:

simplitate
Comparativ cu alte limbaje de programare orientate obiect, cum ar fi C ++ sau C # , Java este simplu, deoarece are un domeniu de limbaj redus și nu acceptă supraîncărcarea operatorului și moștenirea multiplă, de exemplu .
Orientarea obiectului
Java este unul dintre limbajele de programare orientate obiect .
Distribuit
O serie de opțiuni simple pentru comunicarea în rețea, de la protocoalele TCP / IP prin invocarea metodei la distanță până la serviciile web, sunt oferite în principal prin biblioteca de clase Java ; limbajul Java în sine nu include suport direct pentru execuția distribuită.
familiaritate
Datorită apropierii sintactice de C ++, a asemănării originale a bibliotecii de clasă cu bibliotecile de clase Smalltalk și a utilizării modelelor de proiectare în biblioteca de clase, Java nu prezintă efecte neașteptate pentru programatorul experimentat.
robusteţe
Multe dintre alegerile de proiectare făcute la definirea Java reduc probabilitatea erorilor de sistem nedorite; de menționat sunt tastarea puternică, colectarea gunoiului, manipularea excepțiilor și absența aritmeticii indicatorului.
Securitate
Concepte precum încărcătorul de clasă, care controlează furnizarea sigură de informații de clasă către mașina virtuală Java și managerii de securitate, care asigură că sunt disponibile doar accesul la obiectele programului pentru care sunt disponibile drepturile corespunzătoare.
Neutralitatea arhitecturală
Java a fost dezvoltat în așa fel încât aceeași versiune a unui program să ruleze în principiu pe orice hardware al computerului, indiferent de procesorul sau alte componente hardware.
portabilitate
Pe lângă faptul că este neutru în arhitectură, Java este portabil. Aceasta înseamnă că tipurile de date primitive sunt standardizate în dimensiunea și reprezentarea lor internă, precum și în comportamentul lor aritmetic. De exemplu, unul este floatîntotdeauna un IEEE 754 float cu o lungime de 32 de biți. Același lucru se aplică, de exemplu, bibliotecii de clase, care poate fi utilizată pentru a crea o interfață grafică independentă de sistemul de operare .
Eficienţă
Datorită posibilității de optimizare la runtime, Java are potențialul de a obține performanțe mai bune decât limbile limitate la optimizări în timp de compilare (C ++ etc.). Acest lucru este contracarat de costurile generate de mediul de execuție Java , astfel încât performanța, de exemplu, a programelor C ++ este depășită în unele contexte, dar nu este atinsă în altele.
Interpretabilitate
Java este compilat în cod de octeți independent de mașină , care la rândul său poate fi interpretat pe platforma țintă. Mașina virtuală Java de la Oracle interpretează codul de octeți Java, îl compilează din motive de performanță și este optimizat înaintea acestuia.
Paralelizabilitate
Java acceptă multithreading , adică executarea paralelă a secțiunilor independente ale programului. În plus, limbajul în sine oferă cuvintele cheie synchronizedși volatileconstructele care susțin „Monitor & Condition Variable Paradigm” de C. A. R. Hoare . Biblioteca de clase conține suport suplimentar pentru programarea paralelă cu fire. JVM-urile moderne mapează un fir Java la firele de sistem de operare și beneficiază astfel de procesoare cu mai multe nuclee de calcul .
Dinamic
Java este structurat în așa fel încât să poată fi adaptat condițiilor cadru în schimbare dinamică. Deoarece modulele sunt conectate numai în timpul rulării, părți ale software-ului (de exemplu biblioteci) pot fi livrate din nou, de exemplu, fără a fi nevoie să adaptați părțile rămase ale programului. Interfețele pot fi utilizate ca bază pentru comunicarea între două module; implementarea efectivă poate fi modificată dinamic și, de exemplu, și în timpul rulării.

Orientarea obiectului

Grafic de dependență al claselor de bază Java (creat cu jdeps și Gephi ). În mijlocul diagramei puteți vedea clasele cele mai des utilizate Obiect și Șir.

Ideea de bază a programării orientate pe obiecte este de a rezuma datele și funcțiile asociate cât mai aproape posibil într-un așa-numit obiect și de a le încapsula din exterior ( abstractizare ). Intenția este de a face proiectele software mari mai ușor de gestionat și de a crește calitatea software-ului. Un alt obiectiv al orientării obiectelor este un grad ridicat de reutilizare a modulelor software.

Un aspect nou al Java comparativ cu limbajele de programare orientate obiect C ++ și Smalltalk este distincția explicită între interfețe și clase , care este exprimată prin cuvinte cheie interfaceși class. Java nu acceptă moștenirea mai multor clase de bază independente (așa-numita „moștenire multiplă” ca în C ++ sau Eiffel ), dar acceptă implementarea oricărui număr de interfețe, care pot rezolva și multe dintre problemele corespunzătoare. Iată semnăturile metodelor și implementările standard ale metodelor transmise claselor derivate, dar fără atribute .

Java nu este complet orientat pe obiecte, deoarece tipurile de date de bază ( int , boolean etc.) nu sunt obiecte (vezi și sintaxa Java ). Cu toate acestea, de la Java 5, acestea sunt convertite automat în tipurile de obiecte corespunzătoare și invers folosind autoboxing care este transparent pentru programator .

exemplu

Cod sursa
/**
 * Diese Klasse ist eine allgemeine Klasse für jedes beliebige Tier und bietet
 * Methoden an, die alle Tiere gemeinsam haben.
 */
public class Tier {
	/**
	 * Diese Methode lässt das Tier kommunizieren. Die Unterklassen dieser
	 * Klasse können diese Methode überschreiben und eine passende
	 * Implementierung für das jeweilige Tier anbieten.
	 */
	public void kommuniziere() {
	    // Wird von allen Unterklassen verwendet, die diese Methode nicht überschreiben.
	    System.out.println("Tier sagt nichts.");
	}
}

/**
 * Deklariert die Klasse "Hund" als Unterklasse der Klasse "Tier".
 * Die Klasse "Hund" erbt damit die Felder und Methoden der Klasse "Tier".
 */
public class Hund extends Tier {
	/**
	 * Diese Methode ist in der Oberklasse "Tier" implementiert. Sie wird
	 * in dieser Klasse überschrieben und für die Tierart "Hund" angepasst.
	 */
	@Override
	public void kommuniziere() {
		// Ruft die Implementierung dieser Methode in der Oberklasse "Tier" auf.
		super.kommuniziere();
		// Gibt einen Text in der Konsole aus.
		System.out.println("Hund sagt: 'Wuf Wuf'");
	}
}

/**
 * Deklariert die Klasse "Katze" als Unterklasse der Klasse "Tier".
 * Die Klasse "Katze" erbt damit die Felder und Methoden der Klasse "Tier".
 */
public class Katze extends Tier {
	/**
	 * Diese Methode ist in der Oberklasse "Tier" implementiert. Sie wird
	 * in dieser Klasse überschrieben und für die Tierart "Katze" angepasst.
	 */
	@Override
	public void kommuniziere() {
		// Ruft die Implementierung dieser Methode in der Oberklasse "Tier" auf.
		super.kommuniziere();
		// Gibt einen Text auf der Konsole aus.
		System.out.println("Katze sagt: 'Miau'");
	}
}

public class Main {
	/**
	 * Methode die beim Programmstart aufgerufen wird.
	 */
	public static void main(String[] args) {
		// Deklariert eine Variable für Instanzen der Klassen "Hund" und "Katze"
		Tier tier;

		// Erstellt eine Instanz der Klasse "Hund" und speichert die Instanz in
		// der Variable "tier"
		tier = new Hund();
		// Ruft die Methode Hund.kommuniziere() auf
		tier.kommuniziere();

		// Erstellt eine Instanz der Klasse "Katze" und speichert die Instanz in
		// der Variable "tier"
		tier = new Katze();
		// Ruft die Methode Katze.kommuniziere() auf
		tier.kommuniziere();
	}
}
Ieșire consolă
Tier sagt nichts.
Hund sagt: 'Wuf Wuf'
Tier sagt nichts.
Katze sagt: 'Miau'

Reflecţie

Java oferă un API Reflection ca parte a mediului de execuție . Acest lucru face posibilă accesarea claselor și metodelor în timpul rulării a căror existență sau formă exactă nu era cunoscută în momentul creării programului. Adesea, această tehnică este legată de metoda fabricii tiparelor de proiectare ( Metoda fabrică aplicată).

Adnotări

Cu Java 5, Sun a adăugat adnotări limbajului de programare . Adnotările permit notarea metadatelor și, într-o anumită măsură, permit extensiile de limbă definite de utilizator. Scopul adnotărilor este, printre altele, generarea automată de cod și alte documente importante în dezvoltarea de software pentru tipare recurente bazate pe cele mai scurte referințe posibile în textul sursă. Până în prezent, numai comentariile Javadoc cu etichete speciale JavaDoc au fost utilizate în Java , care au fost evaluate de docleturi precum XDoclet .

Adnotările pot fi, de asemenea, incluse în fișierele clasei compilate. Prin urmare, codul sursă nu este necesar pentru utilizarea lor. În special, adnotările sunt accesibile și prin intermediul API-ului Reflection. De exemplu, pot fi utilizate pentru a extinde conceptul de fasole .

Execuție modulară pe computere la distanță

Java oferă posibilitatea de a scrie clase care rulează în diferite medii de execuție. De exemplu, applet-urile pot fi rulate în browserele web care acceptă Java. Conceptul de securitate Java poate fi utilizat pentru a se asigura că clasele necunoscute nu pot provoca daune, ceea ce este deosebit de important în cazul applet-urilor (vezi și sandbox ). Exemple de module Java care pot fi executate în mediile de execuție corespunzătoare sunt applet-urile , servlet- urile , portleturile , MIDleturile , Xletele , transleturile și Enterprise JavaBeans .

Caracteristici

Duke, mascota Java

Accesul la obiecte în Java este implementat intern în VM folosind referințe similare cu indicii cunoscuți din C sau C ++ . Definiția limbajului (Specificația limbii Java) le numește „Valori de referință” pentru a clarifica faptul că sunt transferate în codul sursă al programului respectiv ca apel prin valoare . Din motive de securitate, acestea nu permit recunoașterea sau modificarea adresei reale de memorie. Prin urmare, așa-numita aritmetică a indicatorului este exclusă în Java. Prin proiectare, un tip comun de eroare care apare în alte limbaje de programare poate fi exclus de la început.

Clase de corelare (limba engleză în pachete de pachete combinate). Aceste pachete fac posibilă restricționarea vizibilității claselor, structurarea proiectelor mai mari și separarea spațiului de nume pentru diferiți dezvoltatori. Numele pachetelor sunt structurate ierarhic și încep de obicei cu numele de domeniu (invers) de Internet al dezvoltatorului, de exemplu com.google în cazul bibliotecilor de clase furnizate de Google . Numele claselor trebuie să fie unice numai în cadrul unui pachet. Acest lucru face posibilă combinarea claselor de la diferiți dezvoltatori fără a provoca conflicte de nume. Cu toate acestea, ierarhia numelor pachetelor nu are semnificație semantică . În ceea ce privește vizibilitatea între clasele a două pachete, nu contează unde sunt pachetele în ierarhia numelor. Clasele sunt fie vizibile doar pentru clasele din propriul pachet sau pentru toate pachetele.

Mai mult, limbajul acceptă fire ( părți ale programului care rulează simultan ) și excepții ( excepție în limba engleză ). Java include, de asemenea, o colecție de gunoi (engleză garbage collector ) care nu sunt (mai mult) obiecte de referință din memorie.

Java face o distincție explicită între interfețe și clase . O clasă poate implementa orice număr de interfețe, dar are întotdeauna exact o clasă de bază . Java nu acceptă moștenirea directă din mai multe clase („ moștenirea multiplă ”), ci moștenirea pe mai multe niveluri de ierarhie ( copilul clasei moștenește de la tatăl clasei , care la rândul său moștenește de la bunicul clasei etc.). În funcție de vizibilitate ( public, protected, implicit / pachet-privat , private) moștenește clasa metodele și atributele (numite câmpuri) de la strămoșii lor de clasă. Toate clasele sunt - direct sau indirect - Objectderivate din clasa rădăcină .

O bibliotecă extinsă de clase aparține Java. Programatorului i se oferă astfel o interfață uniformă ( interfață de programare a aplicației, API), care este independentă de sistemul de operare subiacent .

Cu Java 2, au fost introduse Java Foundation Classes (JFC), care, printre altele, oferă Swing , care este utilizat pentru a genera interfețe grafice de utilizator (GUI) independente de platformă și se bazează pe Abstract Window Toolkit .

sintaxă

Sintaxa / gramatica și semantica Java sunt documentate în Specificația limbajului Java de la Sun Microsystems . Următorul exemplu de program afișează mesajul „Bună ziua lume!”, Care este clasic printre programatori, urmat de o întrerupere de linie pe mediul de ieșire.

 public class HalloWelt {
     public static void main(String[] args) {
         System.out.println("Hallo Welt!");
     }
 }

Crearea și dezvoltarea ulterioară

Apariția

Originea și dezvoltarea limbajului de programare Java și a tehnologiei conexe sunt descrise în articolul Tehnologie Java , precum și când versiunea a fost publicată.

Oracle și JCP

Pe lângă Oracle, un număr mare de persoane, companii mici și mari, precum Apple , IBM , Hewlett-Packard și Siemens, se ocupă de dezvoltarea în continuare a specificațiilor limbajului Java în Java Community Process (JCP). JCP a fost lansat în 1998 de Sun Microsystems.

Java ca software gratuit

Sun promisese să-și publice JDK sub licența publică generală GNU ; odată cu preluarea de către Oracle, a fost preluată și licențierea deschisă. La 13 noiembrie 2006, primele părți ale compilatorului javac și ale hotspot-ului mașinii virtuale au fost publicate ca open source . În plus, a fost deschisă o pagină a comunității cu OpenJDK , cu ajutorul căreia se va coordona dezvoltarea. Părți mari din codul sursă „Java SE” pentru crearea unui JDK au urmat pe 8 mai 2007. Excepția de la acest lucru a fost codul pentru care Sun nu avea drepturile necesare pentru al elibera. Prin urmare, acest lucru este disponibil numai în formă compilată. Sun a anunțat, de asemenea, că dezvoltările bazate pe OpenJDK pot purta sigla „Java Compatible” dacă sunt certificate conform „Java Compatibility Kit” (JCK).

Anterior, codul sursă Java a fost inclus cu fiecare JDK, printre altele și, deși acest lucru a făcut posibilă inspecția, nu a fost permis să fie modificat după bunul plac. Prin urmare, pe lângă JCP oficial, există și diverse asociații independente care și-au stabilit obiectivul de a face Java disponibil sub o licență open source gratuită. Cele mai cunoscute dintre aceste proiecte au fost Apache Harmony , Kaffe și proiectul GNU Classpath . În prezent, există o altă implementare majoră în plus față de OpenJDK, care publică versiunile Java actuale, Eclipse OpenJ9. Această implementare JVM a fost acordată Fundației Eclipse de către IBM. OpenJ9 este licențiat sub EPL 2.0 , Apache 2.0 și GNU 2.0 cu Classpath Exception .

Diferențe față de limbi similare

În plus, Java oferă posibilitatea de a executa diverse limbaje de scriptare din codul Java. Există, de asemenea, o serie de limbaje de programare care sunt compilate conform codului byt Java. Aceasta înseamnă că părțile programului pot fi implementate și în alte limbaje de programare. Cu versiunea JDK 7, care a fost lansată pe 28 iulie 2011, suportul pentru „limbi străine” dinamice de către mașina virtuală a fost, de asemenea, îmbunătățit.

JavaScript

Java nu trebuie confundat cu limbajul de script JavaScript . JavaScript a fost dezvoltat de Netscape Communications , anterior a fost numit LiveScript și a fost redenumit JavaScript ca parte a unei cooperări între Netscape și Sun Microsystems.

JavaScript este un tip dinamic , bazat pe obiecte, dar, până la ECMAScript 2015 , un limbaj de scriptare fără clase cu o sintaxă similară cu C, Perl sau Java, dar diferă de Java în multe feluri. În ciuda similitudinii numelor celor două limbaje de programare, Java diferă mai mult de JavaScript decât, de exemplu, de C ++ sau C #. JavaScript este utilizat în principal în paginile HTML pentru programare încorporată pentru a permite aplicații web interactive.

Convorbire scurtă

Smalltalk este unul dintre cele mai vechi limbaje de programare orientate obiect. Java moștenește de la Smalltalk conceptul de bază al unui arbore de clase în care sunt atașate toate clasele. Toate clasele provin direct sau indirect din clasă java.lang.Object. În plus, conceptele au fost deșeuri automate (colector de gunoi) și mașina virtuală luate, precum și o varietate de alte caracteristici ale limbajului Smalltalk.

Cu toate acestea, Smalltalk nu cunoaște niciun tip de date primitive, cum ar fi int- chiar și un număr simplu este un obiect. Acest concept nu a fost adoptat de Java, dar începând cu Java 5, tipurile de date primitive sunt convertite în tipurile de obiecte corespunzătoare folosind autoboxing-ul și invers.

C ++

Java se bazează pe sintaxa limbajului de programare C ++ . Spre deosebire de C ++, cu toate acestea, moștenirea multiplă sau aritmetica indicatorului nu a fost utilizată. Clasele pot avea o singură superclasă (moștenire unică), dar pot implementa orice număr de interfețe. Interfețele corespund claselor abstracte din C ++ care nu au atribute sau metode concrete, dar sunt utilizate conceptual diferit de clasele abstracte posibile și în Java. Gestionarea internă a memoriei este în mare măsură scutită de dezvoltatorul Java; acest lucru se face prin colectarea automată a gunoiului . Cu toate acestea, nici acest mecanism nu garantează excluderea completă a scurgerilor de memorie . În cele din urmă, programatorul trebuie să se asigure că obiectele care nu mai sunt folosite nu mai sunt menționate de niciun fir de execuție. Obiecte de referință reciprocă care nu mai pot fi accesate de orice fir prin referințe sunt, de asemenea, eliberate, prin care depinde de Colectorul de gunoi (GC) când și dacă aceste obiecte sunt deloc eliberate. Fiecare clasă de obiecte are, de asemenea, o metodă numită finalize()care poate fi apelată de colectorul de gunoi pentru a efectua „lucrări de curățare” suplimentare. Cu toate acestea, nu există nicio garanție când sau dacă se va întâmpla acest lucru. Prin urmare, nu este comparabil cu un destructor din C ++.

În plus față de moștenirea multiplă și aritmetica memoriei, alte construcții de limbaj C ++ au fost lăsate în mod deliberat în dezvoltarea Java:

Spre deosebire de C ++, în Java nu este posibilă supraîncărcarea operatorilor (de exemplu, operatori aritmetici precum +și -, operatori logici precum &&și ||, sau operatorul index []), adică să le dea un nou sens într-un anumit context. Pe de o parte, acest lucru simplifică limbajul în sine și împiedică codurile sursă să devină ilizibile cu operatorii supraîncărcați cu semantică greu de înțeles. Pe de altă parte, tipurile definite de utilizator cu operatori supraîncărcați ar părea mai mult ca tipurile încorporate în C ++ - în special codul numeric ar fi mai ușor de înțeles în acest fel. Cu toate acestea, definiția limbajului Java definește comportamentul dependent de tip al operatorilor +(adăugare pentru operanzi aritmetici, altfel pentru concatenarea șirurilor de caractere „concatenare de șiruri”), precum și &, |și ^(logic pentru boolean și bit, pentru operanzi aritmetici). Acest lucru face ca acești operatori să apară cel puțin ca operatori parțial supraîncărcați.

Construcția C ++ a șabloanelor , care permit algoritmilor sau chiar clase întregi să fie definite independent de tipurile de date utilizate în acestea, nu a fost adoptată în Java. De la versiunea 5, Java acceptă așa-numitele generice , care nu permit nici o metaprogramare , dar similar cu șabloanele C ++ permit containerele sigure de tip și altele asemenea.

Cuvântul cheie a fost constrezervat în Java, dar nu are funcție. Alternativa la const(și directivele preprocesorului) este final. Spre deosebire de const, final nu este moștenit într-o semnătură de metodă și, prin urmare, este valabil numai în domeniul de aplicare curent. finalModificator poate fi o clasă (care nu mai poate fi derivată din aceasta), un atribut ( a cărui valoare poate fi stabilită o singură dată) sau o metodă (care poate fi apoi suprascrise).

C # (.NET)

.NET platforma de la Microsoft poate fi văzută ca un competitor pentru Java. Cu specificația C # , Microsoft a încercat, ca parte a strategiei sale .NET, să găsească echilibrul dintre crearea unui nou limbaj și integrarea ușoară a componentelor existente.

Diferențele conceptuale față de Java există în special în implementarea mecanismelor de apel invers. În .NET, acest sprijin a delegat ( în engleză delegați ) a implementat un concept care este similar cu indicii de funcții. În Java, acest lucru poate fi realizat prin referințe la metode sau expresii lambda.

Suport suplimentar. Limbaje .NET numite atribute ( atribute ) care permit funcționalitatea metadatelor de limbă din cod să se extindă (o funcționalitate similară sub forma adnotării de mai sus, inclusă în Java 5.0). C # conține, de asemenea, elemente ale limbajului Visual Basic , de exemplu, caracteristici ( proprietăți ), precum și concepte de C ++.

În .NET, ca și în Java, este posibil să se declare excepții de la o metodă. În Java, excepțiile pot fi declarate în așa fel încât să fie și ele procesate ( excepție verificată ).

Comenzile de sistem Windows ( invocații Win- ABI ) pot fi invocate în .NET prin intermediul platformei invocate sau folosind C ++ / CLI. Acest lucru nu este posibil în Java, dar cu interfața nativă Java există posibilitatea referințării codului C și C ++ direct prin DLL și executarea acestuia în afara mașinii virtuale Java .

Scala

Scala este un limbaj de programare care combină paradigme orientate pe obiecte și funcționale și, la fel ca Java , poate fi executat pe mașina virtuală Java .

Spre deosebire de Java și similar cu C #, sistemul de tip este unificat și include tipuri de referință și valori. Utilizatorii pot defini alte tipuri - în Java sunt tipurile disponibile de valori pentru tipurile primitive fixe predefinite ( int, long, ...) limitată.

În loc de interfețe ( interface), Scala folosește așa-numitele trăsături ( traits), care pot conține implementări ale metodelor reutilizabile. O altă funcționalitate care nu este inclusă în Java include tipurile și funcțiile de ordin superior , potrivirea modelelor și numele de metode și clase selectate liber.

La fel ca în C #, nu există excepții verificate . Cu toate acestea, metodele pot fi @throwsadnotate. Scala elimină, printre altele, conceptul de metode și clase statice (înlocuite cu obiecte însoțitoare ), tipurile brute , necesitatea metodelor getter și setter și varianța incertă a matricelor.

Varianța tipurilor generice nu trebuie să apară în timpul utilizării ca în Java ( varianță de utilizare a site-ului ), dar poate fi specificată direct cu declarația ( varianță de declarație-site ).

Kotlin

Kotlin este un limbaj de programare multi-platformă , tastat static , care în bytecode pentru Java Virtual Machine este tradus (JVM), dar și în JavaScript - Cod sursă sau (folosind LLVM în) codul mașinii poate fi convertit.

Spre deosebire de Java, cu Kotlin tipul de date al unei variabile nu este notat în fața numelui variabilei, ci ulterior, separat de două puncte. Cu toate acestea, Kotlin acceptă și inferența de tip , astfel încât tipul poate fi adesea omis dacă este clar din context. O întrerupere de linie este suficientă pentru a termina instrucțiunea, dar și un punct și virgulă poate fi folosit ca opțiune. În plus față de clase și metode (în Kotlin: funcții de membru ) din programarea orientată obiect , Kotlin acceptă programarea procedurală utilizând funcții precum și anumite aspecte ale programării funcționale . La fel cu C și altele asemenea, o funcție principală servește drept punct de intrare .

Kotlin poate fi, de asemenea, utilizat pentru a dezvolta aplicații Android și este susținut oficial de Google din 2017 . Începând din mai 2019, Kotlin a fost limba preferată de Google pentru dezvoltarea aplicațiilor Android.

Tipuri de aplicații

Multe tipuri diferite de aplicații pot fi create cu Java.

Aplicații web Java

Aplicațiile web Java sunt programe Java care sunt încărcate și pornite pe un server web și rulează sau sunt afișate într-un browser web pentru utilizator. De obicei, o parte a aplicației web rulează pe server ( logica și persistența afacerii ) și o altă parte pe browserul web (logica interfeței grafice a utilizatorului ). Partea server este de obicei scrisă în întregime în Java, partea browserului de obicei în HTML și JavaScript. Cu toate acestea, este, de asemenea, posibil să scrieți aplicații web Java, inclusiv logică GUI complet în Java (a se vedea, de exemplu, Google Web Toolkit sau Platforma de aplicații la distanță ). Exemple binecunoscute de aplicații web Java sunt Twitter , Jira , Jenkins sau Gmail (care nu este în întregime, dar în mare măsură scris în Java).

Aplicații desktop Java

Programele desktop normale sunt rezumate în aplicațiile desktop. Programele de comunicare pe internet, precum și jocurile sau aplicațiile de birou care rulează pe un computer normal sunt așa numite. Exemple binecunoscute de aplicații desktop Java sunt mediul de dezvoltare integrat Eclipse , programul de partajare a fișierelor Vuze sau jocul pentru computer Minecraft .

Applet-uri Java

Applet - uri Java sunt aplicații Java care rulează într - un mod tipic browser web . De obicei, acestea sunt limitate la o zonă a unui site web care este definită de o etichetă HTML specială . Un browser compatibil cu Java este necesar pentru a rula applet-uri Java. Acest tip de aplicație nu mai este acceptat de la Java 11, după ce a fost marcat ca „învechit” în Java 9.

Aplicații

Aplicațiile sunt aplicații mai mici pentru dispozitive mobile precum telefoane mobile, smartphone-uri, PDA-uri sau tablete. De obicei, acestea rulează pe platforme Java speciale, cum ar fi Java ME, care sunt optimizate pentru a rula aplicații Java pe dispozitive mobile .

Aplicațiile pentru sistemul de operare Android de la Google sunt programate în limbajul Java descris aici, dar se bazează pe o altă bibliotecă de clase - API .

Medii de dezvoltare

Există o mare varietate de medii de dezvoltare pentru Java, atât proprietare, cât și gratuită ( open source ). Majoritatea mediilor de dezvoltare pentru Java sunt scrise și ele în Java.

Cele mai cunoscute medii open source furnizate de Eclipse Foundation Eclipse și dezvoltate de Sun NetBeans .

Printre mediile de dezvoltare comercială, IntelliJ IDEA de la JetBrains (care este Free Software în Community Edition ), Jbuilder de la Borland, și JCreator și NetBeans- pe baza Sun ONE Studio de la Soare, sunt cele mai frecvente. Există, de asemenea, o versiune a Eclipse care a fost extinsă cu câteva sute de pluginuri, care a fost vândută de IBM sub numele WebSphere Studio Application Developer („WSAD”) și se numește Rational Application Developer („RAD”) din versiunea 6.0 .

Cu macOS versiunea 10.3 sau o versiune ulterioară, Apple oferă mediul de dezvoltare Xcode , care acceptă diverse limbaje de programare, dar se concentrează pe C, C ++, Objective-C și Swift. Android Studio este recomandat pentru programarea aplicațiilor Android cu Java .

IDE BlueJ este conceput pentru începători și scopuri educaționale , unde, printre altele, relațiile dintre diferitele clase sunt reprezentate grafic sub formă de diagrame de clasă .

Mulți editori de text oferă suport pentru Java, inclusiv Emacs , jEdit , Atom , Visual Studio Code , Vim , Geany , Jed , Notepad ++ și TextPad .

Compilator

Un compilator Java traduce codul sursă Java (extensia de fișier „.java”) în cod executabil. Se face o distincție de bază între codurile bytecode și compilatoarele de coduri native . Unele medii de execuție Java utilizează un compilator JIT pentru a traduce codul de bytec al părților de program utilizate frecvent în codul mașinii native în timpul execuției .

Compilator bytecode

În mod normal, compilatorul Java traduce programele într-un bytecode (extensie de fișier „.class”) care nu poate fi executat direct , pe care Java Runtime Environment (JRE) îl execută mai târziu. Actuala tehnologie HotSpot compilează bytecode-ul la rulare în codul procesorului nativ și îl optimizează în funcție de platforma utilizată. Această optimizare are loc treptat, astfel încât are loc efectul ca părțile programului să devină mai rapide după procesarea repetată. Pe de altă parte, această tehnică, care este un succesor al compilării just-in-time, înseamnă că bytecode-ul Java ar putea fi executat teoretic la fel de repede ca programele native compilate.

Tehnologia HotSpot a fost disponibilă de la versiunea 1.3 a JRE și a fost îmbunătățită continuu de atunci.

Exemple de compilatoare bytecode sunt javac (parte a JDK ) și a fost Jikes (întrerupt, funcționalitate până la Java SE 5) de la IBM .

Compilator nativ

Există, de asemenea, compilatoare pentru Java care pot traduce textele sursă Java sau codul secundar Java în codul mașinii „normale” , așa-numitele compilatoare anticipate . Programele compilate nativ au avantajul că nu mai au nevoie de un JavaVM , dar și dezavantajul că nu mai sunt independente de platformă.

Exemple de compilatoare Java native au fost Excelsior JET (întrerupt până la Java SE 7) și GNU Compiler for Java (GCJ, întrerupt până la J2SE 5.0), cum ar fi MinGW , Cygwin sau JavaNativeCompiler (JNC).

Înveliș

Ca o posibilitate suplimentară, programul Java poate fi „împachetat” într-un alt program (engleză to wrap ); acest shell exterior servește apoi ca înlocuitor pentru o arhivă Java . Se caută automat un mediu de execuție Java instalat pentru a porni programul real și informează utilizatorul despre unde să descarce un mediu de execuție dacă unul nu este deja instalat. Deci, un mediu de rulare este încă necesar pentru a porni programul, dar utilizatorul primește un mesaj de eroare ușor de înțeles care îl ajută în continuare.

Java Web Start este o abordare mai elegantă și mai standardizată a acestei soluții - permite activarea ușoară a aplicațiilor cu un singur clic al mouse-ului și asigură că cea mai recentă versiune a aplicației rulează întotdeauna. Acest lucru automatizează procedurile complicate de instalare sau actualizare.

Exemple de împachetări Java sunt JSmooth sau Launch4J . JBuilder din Borland și NSIS sunt, de asemenea, capabili să creeze un wrapper pentru Windows.

Vezi si

literatură

Link-uri web

Commons : Java (limbaj de programare)  - colecție de imagini, videoclipuri și fișiere audio

Dovezi individuale

  1. Note de versiune consolidate JDK 16 . 20 aprilie 2021 (accesat 21 aprilie 2021).
  2. ^ Robert McMillan: Java își pierde Mojo? wired.com , 1 august 2013, accesat la 29 septembrie 2018 (engleză): „Java este pe cale să scadă, cel puțin conform unei ținute care urmărește lumea în continuă schimbare a limbajelor de programare pentru computer. De mai bine de un deceniu, acesta a dominat Indexul Comunității de Programare Tiobe - un instantaneu al entuziasmului dezvoltatorului de software care privește lucruri precum rezultatele căutării pe internet pentru a măsura cât de multă noutate au diferite limbi. Dar în ultima vreme, Java alunecă. "
  3. ^ Indexul comunității de programare TIOBE. tiobe.com, 2015, accesat la 3 aprilie 2015 .
  4. Stephen O'Grady: The RedMonk Programming Language Rankings: ianuarie 2020. În: tecosystems. RedMonk, 28 februarie 2020, accesat pe 5 martie 2020 (engleză americană).
  5. Silke Hahn: Python face istorie: locul 2 în clasamentul limbajului de programare. heise online, 3 martie 2020, accesat pe 5 martie 2020 .
  6. ^ Limbajul Java: o prezentare generală. 1995 Cartea albă a Soarelui
  7. Hajo Schulz: Daniel Düsentrieb, C #, Java, C ++ și Delphi în testul de eficiență . Partea 1. În: c't . Nu. 19 . Heise Zeitschriften Verlag, Hanovra 2003, p. 204–207 ( heise.de [accesat la 21 octombrie 2010]). Hajo Schulz: Daniel Düsentrieb, C #, Java, C ++ și Delphi în testul de eficiență . Partea 2. În: c't . Nu.
     21 . Heise Zeitschriften Verlag, Hanovra 2003, p. 222–227 ( heise.de [accesat la 21 octombrie 2010]).
  8. JPLewis, Ulrich Neumann: Java trage înainte? Performanța Java versus C ++. Computer Graphics and Immersive Technology Lab, Universitatea din California de Sud, ianuarie 2003, accesat pe 21 octombrie 2010 (engleză): „Acest articol analizează o serie de repere și constată că performanța Java a codului numeric este comparabilă cu cea a C ++, cu indicii că performanța relativă a Java continuă să se îmbunătățească. "
  9. ^ Robert Hundt: Recunoașterea buclei în C ++ / Java / Go / Scala . Ed.: Scala Days 2011. Stanford CA 27 aprilie 2011 (engleză, scala-lang.org [PDF; 318 kB ; accesat la 17 noiembrie 2012]): constatăm că, în ceea ce privește performanța, C ++ câștigă cu o marjă mare. [...] Versiunea Java a fost probabil cea mai simplă de implementat, dar cea mai greu de analizat pentru performanță. Mai exact, efectele din jurul colectării gunoiului au fost complicate și foarte greu de reglat
  10. ^ CAR Hoare: Monitoare: un concept de structurare a sistemului de operare . (PDF) În: Communications of the ACM , 17, No. 10, 1974, pp. 549-557 doi: 10.1145 / 355620.361161
  11. a b Autoboxing în Java (engleză)
  12. Scott Stanchfield: Java este Pass-by-Value, la naiba! (Nu mai este disponibil online.) JavaDude.com, arhivat din original la 15 mai 2008 ; accesat la 5 noiembrie 2010 .
  13. 4.1. Tipurile de valori și valori. În: Specificații limbaj Java. Oracle Inc., accesat la 24 septembrie 2016 .
  14. Pagină comunitară pentru dezvoltarea open source JDK de la Sun
  15. Anunț de presă Sun Microsystems din 8 mai 2007 ( Memento din 11 mai 2008 în Arhiva Internet ) (engleză)
  16. Java: IBM transferă JVM J9 către Eclipse Foundation. În: heise online. Adus pe 24 septembrie 2019 .
  17. licență eclipsă openj9. Fundația Eclipse, 1 august 2018, accesat la 24 septembrie 2019 .
  18. Foaie de parcurs JDK 7 (engleză)
  19. Caracteristici JDK 7 - JSR 292: Suport VM pentru limbaje non-Java (InvokeDynamic) (engleză)
  20. Brendan Eich: JavaScript at Ten Years ( Memento din 28 mai 2007 în Internet Archive ) ( MS PowerPoint ; 576 kB).
  21. punct și virgulă . jetbrains.com. Adus la 8 februarie 2014.
  22. funcții . jetbrains.com. Adus la 8 februarie 2014.
  23. Maxim Șafirov: Kotlin pe Android. Acum oficial. În: Blogul Kotlin. 17 mai 2017. Adus 18 iunie 2019 (engleză americană).
  24. Google I / O: angajamentul Google față de Kotlin. În: heise online. Adus la 18 iunie 2019 .
  25. developer.ibm.com
  26. API-uri, caracteristici și opțiuni depreciate. Adus pe 14 septembrie 2019 .
  27. JEP 289: Dezaproba API-ul Applet. Adus pe 14 septembrie 2019 .
  28. Subiectul Dalibor: Trecerea la un web fără plugin. Adus pe 14 septembrie 2019 .
  29. Aurelio Garcia-Ribeyro: Actualizări suplimentare la „Trecerea la un web fără plugin”. Adus pe 14 septembrie 2019 .
  30. JetBrains Community Edition pe GitHub
  31. Caracteristici Apple Xcode
  32. Swift pentru XCode