Présentation de Minikotlin

Minikotlin est un compilateur Kotlin écrit en C qui émet du bytecode WebAssembly GC. Il permet de compiler des fichiers .kt en modules WebAssembly sans nécessiter de JVM, de LLVM, de Binaryen ou de Gradle.

Fonctionnement de Minikotlin

Minikotlin prend en entrée des fichiers .kt et les compile en une unité unique, permettant aux classes de se voir mutuellement. Le compilateur est lui-même compilé en WebAssembly, ce qui signifie qu'il peut s'exécuter où que s'exécute le code compilé, sans nécessiter d'installation de chaîne d'outils.

Le processus de compilation implique plusieurs étapes, notamment la lecture du code source, l'analyse syntaxique et sémantique, puis la génération de code WebAssembly GC. Les classes sont converties en types de structures GC, les propriétés sont des champs de structure réels et l'allocation se fait via struct.new.

Caractéristiques et fonctionnalités de Minikotlin

Minikotlin prend en charge de nombreuses fonctionnalités Kotlin, notamment les classes ouvertes et les méthodes substituables, les interfaces avec des méthodes par défaut, les classes de données avec des méthodes equals, hashCode et copy générées, les énumérations et les expressions d'objets nommés, compagnons et anonymes.

Il prend également en charge les hiérarchies scellées avec des vérifications exhaustives, les vérifications de type et les vérifications intelligentes qui persistent à travers les branches. Les appels sûrs, les expressions Elvis et les assertions !! sont également supportés.

Les fonctions d'extension, les accesseurs personnalisés et les opérations sur les chaînes et les caractères sont également pris en charge. Les fonctions de liste de niveau supérieur telles que map, filter et forEach sont également disponibles.

Exemple de code

Voici un exemple de code Kotlin qui démontre certaines des fonctionnalités de Minikotlin :

sealed class Lane(val id: Int) 
class Fast : Lane(1) 
class Slow : Lane(2) 
fun Lane.pace(): Long = when (this) { 
   is Fast -> 120 
   is Slow -> 300 
} 
fun main() = runBlocking { 
   val lanes = listOf(Fast(), Slow()) 
   coroutineScope { 
       lanes.forEach { lane -> 
           launch { 
               delay(lane.pace()) 
               println("lane ${lane.id} in") 
           } 
       } 
   } 
   println("race over") 
}

Cet exemple montre comment les classes scellées, les vérifications de type et les fonctions de suspension sont compilées en WebAssembly GC.