Quelle alternative à C++
Quel langage est le meilleur candidat pour remplacer C++ après 35 ans d'existence et des millions de crashes dus à sa syntaxe peu sûre?
Un successeur à C++ doit produire des applications très rapides et du code fonctionnant sur toutes les plateformes. Mais on peut aussi parler de succession pour un langage qui reprend exactement la syntaxe de C, ajoute des classes et apporte des fonctions plus évoluées. Un C++ moderne donc, même s'il n'est pas destiné à le remplacer partout.
Vala (2002)
Disponible sur le site de Gnome, ressemble à une démonstration de GObject, écrit par la même équipe. Vala remplace C++ sur la plateforme Gnome.
Caractéristiques:
- Compile en C.
- Basé sur GObject qui ajoute un système de classes à C.
- Utilise les types de GType qui permet l'utilisation par de multiples langages.
- Mémoire gérée automatiquement par décompte des références.
- Interface avec d'autres langages par fichiers vapi.
- Compatible avec GTK.
Exemple simple:
int main () {
print ("Hello World\n");
return 0;
}
Classe:
class Hello : Object {
void bye () {
stdout.printf ("Hello World\n");
}
}
var example = new Hello ();
example.bye();
De nombreux programmes ont été écrit en Vala, mais même s'il peut s'utiliser en dehors de l'environnement Gnome, il l'est essentiellement en combinaison avec GTK. Leprojet est toujours actif en 2022 avec un nouveau site web, vala.dev.
D (2001)
Conçu comme alternative à C++ avec des simplifications, notamment les tableaux dynamiques.
- Compatible avec C (mais pas C++).
- Héritage simple et mixins.
- Concurrence par acteurs.
- Mémoire gérée par un garbage collector. Celui-ci peut être désactivé, mais on perd la compatibilité avec les bibliothèques.
Exemple simple:
import std.stdio;
void main() {
writeln("Hello World!);
}
Classe:
class Hello {
char[] content;
this(char[] str) { // constructeur
content = str;
}
void display() {
writeln(content);
}
}
Hello hello = new Hello("Hello World!");
C# (2000)
Depuis la plateforme Roslyn, disponible sur GitHub, C# peut être compilé en langage machine plutôt qu'en bytecode, et il peut accéder aux ressources systèmes, donc même si à l'origine c'était une alternative à Java, il devient un remplaçant possible à C++ pour les applications ou le garbage collector n'est pas un inconvénient.
Caractéristiques:
- Compile en bytecode ou binaire.
- Fonctionne sur tous systèmes d'exploitation y compris mobiles.
- Peut se combiner avec d'autres langages .NET. Compatible avec C++ en mode managé sur .NET.
- Programmation parallèle.
- Mémoire gérée par un garbage collector.
Exemple simple:
void Main() {
Console.WriteLine("Hello, World!");
}
Classe:
public Class Point : Shape {
public int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
public void move(int w, int h) {
this.x += x;
this.y += h;
}
}
Point p = new Point(0,0);
p.move(100,50);
Dart (2013)
Conçu comme alternative à JavaScript avec la syntaxe de C, ce n'est pas un langage système, mais il remplace C++ pour la création de scripts sur le serveur ou le bureau avec une vitesse d'exécution proche de celle d'Asm.js.
- Fonctionne sur une machine virtuelle héritée de V8, Fletch.
- Classes et héritage.
- Variables statiques ou dynamiques.
- Concurrence avec les isolates.
- Surcharge des opérateurs.
- Peut être compilé aussi en JavaScript.
Exemple simple:
void main() {
print('Hello World!');
}
Classe:
class Point {
num x, y;
Point(this.x, this.y); // constructeur
void move(num xo, num yo) {
x += xo;
y += yo;
}
}
var p = new Point(0, 0);
p.move(100, 50);
Autres langages
D'autres langages sont aussi dérivés de C ou ont une vocation de remplacer C++ comme langage système.
- Go. Il aura au moins remplacé C++ chez Google qui l'a conçu pour cela. Son domaine est celui des services Web, qui n'est qu'une application accessoire de C++.
- Java. Sa syntaxe est une modernisation de celle de C++ mais ses principes sont très différents. Un fichier par classe, fonctionnement sur une machine virtuelle. Il s'utilise surtout pour des applications Web ce qui le met plus en concurrence avec Go.
- Rust. Le langage de Mozilla fonctionne sur la machine virtuelle LLVM. et est conçu pour les applications portables, il a une syntaxe différente mais aussi, dans un but de sécurité, ajoute de grandes contraintes pour le programmeur. C et C++ doivent leur succès au fait que le programmeur peut faire ce qu'il veut dans ces langages. Malgré la publicité que les font les adeptes de Mozilla, le langage est très mal classé dans les statistiques de popularité.
- Nim. Sa syntaxe est proche de celle de Python et son audience est actuellement réduite. On l'évoque parce que certains le voient comme un successeur à C++ en tant que langage système. Il est compilé en C comme Vala, et utilise un garbage collector, il faudrait que ce dernier soit non bloquant pour l'utilisation dans les jeux et le système.
- Asm.js. Ce sous-ensemble de JavaScript est presque aussi rapide que le code natif, aussi portable que C et on peut l'utiliser pour des jeux en 3D sous WebGL. Si l'on fait du navigateur une alternative au système d'exploitation, il peut effectivement remplacer C++ pour les applications immersives telles que les jeux (par exemple Unreal Engine a une version C++ et une version Asm.js).
Finalement, quel successeur pour C ou C++? Si l'on se base sur le classement des langages par popularité, aucun pour le moment! C reste le langage le plus utilisé et C++ se tient en troisième place, après Java et avant C#.
La tendance qui se dessine est qu'un ensemble de langages, chacun dans un domaine spécifique, jeu, application Web, scripting, etc... peuvent très bien ensemble remplacer C++, un langage universel que l'on ne peut remplacer partout par un unique langage. Cela donne son seul réel avantage à la syntaxe dérivée de C: le programmeur peut passer plus facilement d'un langage à l'autre pour réaliser des types d'applications différentes.