Web - Amazon

We provide Linux to the World

ON AMAZON:


We support WINRAR [What is this] - [Download .exe file(s) for Windows]

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
SITEMAP
Audiobooks by Valerio Di Stefano: Single Download - Complete Download [TAR] [WIM] [ZIP] [RAR] - Alphabetical Download  [TAR] [WIM] [ZIP] [RAR] - Download Instructions

Make a donation: IBAN: IT36M0708677020000000008016 - BIC/SWIFT:  ICRAITRRU60 - VALERIO DI STEFANO or
Privacy Policy Cookie Policy Terms and Conditions
Java (linguaggio) - Wikipedia

Java (linguaggio)

Da Wikipedia, l'enciclopedia libera.

Logo Java

Il linguaggio Java è un linguaggio di programmazione orientato agli oggetti, derivato dal C++ (e quindi indirettamente dal C) e creato da James Gosling e altri ingegneri di Sun Microsystems. Il gruppo iniziò a lavorare nel 1991, il linguaggio inizialmente si chiamava Oak. Il nome fu successivamente cambiato in Java a causa di un problema di copyright (il linguaggio di programmazione Oak esisteva già nel 1991). Java fu annunciato ufficialmente il 23 maggio 1995 a SunWorld. La piattaforma di programmazione Java è fondata sul linguaggio stesso, sulla Java Virtual Machine (JVM) e sulle API. Java è un marchio registrato di Sun Microsystems. Il 13 novembre 2006 la Sun Microsystems ha rilasciato la sua implementazione del compilatore Java e della macchina virtuale sotto licenza GPL[1]. L'8 maggio 2007 SUN ha rilasciato anche le librerie (tranne alcune componenti non di sua proprietà) sotto licenza GPL rendendo Java un linguaggio di programmazione la cui implementazione di riferimento è libera. [2]

Indice

[modifica] Panoramica

Java venne creato per soddisfare quattro scopi:

  1. essere orientato agli oggetti
  2. essere indipendente dalla piattaforma
  3. contenere strumenti e librerie per il networking
  4. essere progettato per eseguire codice da sorgenti remote in modo sicuro

Per facilitare il passaggio a questo linguaggio per i programmatori old-fashioned legati in particolare a linguaggi come il C la sintassi di base (strutture di controllo, operatori e così via) è stata mantenuta pressoché identica.

[modifica] Orientamento agli oggetti

La prima caratteristica, l'orientamento agli oggetti, si riferisce a un moderno metodo di programmazione e progettazione, la programmazione orientata agli oggetti (OOP).

L'idea alla base della OOP è di rappresentare, nella progettazione del software, le entità reali o astratte che compongono il problema sotto forma di oggetti. Gli oggetti sono caratterizzati da delle proprietà (definite variabili o campi di istanza o di esemplare) e di metodi applicabili sugli oggetti stessi, che possono ad esempio modificarne lo stato o estrarne informazioni.

I programmi scritti in Java possono essere unicamente orientati agli oggetti, di conseguenza tutto il codice deve essere necessariamente incluso in una classe.

Sebbene Java possa operare sia su oggetti che su tipi di dati primitivi, è considerato un linguaggio ad oggetti puro, ovvero nel quale gli oggetti sono le entità di base del linguaggio, anziché essere costruiti partendo da costrutti ad un inferiore livello di astrazione.

[modifica] Ereditarietà

L'ereditarietà in java è implementata mediante la parola chiave extends, applicata nella dichiarazione di una classe

public class Quadrato extends Quadrilatero

Una classe estende sempre una e una sola altra classe (ovvero non esiste ereditarietà multipla), ma può a sua volta essere estesa da un numero arbitrario di classi. Se non si utilizza la clausola extends, la classe estende comunque una superclasse implicita, la classe Object.

