Julia è un linguaggio di programmazione, multi-paradigma, open source pubblicato a partire dal 2012 (anche se le basi furono poste nel 2009) da un gruppo di programmatori impegnati professionalmente nel campo del calcolo numerico pensato con lo scopo di fornire uno strumento ad alte prestazioni dedicato in maniera particolare al mondo della programmazione scientifica.
Scritto in C++ e Scheme questo linguaggio si basa su di un compilatore JIT (Just In Time) che si appoggia a sua volta sul noto framework LLVM. Fin dalle prime fasi dello sviluppo gli autori si sono impegnati nel fornire al linguaggio un adeguato supporto di librerie implementate tra l'altro in gran parte in Julia stesso ponendo nel contempo grande enfasi sulle prestazioni che dovevano essere comparabili con quelle ottenute in C o Fortran.
Pur essendo stato ideato per applicazioni di carattere numerico e scientifico non è tuttavia precluso il suo utilizzo come strumento general purpose.
Carattertistiche Julia è un linguaggio di programmazione general-purpose che era stato originariamente progettato per il calcolo e l'analisi numerica. È utile anche per la programmazione di sistema a basso livello, come linguaggio di specifica e per la programmazione web sia da lato server che da lato client.
La principali caratteristiche del linguaggio sono:
Multiple dispatch: la possibilità di definire il comportamento di una funzione tramite le diverse combinazioni dei tipi degli argomenti Tipizzazione dinamica: con l'utilizzo dei tipi per documentazione, l'ottimizzazione e il dispatch Performance che si avvicinano a quelle d linguaggi di programmazione con tipizzazione statica come il C Un gestore di pacchetti interno al linguaggio Macro come in Lisp e altre caratteristiche del metaprogramming È stato progettato per il calcolo parallelo e distribuito. Coroutines: green threading leggeri La generazione automatica di codice per differenti tipi di argomento Conversioni estensibili e la promozione per i tipi numerici e personalizzati
Il dispatch multiplo è una generalizzazione del dispatch singolo, il meccanismo di polimorfismo tipico dei linguaggi orientati ad oggetti (OOP) (come Python, C++, Java etc.) che usano l'ereditarietà.
In Julia, tutti i tipi di dato concreti sono sottotipi di dati astratti, direttamente o indirettamente sottotipi del tipo Any, che si trova in cima alla gerarchia dei tipi. I tipi concreti non possono essere sottotipi a loro volta come in altri linguaggi di programmazione; viene invece usata la composizione invece dell'ereditarietà.
In Julia, tutto è un oggetto, come in molti linguaggi orientati ad oggetti; anche se, a differenza degli OOP, tutte le funzioni utilizzano il dispatch multiplo per selezionare i metodi, invece del dispatch singolo.
Hello, World Il seguente esempio propone il classico "Hello, World!":
print("Hello, World!")
Come esempio più complesso ma significativo ecco il modo in cui si può risolvere con questo linguaggio il noto problema delle 8 regine:
addqueen(queens, queen) = push!(copy(queens), queen) hitsany(queen, queens) = any(map(x -> hits(queen, x), queens)) hits(a, b) = any(a .== b) || first(abs.(a .- b)) == last(abs.(a .- b))
function solve(x, y, n, d = Vector{Tuple{Int, Int}}()) if iszero(n) return d end for px in 1:x, py in 1:y if !hitsany((px, py), d) s = solve(x, y, n - 1, addqueen(d, (px, py))) if s !== nothing return s end end end return nothing end
for i in 1:8 println("# Solve for $i:\n", solve(8, 8, i)) end
Ecosistema Julia offre un ampio ecosistema di librerie per molti campi della computazione, raggruppati nel registro generale. Il linguaggio offre uno strumento integrato per gestire le librerie (package), ovvero Pkg.jl.
Note
Altri progetti
Wikibooks - Calcoli scientifici con Julia
Collegamenti esterni
Categoria:Linguaggi di programmazione multi-paradigma Categoria:Linguaggi di programmazione orientati agli oggetti Categoria:Linguaggi di programmazione funzionali