IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Rune, un langage de programmation systèmes, inspiré de Python et présenté comme étant rapide,
De l'avis de certains développeurs, une bibliothèque aux langages existants aurait été préférable

Le , par Bruno

21PARTAGES

4  0 
Rune est un langage de programmation systèmes inspiré de Python et conçu pour interagir avec les bibliothèques C et C++. Il possède des nombreuses fonctionnalités pour la sécurité, telles que la sécurité de la mémoire et le traitement en temps constant des secrets. Rune vise à être plus rapide que C++ pour la plupart des applications gourmandes en mémoire, grâce à sa gestion de la mémoire par Structure-of-Array (SoA). De l’avis de certains analystes, les langages comme Rust ou encore le C++ répondent déjà à ces besoins.

Pour Ashley Williams, directeur exécutif par intérim de la fondation Rust, Rust est un langage qui donne du pouvoir à tout le monde, mais surtout aux gens qui pensent que la programmation système n'est pas pour eux. « L'une des forces motrices les plus puissantes du projet Rust est la croyance simultanée dans le pouvoir de la programmation système et l'engagement à faire en sorte que ce pouvoir soit utilisable par tous », avait-t-il déclaré lors de son discours d’ouverture de la RustConf 2020.


Les responsables du projet Rune estiment que « Rune est parfois plus rapide que le C. » Au lieu de la programmation basée sur les array-of-structure (AoS), Rune utilise les structure-of-array (SoA). Cela permet d'améliorer les performances du cache et de réduire l'utilisation de la mémoire, en partie parce que la plupart des références d'objets peuvent être 32 bits plutôt que 64 bits. Les tests de référence effectués à ce jour montreraient que les applications gourmandes en mémoire, telles que l'automatisation de la conception électronique, gagnent environ 40 % de vitesse tout en réduisant la mémoire de 20 %.

Code : Sélectionner tout
1
2
3
4
5
6
func bignumModularMul(a, b, modulus, isSecret) {
    if isSecret {
        return fastModularMul(a, b, modulus)
    }
    return constTimeModularMul(a, b, modulus)
}

Considérons l'exemple suivant pour le traitement des secrets :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
// Vérifier le MAC (code d'authentification du message) d'un message.  Un MAC est dérivé
// d'un hachage sur le `macSecret` et le message.  Il garantit que le message n'a pas été
// modifié, et a été envoyé par quelqu'un qui connaît `macSecret`.
func checkMac(macSecret : secret(string), message : string, mac : string) -> bool {
    computedMac = computeMac(macSecret, message)
    return mac == computedMac
}
func computeMac(macSecret : string, message:string) -> string {
  // Un algorithme MAC populaire.
  return hmacSha256(macSecret, message)
}

Dans la plupart des langages, un acteur malveillant disposant de données temporelles précises peut falsifier un MAC sur un message de son choix, ce qui amène un serveur à l'accepter comme authentique.

Supposons que l’acteur malveillant puisse savoir combien de temps il faut pour que mac == computedMac s'exécute. Si le premier octet d'un MAC choisi par l’acteur malveillant est faux pour le message, la boucle se termine après une seule comparaison. Avec 256 tentatives, l’acteur malveillant peut trouver le premier octet du MAC attendu pour le message contrôlé par l'attaquant. En répétant ce processus, l’acteur malveillant peut falsifier un MAC entier.

Les responsables de Rune prétendent que ses utilisateurs sont protégés, car le compilateur voit que macSecret est secret, et donc que le résultat de hmacSha256 est secret. L'opérateur de comparaison de chaînes de caractères, lorsque l'un ou l'autre des opérandes est secret, s'exécute en temps constant, ne révélant aucune information temporelle à l’acteur de la menace. « Il faut toujours être prudent dans Rune, mais de nombreuses erreurs courantes comme celle-ci sont détectées par le compilateur, qui les corrige ou les signale comme des erreurs », écrivent-ils.

En ce qui concerne la vitesse et la sécurité de la gestion de la mémoire de Rune, la classe ci-dessous peut être difficile à modéliser dans certains langages, mais elle est triviale dans SQL et Rune. Considérons une classe Humain.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Human(self, name: string, mother: Human = null, father: Human = null) {
  self.name = name
  if !isnull(mother) {
    mother.appendMotheredHuman(self)
  }
  if !isnull(father) {
    father.appendFatheredHuman(self)
  }

  func printFamilyTree(self, level: u32) {
    for i in range(level) {
      print "    "
    }
    println self.name
    for child in self.motheredHumans() {
      child.printFamilyTree(level + 1)
    }
    for child in self.fatheredHumans() {
      child.printFamilyTree(level + 1)
    }
  }
}

relation DoublyLinked Human:"Mother" Human:"Mothered" cascade
relation DoublyLinked Human:"Fater" Human:"Fathered" cascade

adam = Human("Adam")
eve = Human("Eve")
cain = Human("Cain", eve, adam)
abel = Human("Abel", eve, adam)
alice = Human("Alice", eve, adam)
bob = Human ("Bob", eve, adam)
malory = Human("Malory", alice, abel)
abel.destroy()
adam.printFamilyTree(0u32)
eve.printFamilyTree(0u32)