Questo sistema rende disponibile un modo per creare gerarchie di classi ben definite, ad esempio una classe Quadrilatero può definire alcuni comportamenti generali per tutte le figure geometriche con 4 lati, tuttavia si può presentare la necessità di aver bisogno di caratteristiche più specifiche per i nostri oggetti, quindi creiamo una classe Quadrato che estende la classe Quadrilatero da cui deriva tutti gli attributi (le variabili di istanza) e tutti i comportamenti (i metodi), salvo poi riscrivere (tramite overriding) quei comportamenti che sono prettamente associati ai quadrati (ovvero legati alla proprietà specifica dei quadrati di avere 4 lati uguali).

L'overriding si attua semplicemente scrivendo all'interno della classe che estende (in questo caso la classe Quadrato) il metodo che vogliamo riscrivere, utilizzando la stessa firma del relativo metodo della superclasse (deve avere lo stesso nome e gli stessi attributi, in numero e tipo).

Java adotta un modello di ereditarietà basato sull'ereditarietà singola; in altre parole, una classe può estendere una sola superclasse. Su questo punto Java si differenzia dal C++, basato sul modello dell'ereditarietà multipla. Dopo l'avvento di Java, l'ereditarietà singola si è gradualmente affermata come modello standard di ereditarietà nelle tecnologie object-oriented, ed è stata abbracciata, per esempio, anche dai linguaggi del framework .NET Microsoft.

[modifica] Interfacce

L'utilizzo di una interfaccia in java consente di trattare in modo omogeneo tutti gli oggetti che forniscono un dato insieme di servizi, a prescindere dalla loro implementazione (e quindi dalla loro particolare classe di appartenenza). Dal punto di vista sintattico, una interfaccia Java consiste principalmente di una lista di dichiarazioni di metodi che tutte le classi che implementano l'interfaccia devono fornire.

public class Quadrato implements FiguraGeometrica

dove l'interfaccia FiguraGeometrica potrebbe essere dichiarata come segue:

public interface FiguraGeometrica {
  public int calcolaPerimetro();
  public int calcolaArea();
}

