« Julia (langage) » : différence entre les versions
m Réparation du lien vers le readme.md Balises : Éditeur visuel Modification par mobile Modification par le web mobile Modification sur mobile avancée |
m Retrait bandeau d’ébauche, plus une ébauche. |
||
(35 versions intermédiaires par 15 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
{{Ébauche|informatique}} |
|||
{{Infobox Langage de programmation |
{{Infobox Langage de programmation |
||
| couleur boîte = AB76C0 |
| couleur boîte = AB76C0 |
||
| nom = {{blanc|Julia}} |
| nom = {{blanc|Julia}} |
||
| paradigme = [[Dispatch multiple]] |
|||
| logo = Julia_prog_language.svg |
|||
| typage = [[Typage dynamique|dynamique]] |
|||
| paradigme = |
|||
| |
| influencé par = [[MATLAB]], [[R (langage)|R]], [[Ruby (langage)|Ruby]], [[Perl (langage)|Perl]], [[Python (langage)|Python]] |
||
| langage de programmation = [[Julia]] |
|||
| dernière version = |
|||
| système d'exploitation = [[Logiciel multiplate-forme|Multi-plateformes]] |
|||
| date de dernière version = |
|||
| licence = [[Licence MIT]]<ref>{{lien web|url = https://github.com/JuliaLang/julia/blob/master/LICENSE.md | titre = julia / LICENSE.md | site = GitHub}}</ref> |
|||
| développeur = |
|||
| extension = .jl |
|||
| typage = [[Typage dynamique|dynamique]] |
|||
| influencé par = [[Matlab]], [[R (langage de programmation et environnement statistique)|R]], [[Ruby (langage)|Ruby]], [[Perl (langage)|Perl]], [[Python (langage)|Python]] |
|||
| système d'exploitation = [[Logiciel multiplate-forme|Multi-plateformes]] |
|||
| licence = [[Licence MIT]]<ref>{{lien web|url = https://github.com/JuliaLang/julia/blob/master/LICENSE.md | titre = julia / LICENSE.md | site = GitHub}}</ref> |
|||
| site web = [http://julialang.org/ julialang.org] |
|||
}} |
}} |
||
'''Julia''' est un [[langage de programmation]] de haut niveau, performant et dynamique pour le calcul scientifique |
'''Julia''' est un [[langage de programmation]] de haut niveau, performant et dynamique conçu pour le calcul scientifique et les applications de calcul numérique. Sa syntaxe est familière aux utilisateurs d'autres environnements de développement tels que [[MATLAB]], [[R (langage de programmation et environnement statistique)|R]], [[Scilab]], et [[Python (langage)|Python]]. Julia est connue pour sa vitesse exceptionnelle et ses capacités avancées en termes de calcul parallèle et de gestion de données volumineuses. |
||
== Caractéristiques == |
|||
La bibliothèque, essentiellement écrite dans le langage Julia lui-même, intègre également des bibliothèques en [[C (langage)|C]] et [[Fortran]] pour l'[[algèbre linéaire]], la génération des [[nombre aléatoire|nombres aléatoires]], les [[Transformation de Fourier rapide|FFT]] et le traitement de chaînes de caractères. Les programmes Julia sont organisés autour de la définition de fonctions, et de leur [[Surcharge (programmation informatique)|surcharge]] autour de différentes combinaisons de types d'arguments<ref>{{Lien web |langue=en|url=http://julialang.org/|titre=Julia Official Website}}</ref>. |
|||
Julia combine les avantages des langages compilés (tels que C et Fortran) avec la flexibilité des langages dynamiques. Ses caractéristiques principales comprennent : |
|||
* Performance : Julia est conçue pour offrir des performances proches de celles du code natif compilé. Elle utilise un compilateur JIT (Just-In-Time) pour optimiser les performances à l'exécution. |
|||
* Syntaxe Similaire à MATLAB : Sa syntaxe est simple et similaire à celle de MATLAB, ce qui facilite la transition pour les utilisateurs de MATLAB et d'autres langages scientifiques. |
|||
* Typage Dynamique : Le langage utilise un système de types dynamique qui permet une grande flexibilité tout en offrant la possibilité de faire des optimisations à la compilation. |
|||
* Dispatch Multiple : Julia utilise le dispatch multiple pour la résolution de fonctions en fonction des types d'arguments, permettant une surcharge de fonction puissante et flexible. |
|||
* Interopérabilité : Julia peut interagir directement avec des bibliothèques C, Fortran, et Python, facilitant l'intégration avec des outils existants. |
|||
*Parallélisme et Concurrence : Le langage prend en charge le calcul parallèle et la gestion des tâches concurrentes, permettant des performances accrues pour des calculs intensifs. |
|||
== |
=== Syntaxe === |
||
Julia s'est inspiré des langages avec une syntaxe épurée tels que [[Python (langage)|Python]] ou [[Ruby]]. Un code Julia est structuré en [[Bloc de base|blocs]] d'expressions qui commencent par un {{Lien|trad=Reserved word|fr=mot réservé|texte=mot clé}} comme <code>function</code> ou <code>if</code> et finit par <code>end</code>. Par convention, une [[Style d'indentation|indentation]] de 4 espaces est faite pour chaque nouveau bloc<ref>{{Lien web |langue=en |titre=Style Guide · The Julia Language |url=https://docs.julialang.org/en/v1/manual/style-guide/#Indentation |site=docs.julialang.org |consulté le=2024-11-20}}</ref>, mais elle n'est pas obligatoire. Les caractères sont indiqués par le caractère croissillon ([[Croisillon (signe)|#]]). Julia propose de nombreux outils de syntaxe optionnels qui permettent de rendre le code plus concis. |
|||
L'intérêt de plus en plus marqué des entreprises pour Julia a conduit à la création, en {{date-|juillet 2015}}, de l'entreprise Julia Computing<ref>[https://juliacomputing.com/ Julia Computing]</ref>, qui distribue JuliaPRO et JuliaFIN, des versions améliorées de Julia (respectivement pour la science des données et la finance), ainsi que des services payants de support et d'intégration à des technologies cloud<ref>[https://software.intel.com/sites/default/files/managed/8a/d2/parallel-universe-issue-29.PDF Julia: A high-level language for supercomputing], Intel - The Parallel Universe - Issue 29</ref>. |
|||
{| class="wikitable" |
|||
!width="50%"|Exemple de code en C |
|||
!width="50%"|Exemple de code en Julia |
|||
|-valign="top" |
|||
| |
|||
<syntaxhighlight lang="c">#include <stdio.h> // Pour printf |
|||
#include <stdlib.h> // Pour la fonction abs |
|||
int max_valeur_absolue(int nombres[], int taille) { |
|||
int max_abs = 0; |
|||
for (int i = 0; i < taille; i++) { |
|||
if (abs(nombres[i]) > max_abs) { |
|||
max_abs = abs(nombres[i]); |
|||
} |
|||
} |
|||
return max_abs; |
|||
} |
|||
int main() { |
|||
int nombres[] = {3, -7, -1, 5}; |
|||
int taille = sizeof(nombres) / sizeof(nombres[0]); |
|||
printf("%d\n", max_valeur_absolue(nombres, taille)); // Affiche 7 |
|||
return 0; |
|||
}</syntaxhighlight> |
|||
| |
|||
<syntaxhighlight lang="julia">function max_valeur_absolue(nombres) |
|||
max_abs = 0 |
|||
for n in nombres |
|||
if abs(n) > max_abs |
|||
max_abs = abs(n) |
|||
end |
|||
end |
|||
return max_abs |
|||
end |
|||
# syntaxe concise |
|||
max_valeur_absolue(nombres) = maximum(abs.(nombres)) |
|||
println(max_valeur_absolue([3, -7, -1, 5])) # Affiche 7</syntaxhighlight> |
|||
|} |
|||
Julia supporte le standard [[Unicode]]<ref>{{Lien web |langue=en |titre=Unicode Input · The Julia Language |url=https://docs.julialang.org/en/v1/manual/unicode-input/#Unicode-Input |site=docs.julialang.org |consulté le=2024-11-20}}</ref>, ce qui peut être pratique pour des calculs scientifiques. Cependant pour son possible manque de lisibilité et de support par certains [[Éditeur de code source|éditeurs]], son utilisation est controversée<ref>{{Lien web |langue=en |titre=Unicode: a bad idea, in general |url=https://discourse.julialang.org/t/unicode-a-bad-idea-in-general/99897 |site=Julia Programming Language |date=2023-06-05 |consulté le=2024-11-20}}</ref>{{,}}<ref>{{Lien web |titre=SciML Style Guide for Julia · SciML Style Guide for Julia |url=https://docs.sciml.ai/SciMLStyle/stable/#General-Naming-Principles |site=docs.sciml.ai |consulté le=2024-11-20}}</ref>. Par exemple, la [[fonction xi de Riemann]] peut être implémentée comme suit : |
|||
<syntaxhighlight lang="julia">using SpecialFunctions: gamma as Γ, zeta as ζ |
|||
ξ(s) = 1/2 * s * (s-1) * π^(-s/2) * Γ(s/2) * ζ(s)</syntaxhighlight> |
|||
=== Performances === |
|||
Julia a été conçu pour avoir des performances élevées tout en étant un [[Langage de programmation de haut niveau|langage de haut niveau]]<ref>{{Article|prénom1=Jeff|nom1=Bezanson|prénom2=Stefan|nom2=Karpinski|prénom3=Viral B.|nom3=Shah|prénom4=Alan|nom4=Edelman|titre=Julia: A Fast Dynamic Language for Technical Computing|date=2012|doi=10.48550/ARXIV.1209.5145|lire en ligne=https://arxiv.org/abs/1209.5145|consulté le=2024-11-20}}</ref>. Pour ce faire, il [[Compilation à la volée|compile à la volée]] (JIT) le code Julia en [[Langage machine|code machine]] optimisé à l'aide de [[LLVM]]. La conception de Julia étant faite pour exploiter au mieux cette compilation à la volée, il en résulte des performances proches de celles de langages [[Langage de programmation de bas niveau|bas niveau]] (comme [[C (langage)|C]] ou [[Rust (langage)|Rust]]) et meilleures que d'autres langages JIT (comme [[PyPy|Pypy]] ou {{Lien|trad=LuaJIT}})<ref>{{Article|langue=fr-FR|auteur1=Jade Emy|titre=Programming Language Benchmark v2 (plb2) évalue les performances de 20 langages de programmation sur quatre tâches gourmandes en CPU|périodique=Developpez.com|date=2024-01-03|lire en ligne=https://programmation.developpez.com/actu/352591/Programming-Language-Benchmark-v2-plb2-evalue-les-performances-de-20-langages-de-programmation-sur-quatre-taches-gourmandes-en-CPU/|consulté le=2024-11-22}}</ref>. |
|||
Julia étant [[Langage de programmation dynamique|dynamique]], aucune erreur ne sera lancée si le [[compilateur]] n'a pas assez d'information pour optimiser efficacement le code, notamment sur le [[Type (informatique)|type]] des [[Variable (informatique)|variables]] (''type instability''<ref>{{Lien web |langue=en |titre=Type instability · JuliaNotes.jl |url=https://m3g.github.io/JuliaNotes.jl/stable/instability/ |site=m3g.github.io |consulté le=2024-11-22}}</ref>'')''. Ce problème d'optimisation conduit à une baisse notable en performance, ce qui a pour effet de surprendre les nouveaux utilisateurs<ref>{{Lien web |langue=en |titre=Julia is surprisingly slow for some simple iteration |url=https://discourse.julialang.org/t/julia-is-surprisingly-slow-for-some-simple-iteration/104053 |site=Julia Programming Language |date=2023-09-20 |consulté le=2024-11-22}}</ref>{{,}}<ref>{{Lien web |nom=arkie87 |titre=Trying Out Julia, and it Seems Slow for a Compiled Language |url=https://www.reddit.com/r/Julia/comments/ryh992/trying_out_julia_and_it_seems_slow_for_a_compiled/?rdt=50137 |site=r/Julia |date=2022-01-07 |consulté le=2024-11-22}}</ref>. Une page entière de la documentation officielle du langage est dédiée à donner des techniques qui résolvent ce problème<ref>{{Lien web |langue=en |titre=Performance Tips · The Julia Language |url=https://docs.julialang.org/en/v1/manual/performance-tips/ |site=docs.julialang.org |consulté le=2024-11-22}}</ref>. |
|||
=== Polymorphisme === |
|||
Le modèle de Julia s'appuie principalement sur le [[Polymorphisme (informatique)|polymorphisme]] ''ad-hoc (''aussi appelé [[dispatch multiple]] ou multi méthodes) et le polymorphisme paramétré ou de type (aussi appelé [[programmation générique]]). Pour Julia, une fonction est un simple nom, qui peut posséder plusieurs méthodes. Une méthode est une implémentation spécifique de la fonction selon le nombre et le type de chaque [[Paramètre (programmation informatique)|paramètres]] de celle-ci. De cette manière, il est possible de créer une implémentation complètement différente pour chaque combinaison de types possibles. Par exemple :<syntaxhighlight lang="julia"> |
|||
ma_fonction(x) = "x peut être de n'importe quel type" |
|||
ma_fonction(x::Real) = "x est un nombre réel" |
|||
ma_fonction(x::Integer) = "x est un entier de n'importe quelle taille" |
|||
ma_fonction(x::UInt8) = "x est un entier non signé de 8 bits" |
|||
ma_fonction(x, y) = "x et y sont de n'importe quel type" |
|||
ma_fonction(x::T, y::T) where {T} = "x et y sont du meme type qui est $T" |
|||
println(ma_fonction("bonjour")) # x peut être de n'importe quel type |
|||
println(ma_fonction(π)) # x est un nombre réel |
|||
println(ma_fonction(3)) # x est un entier de n'importe quelle taille |
|||
println(ma_fonction(0x01)) # x est un entier non signé de 8 bits |
|||
println(ma_fonction(3.14, 1)) # x et y sont de n'importe quel type |
|||
println(ma_fonction(3.14, 1.0)) # x et y sont du meme type qui est Float64 |
|||
</syntaxhighlight> |
|||
Un autre exemple plus classique est celui de [[Addition|l'addition]]. Pour Julia, la simple opération <code>1+2</code> est traduite en <code>+(1, 2)</code><ref>{{Lien web |langue=en |titre=Mathematics · The Julia Language |url=https://docs.julialang.org/en/v1/base/math/#Base.:+ |site=docs.julialang.org |consulté le=2024-11-22}}</ref>, ou <code>+</code>est la fonction et <code>+(::Int, ::Int)</code> la méthode, spécifique et optimisée pour des nombres entiers. Il existe alors une {{Lien|trad=https://en.wikipedia.org/wiki/Generic_function|fr=Fonction générique|texte=méthode générique}}<code>+(::Number, ::Number)</code> ou même <code>+(::Real, ::Complex)</code>. La liste de toutes les méthodes pour une fonction donnée peut s'obtenir avec <code>methods(nom_de_la_fonction)</code>. |
|||
Les variables n'ont généralement pas besoin d'être typées grâce à la [[compilation à la volée]], les [[Type (informatique)|types]] étant souvent connus lors de la compilation. Si ce n'est pas le cas, Julia utilise un {{Lien|trad=Dynamic dispatch|fr=dispatch dynamique}} pour garder un typage dynamique. C'est ce dispatch dynamique qui différencie le [[dispatch multiple]] de la [[surcharge de fonction]] (comme en [[C++]] ou en [[Java]]). |
|||
Cette implémentation du polymorphisme en Julia se rapproche de celles des langages [[Common Lisp]], [[Dylan (langage)|Dylan]] ou [[Fortress (langage)|Fortress]]. |
|||
== Exemple de Code == |
|||
Voici un exemple de programme Julia qui affiche "Hello, world !" : |
|||
println("Hello, world!") |
|||
Pour calculer la somme des carrés des nombres de 1 à 10 en Julia, vous pouvez utiliser le code suivant : |
|||
function somme_des_carres(n) |
|||
somme = 0 |
|||
for i in 1:n |
|||
somme += i^2 |
|||
end |
|||
return somme |
|||
end |
|||
println(somme_des_carres(10)) # Affiche 385 |
|||
== Histoire == |
|||
Le développement de Julia a débuté en 2009 par [[Jeff Bezanson]], [[Stefan Karpinski]], [[Viral B. Shah]], et [[Alan Edelman]]. Le langage a été officiellement lancé le 14 février 2012 avec la publication d'un article de blog expliquant sa mission. Julia visait à combiner la rapidité des langages compilés avec la flexibilité des langages dynamiques. En 2018, Julia a atteint sa version 1.0, marquant une étape importante dans sa maturité et sa stabilité. |
|||
Depuis son lancement, la communauté Julia a considérablement grandi. La conférence annuelle [[JuliaCon]] attire des milliers de participants chaque année et offre une plateforme pour les développeurs et les utilisateurs de Julia pour partager leurs travaux et innovations. |
|||
== Versions == |
|||
* Julia 0.7 et 1.0 : Lancements en août 2018, marquant une étape importante dans la stabilisation du langage. |
|||
* Julia 1.6 : Introduit des améliorations significatives, y compris une précompilation parallèle pour accélérer le chargement des packages. |
|||
* Julia 1.9.0 : Lancée en mai 2023, elle comprend de nombreuses améliorations de performance, y compris des optimisations significatives pour le code précompilé. |
|||
== JuliaCon == |
|||
Depuis 2014, [[JuliaCon]] est l'événement majeur pour la communauté Julia, offrant une plateforme pour des présentations, des ateliers et des discussions sur le langage. La conférence a eu lieu dans divers lieux, y compris le MIT et l'Université du Maryland à Baltimore. JuliaCon 2020 et 2021 se sont déroulées virtuellement en raison de la pandémie, attirant un public mondial de plus de 43 000 participants uniques et plus de 300 présentations. |
|||
== Compagnie Julia == |
|||
La société [[JuliaHub, Inc.]], fondée en 2015 sous le nom de [[Julia Computing, Inc.]], a été créée pour soutenir le développement et la diffusion de Julia. Les fondateurs incluent plusieurs des créateurs du langage Julia, tels que Viral B. Shah et Alan Edelman. |
|||
== Références == |
== Références == |
||
{{Références}} |
{{Références}} |
||
==Liens externes== |
== Liens externes == |
||
* |
* [https://julialang.org/ Site officiel de Julia] |
||
* [http://bioinfo-fr.net/julia-le-successeur-de-r Découverte de Julia] |
* [http://bioinfo-fr.net/julia-le-successeur-de-r Découverte de Julia] |
||
* [https://zestedesavoir.com/articles/141/a-la-decouverte-de-julia/ Présentation de Julia] |
* [https://zestedesavoir.com/articles/141/a-la-decouverte-de-julia/ Présentation de Julia sur Zeste de Savoir] |
||
{{Palette|Datascience|Logiciels de calcul numérique|Langages de programmation}}{{Portail|programmation informatique|probabilités et statistiques}} |
{{Palette|Datascience|Logiciels de calcul numérique|Langages de programmation}} |
||
{{Portail|programmation informatique|probabilités et statistiques|logiciel libre}} |
|||
[[Catégorie:Langage de programmation]] |
[[Catégorie:Langage de programmation]] |
Version du 23 novembre 2024 à 09:15
Julia | ||
Date de première version | ||
---|---|---|
Paradigme | Dispatch multiple | |
Dernière version | 1.11.0 ()[1] | |
Typage | dynamique | |
Influencé par | MATLAB, R, Ruby, Perl, Python | |
Écrit en | Julia | |
Système d'exploitation | Multi-plateformes | |
Licence | Licence MIT[2] | |
Site web | julialang.org | |
Extension de fichier | .jl | |
modifier |
Julia est un langage de programmation de haut niveau, performant et dynamique conçu pour le calcul scientifique et les applications de calcul numérique. Sa syntaxe est familière aux utilisateurs d'autres environnements de développement tels que MATLAB, R, Scilab, et Python. Julia est connue pour sa vitesse exceptionnelle et ses capacités avancées en termes de calcul parallèle et de gestion de données volumineuses.
Caractéristiques
Julia combine les avantages des langages compilés (tels que C et Fortran) avec la flexibilité des langages dynamiques. Ses caractéristiques principales comprennent :
- Performance : Julia est conçue pour offrir des performances proches de celles du code natif compilé. Elle utilise un compilateur JIT (Just-In-Time) pour optimiser les performances à l'exécution.
- Syntaxe Similaire à MATLAB : Sa syntaxe est simple et similaire à celle de MATLAB, ce qui facilite la transition pour les utilisateurs de MATLAB et d'autres langages scientifiques.
- Typage Dynamique : Le langage utilise un système de types dynamique qui permet une grande flexibilité tout en offrant la possibilité de faire des optimisations à la compilation.
- Dispatch Multiple : Julia utilise le dispatch multiple pour la résolution de fonctions en fonction des types d'arguments, permettant une surcharge de fonction puissante et flexible.
- Interopérabilité : Julia peut interagir directement avec des bibliothèques C, Fortran, et Python, facilitant l'intégration avec des outils existants.
- Parallélisme et Concurrence : Le langage prend en charge le calcul parallèle et la gestion des tâches concurrentes, permettant des performances accrues pour des calculs intensifs.
Syntaxe
Julia s'est inspiré des langages avec une syntaxe épurée tels que Python ou Ruby. Un code Julia est structuré en blocs d'expressions qui commencent par un mot clé (en) comme function
ou if
et finit par end
. Par convention, une indentation de 4 espaces est faite pour chaque nouveau bloc[3], mais elle n'est pas obligatoire. Les caractères sont indiqués par le caractère croissillon (#). Julia propose de nombreux outils de syntaxe optionnels qui permettent de rendre le code plus concis.
Exemple de code en C | Exemple de code en Julia |
---|---|
#include <stdio.h> // Pour printf
#include <stdlib.h> // Pour la fonction abs
int max_valeur_absolue(int nombres[], int taille) {
int max_abs = 0;
for (int i = 0; i < taille; i++) {
if (abs(nombres[i]) > max_abs) {
max_abs = abs(nombres[i]);
}
}
return max_abs;
}
int main() {
int nombres[] = {3, -7, -1, 5};
int taille = sizeof(nombres) / sizeof(nombres[0]);
printf("%d\n", max_valeur_absolue(nombres, taille)); // Affiche 7
return 0;
}
|
function max_valeur_absolue(nombres)
max_abs = 0
for n in nombres
if abs(n) > max_abs
max_abs = abs(n)
end
end
return max_abs
end
# syntaxe concise
max_valeur_absolue(nombres) = maximum(abs.(nombres))
println(max_valeur_absolue([3, -7, -1, 5])) # Affiche 7
|
Julia supporte le standard Unicode[4], ce qui peut être pratique pour des calculs scientifiques. Cependant pour son possible manque de lisibilité et de support par certains éditeurs, son utilisation est controversée[5],[6]. Par exemple, la fonction xi de Riemann peut être implémentée comme suit :
using SpecialFunctions: gamma as Γ, zeta as ζ
ξ(s) = 1/2 * s * (s-1) * π^(-s/2) * Γ(s/2) * ζ(s)
Performances
Julia a été conçu pour avoir des performances élevées tout en étant un langage de haut niveau[7]. Pour ce faire, il compile à la volée (JIT) le code Julia en code machine optimisé à l'aide de LLVM. La conception de Julia étant faite pour exploiter au mieux cette compilation à la volée, il en résulte des performances proches de celles de langages bas niveau (comme C ou Rust) et meilleures que d'autres langages JIT (comme Pypy ou LuaJIT (en))[8].
Julia étant dynamique, aucune erreur ne sera lancée si le compilateur n'a pas assez d'information pour optimiser efficacement le code, notamment sur le type des variables (type instability[9]). Ce problème d'optimisation conduit à une baisse notable en performance, ce qui a pour effet de surprendre les nouveaux utilisateurs[10],[11]. Une page entière de la documentation officielle du langage est dédiée à donner des techniques qui résolvent ce problème[12].
Polymorphisme
Le modèle de Julia s'appuie principalement sur le polymorphisme ad-hoc (aussi appelé dispatch multiple ou multi méthodes) et le polymorphisme paramétré ou de type (aussi appelé programmation générique). Pour Julia, une fonction est un simple nom, qui peut posséder plusieurs méthodes. Une méthode est une implémentation spécifique de la fonction selon le nombre et le type de chaque paramètres de celle-ci. De cette manière, il est possible de créer une implémentation complètement différente pour chaque combinaison de types possibles. Par exemple :
ma_fonction(x) = "x peut être de n'importe quel type"
ma_fonction(x::Real) = "x est un nombre réel"
ma_fonction(x::Integer) = "x est un entier de n'importe quelle taille"
ma_fonction(x::UInt8) = "x est un entier non signé de 8 bits"
ma_fonction(x, y) = "x et y sont de n'importe quel type"
ma_fonction(x::T, y::T) where {T} = "x et y sont du meme type qui est $T"
println(ma_fonction("bonjour")) # x peut être de n'importe quel type
println(ma_fonction(π)) # x est un nombre réel
println(ma_fonction(3)) # x est un entier de n'importe quelle taille
println(ma_fonction(0x01)) # x est un entier non signé de 8 bits
println(ma_fonction(3.14, 1)) # x et y sont de n'importe quel type
println(ma_fonction(3.14, 1.0)) # x et y sont du meme type qui est Float64
Un autre exemple plus classique est celui de l'addition. Pour Julia, la simple opération 1+2
est traduite en +(1, 2)
[13], ou +
est la fonction et +(::Int, ::Int)
la méthode, spécifique et optimisée pour des nombres entiers. Il existe alors une méthode générique (en)+(::Number, ::Number)
ou même +(::Real, ::Complex)
. La liste de toutes les méthodes pour une fonction donnée peut s'obtenir avec methods(nom_de_la_fonction)
.
Les variables n'ont généralement pas besoin d'être typées grâce à la compilation à la volée, les types étant souvent connus lors de la compilation. Si ce n'est pas le cas, Julia utilise un dispatch dynamique (en) pour garder un typage dynamique. C'est ce dispatch dynamique qui différencie le dispatch multiple de la surcharge de fonction (comme en C++ ou en Java).
Cette implémentation du polymorphisme en Julia se rapproche de celles des langages Common Lisp, Dylan ou Fortress.
Exemple de Code
Voici un exemple de programme Julia qui affiche "Hello, world !" :
println("Hello, world!")
Pour calculer la somme des carrés des nombres de 1 à 10 en Julia, vous pouvez utiliser le code suivant :
function somme_des_carres(n) somme = 0 for i in 1:n somme += i^2 end return somme end println(somme_des_carres(10)) # Affiche 385
Histoire
Le développement de Julia a débuté en 2009 par Jeff Bezanson, Stefan Karpinski, Viral B. Shah, et Alan Edelman. Le langage a été officiellement lancé le 14 février 2012 avec la publication d'un article de blog expliquant sa mission. Julia visait à combiner la rapidité des langages compilés avec la flexibilité des langages dynamiques. En 2018, Julia a atteint sa version 1.0, marquant une étape importante dans sa maturité et sa stabilité.
Depuis son lancement, la communauté Julia a considérablement grandi. La conférence annuelle JuliaCon attire des milliers de participants chaque année et offre une plateforme pour les développeurs et les utilisateurs de Julia pour partager leurs travaux et innovations.
Versions
- Julia 0.7 et 1.0 : Lancements en août 2018, marquant une étape importante dans la stabilisation du langage.
- Julia 1.6 : Introduit des améliorations significatives, y compris une précompilation parallèle pour accélérer le chargement des packages.
- Julia 1.9.0 : Lancée en mai 2023, elle comprend de nombreuses améliorations de performance, y compris des optimisations significatives pour le code précompilé.
JuliaCon
Depuis 2014, JuliaCon est l'événement majeur pour la communauté Julia, offrant une plateforme pour des présentations, des ateliers et des discussions sur le langage. La conférence a eu lieu dans divers lieux, y compris le MIT et l'Université du Maryland à Baltimore. JuliaCon 2020 et 2021 se sont déroulées virtuellement en raison de la pandémie, attirant un public mondial de plus de 43 000 participants uniques et plus de 300 présentations.
Compagnie Julia
La société JuliaHub, Inc., fondée en 2015 sous le nom de Julia Computing, Inc., a été créée pour soutenir le développement et la diffusion de Julia. Les fondateurs incluent plusieurs des créateurs du langage Julia, tels que Viral B. Shah et Alan Edelman.
Références
- (en) « Julia 1.11 Highlights »,
- « julia / LICENSE.md », sur GitHub
- (en) « Style Guide · The Julia Language », sur docs.julialang.org (consulté le )
- (en) « Unicode Input · The Julia Language », sur docs.julialang.org (consulté le )
- (en) « Unicode: a bad idea, in general », sur Julia Programming Language, (consulté le )
- « SciML Style Guide for Julia · SciML Style Guide for Julia », sur docs.sciml.ai (consulté le )
- Jeff Bezanson, Stefan Karpinski, Viral B. Shah et Alan Edelman, « Julia: A Fast Dynamic Language for Technical Computing », {{Article}} : paramètre «
périodique
» manquant, (DOI 10.48550/ARXIV.1209.5145, lire en ligne, consulté le ) - Jade Emy, « Programming Language Benchmark v2 (plb2) évalue les performances de 20 langages de programmation sur quatre tâches gourmandes en CPU », Developpez.com, (lire en ligne, consulté le )
- (en) « Type instability · JuliaNotes.jl », sur m3g.github.io (consulté le )
- (en) « Julia is surprisingly slow for some simple iteration », sur Julia Programming Language, (consulté le )
- arkie87, « Trying Out Julia, and it Seems Slow for a Compiled Language », sur r/Julia, (consulté le )
- (en) « Performance Tips · The Julia Language », sur docs.julialang.org (consulté le )
- (en) « Mathematics · The Julia Language », sur docs.julialang.org (consulté le )