Genèse · charte fondatrice · 2026

Écrit par des LLM. Compilé sur n'importe quel métal.

Cyr est le dialecte natif de Cyra — compilé en AOT via LLVM, des serveurs jusqu'au plus dépouillé des MCU. Sans VM, sans GC. Le langage que les machines écrivent, désormais sur le métal.

Du code natif, de votre application jusqu'au PID 1.

Pre-v0

Cette page partage les premières idées, la philosophie de genèse et les attentes pour Cyr. Le nom, la relation tronc/branche, les noms du runtime et de la CLI, ainsi qu'un ensemble de décisions clés sont figés — mais Cyr n'est pas encore livré. Ce que vous lisez ici est une charte, pas une version publiée.

Là où la BEAM est un mur.

Cyra excelle là où la BEAM excelle : les systèmes concurrents, tolérants aux pannes et rechargeables à chaud. Mais des classes entières de travail vivent sous cette ligne. Aujourd'hui, un développeur qui heurte le mur doit descendre vers C, Rust ou Zig et quitter entièrement le langage. Cyr est l'issue de secours qui vous maintient dans la famille.

LLVM, AOT

Cyr compile en avance (AOT) vers du code objet natif via LLVM — pas de VM, pas de JIT. Un binaire autonome qui s'exécute sur une plateforme Tier-1 sans rien d'installé.

Runtime minuscule : cyrt

Un petit runtime lié à chaque binaire — allocateur, gestionnaire de panique, intrinsèques. Visé à quelques centaines de kilo-octets, pas des méga-octets. Embarqué et plausible en WASM.

.C

FFI C23

@external(c, "...") est l'unique surface d'interopérabilité native. Appelez du C et soyez appelé par du C avec des signatures complètes, des largeurs explicites et une nullabilité explicite — sans glu écrite à la main.

Même syntaxe, même âme

Flux uniquement par switch, Option/Result, types explicites — une grammaire identique à ~85 % à celle de Cyra. La compétence et le code source franchissent la frontière géré/natif.

L'arborescence

Une grammaire, un noyau sémantique, deux backends — à la manière dont C a une implémentation hébergée et une autonome. Le tronc est la grammaire partagée ; les deux branches ne divergent que là où le modèle de runtime les y contraint.

// le dialecte BEAM

Cyra

Chaleureux et géré. S'exécute sur une machine.

  • Cible VM Erlang — dynamique, rechargement à chaud
  • Acteurspid / ref / port
  • Entiers à précision arbitraire
  • FFI :erlang.* · stdlib Cyra.*

// le dialecte natif

Cyr

Bare metal. Est le code machine.

  • Cible LLVMAOT, binaire statique
  • FFI C23ptr<T>, @external(c, "...")
  • i64 par défaut + bigint sur option
  • runtime cyrt · stdlib Cyr.*

De votre application jusqu'au PID 1.

Cyr vise explicitement le développement système et OS de bas niveau — jusqu'à et y compris un init/PID 1, des démons, des pilotes et du code autonome bare-metal. Plus le profil est exigeant, plus le langage s'efface. La portée de Cyr s'organise en trois profils d'exécution.

1

hébergé

application · démon · CLI

Un programme natif ordinaire sur un OS complet. Toute la pile est disponible, et cyrt utilise le tas et les threads de l'OS.

cyrt complet + stdlib Cyr.* complète + libc
2

autonome-hébergé

init / PID 1 · binaire statique minimal

Un noyau est présent mais l'espace utilisateur est minimal. PID 1 ne devrait pas traîner une libc complète — une fine couche d'appels système directs dialogue avec le noyau.

cyrt + Cyr.Core + libc fine / appels système
3

bare-metal

noyau · bootloader · firmware · ISR

Aucun OS du tout. Vous apportez l'allocateur ; il n'y a ni threads, ni libc, ni déroulement de pile. Asm inline, volatile/MMIO, atomiques, points d'entrée personnalisés.

cyrt-core seul · pas de libc, pas d'allocateur OS

Natif, explicite, sans ambiguïté

