3.6 KiB
51. Invariants de conception
Les futures décisions doivent respecter les invariants suivants :
-
Une sémantique Saselang ne change pas silencieusement selon le backend.
-
Le frontend reste indépendant de LLVM.
-
V1 est suffisamment complet pour construire le compilateur/interpréteur sans inventer des règles pendant l'implémentation.
-
V2 doit pouvoir réimplémenter V1 en Saselang.
-
Les décisions V1 évitent de bloquer les backends V3+ sans prétendre les spécifier définitivement.
-
Pas de préprocesseur textuel.
-
Pas de magie lorsque la même capacité peut être exprimée explicitement et de façon déterministe.
-
Pas de duplication de concepts par des alias syntaxiques gratuits.
-
Les types Core compiler-known restent peu nombreux.
-
Le package, le namespace, le target, la feature, la capability et l'artifact restent des dimensions distinctes.
-
Une collision de namespace entre packages ne doit jamais fusionner implicitement leurs types.
-
ResultError,ExceptionetFaultsont trois mécanismes distincts : valeur d'échec explicite, propagation checked et échec unchecked capturable. -
throwsne contient que desExceptionet reste indépendant du type de retour ;faultsne contient que desFaultet reste optionnel/non exhaustif. -
L'identité d'objet est distincte de l'égalité de valeur.
-
Les opérateurs utilisateur passent uniquement par les contrats Core
Op.... -
Les interfaces fournissent l'héritage multiple de contrats/comportements sans introduire un second système de traits.
-
Le modèle mémoire V1 doit fournir performances, sûreté et destruction déterministe sans imposer des lifetimes explicites partout.
-
L'ordre des fichiers et des imports n'est pas un ordre d'exécution ou de résolution sémantique.
-
Un cycle n'est interdit que par la règle du graphe concerné : héritage et layout by-value doivent être acycliques ; références de classes, imports et appels peuvent être cycliques.
-
Une fonctionnalité n'est réservée que lorsqu'un besoin réel est identifié ; pas de réservation spéculative « au cas où ».
-
Une opération Core combinée n'existe pas lorsqu'une composition d'opérations existantes exprime strictement la même sémantique.
-
La mutabilité est le défaut ;
constretire explicitement les droits de mutation depuis l'accès concerné. -
constne crée pas d'immutabilité globale et n'invalide pas les autres alias mutables légitimes. -
Saselang ne requiert pas de
mut, borrow syntax ou lifetimes utilisateur pour le code mutable ordinaire. -
Les conversions et opérations textuelles ne transcendent jamais implicitement les encodages : conversion explicite d'abord, opération ensuite.
-
Une interface de collection n'annonce jamais une capacité qui peut être absente et échouer ensuite comme « unsupported ».
-
Capacité intrinsèque d'un type et permission portée par
constrestent deux dimensions distinctes. -
Une slice ne peut jamais augmenter les droits de mutation de sa source.
-
Un array safe devient observable uniquement après initialisation complète.
-
Une bibliothèque spécialisée peut être officielle sans appartenir au Core ou au SDK obligatoire ; son artifact normal reste une
.saselib. -
Les dépendances natives de bootstrap peuvent être remplacées progressivement par des implémentations Saselang sans imposer leur architecture historique au langage.
-
Lorsqu'une forme légèrement plus longue supprime un implicite ou une ambiguïté réelle, Saselang privilégie l'explicite.