Concurnas : un langage pour la JVM, dédié à la programmation parallèle et distribuée

Par:
fredericmazue

mar, 25/02/2020 - 15:14

En développement depuis trois ans, Concurnas est désormais un langage abouti qui mérite qu'on s'y attarde si l'on cherche un outil pour la programmation parallèle et/ou distribuée, ses champs de prédilection.

Concurnas est très inspiré de Python en ce qui concerne sa syntaxe, mais aussi de Java. C'est un langage compilé pour exécution sur une machine virtuelle Java.

Concurnas supporte la généricité et il est multi paradigmes : impératif, orienté objet et fonctionnel. A la programmation fonctionnelle, il emprunte notamment les fonctions lambdas, l'évaluation partielle et l'évaluation paresseuse, et il propose une boucle d'évaluation interactive, ou REPL, pour Read Eval Print Loop.

Une caractéristique très intéressante est son support de programmation GPU. Vous pouvez écrire votre code dans du code Concurnas idiomatique et l'exécuter sur le GPU sans avoir à passer en C/C++.

En ce qui concerne la sûreté du code, Concurnas est typé statiquement, avec un système d'inférence de type et il est sécurisé contre les pointeurs null.

Concurnas vous permet d'exécuter facilement le calcul, simultanément, dans des conteneurs de type thread appelés isolats via l'utilisation de l'opérateur bang ! lIln'y a pas besoin de créer / gérer des threads, des pools de threads, des cycles de vie, des verrous (ou des deadlocks... :-)

Tout le code Concurnas est exécuté dans des isolats. Les isolats sont mappés sur les threads matériels sous-jacents de la machine sur laquelle on exécute le code. Les isolats fonctionnent dans leur propre espace mémoire dédié.

Tous les états utilisés dans un isolat sont copiés à l'exception des références, des acteurs et de certaines classes partageables spécialement marquées. Cette isolation de l'état facilite le raisonnement et la conception d'algorithmes simultanés car elle réduit la nécessité de coder pour les conditions de synchronisation et de concurrence.

Quelques exemples :

Tout d'abord un 'Hello World' en Concurnas :

def complexFunc() {
  System.out.println("Hello world!")
}

complexFunc()!//execute concurrently in seperate isolate

Création et utilisation d'isolats

def gcd(x int, y int){//greatest common divisor of two integers
  while(y){
    (x, y) = (y, x mod y)
  }
  x
}

calc1 = gcd(8, 20)!//run this calculation in a isolate
calc2 = gcd(6, 45)!//run this calculation in a separate isolate

calc3 = calc1 if calc1 > calc2 else calc2
//^^^ wait for the results of calc1 and calc2 before assigning calc3

Références et calcul réactif

aRef int://this is a ref of type int
{//complex isolate executed concurrently eventually sets aRef...
  //complex code here...
  aRef = 10
}!

//aRef's current value is requested of it:
result int = aRef//If no value has yet been set execution will pause

System.out.println("The value of aRef is: " + result)

Concurnas est un logiciel libre sous licence MIT, disponible sur GitHub. Des plugins existent pour les EDI Atom, SublimeText et Visual Studio Code.

Site officiel : concurnas.com