Un fragment de pilote avec FFI C23, agencement compact, Option au lieu de null, et récursion terminale qui s'exécute en pile constante — le tout dans la syntaxe Cyra familière.

driver.cyr
module Sensor.Driver {
    use Cyr.Result;

    // C23 FFI — the single native interop surface
    @external(c, "read_register")
    fn read_register(addr: ptr<u32>) -> u32;

    @repr(packed)
    struct Reading { id: u16; value: i32; }

    // switch-only flow; Option<T> for absence, never null
    pub fn decode(raw: u32) -> Option<Reading> {
        switch raw {
            0 => None;
            _ => Some(Reading { id: 1, value: raw as i32 });
        }
    }

    // guaranteed constant stack — TCO holds at the CIR layer
    fn sum(xs: list<i64>, acc: i64) -> i64 {
        switch xs {
            []        => acc;
            h :: rest => sum(rest, acc + h);   // i64 traps on overflow
        }
    }

    @entry
    pub fn main() -> i32 { 0; }
}

Décisions clés

Cyr part des prémisses que Cyra a déjà établies, plus un ensemble de portes à sens unique ratifiées par le conseil philosophique à la genèse. Ce sont les attentes auxquelles Cyr s'engage.

i64

Pas de débordement silencieux

i64 par défaut ; l'arithmétique déclenche un trap par défaut. wrapping, saturating et bigint sont des options explicites.

?:

Absence uniquement via Option

nil est retiré des types non-Option. Le null ne vit que derrière ptr/any, au mur du C.

TCO garantie

La récursion en position terminale — y compris la récursion mutuelle — s'exécute en pile constante. Une garantie sémantique au niveau CIR, pas une foi en LLVM.

&

ARC, pas de borrow checker

La mémoire est ARC + arène sur option + weak. La sûreté est relocalisée dans les valeurs par défaut du compilateur, pas dans des annotations de durée de vie écrites par l'auteur — le bon choix pour un corpus rédigé par un LLM.

!!

unsafe bruyant et minimal

Le déréférencement brut de ptr<T> et les down-casts any ne vivent qu'à l'intérieur d'unsafe — repérables au grep et auditables.

::

Une stdlib Cyr.* distincte

Cyr réécrit sa bibliothèque standard nativement. La portabilité vit dans la grammaire, pas dans les noms de bibliothèque — une ligne use est toujours honnête sur son dialecte.

Ce que Cyr n'est pas

Pas une réécriture ni un fork

Cyr n'est pas « Cyra 2.0 » et ne diverge pas en syntaxe. C'est un seul langage avec deux backends — pas deux langages en concurrence.

Pas une marque distincte

Cyr fait partie du même projet — mêmes outils, même communauté — et non d'un produit rival doté de sa propre identité.

Pas le modèle d'acteurs

pid, ref, port, spawn, receive, send sont supprimés. Tout ce qui ressemble à un acteur est une bibliothèque, pas une primitive du langage.

Pas un argumentaire système généraliste

Cyr s'adresse aux gens qui aiment déjà Cyra et veulent maintenant écrire la couche située sous leurs applications — pas un argumentaire destiné au grand public de la programmation système.

Décidé délibérément, une seule fois

« Continuité du code source et de la compétence »

La maxime pragmatique de Peirce est le test de Cyr : quelle différence concrète Cyr fait-il que « Cyra plus utilisez simplement C » ne fait pas ? La réponse — la continuité du code source et de la compétence à travers la frontière géré/natif — gouverne chaque choix de conception.

« Grammaire partagée, bibliothèque honnête »

Les dialectes partagent ~85 % de leur syntaxe — le véritable actif transférable. Ils ne partagent délibérément pas les noms de bibliothèque : la cohérence appartient à la syntaxe et à la CLI ; l'honnêteté appartient à l'espace de noms.

« Vingt et un philosophes, une charte »

Les Quatre Causes d'Aristote cadrent l'effort ; Popper nomme ce qui falsifierait le succès ; les antinomies de Kant maintiennent le conseil honnête. Dix-huit domaines de conception ouverts ont été lus par les vingt et un, et les décisions clés ratifiées — le conseil fonctionne sous le nom d'organon, ouvert sur GitLab.