La version 0.32.0 de Gleam, le langage évolutif et sûr pour la machine virtuelle Erlang et les moteurs d'exécution JavaScript, a été publiée

Gleam v0.32.0 vient d'être publié. Gleam est un langage de type sûr et évolutif pour la machine virtuelle Erlang et les moteurs d'exécution JavaScript. Cette version se concentre sur la préparation de Gleam pour une future version 1.0 en apportant quelques changements avant que le langage ne soit déclaré stable.

Gleam est un langage convivial permettant de construire des systèmes de type sûrs et évolutifs. Ce langage offre la puissance d'un système de types, l'expressivité de la programmation fonctionnelle et la fiabilité du moteur d'exécution Erlang hautement concurrent et tolérant aux pannes, avec une syntaxe familière et moderne.

Exécuté sur la machine virtuelle Erlang qui a fait ses preuves et qui alimente des systèmes à l'échelle de la planète tels que WhatsApp et Ericsson, Gleam est prêt pour des charges de travail de toute taille. Grâce à un système de concurrence basé sur des acteurs multicœurs qui peut exécuter des millions de tâches simultanées, des structures de données rapides et immuables, et un ramasse-miettes concurrent qui fait en sorte que le monde ne s'arrête jamais, votre service peut évoluer et rester rapide comme l'éclair, en toute simplicité.


Gleam est livré avec un compilateur, un outil de construction, un formateur, des intégrations d'éditeurs et un gestionnaire de paquets tous intégrés, de sorte que la création d'un projet Gleam consiste simplement à exécuter gleam new.

En tant que partie intégrante de l'écosystème BEAM, les programmes Gleam peuvent utiliser des milliers de paquets publiés, qu'ils soient écrits en Gleam, Erlang ou Elixir. Pas de valeurs nulles, pas d'exceptions, des messages d'erreur clairs et un système de types pratique. Que vous écriviez un nouveau code ou que vous mainteniez un ancien code, Gleam est conçu pour rendre votre travail le plus agréable et le moins stressant possible.

Gleam facilite en outre l'utilisation de code écrit dans d'autres langages BEAM tels qu'Erlang et Elixir. Il existe donc un écosystème riche de milliers de bibliothèques open source que les utilisateurs de Gleam peuvent utiliser. Gleam peut également compiler en JavaScript, ce qui vous permet d'utiliser votre code dans le navigateur ou partout où JavaScript peut s'exécuter. Il génère par ailleurs des définitions TypeScript, ce qui vous permet d'interagir avec votre code Gleam en toute confiance, même depuis l'extérieur.

Pourquoi le langage s'appelle-t-il Gleam ?

Gleam rime avec et est un synonyme de "beam", qui est le nom de la machine virtuelle Erlang. C'est aussi un mot court et mignon qui, espérons-le, est facile à épeler et à prononcer pour la plupart des gens.

En quoi Gleam compile-t-il ?

Gleam compile en Erlang ou en JavaScript.

Gleam aura-t-il des classes de type ?

Les classes de type sont amusantes et permettent de créer de très belles API concises, mais elles peuvent faciliter la création d'un code difficile à comprendre, ont tendance à avoir des messages d'erreur confus, à consommer le code d'autres langages beaucoup plus difficilement, ont un coût de compilation élevé, et ont un coût d'exécution à moins que le compilateur n'effectue une compilation complète du programme et un monomorphisme coûteux. Ce n'est malheureusement pas un bon choix pour Gleam et ce n'est pas prévu.

Gleam aura-t-il une forme de métaprogrammation ?

L'équipe de Gleam est très intéressée par une forme de métaprogrammation dans Gleam. Actuellement, Gleam est dans la phase de recherche et de conception, et ce n'est pas une priorité par rapport à l'outillage et aux autres travaux nécessaires à la sortie de la version 1.0.

Si vous avez des problèmes qui pourraient être résolus par la métaprogrammation, ou des propositions pour une conception de métaprogrammation, n'hésitez pas à les partager.

