Aller au contenu principal

Pointeur

Introduction

Ce document explique comment exploiter les pointeurs dans Wave. Wave est un langage qui prend en charge la programmation système bas niveau, offrant des fonctionnalités de pointeurs pour permettre la manipulation explicite des adresses mémoire. Un pointeur est une variable qui pointe vers une adresse mémoire de type spécifique, permettant un accès et une modification directs de la valeur.


Déclaration de pointeur

Dans Wave, un pointeur est déclaré au format ptr<type>. Par exemple, un pointeur de type entier se déclare comme suit:

var p : ptr<i32>;

Cette déclaration crée un pointeur p qui pointe vers une valeur de type i32.


Initialisation de pointeur

Un pointeur peut être initialisé à l'adresse d'une variable à l'aide de l'opérateur &:

var a :i32 = 10;
var p :ptr<i32> = &a;

Ici, &a signifie l'adresse mémoire de la variable a, et p devient un pointeur vers cette adresse.


Déréférencement de pointeur

Pour lire ou modifier la valeur pointée par un pointeur, utilisez le mot-clé deref. Cela s'appelle le déréférencement:

var a :i32 = 10;
var p :ptr<i32> = &a;

println("{}", deref p); // Affiche 10

deref p = 20;
println("{}", a); // Affiche 20

Pointeur NULL

Dans Wave, un pointeur nul est représenté par le mot-clé null. Une variable pointeur peut être initialisée à null, signifiant qu'elle ne pointe vers aucune mémoire valide:

var p :ptr<i32> = null;

Le déréférencement d'un pointeur nul provoque une erreur du compilateur.


Pointeurs multiples

Wave prend en charge les pointeurs multiples. Les pointeurs peuvent être déclarés et utilisés en plusieurs niveaux imbriqués:

var x :i32 = 1;
var p1 :ptr<i32> = &x;
var p2 :ptr<ptr<i32>> = &p1;
var p3 :ptr<ptr<ptr<i32>>> = &p2;

println("{}", deref p1); // 1
println("{}", deref deref p2); // 1
println("{}", deref deref deref p3); // 1

Tableaux et pointeurs

Les pointeurs peuvent également pointer vers des éléments de tableau ou le tableau lui-même.

Pointeur vers un élément de tableau

var a :i32 = 10;
var b :i32 = 20;
var arr :array<ptr<i32>, 2> = [&a, &b];

println("deref arr[0] = {}, deref arr[1] = {}", deref arr[0], deref arr[1]); // 10, 20

Pointeur vers le tableau entier

var arr :ptr<array<i32, 3>> = &[1, 2, 3];
println("{}", arr); // Affiche l'adresse mémoire

Sécurité et propriété

Wave introduit un système de propriété et de durée de vie similaire à Rust pour assurer la stabilité de la mémoire lors de l'utilisation des pointeurs. Ainsi, elle vérifie strictement pour éviter des problèmes tels que le déréférencement de pointeurs invalides, la double libération ou les pointeurs suspendus.

fun main() {
let x :i32 = 42;
let p :ptr<i32> = &x;

println("x = {}", deref p);

deref p = 99;
println("x = {}", x);
}

Sortie:

x = 42
x = 99

Conclusion

Les pointeurs sont l'une des fonctionnalités clés de Wave, permettant une programmation bas-niveau hautement performante. Ils sont très utiles pour le développement de systèmes nécessitant un contrôle direct de la mémoire, les bibliothèques natives, le contrôle matériel, et grâce à la structure sécurisée du compilateur de Wave, les risques potentiels liés à l'utilisation des pointeurs peuvent être efficacement évités.