Oscar Spencer est l'un des fondateurs du
langage Grain Grain, un langage de programmation de haut niveau fortement typé. Il s'agit d'un langage hybride qui combine certaines fonctionnalités de programmation fonctionnelle (par exemple, inférence de type, correspondance de motifs, fermetures) et impérative (par exemple, variables mutables).
Oscar Spencer, l'un des créateurs du langage, a présenté Grain au WebAssembly Summit 2021. Spencer a parlé de ses fonctionnalités les plus intéressantes et les plus importantes, et a également souligné que Grain a été créé et optimisé spécifiquement pour WebAssembly. Il ne peut être compilé que dans le bytecode Wasm. C'est du moins le cas aujourd'hui.
Voici comment les développeurs ont formulé la mission du langage Grain :
Grain s'efforce de prendre le meilleur des langages de programmation fonctionnels et impératifs et de le proposer à un public plus large. De nombreuses langues ont de grandes idées, mais finalement ces langues ne se sont pas généralisées. C'est parce qu'ils sont trop bizarres ou trop difficiles à apprendre. Et par conséquent, leurs tentatives de rallier une large communauté autour d'eux ont échoué. Grain doit insuffler une nouvelle vie à ces idées et les présenter de manière accessible, tout en restant simple d'utilisation.
Le WebAssembly Summit est une conférence annuelle consacrée à tous les aspects de l'utilisation et de l'interaction avec Wasm. Le sommet évoqué dans l'article a eu lieu en avril 2021.
Types de données
En plus des types de données de base WebAssembly (par exemple, les types de base i32 aka Int32), Grain a des types de données composites. Par example:
- Option est un type spécial d'énumération qui définit la présence d'options (options) comme Certaines ou l'absence comme Aucune ;
- Résultat - tout est standard : Err, si quelque chose s'est mal passé, et Ok, si tout est ainsi ;
- La pile est une pile immuable.
Grain implémente également des tuples, des enregistrements, des tableaux, des listes, des plages, des caractères, des chaînes, des ensembles, des cartes, des files d'attente et bien plus encore.
Voici à quoi ressemble le programme Grain le plus simple :
import List from «list»
import Option from «option»
import { data } from «./data»
let allPairs = List.product(data, data);
let (a, b) = Option.expect (
«Expected to find values»,
List.find(((a ,b)) => a + b == 2020, allPairs)
);
print((«Values», a, b));
print((«Answer», a * b));
L'exemple est tiré du timecode du reportage vidéo de Spencer.
Constructeurs génériques
Grain permet, par exemple, de créer des énumérations à l'aide de constructeurs génériques.
enum Veggie { Squash, Cabbage, Broccoli }
enum Fruit { Apples, Oranges, Bananas }
enum Inventory<produce> { Crate(produce), Truckload(produce) }
let veggieInventory = [Crate(Broccoli), Truckload(Cabbage)]
let fruitInventory = [Crate(Apples), Truckload(Oranges)]
Dans l'exemple de code ci-dessus, le paramètre des constructeurs Crate et Truckload est une variable de production.
Correspondance de motifs
enum Topping { Cheese, Pepperoni, Peppers, Pineapple }
enum Menu { Pizza(Topping), Calzone(Topping) }
let item = Calzone(Peppers)
match (item) {
Calzone(topping) => {
if (checkSpecials(topping)) {
print(«These are half off this week.»)
} else {
print(«No current specials.»)
}
},
_ => print(«No current specials.»)
}
La section de documentation Liaisons dans les motifs de correspondance indique que nous pouvons lier un motif de correspondance (motif) à, par exemple, un nom d'énumération. Ensuite, en substituant son nom à la casse correspondante dans le corps de l'expression de correspondance, nous pouvons vérifier automatiquement les valeurs de cette énumération.
Dans l'exemple de code ci-dessus, la valeur de la variable topping est liée à l'énumération Topping, qui initialise l'élément dans l'énumération Menu avec l'une de ses valeurs.
La correspondance de modèle fonctionne également pour les enregistrements, les tuples et les listes. Regardons un exemple pour une liste :
let list = [1, 2, 3]
match (list) {
[] => print(«List contains no elements»),
[_] => print(«List contains one element»),
[_, _] => print(«List contains two elements»),
[_, _, _] => print(«List contains three elements»),
_ => print(«List containes more than 3 elements»)
}
Vous pouvez en savoir plus sur cette fonctionnalité de langue ici.
En bref sur les autres possibilités de Grain
En travaillant sur Grain, les développeurs ont accordé une grande attention à la mise en œuvre complète et moderne des fonctions. Par exemple, une fonction peut être utilisée comme valeur. Tout comme JavaScript, Grain implémente des fermetures.
Grain sait aussi imprimer des valeurs sans les convertir en chaîne. De plus, Grain peut accéder à l'interface système WebAssembly (WASI). L'interface système WebAssembly doit permettre au code Wasm de s'exécuter sur tous les appareils et systèmes d'exploitation. WASI inclut des API pour les E/S asynchrones, la génération de nombres aléatoires, l'obtention de l'heure actuelle, etc.
Les programmes céréaliers peuvent être divisés en modules. Les modules peuvent être exportés ou importés à partir d'autres modules Grain. Les modules Grain peuvent également connecter des fonctions externes. Mais seulement à condition que le développeur s'assure lui-même que les fonctions externes correspondantes sont créées.
Il y a maintenant un achèvement actif de l'interface de fonction étrangère (FFI - Interface de fonction étrangère ), ainsi que la liaison statique, fonctionnant en mode 64 bits, la bibliothèque DOM standard et les macros.
Pour ceux qui veulent plonger plus profondément
Liaison statique
Jusqu'à la version d'avril 2021, tous les programmes Grain étaient assemblés par un moteur js spécial qui jouait le rôle d'un éditeur de liens dynamique. Cependant, avec cette approche, les programmes ne pouvaient être exécutés que dans Node.js et les navigateurs. Grain est désormais capable d'utiliser des environnements d'exécution autonomes pour WebAssembly - Wasmer, Wasmtime et Wasm3.
En 2018, les développeurs de Grain ont clairement réalisé que la liaison statique était vitale pour le développement futur du projet. Mais ils espéraient pouvoir utiliser les outils de l'écosystème pour ce faire. Malheureusement, aucun outil approprié n'a été trouvé et Oscar a décidé d'intégrer la phase de lien statique directement dans le compilateur Grain. Pour implémenter la liaison statique à l'aide de la boîte à outils Binaryen, il a fallu environ 600 lignes de code à écrire.
Cependant, après cela, j'ai dû m'attaquer à une tâche plus complexe et volumineuse - réécrire le code JavaScript du runtime et le code AssemblyScript de la bibliothèque standard en pur Grain.
Grain vs AssemblyScript
AssemblyScript , qui compile un sous-ensemble de TypeScript en Wasm, est également décrit comme un langage spécialement conçu pour WebAssembly. Il dispose également d'une bibliothèque standard avec des types composites (par exemple pour les tableaux ou les dates). Comme Grain, AssemblyScript est compilé en WebAssembly à l'aide de Binaryen. AssemblyScript, étant un langage de haut niveau, vise à donner aux développeurs plus de capacités de "bas niveau" lors de la résolution de tâches exigeantes en performances (par rapport à TS et JS).
AssemblyScript nécessite cependant des annotations supplémentairesles types. Par rapport à TypeScript, l'inférence de type dans AssemblyScript est limitée car le type de chaque expression doit être connu à l'avance. Cela signifie que les déclarations de variables et de paramètres doivent être d'un type annoté ou d'un initialiseur.
Grain est un langage fortement typé (fourni par OCaml typechecker) qui nécessite peu ou pas d'annotations. Ceci a été réalisé grâce au fait que les développeurs ont mis en œuvre un mécanisme d'inférence de type.
Où chercher ?
Grain (avec la CLI, le compilateur, l'environnement d'exécution et la bibliothèque standard) est fourni dans un seul binaire. Cette version est disponible pour MacOS x64 , Linux x64 et Windows x64 . Sur d'autres plateformes, vous pouvez utiliser la version JS du compilateur Grain.
Documentation sur les céréales.
Vidéo avec le reportage :
Les serveurs cloud de Macleod sont rapides et sécurisés.
Inscrivez-vous en utilisant le lien ci-dessus ou en cliquant sur la bannière et bénéficiez d'une remise de 10 % pour le premier mois de location d'un serveur de n'importe quelle configuration !