Gleam a-t-il un état mutable ?

Toutes les structures de données de Gleam sont immuables et sont implémentées en utilisant le partage structurel afin qu'elles puissent être mises à jour efficacement.

Si votre application a besoin de conserver un état mutable, celui-ci peut être conservé par un acteur (qui enveloppe de manière immuable l'état mutable en utilisant la récursivité) ou vous pouvez utiliser ETS, la base de données clé-valeur en mémoire d'Erlang.

Si vous compilez Gleam en JavaScript, la bibliothèque gleam_javascript propose des références mutables.


Gleam v0.32.0 a été publié

Gleam est un langage de type sûr et évolutif pour la machine virtuelle Erlang et les moteurs d'exécution JavaScript. Aujourd'hui, Gleam v0.32.0 a été publié, une version qui se concentre sur la préparation de Gleam pour une version 1.0 en apportant quelques changements avant que le langage ne soit déclaré stable.

Résoudre l'ambiguïté des importations

Voici à quoi ressemble la syntaxe d'importation de Gleam :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
import gleam/option.{Option, Some, None}
 
pub fn greet(option : Option(String)) -> String {
  case option {
    Some(name) -> "Hello " <> name
    None -> "Hello, World !"
  }
}

Ici, le module gleam/option est importé, et les valeurs Some, et None ainsi que le type Option sont importés de manière non qualifiée afin que l'on puisse s'y référer sans le préfixe module_name.

Bien que Option soit un type et None une valeur, ils sont tous deux importés en utilisant la même syntaxe. La situation devient plus complexe si l'on considère que dans Gleam, un type et une valeur peuvent avoir le même nom. Par exemple :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
/// A type called `Person`
pub type Person {
  /// A value constructor, also called `Person`
  Person(name : String)
}

Dans ce cas, lorsque vous lisez le code import the/module.{Person}, vous ne pouvez pas savoir si c'est le type qui est importé, la valeur ou les deux. Le compilateur résout cette ambiguïté en vérifiant comment l'élément importé est utilisé.

La clarté est un objectif central de Gleam, c'est pourquoi, pour alléger la charge cognitive de la lecture du code Gleam, la syntaxe d'importation des types et des valeurs a été modifiée.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
import gleam/option.{type Option, Some, None}

Pour importer un type, le mot-clé type est utilisé avant le nom, aucun mot-clé n'étant utilisé pour une valeur. Désormais, on sait toujours ce que fait une déclaration d'importation !

L'ancienne syntaxe est toujours supportée, mais sera supprimée dans une prochaine version, et un avertissement de dépréciation sera émis lorsqu'elle sera utilisée.

BitString -> BitArray

Gleam dispose d'un type pour une séquence contiguë de bits. Il est similaire au type bytes de Python, mais il n'est pas limité à des octets de 8 bits, il peut s'agir de n'importe quel nombre de bits.

Il dispose également d'une syntaxe littérale pour la construction et la recherche de motifs, de sorte que la plupart des opérations bitwise utilisées dans d'autres langages peuvent être effectuées avec une syntaxe plus simple.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
pub fn seven_bit_little_endian_int() -> BitString {
  <<2:size(7)-little>>>
}

Cette fonctionnalité, que Gleam a héritée d'Erlang, est très appréciée par la communauté, à l'exception du nom. De nombreux utilisateurs de Gleam, en particulier ceux qui viennent de langages autres qu'Erlang ou Elixir, trouvent le nom BitString déroutant. Qu'est-ce que cela a à voir avec les chaînes de caractères ? C'est uniquement pour le texte ?

Cette confusion est compréhensible, c'est pourquoi le nom a été changé en BitArray, et dans la syntaxe du pattern, les options binary et bit_string ont été renommées en bytes et bits, en espérant que leur but soit plus clair. Parallèlement, le module de la bibliothèque standard gleam/bit_string a été supprimé au profit de gleam/bit_array. Les anciens noms et modules sont obsolètes et seront supprimés dans une prochaine version.

Le retour de gleam fix

Wow, ça fait beaucoup de choses obsolètes ! Il va être fastidieux de corriger tout le code existant, n'est-ce pas ? Heureusement, la commande gleam fix est de retour.

Lancez gleam fix à la racine de n'importe quel paquetage Gleam et il mettra automatiquement à jour votre code pour utiliser la nouvelle syntaxe. Elle mettra également à jour le fichier gleam.toml pour définir la contrainte de version de Gleam à >= 0.32.0, garantissant que si vous publiez votre paquetage dans le gestionnaire de paquetages Hex, les utilisateurs de versions plus anciennes de Gleam n'obtiendront pas d'erreurs déroutantes dues à la nouvelle syntaxe.

Actions du code du serveur de langage

Le binaire gleam inclut le compilateur, l'outil de construction, le gestionnaire de paquets, ainsi que le serveur de langage, qui fournit des fonctionnalités IDE à VS Code, Vim, Emacs, et tout autre éditeur qui supporte le protocole.

Avec cette version, le serveur de langage reçoit sa première action de code ! Il peut désormais supprimer automatiquement toutes les importations inutilisées en appuyant simplement sur un bouton.

Il s'agit d'une fonctionnalité pratique et agréable, mais cela signifie également que le serveur de langage dispose en interne de l'infrastructure nécessaire pour ajouter d'autres actions de code à l'avenir. L'équipe accorde une grande importance à l'expérience utilisateur et à la productivité, c'est pourquoi le serveur de langage sera doté de plus d'actions de code et de nouvelles fonctionnalités dans les prochaines versions.

Cible spécifique gleam check

Si pendant le développement vous voulez voir si votre type de code est vérifié mais que vous ne vous souciez pas de le compiler pour exécuter vos tests, vous pouvez utiliser la commande gleam check.

Avec cette version, elle bénéficie de l'option --target, qui vous permet de spécifier une cible de compilation autre que celle par défaut du paquet. Ceci est utile pour les paquets qui utilisent la compilation conditionnelle, une fonctionnalité de Gleam moins courante, mais parfois nécessaire.

Accès aux modules dans les expressions de garde

Les valeurs définies dans d'autres modules peuvent désormais être référencées dans les expressions de garde des clauses de cas en utilisant la syntaxe module_name.value.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
import some/module.{type Person}
 
pub fn greet(person : Person) -> String {
  case person {
    Person(name : n) if n == module.friends_name -> "Hey Buddy !"
    _ -> "Hello ! Bienvenue !"
  }
}

Constantes Bit array sur la cible JavaScript

Les tableaux de bits peuvent désormais être utilisés dans des expressions constantes sur la cible JavaScript.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
pub const some_bits = <<1, 2, 3, 4>>

Types @deprecated

La version précédente a ajouté l'attribut @deprecated, qui pouvait être utilisé pour marquer des valeurs comme étant obsolètes. Cette version étend cet attribut pour permettre aux définitions de types d'être marquées comme obsolètes également.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
@deprecated("Use the Pet type instead")
pub type Animal {
  Cat
  Dog
}

Lorsqu'un type est marqué comme déprécié, le compilateur émet un avertissement lorsque le type ou l'un de ses constructeurs de valeurs est référencé.

Source : Gleam

Et vous ?

Que pensez-vous du langage Gleam et de ses fonctionnalités ?

Voir aussi

JavaScript est resté le langage de programmation le plus demandé de janvier 2022 à juin 2023, d'après DevJobsScanner, un emploi de développeur sur trois nécessite des connaissances en JavaScript

Sortie de la version stable du framework JavaScript Svelte 4, avec une mise à jour des performances

La version 25.0 de Erlang/OTP, le langage de programmation couplé à une collection de middleware est disponible, elle s'accompagne d'une amélioration du JIT pour les outils comme perf et gdb

La version 1.9 d'Elixir est publiée avec l'ajout de nouvelles fonctionnalités et une configuration améliorée