(Notare che nella dichiarazione di un metodo in un'interfaccia le parole-chiave "public" e "abstract" sono sempre implicite e, dunque, facoltative.) Con l'implementazione dell'interfaccia la classe Quadrato deve contenere al suo interno i metodi calcolaPerimetro e calcolaArea propri (o possono essere ereditati dalla classe padre). L'utilizzo delle interfacce viene usato quando si hanno delle gerarchie di oggetti, o oggetti semplici che possiedono delle operazioni comuni (metodi), ma l'implementazione di queste sono differenti una dall'altra.

[modifica] Indipendenza dalla piattaforma

La seconda caratteristica, l'indipendenza dalla piattaforma, significa che l'esecuzione di programmi scritti in Java deve avere un comportamento simile su hardware diverso. Si dovrebbe essere in grado di scrivere il programma una volta e farlo eseguire dovunque. Questo è possibile con la compilazione del codice di Java in un linguaggio intermedio bytecode, basato su istruzioni semplificate che ricalcano il linguaggio macchina. Il bytecode verrà quindi eseguito da una macchina virtuale. Inoltre, vengono fornite librerie standardizzate per permettere l'accesso alle caratteristiche della macchina (come grafica e networking) in modo unificato. Il linguaggio Java include anche il supporto per i programmi con multithread, necessario per molte applicazioni che usano la rete.

La portabilità è un obiettivo tecnicamente difficile da raggiungere, e il successo di Java in questo ambito è materia di alcune controversie. Sebbene sia in effetti possibile scrivere in Java programmi che si comportano in modo consistente attraverso molte piattaforme diverse, bisogna tenere presente che questi poi dipendono dalle virtual machine, che sono programmi a sé e che hanno inevitabilmente i loro bug, diversi dall'una all'altra: per questo è nata una parodia dello slogan di Sun "Scrivi una volta, esegui dovunque" ("write once, run everywhere"), che è diventato "Scrivi una volta, fai il debug ovunque" ("write once, debug anywhere").

[modifica] Compilazione Just-In-Time

Le prime implementazioni del linguaggio usavano una virtual machine che interpretava il bytecode per ottenere la massima portabilità, definita Architecture Neutral. Questa soluzione si è però rivelata poco efficiente, in quanto i programmi interpretati erano molto lenti. Per questo, tutte le implementazioni recenti di macchine virtuali Java hanno incorporato un JIT compiler, cioè un compilatore interno, che al momento del lancio traduce al volo il programma bytecode Java in un normale programma nel linguaggio macchina del computer ospite. Inoltre, questa ricompilazione è dinamica, cioè la virtual machine analizza costantemente il modello di esecuzione del codice (profiling), e ottimizza ulteriormente le parti più frequentemente eseguite, mentre il programma è in esecuzione. Questi accorgimenti, a prezzo di una piccola attesa in fase di lancio del programma, permettono di avere delle applicazioni Java decisamente più veloci e leggere. Tuttavia, anche così Java resta un linguaggio meno efficiente dei linguaggi compilati come il C++, scontando il fatto di possedere degli strati di astrazione in più, e di implementare una serie di automatismi, come il garbage collector, che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi, dall'altro consumano memoria e tempo di CPU in fase di esecuzione del programma finito.

[modifica] Esecuzione sicura del codice remoto

La piattaforma Java fu uno dei primi sistemi a fornire un largo supporto per l'esecuzione del codice da sorgenti remote. Un Java applet è un particolare tipo di applicazione che può essere avviata all'interno del browser dell'utente, eseguendo codice scaricato da un server web remoto. Questo codice viene eseguito in un'area (sandbox) altamente ristretta, che protegge l'utente dalla possibilità che il codice sia malevolo o abbia un comportamento non desiderato; chi pubblica il codice può applicare un certificato che usa per firmare digitalmente le applet dichiarandole "sicure", dando loro il permesso di uscire dall'area ristretta e accedere al filesystem e al network, presumibilmente con l'approvazione e sotto il controllo dell'utente. In realtà gli applet non hanno avuto molta fortuna. Infatti presuppone che il client in cui essi vengono eseguiti abbia installata la JRE (deve eseguire il codice dell'applet). Hanno avuto fortuna le applicazioni che prevedono il cosiddetto thin-client, cioè un client 'leggero' che non ha bisogno di particolari strumenti per eseguire il codice remoto (a volte è necessario solo il browser).

[modifica] Altri aspetti di interesse

Rispetto alla tradizione dei linguaggi a oggetti da cui deriva (e in particolare rispetto al suo diretto progenitore, il C++), Java ha introdotto una serie di notevoli novità rispetto all'estensione della sua semantica. Fra le più significative si possono citare probabilmente la possibilità di costruire GUI (interfacce grafiche) con strumenti standard e non proprietari utilizzando i package java.awt e javax.swing (per il C++ e altri linguaggi analoghi solitamente le GUI non fanno parte del linguaggio, ma sono delegate a librerie esterne), la possibilità di creare applicazioni multi-thread, ovvero che svolgono in modo concorrente molteplici attività, e il supporto per la riflessione, ovvero la capacità di un programma di agire sulla propria struttura e di utilizzare classi caricate dinamicamente dall'esterno.

Fra gli argomenti che depongono spesso a favore di Java nella scelta del linguaggio di implementazione di un progetto software moderno, inoltre, si deve certamente contare la vastità delle librerie standard di cui il linguaggio è dotato, e che in particolare contribuiscono a renderlo altamente integrabile con le altre tecnologie. Alcuni esempi di funzionalità di libreria di Java sono:

  • accesso ai database tramite JDBC e ai DBMS con driver ODBC tramite il bridge JDBC-ODBC
  • manipolazione documenti XML
  • dialogo con piattaforme CORBA
  • potenti strumenti per la programmazione lato server nel contesto Web
  • supporto nativo per gran parte dei protocolli della famiglia IP, vedi ad esempio il Socket Java
  • supporto per le applicazioni multimediali, streaming audio e video

[modifica] Linguaggio

[modifica] Hello, world!

Il seguente esempio stampa il testo "Hello world".

public class HelloWorld {
     public static void main(String[] args) {
         System.out.println("Hello World");
     }
 }

Segue l'analisi riga per riga del frammento di codice:

  • public class HelloWorld

La classe porta il nome HelloWorld e, poiché è dichiarata "public", significa che anche il nome del file nel quale verra' scritto il programma dovra' chiamarsi HelloWorld.java. Quindi il nome del file .java e il nome della classe "pubblica" devono coincidere!

  • public static void main(String[] args)

La classe HelloWorld contiene un unico metodo, che si chiama "main". È un nome particolare. In effetti, al caricamento della classe, l'interprete java cerchera' il metodo che portera' questo nome.

  • "public" perché il metodo deve essere raggiungibile da qualsiasi classe, e in particolare, dallo stesso interprete.
  • "static" perché non deve essere invocato su un oggetto particolare (detto "d'invocazione").
  • "void" perché non deve restituire alcun valore.

Il parametro args si riferisce all'array di stringhe passato all'interprete al momento del suo avvio. Se viene eseguito questo comando:

$ java HelloWorld par1 par2

la stringa par1 sarà caricata nella variabile args[0] mentre par2 sarà caricata nella variabile args[1].

  • System.out.println("Hello world");

Questa operazione stampa sullo schermo la scritta "Hello world". Entrando più nel dettaglio, il metodo println() viene invocato su un oggetto statico di tipo PrintStream chiamato "out", il quale, a sua volta si trova all'interno della classe System.

[modifica] Strutture di controllo

Per approfondire, vedi la voce Strutture di controllo in Java.

[modifica] Cicli

while (boolean expression) {
    statement(s)
}
 
do {
    statement(s)
} while (boolean expression);
 
for (initialisation; termination condition; incrementing expr) {
    statement(s)
}

[modifica] Alternative

if (boolean expression) {
    statement(s)
}
 
if (boolean expression) {
    statement(s)
} else {
    statement(s)
}
 
if (boolean expression) {
    statement(s)
} else if (boolean expression) {
    statement(s)
} else if (boolean expression) {
    statement(s)
} else {
    statement(s)
}
 
switch (integer expression) {
    case constant integer expr:
         statement(s)
         break;
    ...
    default:
         statement(s)
         break;
}
 
(boolean expression) ? (statement on true condition) : (statement on false condition)

[modifica] Gestione delle eccezioni

Per approfondire, vedi la voce Gestione delle eccezioni in Java.
try {
    statement(s)
} catch (exception type) {
    statement(s)
} catch (exception type) {
    statement(s)
} finally {
    statement(s)
}

[modifica] Salti

È possibile inserire un'etichetta prima di ogni dichiarazione

myLabel: aJavaStatement;

Il comando

break;

termina il ciclo corrente.

Nel caso di cicli annidati, il break con label può essere usato per terminare uno qualsiasi di tali cicli:

break cicloEsterno;

Un'espressione continue termina l'iterazione corrente e inizia quella successiva

continue;

Il continue con una label può essere usato per passare alla prossima iterazione di uno qualsiasi di un insieme di cicli annidati:

continue cicloEsterno;

[modifica] Tipi Primitivi

Tipo di variabile Descrizione
byte intero con segno a 8 bit
short intero con segno a 16 bit
int intero con segno a 32 bit
long intero con segno a 64 bit
float virgola mobile a 32 bit singola precisione (standard IEEE 754)
double virgola mobile a 64 bit doppia precisione (standard IEEE 754)
char carattere singolo Unicode
boolean vero o falso

I caratteri usano la codifica a 16 bit Unicode. Contiene tutti i caratteri usuali, oltre a tutti i set di caratteri di molte lingue come Greco, Cirillico, Cinese, Arabo, ecc. In Java si possono usare tutti questi caratteri, anche se molti editor non hanno il supporto per i set di caratteri diversi dal ASCII. Gli Array e le stringhe non sono tipi primitivi ma oggetti.

[modifica] Versioni

  • JDK 1.1.4 (Sparkler) 12 Settembre 1997
    • JDK 1.1.5 (Pumpkin) 3 Dicembre 1997
    • JDK 1.1.6 (Abigail) 24 Aprile 1998
    • JDK 1.1.7 (Brutus) 28 Settembre 1998
    • JDK 1.1.8 (Chelsea) 8 Aprile 1999i
  • J2SE 1.2 (Playground) 4 Dicembre 1998
    • J2SE 1.2.1 (none) 30 Marzo 1999
    • J2SE 1.2.2 (Cricket) 8 Luglio 1999
  • J2SE 1.3 (Kestrel) 8 Maggio 2000
    • J2SE 1.3.1 (Ladybird) 17 Maggio 2001
  • J2SE 1.4.0 (Merlin) 13 Febbraio 2002
    • J2SE 1.4.1 (Hopper) 16 Settembre 2002
    • J2SE 1.4.2 (Mantis) 26 Giugno 2003
  • J2SE 5.0 (1.5.0) (Tiger) 29 Settembre 2004
  • Java SE 6 (1.6.0) (Mustang) 11 Dicembre 2006
  • Java SE 7 (1.7.0) (Dolphin) Prevista per il 2008

Java fu inizialmente rilasciato come Java Development Kit 1.0 (JDK 1.0). Questo comprende Java Runtime (la virtual machine e le librerie di classi), e gli strumenti di sviluppo (es. il compilatore Java). Successivamente, Sun fornì un pacchetto che comprendeva solo Java runtime, chiamato Java RunTime Environment (JRE). Normalmente le persone si riferiscono ad una particolare versione di Java attraverso la versione del JDK (es. JDK 1.4) Le versioni JDK 1.2 e successive sono spesso chiamate Java 2. Per esempio, il nome ufficiale del JDK 1.4 è Java(TM) 2 Platform, Standard Edition 1.4.

Il linguaggio è rimasto stabile dal JDK 1.0; la libreria di classi che viene fornita con JDK è stata progressivamente ampliata e modificata in alcune parti.
Le estensioni e architetture legate al linguaggio Java comprendono:

  • GeoTools Libreria per il trattamento di dati geografici
  • J2SE Java 2 Platform Standard Edition;
  • J2EE Java 2 Platform Enterprise Edition;
  • J2ME Java 2 Platform Micro Edition;
  • Servlet;
  • EJB Enterprise JavaBeans;
  • JSP JavaServer Pages;
  • JSF Java Server Faces
  • JDO Java Data Objects;
  • JMS Java Message Service;
  • JAF JavaBeans Activation Framework;
  • Java Mail;
  • JNI Java Native Interface;
  • JNDI Java Naming and Directory Interface;
  • JSML Java Speech Grammar Specification;
  • JDBC Java Database Connectivity;
  • JAIN Java Integrated Networks;
  • JDMK Java Dynamic Management Kit;
  • Jini Java Intelligent Network Infrastructure;
  • Jiro Java Interface for Regular Objects;
  • JXTA sigla che sta per "juxtapose" (porre accanto);
  • JavaSpaces;
  • JMI Java Metadata Interface;
  • JMX Java Management Extension.
  • JAXB Java Architecture for XML Binding
  • JAXP Java API for XML Processing
  • SAAJ SOAP with Attachments API for Java
  • JAX-RPC Java API for XML-based RPC
  • JAXR Java API for XML Registries
  • Java 3D Java 3D API

Sebbene il linguaggio sia molto semplice da imparare, l'utilizzo delle architetture e delle specifiche richiede un tempo di apprendimento molto lungo.

[modifica] Come programmare in Java

La programmazione in Java è una specializzazione della programmazione con linguaggi orientati agli oggetti.

Il linguaggio Java è un linguaggio orientato agli oggetti con una sintassi simile al linguaggio C e al linguaggio C++. Allo sviluppatore già esperto di programmazione OOP, alcuni punti dovrebbero essere evidenziati:

  1. Java supporta solo la singola ereditarietà di classi, ma permette l'ereditarietà multipla di interfacce.
  2. Java ha una libreria di classi molto grande (detta Java API) simile a SmallTalk, e supporta molte caratteristiche, dai contenitori di oggetti a complesse esigenze di sicurezza.
  3. Java viene eseguito attraverso una Virtual Machine

L'apprendimento del linguaggio non è difficile. La vastità delle "librerie" (o più correttamente package) standard del linguaggio è tale da renderne praticamente impossibile la "padronanza"; per programmare in Java è dunque necessario avere a disposizione la documentazione delle API del linguaggio, disponibile in linea sul sito ufficiale.

Un buon punto di partenza per imparare Java è il tutorial di Sun.

Per sviluppare programmi in Java è teoricamente sufficiente un qualsiasi editor di testo; in pratica, se si vuole scrivere qualcosa di più del classico hello world, occorre un ambiente di sviluppo integrato. Esistono diversi IDE (Integrated Development Environment, ambiente di sviluppo integrato), alcuni gratuiti ed altri a pagamento.

Fra questi quello più premiato è IntelliJ IDEA vincitore fra l'altro del premio Best Java IDE 2005 rilasciato da JDJ. Si tratta di un IDE completo, molto funzionale ed in grado di garantire una padronanza completa del codice che si sta sviluppando.

Un ambiente di sviluppo per Java gratuito e soprattutto leggero è BlueJ, di chiara impostazione didattica, e disponibile per tutti i sistemi operativi al sito gratuito http://www.bluej.org/. Un altro ambiente per lo sviluppo in Java (e non solo) è Eclipse, donato alla comunità di sviluppatori da IBM e scaricabile dalla pagina http://www.eclipse.org. Eclipse è più avanzato e potente, è libero e disponibile per molti sistemi operativi; da notare che quest'ultimo è strutturato con un'architettura a plugin che permette l'aggiunta di ulteriori funzionalità semplicemente scaricando ed installando il relativo plugin (si veda ad esempio eclipse plugins).

La Sun stessa ha promosso lo sviluppo di un ambiente di sviluppo gratuito e open source chiamato NetBeans e lo mette a disposizione gratuitamente insieme a Sun Java Studio. Questi due ambienti sono scritti in Java e NetBeans è distribuito (opzionalmente) insieme alla macchina virtuale [1]. Come entità separata, NetBeans è scaricabile da netbeans.org. Uno degli IDE commerciali più diffusi è JBuilder prodotto dalla Borland.

[modifica] Curiosità

J. Gosling e A. Van Hoof (considerati gli autori del linguaggio Java) si trovavano spesso ad un caffè presso il quale discutevano del linguaggio stesso. E così il linguaggio prese il nome da tale abitudine (Java è una qualità di caffè dell'omonima isola dell'Indonesia), tanto che il magic number che identifica un file .class (byte code ottenuto dalla compilazione di un file .java) è 0xCAFEBABE (probabilmente riferendosi alla cameriera che li serviva).

[modifica] Note

  1. ^ "Q: What components of the JDK software are you open sourcing today? A: We're open sourcing the Java programming language compiler ("javac"), and the Java HotSpot virtual machine."Free and Open Source Java FAQ; the source is being released via the OpenJDK project.
  2. ^ Open JDK is here!. Sun Microsystems, 08-05-2007. URL consultato il 09-05-2007.

[modifica] Voci correlate

[modifica] Altri progetti

[modifica] Collegamenti esterni



Principali linguaggi di programmazione (tutti)

Ada | ALGOL | APL | Awk | BASIC | C | C++ | C# | COBOL | Delphi | Eiffel | Fortran | Haskell | IDL | Java | JavaScript | J# | Lisp | LOGO | ML | Objective C | O'Caml | Pascal | Perl | PHP | PL/I | PLaSM | Prolog | Python | Ruby | SAS | Scheme | sh | Simula | Smalltalk | SQL | Transact-SQL | Visual Basic


Static Wikipedia 2008 (March - no images)

aa - ab - als - am - an - ang - ar - arc - as - bar - bat_smg - bi - bug - bxr - cho - co - cr - csb - cv - cy - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - jbo - jv - ka - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nn - -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -
https://www.classicistranieri.it - https://www.ebooksgratis.com - https://www.gutenbergaustralia.com - https://www.englishwikipedia.com - https://www.wikipediazim.com - https://www.wikisourcezim.com - https://www.projectgutenberg.net - https://www.projectgutenberg.es - https://www.radioascolto.com - https://www.debitoformativo.it - https://www.wikipediaforschools.org - https://www.projectgutenbergzim.com