Book · Chapter 4

2. Philosophie et design

2. Philosophie et design

Un langage bas niveau doit faire deux choses : ne pas vous mentir et ne pas vous surprendre. Vitte a Ă©tĂ© pensĂ© autour de cette idĂ©e. C’est un langage qui prĂ©fĂšre la clartĂ© Ă  la magie, et la stabilitĂ© Ă  la nouveautĂ© permanente.

Principes

ClartĂ© par dĂ©faut : le code doit se lire comme un contrat. Diagnostics prĂ©cis : les messages d’erreur doivent aider, pas juger. Pipeline transparent : comprendre la compilation doit ĂȘtre possible sans lire 100 000 lignes de code. Reproductibilité : un build doit ĂȘtre un rĂ©sultat, pas une loterie.

Ces principes ne sont pas dĂ©coratifs. Ils influencent la syntaxe, les messages d’erreur, et mĂȘme la maniĂšre dont on organise les modules.

Le coût des abstractions

Les abstractions sont utiles, mais elles ont un coĂ»t. Vitte vous demande d’ĂȘtre explicite sur ce coĂ»t. Cela rend le code plus verbeux au dĂ©but, mais il devient plus robuste quand l’équipe grandit. Un code court mais incomprĂ©hensible est une victoire de dix minutes ; un code clair est une victoire de dix ans.

Ce que Vitte n’est pas

Un langage « magique ». Un macro‑systĂšme sans garde‑fous. Un systĂšme qui cache l’ABI ou les appels externes.

Cette position peut sembler austÚre au début. Mais elle paie vite quand le projet grandit.

Le rĂŽle du compilateur

Le compilateur n’est pas un oracle. Il est un partenaire : il vous signale les incohĂ©rences, il refuse les ambiguĂŻtĂ©s, et il vous aide Ă  rester honnĂȘte. Cette relation est saine : elle vous pousse Ă  expliciter vos hypothĂšses.

La stabilité comme stratégie

Les projets long‑vivants demandent un langage qui ne change pas Ă  chaque mode. La stabilitĂ© n’est pas un conservatisme, c’est une stratĂ©gie : elle rĂ©duit les coĂ»ts de maintenance et rend le code plus abordable pour les nouvelles recrues.

Lisibilité et performance ne sont pas des ennemies

Un code lisible ne signifie pas un code lent. Au contraire : la lisibilitĂ© vous permet d’identifier les vrais chemins chauds, et donc d’optimiser lĂ  oĂč c’est utile. Le code obscur, lui, dissipe vos efforts.

Le contrat implicite

Vitte vous demande d’ĂȘtre explicite, mais en Ă©change il promet quelque chose : un contrat stable, des diagnostics cohĂ©rents, et un pipeline comprĂ©hensible. C’est un pacte entre le langage et le dĂ©veloppeur.

À retenir

Le design de Vitte privilégie la durabilité du code. Si vous hésitez entre « court » et « clair », choisissez « clair ».

Deux styles de code

Comparez ces deux styles :

Style A : court, dense, difficile à lire. Style B : plus long, mais chaque étape est visible.

Un compilateur accepte les deux. Une équipe, elle, préfÚre le second. La lisibilité est un acte collectif.

Pourquoi la simplicité est une stratégie

Quand un bug survient, vous n’avez pas besoin d’une thĂ©orie. Vous avez besoin d’une trace lisible. La simplicitĂ© augmente la probabilitĂ© que votre futur vous comprenne.

Erreurs courantes de philosophie

Confondre “minimal” et “opaque”. Penser que la syntaxe magique accĂ©lĂšre les Ă©quipes. Sacrifier la lisibilitĂ© pour une optimisation non mesurĂ©e.

Checklist de design

Chaque module a une responsabilité claire. Les interfaces sont petites et bien nommées. Les erreurs sont actionnables. Le build est reproductible.

Exercice : écrire pour un autre

Prenez un petit bout de code que vous connaissez bien. Réécrivez‑le comme si vous deviez l’expliquer Ă  une personne qui ne connaĂźt pas votre projet. Si votre code devient plus clair, vous avez compris la philosophie.

O’Reilly en une phrase

Un langage est une promesse d’explications futures. Vitte vous demande d’ĂȘtre explicite aujourd’hui pour Ă©viter l’opacitĂ© demain.

Code complet (API actuelle)

Exemple de deux styles : l’un compact, l’autre lisible.

proc sum_compact(a: [i32]) -> i32 {
  let i: i32 = 0
  let s: i32 = 0
  loop { if i >= a.len as i32 { break } s = s + a[i as usize]; i = i + 1 }
  give s
}

proc sum_clear(a: [i32]) -> i32 {
  let i: i32 = 0
  let s: i32 = 0
  loop {
    if i >= a.len as i32 { break }
    set s = s + a[i as usize]
    i = i + 1
  }
  give s
}

API idéale (future)

Un formalisme de style (lint) qui encourage les blocs lisibles au lieu des expressions compressées.