Julia vs Python

Julia est un challenger à Python dans le domaine scientifique, chacun disposant d'une bibliothèque étendue. Le nouveau venu peut-il remplacer l'ancien? (Python date de 1991).

Démo Langage de programmation Julia
Exemple de code en langage Julia

Le développement de Julia a débuté en 2009 et le langage s'est popularisé lorsque le compilateur est devenu open source en 2012. Il est actuellement disponible sous licence MIT. L'objectif est de créer un langage ayant les avantages de Python (la simplicité et le dynamisme), de R (les traitements statistiques), de C (la rapidité d'exécution), de Perl (le traitement des chaînes), de Mathlab (l'algèbre linéaire), et d'autres encore. Il veut aussi être distribué, générique.
Dans la tradition de Pascal, le nom du langage vient du mathématicien français Gaston Julia, découvreur des fractales.

Sa simplicité et ses capacités scientifiques en font une alternative possible à Python. Mais est-il supérieur? Il est généralement nettement plus rapide que Python, mais celui-ci a des bibliothèques écrites en C pour compenser la lenteur de l'interpréteur. Lequel est le plus rapide pour exécuter un algorithme est surtout important sauf sur le cloud, mais sur le bureau, ce qui compte est comment ils se comportent sur de grands ensembles de données, des calculs matriciels par exemple. Certains programmes en Julia sont plus rapides que la version Python, mais ce n'est pas toujours le cas. Cela dépend en fait si l'on fait appel à des fonctions compilées en binaire, ce qui est le cas de la plupart des bibliothèques Python, ou si elles sont en Julia, forcément moins performant.

On comparera plutôt les fonctionnalités et la syntaxe. Les deux langages se veulent faciles à comprendre et s'adressent avant tout à un public qui n'a aucun intérêt dans le hardware, et donc dans les langages dérivés de C tels que Go qui sont fait pour simplifier la tâche du compilateur et non améliorer la productivité du programmeur.

Similitudes

Différences

Introduction à la syntaxe de Julia

Fonction

La définition commence par le mot clé function et se termine par end. Cela est classique, mais non optimal, le langage Scriptol simplifie en terminant une fonction par return ou return suivi d'une valeur de retour.

Une fonction peut aussi être définie en assignant une expression à un nom avec des arguments. Par exemple:

fun(x) = x * 5

println(fun(2))

Ce qui doit afficher 10.

Ce qui est propre à ce langage, est que la valeur de retour est le résultat de la dernière expression évaluée, sauf si une instruction return est explicitement insérée dans le corps de la fonction.
Les tableaux sont passés par références en arguments et donc peuvent être modifiés à la suite de l'appel à une fonction.

Les opérateurs sont des fonctions. On peut assigner le symbole + à une fonction f, et faire un appel f(x, y) qui retournera la somme des deux arguments.

Structures de contrôle

La structure if est similaire à celle de PHP ou Python.

La boucle for à la forme:

for i = 1:n
 ... 
end 

Ce qui est aussi simple que Python quoiqu'avec une syntaxe différente.

L'itération sur un conteneur, à la même forme qu'en Scriptol ou autres langages modernes:

for s in [1, 2, 3] ... end

Le boucle while est classique:

while a < 5
  a += 5
end

Il n'y a pas d'autre structure de contrôle. Pas de until, de switch. Le pattern matching n'est pas envisagé par les créateurs.

Classes et homoiconicité

Les classes sont des types composites dans lesquels sont imbriqués des fonctions qui deviennent ainsi leur méthodes.

type maclass 
   function f(x, y)
     ....
   end
end

Il n'y a pas de prototypes comme en JavaScript pour ajouter des membres de façon dynamique, mais puisque un programme peut se modifier et s'étendre du fait de l'homoiconicité, il doit donc être possible de modifier les objets et leur ajouter des attributs et méthodes...

Cela est traité dans le manuel, mais les exemples ne sont pas très lumineux. J'en retiens pour le moment que la fonction eval, comme en JavaScript, permet d'évaluer et intégrer du code au programme, et que diverses commandes existent pour "l'introspection", l'accès du code à lui même comme donnée.

Dois-je utiliser Julia?

Je suis vraiment impressionné par les possibilités de ce langage. Go et Dart à coté ont l'air d'avoir été conçus à une autre époque. Python est laissé très loin en arrière mais il a l'excuse d'avoir été effectivement conçu à une autre époque.
Julia a toutes les fonctionnalités de Python et même beaucoup plus, le code est tout aussi simple à écrire, il dispose de bibliothèques similaires dans le domaine scientifique et semble donc constituer une alternative.

Il n'est pas parfait pour autant. Rien n'est prévu rien pour le pattern matching, quelque chose qui est très développé dans Scala, autre langage moderne et innovateur. Les objets ne supportent pas l'héritage ni les compositions ce qui exlut les applications larges.
La documentation est succincte et peu compréhensible. La plupart des exemples sont en ligne de commande, ce que personne n'utilise en fait et c'est peu lisible.
Les messages d'erreurs surtout sont le point faible. La plupart des erreurs à l'intérieur d'une fonction sont signalées sur la ligne 1, qui est la ligne ou commence la fonction et sont donc difficiles à localiser. Il sera très ardu d'apprendre à programmer avec ce langage s'il ne progresse pas sur ce point.

Finalement, Julia semble vraiment conçu pour le domaine scientifique et difficile à utiliser pour le scripting en général. Mon expérience pour implémenter le crible d'Erasthothènes fût laborieuse. On doit pratiquer un peu de divination. Ne trouvant rien dans la doc sur la façon d'insérer un commentaire, j'ai utilisé à tout hasard la syntaxe de Python et la chance a voulu que ce soit la bonne! (En fait la syntaxe de C est aussi reconnue).
Il faut aborder ce langage avec un esprit de pionner, car on ne trouvera, pour le moment (en février 2014), aucune aide sur le Web.

Julia Studio est un EDI gratuit dédié à ce langage. Escher est une interface graphique pour Julia.

Références: Le site de Julia. Les auteurs sont Jeff Bezanson, Stefan Karpinski, Viral B. Shah, Alan Edelman.

Langages de programmation et de données Asm.js - Basic - C - C++ - C# - Dart - Eiffel - Go - Java - JavaScript - Julia - Pascal - PHP - Python - Ruby - Scala - Scriptol - TypeScript - HTML - Wasm - XML - XAML - SQL