Lorsqu'il est exécuté, il affiche

Abel et Malory ne sont pas listés. Cela s'explique par le fait que Rune n'a pas seulement éliminé Abel, il a été détruit, ce qui a entraîné la destruction récursive de tous les enfants d'Abel. Les instructions de relation sont similaires aux colonnes des tables SQL. Une table avec une colonne Mère et Père a deux relations de plusieurs à un dans une base de données.

Les instructions de relation donnent au compilateur Rune des indications essentielles pour l'optimisation de la mémoire. Les objets dont le compilateur peut prouver qu'ils sont toujours dans des relations de type cascade-suppression n'auraient pas besoin d'être comptés par référence. Les déclarations de relation indiquent également au compilateur qu'il doit mettre à jour le destructeur de Node pour détruire récursivement les enfants.

Tout langage peut utiliser un type de données distinct pour les secrets et l'opérateur correspondant pour la comparaison en temps constant.

Rune comme bibliothèque dans la plupart des langages existants

Pour certains analystes, il n’existe pas de raisons nécessitant un nouveau langage et qui ne pourrait pas être implémenté sous forme de bibliothèque dans la plupart des langages existants (y compris les langages populaires comme le C++).
RUST répond au besoin de sécurité mémoire

Rust a été créé pour garantir des performances élevées similaires à celles offertes par le C et le C++, mais en mettant l'accent sur la sécurité du code, dont le manque est le talon d'Achille de ces deux langages. Cependant, Rust a plus que la sécurité de la mémoire de son côté. Les hautes performances lors du traitement de grandes quantités de données, le support de la programmation concurrente, ainsi qu'un compilateur efficace sont d'autres raisons pour lesquelles des poids lourds du logiciel utilisent le langage de programmation Rust.

Caractéristiques du langage Rust

Rust est un langage entièrement développé de façon ouverte. Il offre la possibilité de construire des logiciels fiables et efficaces. Ses domaines de prédilection étant la programmation système, les applications en ligne de commande, les applications Web via WebAssembly, les services réseaux et les systèmes embarqués. Le langage est également apprécié par sa communauté pour les raisons suivantes :

  • performance : Rust est un langage rapide et économique en mémoire, sans environnement d'exécution, ni ramasse-miettes, il peut dynamiser des services à hautes performances, s'exécuter dans des systèmes embarqués, et s'intégrer facilement à d'autres langages ;
  • fiabilité : le système de typage et le modèle d’ownership de Rust garantissent la sécurité mémoire ainsi que la sécurité des threads. Il permet d'éliminer de nombreuses variétés de bugs dès la compilation ;
  • productivité : Rust dispose d'une excellente documentation, d'un compilateur bienveillant, avec des messages d'erreur utiles. Le langage a également un gestionnaire de paquet et de compilation intégré, divers éditeurs intelligents avec autocomplétions et analyse de type. Il dispose également d’un outil de mise en forme automatique.

C++

C++ est un langage de programmation compilé permettant la programmation sous de multiples paradigmes, dont la programmation procédurale, la programmation orientée objet et la programmation générique. Ses bonnes performances, et sa compatibilité avec le C en font un des langages de programmation les plus utilisés dans les applications où la performance est critique.

C'est un langage polyvalent, ce qui signifie qu'il peut être utilisé dans presque tous les cas. Cependant, en raison de ses règles syntaxiques complexes et de son utilisation globalement difficile, il est principalement dominant dans les applications qui nécessitent une grande vitesse, la simultanéité et un examen plus approfondi du fonctionnement du matériel.

C++ est le langage de programmation qui a permis de créer des systèmes d'exploitation comme Microsoft Windows. En outre, le C++ est utilisé pour produire la majorité des jeux vidéo sur le marché.

Source : Rune Team's

Et vous ?

À votre avis, le langage de programmation système Rune est-il pertinent ?

Que pensez-vous de l'idée selon laquelle il n'existe pas de raison pour la création du langage Rune ?

Croyez-vous qu'une bibliothèque pour les langages existants serait mieux qu'un nouveau langage ?

Voir aussi :

Rust est approuvé pour une utilisation côté serveur chez Meta, les principaux langages côté serveur supportés par Meta sont Hack, C++, Rust et Python

Rust 1.63 est disponible et s'accompagne des fils d'exécution délimités, des propriété Rust pour les descripteurs de fichiers

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de
https://www.developpez.com
Le 28/11/2022 à 18:27
- Pas de besoin précis ;
- Pas de communauté motivée ;
- Pas de géant de tech pour pousser.

Bref, le langage finira aux oubliettes de l'histoire.

On est bien loin d'un JavaScript qui était au bon moment, d'un Go aux qualités discutables mais avec Google pour le soutenir, ou d'un Julia dont les développeurs de paquets sont des spécialistes qui font référence dans leur domaine.
2  0 
Avatar de moldavi
Inactif https://www.developpez.com
Le 30/11/2022 à 1:21
Bonjour.

En gros, un langage wrapper de C++. Rien de révolutionnaire quoi. Presque tous les langages le font.
1  1