❌

Vue lecture

Programmer des dĂ©monstrations : une modeste invitation aux assistants de preuve

En principe, une dĂ©monstration mathĂ©matique ne fait que suivre des rĂšgles logiques bien dĂ©finies, et devrait donc pouvoir ĂȘtre encodĂ©e informatiquement et vĂ©rifiĂ©e par un ordinateur. OĂč en est-on dans la pratique et dans la thĂ©orie ? Petit tour au pays des assistants de preuve, des langages de programmation dĂ©diĂ©s aux dĂ©monstrations, et de leur fondement thĂ©orique le plus commun, la thĂ©orie des types.

Sommaire

VĂ©rifier des programmes

Comme nous sommes sur LinuxFr.org, je devrais peut-ĂȘtre commencer par ceci : nous passons Ă©normĂ©ment de temps Ă  dĂ©couvrir des bugs, et pour les personnes du dĂ©veloppement logiciel, Ă  les comprendre, Ă  les rĂ©soudre, et de prĂ©fĂ©rence Ă  les Ă©viter en Ă©crivant des tests.

Dans une formation universitaire de base en informatique, on rencontre des algorithmes, mais aussi des mĂ©thodes pour prouver que ces algorithmes terminent et rĂ©pondent bien au problĂšme posĂ©. Les premiĂšres introduites sont typiquement les variants de boucle (montrer qu’une certaine valeur dĂ©croĂźt Ă  chaque itĂ©ration, ce qui assure que le programme termine si elle ne peut pas dĂ©croĂźtre Ă  l’infini), et les invariants de boucle (montrer qu’une certaine propriĂ©tĂ© vraie au dĂ©but d’une boucle est prĂ©servĂ©e entre deux itĂ©rations, ce qui assure qu’elle reste encore vraie Ă  la fin de la boucle).

On a donc, d’une part, un algorithme, implĂ©mentable sur machine, d’autre part une preuve, sur papier, que l’algorithme est correct. Mais si l’implĂ©mentation a une erreur par rapport Ă  l’algorithme sur papier ? Et puisque nous n’arrĂȘtons pas de nous tromper dans nos programmes, il est fort possible que nous nous trompions dans notre preuve (qui n’a jamais oubliĂ© qu’il fallait faire quelque chose de spĂ©cial dans le cas n = 0 ?).

En tant que programmeurs, on peut imaginer une approche oĂč non seulement l’algorithme est implĂ©mentĂ©, mais sa preuve de terminaison et de correction est aussi « implĂ©mentĂ©e Â», c’est-Ă -dire encodĂ©e dans un langage qui ressemble Ă  un langage de programmation, pour ĂȘtre ensuite non pas interprĂ©tĂ©e ou compilĂ©e mais vĂ©rifiĂ©e.

La vĂ©rification est un trĂšs vaste domaine de l’informatique, dont je ne suis pas spĂ©cialiste du tout, et dans lequel il existe Ă©normĂ©ment d’approches : la logique de Hoare (voir par exemple l’outil why3), qui est essentiellement un raffinement des variants et invariants de boucle, la logique de sĂ©paration spĂ©cialement conçue pour raisonner sur la mĂ©moire mutable (voir Iris), le model checking qui se concentre sur des programmes d’une forme particuliĂšrement simple (typiquement des systĂšmes de transition finis) pour en vĂ©rifier des propriĂ©tĂ©s de façon complĂštement automatisĂ©e, etc.

Dans cette dĂ©pĂȘche, je vais parler d’une approche avec quelques caractĂ©ristiques particuliĂšres :

  • On vĂ©rifie des programmes purement fonctionnels (pas d’effets de bord, mĂȘme si on peut les simuler).

  • Le mĂȘme langage mĂ©lange Ă  la fois les programmes et leurs preuves.

  • Plus prĂ©cisĂ©ment, le langage ne fait pas (ou peu) de distinction entre les programmes et les preuves.

Vérifier des démonstrations mathématiques

Pour se convaincre de l’ampleur que les dĂ©monstrations ont prise dans les mathĂ©matiques contemporaines, il suffit d’aller jeter un Ɠil, par exemple, au projet Stacks : un livre de rĂ©fĂ©rence sur la gĂ©omĂ©trie algĂ©brique, Ă©crit collaborativement sur les 20 derniĂšres annĂ©es, dont l’intĂ©grale totalise plus de 7500 pages trĂšs techniques. Ou bien la dĂ©monstration du thĂ©orĂšme de classification des groupes finis simples : la combinaison de rĂ©sultats rĂ©partis dans les dizaines de milliers de pages de centaines d’articles, et une preuve « simplifiĂ©e Â» toujours en train d’ĂȘtre Ă©crite et qui devrait faire plus de 5000 pages. Ou bien le thĂ©orĂšme de Robertson-Seymour, monument de la thĂ©orie des graphes aux nombreuses applications algorithmiques : 20 articles publiĂ©s sur 20 ans, 400 pages en tout. Ou bien, tout simplement, le nombre de rĂ©fĂ©rences dans la bibliographie de la moindre thĂšse ou d’articles publiĂ©s rĂ©cemment sur arXiv.

InĂ©vitablement, beaucoup de ces dĂ©monstrations contiennent des erreurs. Parfois dĂ©couvertes, parfois beaucoup plus tard. Un exemple assez cĂ©lĂšbre est celui d’un thĂ©orĂšme, qui aurait Ă©tĂ© trĂšs important s’il avait Ă©tĂ© vrai, publiĂ© en 1989 par Vladimir Voedvodsky, un cĂ©lĂšbre mathĂ©maticien dont je vais ĂȘtre amenĂ© Ă  reparler plus bas, avec Mikhail Kapranov. Comme racontĂ© par Voedvodsky lui-mĂȘme, un contre-exemple a Ă©tĂ© proposĂ© par Carlos Simpson en 1998, mais jusqu’en 2013, Voedvodsky lui-mĂȘme n’était pas sĂ»r duquel Ă©tait faux entre sa preuve et le contre-exemple !

Il y a aussi, souvent, des « trous Â», qui ne mettent pas tant en danger la dĂ©monstration mais restent gĂȘnants : par exemple, « il est clair que la mĂ©thode classique de compactification des espaces Lindelöf s’applique aussi aux espaces quasi-Lindelöf Â», quand l’auteur pense Ă©vident qu’un argument existant s’adapte au cas dont il a besoin mais que ce serait trop de travail de le rĂ©diger entiĂšrement. Donc, assez naturellement, un but possible de la formalisation des maths est de produire des dĂ©monstrations qui soient certifiĂ©es sans erreur (et sans trou).

Mais c’est loin d’ĂȘtre le seul argument. On peut espĂ©rer d’autres avantages, qui pour l’instant restent de la science-fiction, mais aprĂšs tout ce n’est que le dĂ©but : par exemple, on peut imaginer que des collaborations Ă  grande Ă©chelle entre beaucoup de mathĂ©maticiens deviennent possibles, grĂące au fait qu’il est beaucoup plus facile de rĂ©utiliser le travail partiel de quelqu’un d’autre s’il est formalisĂ© que s’il est donnĂ© sous formes d’ébauches informelles pas complĂštement rĂ©digĂ©es.

Brouwer-Heyting-Kolmogorov

Parmi les assistants de preuve existants, la plupart (mais pas tous) se fondent sur une famille de systĂšmes logiques rangĂ©s dans la famille des « thĂ©ories des types Â». L’une des raisons pour lesquelles ces systĂšmes sont assez naturels pour ĂȘtre utilisĂ©s en pratique est qu’en thĂ©orie des types, les preuves et les programmes deviennent entiĂšrement confondus ou presque, ce qui rend facile le mĂ©lange entre les deux.

Mais comment est-ce qu’un programme devient une preuve, au juste ? L’idĂ©e de base est appelĂ©e interprĂ©tation de Brouwer-Heyting-Kolomogorov et veut que les preuves mathĂ©matiques se comprennent de la façon suivante :

  • Le moyen de base pour prouver une proposition de la forme « P et Q Â» est de fournir d’une part une preuve de P et une preuve de Q. En d’autres mots, une preuve de « P et Q Â» rassemble en un mĂȘme objet une preuve de P et une preuve de Q. Mais en termes informatiques, ceci signifie qu’une preuve de « P et Q Â» est une paire d’une preuve de P et d’une preuve de Q.

  • De mĂȘme, pour prouver « P ou Q Â», on peut prouver P, ou on peut prouver Q. Informatiquement, une preuve de « P ou Q Â» va ĂȘtre une union disjointe : une preuve de P ou une preuve de Q, avec un bit pour savoir dans quel cas on est.

  • Pour prouver « Vrai Â», il suffit de dire « c’est vrai Â» : on a une unique preuve de « Vrai Â».

  • On ne doit pas pouvoir prouver « Faux Â», donc une preuve de « Faux Â» n’existe pas.

  • Et le plus intĂ©ressant : pour prouver « si P alors Q Â», on suppose temporairement P et on en dĂ©duit Q. Informatiquement, ceci doit devenir une fonction qui prend une preuve de P et renvoie une preuve de Q.

Curry-Howard

L’interprĂ©tation de Brouwer-Heyting-Kolmogorov est informelle, et il existe plusieurs maniĂšres de la rendre formelle. Par exemple, on peut interprĂ©ter tout ceci par des programmes dans un langage complĂštement non-typĂ©, ce qui s’appelle la rĂ©alisabilitĂ©.

Mais en thĂ©orie des types, on prend plutĂŽt un langage statiquement typĂ© pour suivre l’idĂ©e suivante : si une preuve de P et Q est une paire d’une preuve de P et d’une preuve de Q, alors le type des paires de P et Q peut se comprendre comme le type des preuves de « P et Q Â». On peut faire de mĂȘme avec les autres types de preuves, et ceci s’appelle la correspondance de Curry-Howard. Autrement dit, lĂ  oĂč Brouwer-Heyting-Kolmogorov est une correspondance entre les preuves et les programmes, Curry-Howard est un raffinement qui met aussi en correspondance les propositions logiques avec les types du langage, et la vĂ©rification des preuves se confond entiĂšrement avec le type checking.

Sur les cas que j’ai donnĂ©s, la correspondance de Curry-Howard donne :

  • La proposition « P et Q Â» est le type des paires d’un Ă©lĂ©ment de P et d’un Ă©lĂ©ment de Q,

  • La proposition « P ou Q Â» est le type somme de P et Q (comme Either en Haskell et OCaml, les tagged unions en C, et std::variant en C++ : l’un ou l’autre, avec un boolĂ©en pour savoir lequel),

  • La proposition « Vrai Â» est le type trivial Ă  une seule valeur (comme () en Haskell et Rust, unit en OCaml),

  • La proposition « Faux Â» est le type vide qui n’a aucune valeur (comme ! en Rust),

  • La proposition « si P alors Q Â» est le type des fonctions qui prennent un argument de type P et renvoient une valeur de type Q.

Quantificateurs et types dépendants

La version de Curry-Howard que j’ai esquissĂ©e donne une logique dite « propositionnelle Â» : il n’y a que des propositions, avec des connecteurs entre elles. Mais en maths, on ne parle Ă©videmment pas que des propositions. On parle de nombres, de structures algĂ©briques, d’espaces topologiques, 
, bref, d’objets mathĂ©matiques, et des propriĂ©tĂ©s de ces objets. Les deux types principaux de propositions qui manquent sont ce qu’on appelle les quantificateurs : « Pour tout x, 
 Â» et « Il existe x tel que
 Â». Ici, ce qui est une Ă©vidence en logique devient moins Ă©vident, mais trĂšs intĂ©ressant, du cĂŽtĂ© des programmes.

Prenons pour l’exemple le thĂ©orĂšme des deux carrĂ©s de Fermat, qui Ă©nonce (dans l’une de ses variantes) qu’un nombre premier impair est de la forme 4n+1 si et seulement s’il peut s’écrire comme somme de deux carrĂ©s parfaits. À quoi doit ressembler le type associĂ© Ă  cette proposition ? Par analogie avec les implications, on a envie de dire que cela devrait ĂȘtre une fonction, qui prend un nombre premier impair p, et renvoie une preuve de l’équivalence. ProblĂšme : ce qui est Ă  droite de l’équivalence est une proposition paramĂ©trĂ©e par p. Autrement dit, en notant P le type des nombres premiers impairs, on ne veut plus un simple type fonction P → E, mais un type fonction oĂč le type de retour peut dĂ©pendre de la valeur passĂ©e Ă  la fonction, notĂ© par exemple (p : P) → E(p). Ces types qui dĂ©pendent de valeurs sont appelĂ©s types dĂ©pendants.

Dans les langages de programmation populaires, il est rare de trouver des types dĂ©pendants. Mais on en retrouve une forme faible en C avec les tableaux de longueur variable (VLA pour « variable-length arrays Â») : on peut Ă©crire


 f(int n) {
  int array[n];
  

}

qui dĂ©clare un tableau dont la taille n est une expression. NĂ©anmoins, en C, mĂȘme si on dispose de ce type tableau qui est en quelque sorte dĂ©pendant, on ne peut pas Ă©crire une fonction « int[n] f(int n) Â» qui renvoie un tableau dont la longueur est passĂ©e en paramĂštre. Plus rĂ©cemment, en Rust, il existe les const generics, oĂč des valeurs se retrouvent dans les types et oĂč on peut Ă©crire fn f<const n: usize>() -> [u8; n], ce qui est un vrai type dĂ©pendant, mais cette fois avec la restriction assez sĂ©vĂšre que toutes ces valeurs peuvent ĂȘtre calculĂ©es entiĂšrement Ă  la compilation, ce qui Ă  cause de la façon dont fonctionne ce type de calcul en Rust empĂȘche par exemple les allocations mĂ©moire. (Donc l’implĂ©mentation est assez diffĂ©rente, elle efface ces valeurs en « monomorphisant Â» tous les endroits oĂč elles apparaissent.)

En thĂ©orie des types, le langage est (normalement) purement fonctionnel, donc les problĂšmes d’effets de bord dans les valeurs Ă  l’intĂ©rieur des types dĂ©pendants ne se pose pas. Le type checking peut dĂ©clencher des calculs arbitrairement complexes pour calculer les valeurs qui se trouvent dans les types.

Et le « il existe Â», au fait, Ă  quoi correspond-il ? Cette fois, ce n’est plus une fonction dĂ©pendante mais une paire dĂ©pendante : une preuve de « Il existe x tel que E(x) Â» est une paire d’une valeur x et d’une preuve de E(x). La diffĂ©rence avec une paire normale est que le type du deuxiĂšme Ă©lĂ©ment peut dĂ©pendre de la valeur du premier Ă©lĂ©ment.

Comme on peut commencer Ă  s’en douter, le fait d’avoir des types dĂ©pendants est utile pour prouver des affirmations mathĂ©matiques, mais aussi, bien qu’il puisse sembler inhabituel, pour prouver des programmes, et plus prĂ©cisĂ©ment pour encoder des propriĂ©tĂ©s des valeurs dans les types. LĂ  oĂč on aurait dans un langage moins expressif une fonction qui renvoie deux listes, avec une remarque dans la documentation qu’elles sont toujours de mĂȘme taille, dans un langage avec des types dĂ©pendants, on peut renvoyer un triplet d’un entier n, d’une liste dont le type indique qu’elle est de taille n, et une deuxiĂšme liste elle aussi de taille n. Et lĂ  oĂč on aurait un deuxieme_liste[indice_venant_de_la_premiere] avec un commentaire que cela ne peut pas produire d’erreur, car les deux listes sont de mĂȘme taille, on a un programme qui utilise la garantie que les deux listes sont de mĂȘme taille, et le typage garantit statiquement que cette opĂ©ration t[i] ne produira pas d’erreur.

Logique intuitionniste

Reprenons l’exemple du thĂ©orĂšme des deux carrĂ©s de Fermat. Nous pouvons maintenant traduire cette proposition en un type : celui des fonctions qui prennent un nombre premier impair p et renvoient une paire de :

  • Une fonction qui prend n tel que p = 4n+1 et renvoie deux entiers a, b accompagnĂ©s d’une preuve que a^2 + b^2 = p,

  • RĂ©ciproquement, une fonction qui prend a, b et une preuve de a^2 + b^2 = p, et renvoie n tel que p = 4n+1.

Prouver le thĂ©orĂšme des deux carrĂ©s de Fermat en thĂ©orie des types, c’est donner un Ă©lĂ©ment (on dit plutĂŽt « habitant Â») de ce type, soit un programme dont le langage peut vĂ©rifier qu’il a ce type. Mais que fait au juste ce programme quand on l’exĂ©cute ? On voit qu’il permet notamment de calculer une dĂ©composition d’un nombre premier impair congru Ă  1 modulo 4 comme somme de deux carrĂ©s.

LĂ , c’est le cĂŽtĂ© « programmes Â» qui apporte un Ă©lĂ©ment moins habituel du cĂŽtĂ© « preuves Â» : l’exĂ©cution d’un programme va correspondre Ă  un processus de simplification des preuves. Notamment, si on a une preuve de « si P alors Q Â» et une preuve de P, on peut prendre la preuve de P et remplacer chaque utilisation de l’hypothĂšse P dans la preuve de « si P alors Q Â», pour obtenir une preuve de Q qui peut contenir de multiples copies d’une mĂȘme preuve de P. Cette opĂ©ration de simplification du cĂŽtĂ© logique correspond naturellement au fait que la maniĂšre en thĂ©orie des types de prouver Q Ă  partir d’une preuve f de P ⇒ Q et d’une preuve x de P est tout simplement d’écrire f(x), et que calculer f(x), informatiquement, se fait bien en remplaçant le paramĂštre de f Ă  tous les endroits oĂč il apparaĂźt par la valeur x et Ă  simplifier le rĂ©sultat. On dit que la logique de Curry-Howard est constructive, parce qu’elle se prĂȘte Ă  une interprĂ©tation algorithmique.

Mais ceci peut sembler gĂȘnant. Par exemple, il est trivial en maths « normales Â» de prouver que tout programme termine ou ne termine pas. Mais par Curry-Howard, une preuve que tout programme termine ou ne termine pas doit ĂȘtre une fonction qui prend un programme, et qui renvoie soit une preuve qu’il termine, soit une preuve qu’il ne termine pas. Autrement dit, si cette proposition censĂ©ment triviale Ă©tait prouvable dans Curry-Howard, on aurait un algorithme pour rĂ©soudre le problĂšme de l’arrĂȘt, ce qui est bien connu pour ĂȘtre impossible.

L’explication Ă  cette diffĂ©rence tient au fait que la preuve « triviale Â» de cette proposition utilise une rĂšgle de dĂ©duction qui a un statut un peu Ă  part en logique, dite rĂšgle du tiers exclu : pour n’importe quelle proposition P, sans aucune hypothĂšse, on peut dĂ©duire « P ou (non P) Â» (autrement dit, que P est vraie ou fausse). Or cette rĂšgle n’admet pas d’interprĂ©tation Ă©vidente par Curry-Howard : le tiers exclu devrait prendre une proposition P et renvoyer soit une preuve de P, soit une preuve que P est fausse (ce qui s’encode par « si P alors Faux Â»), autrement dit, le tiers exclu devrait ĂȘtre un oracle omniscient capable de vous dire si une proposition arbitraire est vraie ou fausse, et ceci est bien Ă©videmment impossible.

(Cela dit, si vous voulez vous faire mal Ă  la tĂȘte, apprenez que c’est l’opĂ©rateur call/cc et pourquoi l’ajouter permet de prouver le tiers exclu. Exercice : call/cc existe dans de vrais langages, comme Scheme, pourtant on vient de voir que le tiers exclu semble nĂ©cessiter un oracle omniscient, comment expliquer cela ?)

Pour ĂȘtre prĂ©cis, la logique sans le tiers exclu est dite intuitionniste (le terme constructive Ă©tant un peu flou, alors que celui-ci est prĂ©cis). On peut faire des maths en restant entiĂšrement en logique intuitionniste, et mĂȘme si ce n’est pas le cas de l’écrasante majoritĂ© des maths, il existe tout de mĂȘme un certain nombre de chercheurs qui le font, et ceci peut avoir divers intĂ©rĂȘts. Il y a notamment l’interprĂ©tation algorithmique des thĂ©orĂšmes, mais aussi, de maniĂšre beaucoup plus avancĂ©e, le fait que certaines structures mathĂ©matiques (topos, ∞-topos et consorts) peuvent s’interprĂ©ter comme des sortes d’univers mathĂ©matiques alternatifs rĂ©gis par les rĂšgles de la logique intuitionniste (techniquement, des « modĂšles Â» de cette logique), et que parfois il est plus simple de prouver un thĂ©orĂšme en le traduisant Ă  l’intĂ©rieur de l’univers et en prouvant cette version traduite de maniĂšre intuitionniste.

Pour pouvoir malgrĂ© tout raisonner en thĂ©orie des types de maniĂšre classique (par opposition Ă  intuitionniste), il suffit de postuler le tiers exclu comme axiome. Du point de vue des programmes, cela revient Ă  rajouter une constante qui est supposĂ©e avoir un certain type mais qui n’a pas de dĂ©finition (cela peut donc rendre les programmes impossibles Ă  exĂ©cuter, ce qui est normal pour le tiers exclu).

Quelques exemples

Si vous aviez dĂ©crochĂ©, c’est le moment de reprendre. Parlons un peu des assistants de preuve qui existent. Les plus connus sont :

  • Rocq, anciennement nommĂ© Coq, dĂ©veloppĂ© Ă  l’Inria depuis 1989, Ă©crit en OCaml, sous licence LGPL 2.1. Il est assez liĂ© Ă  l’histoire de la thĂ©orie des types, car il a Ă©tĂ© crĂ©Ă© par Thierry Coquand comme premiĂšre implĂ©mentation du calcul des constructions, une thĂ©orie des types inventĂ©e par Coquand et devenue l’une des principales existantes. (Oui, Coq a Ă©tĂ© renommĂ© en Rocq Ă  cause de l’homophonie en anglais entre « Coq Â» et « cock Â». J’apprĂ©cierais que les commentaires ne se transforment pas en flame war sur ce sujet trĂšs peu intĂ©ressant, merci.)

  • Lean, crĂ©Ă© par Leonardo de Moura et dĂ©veloppĂ© depuis 2013 chez Microsoft Research, Ă©crit en C++, placĂ© sous licence Apache 2.0.

  • Agda, crĂ©Ă© par Ulf Norrell en 1999, Ă©crit en Haskell et sous licence BSD 1-clause.

  • D’autres que je connais moins, notamment Isabelle et F* (liste sur WikipĂ©dia).

Pour illustrer comment peuvent fonctionner les choses en pratique, voici un exemple trĂšs simple de code en Agda :

open import Agda.Primitive using (Level)
open import Data.Product using (_×_; _,_)

swap : {ℓ₁ ℓ₂ : Level} → {P : Set ℓ₁} {Q : Set ℓ₂} → P × Q → Q × P
swap (p , q) = (q , p)

Vue comme un programme, cette fonction swap inverse simplement les deux Ă©lĂ©ments d’une paire. Vue comme une preuve, elle montre que pour toutes propositions P et Q, si P et Q, alors Q et P. Comme le veut Curry-Howard, les deux ne sont pas distinguĂ©s. Les types P et Q sont eux-mĂȘmes dans des types \mathsf{Set}_\ell avec un « niveau Â» \ell, ceci parce que, pour des raisons logiques, il serait incohĂ©rent que le type des types soit de son propre type, donc on a un premier type de types \mathsf{Set}_0, qui est lui-mĂȘme de type \mathsf{Set}_1, et ainsi de suite avec une hiĂ©rarchie infinie de niveaux appelĂ©s univers. À un niveau plus superficiel, on remarquera qu’Agda a une syntaxe qui ressemble fort Ă  Haskell (et utilise intensivement Unicode).

VoilĂ  la mĂȘme chose en Rocq :

Definition swap {P Q : Prop} : P /\ Q -> Q /\ P :=
  fun H => match H with conj p q => conj q p end.

La syntaxe est assez diffĂ©rente et ressemble plutĂŽt Ă  OCaml (normal, vu que Rocq est Ă©crit en OCaml et Agda en Haskell). Mais Ă  un niveau plus profond, on voit apparaĂźtre un type Prop dont le nom Ă©voque furieusement les propositions. Or j’avais promis que les propositions seraient confondues avec les types, donc pourquoi a-t-on un type spĂ©cial pour les propositions ?

En rĂ©alitĂ©, pour diverses raisons, il peut ĂȘtre intĂ©ressant de briser l’analogie d’origine de Curry-Howard et de sĂ©parer les propositions et les autres types en deux mondes qui se comportent de façon extrĂȘmement similaire mais restent nĂ©anmoins distincts. Notamment, un principe qu’on applique sans rĂ©flĂ©chir en maths est que si deux propositions sont Ă©quivalentes, alors elles sont Ă©gales (extensionnalitĂ© propositionnelle), mais on ne veut clairement pas ceci pour tous les types (on peut donner des fonctions bool -> int et int -> bool, pourtant on ne veut certainement pas bool = int), donc sĂ©parer les propositions des autres permet d’ajouter l’extensionnalitĂ© propositionnelle comme axiome. (Mais il y a aussi des diffĂ©rences comme l'imprĂ©dicativitĂ© dans lesquelles je ne vais pas rentrer.)

Et voici encore le mĂȘme code, cette fois en Lean :

def swap {P Q : Prop} : P ∧ Q → Q ∧ P :=
  fun ⟹p, q⟩ => ⟹q, p⟩

À part les diffĂ©rences de syntaxe, c’est trĂšs similaire Ă  Rocq, parce que Lean a aussi une sĂ©paration entre les propositions et les autres types.

Cependant, en Rocq et Lean, on peut aussi prouver la mĂȘme proposition de façon diffĂ©rente :

Lemma swap {P Q : Prop} : P /\ Q -> Q /\ P.
Proof.
  intros H. destruct H as [p q]. split.
  - apply q.
  - apply p.
Qed.

et

def swap {P Q : Prop} : P ∧ Q → Q ∧ P := by
  intro h
  have p := h.left
  have q := h.right
  exact ⟹q, p⟩

Avec Proof. ou by, on entre dans un mode oĂč les preuves ne sont plus Ă©crites Ă  la main comme programmes, mais avec des tactiques, qui gĂ©nĂšrent des programmes. Il existe toutes sortes de tactiques, pour appliquer des thĂ©orĂšmes existants, raisonner par rĂ©currence, rĂ©soudre des inĂ©galitĂ©s, ou mĂȘme effectuer de la recherche automatique de dĂ©monstration, ce qui s’avĂšre extrĂȘmement utile pour simplifier les preuves.

Ce mode « tactiques Â» permet aussi d’écrire la preuve de façon incrĂ©mentale, en faisant un point d’étape aprĂšs chaque tactique pour voir ce qui est prouvĂ© et ce qui reste Ă  prouver. Voici par exemple ce qu’affiche Rocq aprĂšs le destruct et avant le split :

  P, Q : Prop
  p : P
  q : Q
  ============================
  Q /\ P

Cette notation signifie que le contexte ambiant contient les variables P et Q de type Prop ainsi que p une preuve de P (donc un Ă©lĂ©ment du type P) et q une preuve de Q. Le Q /\ P en dessous de la barre horizontale est le but Ă  prouver, c’est-Ă -dire le type dont on cherche Ă  construire un Ă©lĂ©ment.

Agda fonctionne assez diffĂ©remment : il n’y a pas de tactiques, mais il existe nĂ©anmoins un systĂšme de mĂ©ta-programmation qui sert Ă  faire de la recherche de preuves (donc contrairement Ă  Rocq et Lean, on n’écrit pas la majeure partie des preuves avec des tactiques, mais on peut se servir d’un Ă©quivalent quand c’est utile). Pour Ă©crire les preuves incrĂ©mentalement, on met ? dans le programme quand on veut ouvrir une sous-preuve, et Agda va faire le type-checking de tout le reste et donner le contexte Ă  l’endroit du ?.

Quelques succĂšs de la formalisation

En 2025, la formalisation reste trĂšs fastidieuse, mais elle a dĂ©jĂ  eu plusieurs grands succĂšs :

Actuellement, Lean a rĂ©ussi Ă  attirer une communautĂ© de mathĂ©maticiens qui dĂ©veloppent mathlib (1,1 million de lignes de code Lean au moment oĂč j’écris), une bibliothĂšque de dĂ©finitions et thĂ©orĂšmes mathĂ©matiques qui vise Ă  ĂȘtre la plus unifiĂ©e possible.

Les Ă©quivalents dans d’autres assistants de preuve se dĂ©veloppent mĂȘme s’ils ne sont pas (encore) aussi gros : citons mathcomp, unimath, agda-unimath entre autres.

Un autre grand succÚs, dans le domaine de la vérification cette fois, est CompCert (malheureusement non-libre), qui est un compilateur C entiÚrement écrit en Rocq et vérifié par rapport à une spécification du C également encodée en Rocq.

La recherche en théorie des types

La théorie des types est un domaine de recherche à part entiÚre, qui vise à étudier du point de vue logique les théories des types existantes, et à en développer de nouvelles pour des raisons à la fois théoriques et pratiques.

Historiquement, une grande question de la thĂ©orie des types est celle de comprendre Ă  quel type doivent correspondre les propositions d’égalitĂ©. Par exemple, on veut que deux propositions Ă©quivalentes soient Ă©gales, et que deux fonctions qui prennent les mĂȘmes valeurs soient Ă©gales, et Ă©ventuellement pour diverses raisons que deux preuves de la mĂȘme proposition soient Ă©gales, mais s’il est facile d’ajouter toutes ces choses comme axiomes, il est trĂšs compliquĂ© de les rendre prouvables sans obtenir, comme avec le tiers exclu, des programmes qui ne peuvent pas s’exĂ©cuter Ă  cause des axiomes qui sont dĂ©clarĂ©s sans dĂ©finition.

Vladimir Voedvodsky a fait une contribution majeure en proposant un nouvel axiome, appelĂ© univalence, qui dit trĂšs sommairement que si deux types ont la mĂȘme structure (on peut donner une « Ă©quivalence Â» entre les deux), alors ils sont en fait Ă©gaux (rĂ©sumĂ© simpliste Ă  ne pas prendre au mot). Cet axiome est trĂšs pratique pour faire des maths parce qu’on travaille souvent avec des objets qui ont la mĂȘme structure (on dit qu’ils sont isomorphes), et qui doivent donc avoir les mĂȘmes propriĂ©tĂ©s, et cet axiome permet de les identifier (mĂȘme s’il a aussi des consĂ©quences qui peuvent paraĂźtre choquantes). Sa proposition a donnĂ© naissance Ă  une branche appelĂ©e thĂ©orie homotopique des types, qui explore les maths avec univalence. Le prix Ă  payer est que les types ne se comprennent plus comme de simples ensembles de valeurs (ou de preuves d’une proposition), mais comme des espaces gĂ©omĂ©triques munis de toute une structure complexe (techniquement, les Ă©galitĂ©s sont des chemins entre points, et il y a des Ă©galitĂ©s non-triviales, des Ă©galitĂ©s entre Ă©galitĂ©s, etc.), et la comprĂ©hension de ces espaces-types est fondĂ©e sur la thĂ©orie de l’homotopie. Il y a bien d’autres thĂ©ories des types, avec univalence ou non : thĂ©orie cubique des types, thĂ©orie des types observationnelle, etc.

Conclusion

J’espĂšre avoir communiquĂ© un peu de mon enthousiasme pour le domaine (dans lequel je suis probablement parti pour dĂ©marrer une thĂšse). Si vous voulez apprendre un assistant de preuve, une ressource assez abordable est la sĂ©rie Software Foundations avec Rocq. Il existe Ă©galement Theorem proving in Lean 4 et divers tutoriels Agda. Vous pouvez aussi essayer ces assistants de preuve directement dans votre navigateur : Rocq, Lean ou Agda. Et bien sĂ»r les installer et jouer avec : Rocq, Lean, Agda.

Commentaires : voir le flux Atom ouvrir dans le navigateur

  •  

Nouvelles de Haiku - Hiver 2024-25

Haiku est un systĂšme d’exploitation pour les ordinateurs personnels. Il s’agit Ă  l’origine d’une rĂ©Ă©criture de BeOS. Le projet a dĂ©marrĂ© en 2001 et est actuellement en phase de beta-test pour une premiĂšre version stable avec support Ă  long terme. Depuis 2024, l’activitĂ© du projet Haiku s’accĂ©lĂšre grĂące entre autres Ă  l’embauche d’un dĂ©veloppeur Ă  plein temps. Les dĂ©pĂȘches sur Haiku sont donc dĂ©sormais publiĂ©es tous les 3 mois au lieu de tous les ans pour leur conserver une longueur digeste.

La complĂšte liste des changements survenus pendant ces 3 mois comporte prĂšs de 300 commits. La dĂ©pĂȘche ne rentre pas dans les dĂ©tails de chaque changement et met en valeur les plus importants.

Les grosses évolutions sont un nouveau port de Iceweasel (Firefox), et des grosses améliorations sur la gestion de la mémoire.

Comme on est en dĂ©but d’annĂ©e, c’est aussi le moment du bilan financier.

Sommaire

Rapport financier 2024

Recettes

L’association Haiku inc (association de type 501(c)3 aux USA) publie chaque annĂ©e un rapport financier. Le rĂŽle de l’association est de rĂ©colter les dons et de les redistribuer pour aider au dĂ©veloppement de Haiku. Elle ne prend pas part aux dĂ©cisions techniques sur l’orientation du projet, et habituellement les dĂ©penses sont faites en rĂ©ponse aux demandes des dĂ©veloppeurs du projet.

L’objectif en dĂ©but d’annĂ©e 2024 Ă©tait de rĂ©colter 20 000$ de dons. Cet objectif a Ă©tĂ© largement atteint, il a dĂ» ĂȘtre mis Ă  jour 2 fois en cours d’annĂ©e et finalement ce sont plus de 31 000$ qui ont Ă©tĂ© reçus ! Cela en particulier grace Ă  un assez gros don de 7 500$.

Les dons sont rĂ©coltĂ©s via diffĂ©rentes plateformes: Github Sponsors (intĂ©ressant, car il n’y a aucun frais de traitement), PayPal, Liberapay, Benevity (une plateforme de « corporate matching »), ainsi que des paiements par chĂšque, virements bancaires, et en espĂšce lors de la tenue de stands dans des confĂ©rences de logiciels libres. La vente de T-Shirts et autre merchandising via la boutique Freewear reste anecdotique (une centaine de dollars cette annĂ©e).

Il faut ajouter Ă  ces dons une contribution de 4 400$ de la part de Google en compensation du temps passĂ© Ă  l’encadrement des participants au Google Summer of Code.

Il faut également ajouter des dons en crypto-monnaies, principalement en bitcoins. Le rapport financier présente les chiffres en détail en tenant une compatibilité séparée en dollars, en euros, et en crypto-monnaies, avant de convertir le total en dollars pour dresser un bilan complet.

Une mauvaise nouvelle tout de mĂȘme: le service de microdons Flattr a fermĂ© ses portes. L’entreprise propose maintenant un service de bloqueur de publicitĂ©s payant, qui reverse de l’argent aux sites dont les publicitĂ©s sont bloquĂ©es.

Le compte Flattr de Haiku avait Ă©tĂ© crĂ©Ă© pour recevoir des dons sur la plateforme, mais n’avait jamais Ă©tĂ© configurĂ© pour transfĂ©rer ces dons vers le compte en banque de l’association. MalgrĂ© un certain temps passĂ© Ă  discuter avec le service client de Flattr et Ă  leur fournir tous les documents demandĂ©s, il n’a pas Ă©tĂ© possible de trouver une solution pour rĂ©cupĂ©rer cet argent. Ce sont donc 800$ qui ne reviendront finalement pas au projet Haiku.

Au final, les recettes sont de 36 479 dollars, de loin la plus grosse somme reçue par le projet en un an.

DĂ©penses

La dĂ©pense principale est le paiement de Waddlesplash, le dĂ©veloppeur actuellement employĂ© par Haiku inc pour accĂ©lĂ©rer le dĂ©veloppement du systĂšme (les autres dĂ©veloppeurs participent uniquement sur leur temps libre, en fonction de leurs autres activitĂ©s). Cela reprĂ©sente 25 500$, un coĂ»t assez faible par rapport au travail rĂ©alisĂ©.

Le deuxiĂšme poste de dĂ©penses est l’infrastructure, c’est-Ă  dire le paiement pour l’hĂ©bergement de serveurs, les noms de domaines, et quelques services « cloud » en particulier pour le stockage des dĂ©pĂŽts de paquets.

Le reste des dépenses consiste en frais divers (commission PayPal par exemple), remboursement de déplacements pour la participation à des conférences, ainsi que le renouvellement de la marque déposée sur le logo Haiku.

Le total des dĂ©penses s’élĂšve Ă  31 467$. C’est moins que les recettes, et l’association continue donc de mettre de l’argent de cĂŽtĂ©. L’annĂ©e 2022 a Ă©tĂ© la seule Ă  ĂȘtre dĂ©ficitaire, suite au dĂ©marrage du contrat de Waddlesplash. Ce contrat est Ă  prĂ©sent couvert par les donations reçues.

RĂ©serves

L’association dispose de plus de 100 000$ rĂ©partis sur son compte en banque, un compte PayPal (qui permet de conserver des fonds en euros pour les paiements en euros et ainsi d’éviter des frais de change), et un compte Payoneer (utilisĂ© pour recevoir les paiements de Google).

Elle dispose Ă©galement de prĂšs de 350 000$ en crypto-monnaies dont la valeur continue d’augmenter. Cependant, actuellement ces fonds ne sont pas accessibles directement, en raison de problĂšmes administratifs avec Coinbase, l’entreprise qui gĂšre ce portefeuille de crypto-monnaies. Le compte n’est pas configurĂ© correctement comme appartenant Ă  une association Ă  but non lucratif et cela pose des problĂšmes de dĂ©claration de taxes lorsque on souhaite vendre des crypto-monnaies contre du vrai argent. Cette situation persiste depuis plusieurs annĂ©es, mais l’association n’a pour l’instant pas besoin de rĂ©cupĂ©rer cet argent, les rĂ©serves dans le compte en banque principal Ă©tant suffisantes.

Applications

Iceweasel

Le navigateur web Iceweasel est disponible dans les dĂ©pĂŽts de paquets (seulement pour la version 64 bits pour l’instant). Il s’agit d’un portage de Firefox utilisant la couche de compatibilitĂ© Wayland. Le nom Firefox ne peut pas ĂȘtre utilisĂ© puisqu’il ne s’agit pas d’un produit officiel de Mozilla.

En plus du travail de portage pour rĂ©ussir Ă  faire fonctionner le navigateur, cela a nĂ©cessitĂ© un gros travail d’amĂ©lioration au niveau de la gestion de la mĂ©moire, une partie du systĂšme qui est fortement mise Ă  contribution par ce navigateur. On en reparle plus loin dans la dĂ©pĂȘche.

Le navigateur est encore considĂ©rĂ© comme expĂ©rimental: plusieurs fonctions sont manquantes et il peut y avoir des plantages. WebPositive (le navigateur natif basĂ© sur WebKit) reste donc le navigateur installĂ© par dĂ©faut avec Haiku, mais les deux sont complĂ©mentaires. Par exemple, Iceweasel permet d’afficher les vidĂ©os Youtube avec des performances acceptables.

Tracker

Tracker est le gestionnaire de fichiers de Haiku. Il implĂ©mente une interface « spatiale », c’est-Ă -dire que chaque dossier s’ouvre dans une fenĂȘtre sĂ©parĂ©e et enregistre sa position Ă  l’écran.

Le code du Tracker fait partie des composants qui ont pu ĂȘtre rĂ©cupĂ©rĂ©s de BeOS. Cela signifie que certaines parties du code ont Ă©tĂ© dĂ©veloppĂ©es il y a prĂšs de 30 ans, dans un contexte oĂč l’élĂ©gance du code n’était pas la prioritĂ© (il fallait pour les dĂ©veloppeurs de BeOS, d’une part livrer un systĂšme fonctionnel dans un temps raisonable, et d’autre part, fonctionner sur les machines relativement peu performantes de l’époque).

Les Ă©volutions sur le Tracker nĂ©cessitent donc souvent du nettoyage dans de nombreuses parties du code, et provoquent souvent des rĂ©gressions sur d’autres fonctionnalitĂ©s. Toutefois, les choses s’amĂ©liorent petit Ă  petit.

Ce trimestre, on a vu par exemple arriver la correction d’un problĂšme avec l’utilisation de la touche « echap ». Cette touche peut servir Ă  plusieurs choses:

  • Fermer une fenĂȘtre de chargement ou d’enregistrement de fichier,
  • Annuler le renommage d’un fichier,
  • Annuler une recherche rapide « type ahead » qui consiste Ă  taper quelques lettres et voir immĂ©diatement la liste de fichiers du dossier courant se rĂ©duire Ă  ceux qui contiennent cette chaĂźne de caractĂšres.

Ces diffĂ©rentes utilisations peuvent entrer en conflit. Plus prĂ©cisĂ©ment, lorsqu’on utilise le filtrage « type ahead », puis qu’on change d’avis et qu’on appuie sur la touche « echap », il ne faut pas que cela ferme la fenĂȘtre en mĂȘme temps.

Un autre changement concerne plutĂŽt la validation des donnĂ©es: Tracker interdit l’insertion de caractĂšres de contrĂŽle ASCII dans le nom de fichiers. Ce n’est pas strictement interdit (ni par Haiku, ni par ses systĂšmes de fichiers, ni par POSIX) en dehors de deux caractĂšres spĂ©ciaux: le '/' et le 0 qui termine une chaĂźne de caractĂšres. Mais, c’est trĂšs probablement une mauvaise idĂ©e d’avoir un retour Ă  la ligne ou un autre caractĂšre de contrĂŽle enregistrĂ© dans un nom de fichier. Le Tracker interdit donc dĂ©sormais de le faire et si vous ĂȘtes vraiment rĂ©solu Ă  y parvenir, il faudra passer par le terminal.

Enfin, une nouvelle fonctionnalitĂ© dans le Tracker est la mise Ă  jour en temps rĂ©el des menus pop-up. Cela peut se produire pour plusieurs raisons, par exemple, l’appui sur la touche « command » modifie le comportement de certains menus. Avant ce changement, il fallait rĂ©-ouvrir le menu (command + clic droit) pour voir ces options modifiĂ©es. Maintenant, on peut d’abord ouvrir le menu, puis maintenir la touche command enfoncĂ©e pour voir les options modifiĂ©es.

Cela a nĂ©cessitĂ© une refonte complĂšte de la gestion de ces menus (qui proposent de nombreuses autres choses comme la navigation « rayons X »). Au passage, certaines options qui Ă©taient uniquement disponibles au travers de raccourcis claviers ou de la barre de menu des fenĂȘtres du Tracker sont maintenant aussi affichĂ©es dans le menu pop-up.

TeamMonitor

TeamMonitor est le gestionnaire d’applications affichĂ© quand on utilise la combinaison de touches Ctrl+Alt+Suppr. Il permet de stopper des programmes, de redĂ©marrer la machine, et autres manipulations d’urgence si le systĂšme ne fonctionne pas comme il faut.

Les processus lancĂ©s par une mĂȘme application sont maintenant regroupĂ©s et peuvent ĂȘtre tous arrĂȘtĂ©s d’un seul coup. Ce changement est nĂ©cessaire suite Ă  l’apparition de IceWeasel, qui crĂ©e beaucoup de processus en tĂąche de fond pour une seule instance du navigateur web.

HaikuDepot

HaikuDepot est l’interface graphique pour le systĂšme de paquets de Haiku. Il se prĂ©sente comme un magasin d’applications, permettant non seulement d’installer et de dĂ©sinstaller des logiciels, mais aussi de les Ă©valuer avec une note et un commentaire.

  • Ajout d’un marqueur sur les icĂŽnes des paquets qui sont dĂ©jĂ  installĂ©s, et remplacement du marqueur utilisĂ© pour indiquer les applications « natives » (utilisant le toolkit graphique de Haiku, par opposition Ă  Qt et GTK par exemple).
  • Affichage plus rapide de l’état « en attente d’installation » lorsqu’on demande l’installation d’un paquet.
  • L’interface pour noter un paquet est masquĂ©e si l’attribution de notes n’est pas possible.

Préférences

Diverses amĂ©liorations dans les fenĂȘtres de prĂ©fĂ©rences:

  • Correction d’un crash dans les prĂ©fĂ©rences d’affichage (korli).
  • Les prĂ©fĂ©rences de fond d’écran n’acceptent plus le glisser-dĂ©poser d’une couleur sur un contrĂŽle de choix de couleur dĂ©sactivĂ©. La modification de la position X et Y de l’image de fond se met Ă  jour en temps rĂ©el quand on Ă©dite la valeur des contrĂŽles correspondants.
  • Ajout de rĂ©glages supplĂ©mentaires (vitesse, accĂ©lĂ©ration, dĂ©filement) dans les prĂ©fĂ©rences des pavĂ©s tactiles. Ces options Ă©taient dĂ©jĂ  implĂ©mentĂ©es dans l’input_server, mais configurable uniquement pour les souris.
  • Suppression de code mort et amĂ©lioration de la gestion des polices de caractĂšres dans les prĂ©fĂ©rences d’apparence.

Plusieurs améliorations sur les préférences de sons de notifications:

  • La fenĂȘtre de sĂ©lection de fichiers retient le dernier dossier utilisĂ©,
  • Elle permet Ă©galement d’écouter un son avant de le sĂ©lectionner,
  • Les menus de sĂ©lection rapide de sons affichent uniquement les fichiers et pas les dossiers,
  • Certains sons ont Ă©tĂ© renommĂ©s.

La plupart des sons ne sont cependant toujours pas utilisés par le systÚme.

Expander

Expander est un outil permettant d’extraire plusieurs types de fichiers archivĂ©s.

Peu de changement sur cet outil qui est assez simple et fonctionnel. La seule amĂ©lioration ce mois-ci concerne un changement des proportions de la fenĂȘtre pour Ă©viter un espace vide disgracieux.

Cortex

Cortex est une application permettant de visualiser et de manipuler les nƓuds de traitement de donnĂ©es du Media Kit.

Le composant « logging consumer » qui reçoit des donnĂ©es d’un autre noeud et les enregistre dans un fichier de log pour analyse a Ă©tĂ© amĂ©liorĂ© pour enregistrer un peu plus d’informations.

Icon-O-Matic

L’éditeur d’icĂŽnes vectoriels Icon-O-Matic Ă©volue peu, aprĂšs un projet Google Summer of Code qui a ajoutĂ© la plupart des fonctionnalitĂ©s manquantes. Ce trimestre, un seul changement: l’ajout d’une entrĂ©e menu pour supprimer un « transformeur ».

PowerStatus

L’application PowerStatus affiche l’état de la batterie. Cela peut se prĂ©senter comme une icĂŽne dans la barre des tĂąches. L’icĂŽne est de taille rĂ©duite, et les diffĂ©rents Ă©tats n’étaient pas forcĂ©ment bien visibles. Ce problĂšme a Ă©tĂ© corrigĂ© avec des nouveaux marqueurs pour l’état de la batterie (en charge ou inactive).

StyledEdit

StyledEdit est un Ă©diteur de texte simple, permettant tout de mĂȘme de formater le texte (un peu comme WordPad pour Windows).

L’application reçoit une nouvelle option pour Ă©crire du texte barrĂ©. Le code nĂ©cessaire a Ă©galement Ă©tĂ© ajoutĂ© dans app_server, puisque cette possibilitĂ© Ă©tait prĂ©vue, mais non implĂ©mentĂ©e.

WebPositive

Le navigateur WebPositive reçoit peu d’évolutions en ce moment, en dehors de la maintenance du moteur WebKit. On peut tout de mĂȘme mentionner l’ajout d’un menu contextuel sur les marque-pages, permettant de les renommer et de les supprimer. Ce dĂ©veloppement est issu d’un vieux patch rĂ©alisĂ© par un candidat au Google Summer of Code, qui ne fonctionnait pas et n’avait jamais Ă©tĂ© finalisĂ©.

Mode sombre et configuration des couleurs

Depuis la version Beta 5, Haiku dispose d’un nouveau systĂšme de configuration des couleurs, permettant d’obtenir facilement un affichage en « mode sombre ». Cependant, cet affichage est loin d’ĂȘtre parfait, et de petits ajustements sont Ă  faire petit Ă  petit dans toutes les applications qui n’avaient pas Ă©tĂ© pensĂ©es pour cela. En particulier, le changement de couleurs se fait en direct lorsqu’on change les rĂ©glages. On trouve ces trois derniers mois des changements dans DeskBar, Tracker, HaikuDepot, l’horloge, ainsi que la classe BTextView.

Outils en ligne de commande

pkgman peut rechercher les paquets installĂ©s et qui n’ont aucun autre paquet dĂ©pendant d’eux. Cela permet de trouver des paquets inutiles qui peuvent ĂȘtre dĂ©sinstallĂ©s (il manque encore la possibilitĂ© de marquer un paquet comme Ă©tant « installĂ© manuellement » avant de pouvoir automatiser le nettoyage).

La commande route accepte la syntaxe utilisĂ©e par openvpn pour la configuration d’une route par dĂ©faut, ce qui facilite l’utilisation de VPN avec Haiku.

Correction d’un problĂšme dans le compilateur de ressources: la commande rc -d ne savait pas dĂ©compiler la structure app_version des applications Haiku, uniquement le format plus ancien utilisĂ© par BeOS.

La commande screenmode permet maintenant de récupérer la valeur actuelle du réglage du rétro-éclairage (en plus de permettre de changer cette valeur).

Kits

La bibliothĂšque de fonctions de Haiku est dĂ©coupĂ©e en « kits » qui regroupent un ensemble de classes et de fonctionnalitĂ©s liĂ©es.

Application kit

L’Application Kit permet, comme son nom l’indique, de lancer des applications. Il offre Ă©galement toutes les fonctionnalitĂ©s de boucles d’évĂšnements, et d’envoi de messages entre applications et entre composants d’une application.

Correction d’un problùme de suppression d’un port dans la classe BApplication.

Debug kit

Le Debug Kit fournit les services nĂ©cessaires au Debugger pour dĂ©bugger une application. Cela consiste d’une part en un accĂšs privilĂ©gie Ă  l’espace mĂ©moire d’une application, et d’autre part en outils pour analyser les fichiers ELF des exĂ©cutables et bibliothĂšques.

Le Debug Kit reçoit ce trimestre plusieurs Ă©volutions et corrections permettant le dĂ©codage des stack traces dans les programmes compilĂ©s avec clang et lld. Par exemple, les fichiers ELF gĂ©nĂ©rĂ©s par ces outils sont dĂ©coupĂ©s en plusieurs segments, alors que ce n’est pas le cas pour gcc.

Device Kit

Le Device Kit regroupe tout ce qui concerne l’accĂšs direct au matĂ©riel et aux entrĂ©es-sorties depuis l’espace utilisateur: ports sĂ©rie, accĂšs direct aux pĂ©riphĂ©riques USB, accĂšs aux joysticks et manettes de jeu.

Les ports sĂ©rie RS232 peuvent ĂȘtre configurĂ©s avec des valeurs en baud personnalisĂ©es (pour l’instant uniquement pour les adaptateurs sĂ©rie USB).

Interface kit

L’Interface Kit regroupe tout ce qui concerne l’affichage de fenĂȘtres et de vues Ă  l’écran et les interactions avec ces fenĂȘtres.

  • Ajout de constructeur « move » et d’opĂ©rateur d’assignation pour BRegion et BShape pour amĂ©liorer les performances en Ă©vitant les copie d’objet immĂ©diatement suivies de suppression.
  • Ajout d’un constructeur pour BRect avec deux arguments (largeur et hauteur) pour les rectangles alignĂ©s en haut Ă  gauche ou dont la position n’a pas d’importance.
  • Remise en place d’un cas particulier dans BBitmap::SetBits pour la gestion du canal alpha afin d’avoir un comportement plus proche de celui de BeOS.
  • BColorControl rĂ©agit correctement et dĂ©clenche les Ă©vĂšnements nĂ©cessaires lorsqu’on modifie sa couleur par glisser-dĂ©poser.

Media Kit

Correction d’une assertion vĂ©rifiant la mauvaise condition dans BTimeSource.

RĂ©Ă©criture de la classe BTimedEventQueue pour amĂ©liorer ses performances en Ă©vitant d’allouer de la mĂ©moire dynamique.

AmĂ©lioration de l’affichage des « media controls » (sliders de contrĂŽle de volume par exemple) en mode sombre.

libshared

La « libshared » contient plusieurs classes expĂ©rimentales, en cours de dĂ©veloppement, mais dĂ©jĂ  utilisĂ©es par plusieurs applications. Il s’agit d’une bibliothĂšque statique, ce qui permet de changer facilement son contenu sans casser l’ABI des applications existantes.

Ajout de la classe ColorPreview qui existait en plusieurs exemplaires dans le code de Haiku (prĂ©fĂ©rences d’apparence et Terminal). Cette classe permet d’afficher une couleur dans un petit rectangle. Elle est utilisĂ©e Ă  plusieurs endroits dans des contrĂŽles de choix de couleur plus complexes, tels que des listes ou des menus.

Servers

Les servers sont des processus systÚmes implémentant différentes fonctionnalités de Haiku. Le concept est similaire à celui des daemons dans UNIX, ou des services dans Windows NT et systemd.

app_server

L’app_server s’occupe de l’affichage des applications Ă  l’écran.

Suppression de code inutilisĂ© depuis longtemps permettant l’accĂ©lĂ©ration matĂ©rielle d’opĂ©rations de dessin en 2D (blit, tracĂ© de lignes, remplissage de rectangles
).

Sur les cartes graphiques PCI, ces opĂ©rations Ă©taient souvent rĂ©alisĂ©es plus rapidement par le CPU qui tourne Ă  une frĂ©quence bien plus rapide que la carte. Sur les cartes AGP, l’accĂšs en lecture Ă  la mĂ©moire vidĂ©o par le CPU est trĂšs lent, et il Ă©tait donc plus intĂ©ressant de faire ces opĂ©rations en RAM centrale avant d’envoyer un buffer prĂȘt Ă  afficher Ă  la carte graphique. Enfin sur les cartes PCI express modernes, ces fonctions d’accĂ©lĂ©ration ont disparu ou en tout cas n’ont pas du tout une interface compatible avec les besoins de Haiku. Il est donc temps de jeter ce code.

Modification de la façon dont les applications rĂ©cupĂšrent la palette de couleurs en mode graphique 256 couleurs: elle utilise maintenant une mĂ©moire partagĂ©e, et il n’est plus nĂ©cessaire que chaque application demandent au serveur graphique d’en obtenir une copie.

input_server

L’input_server se charge des entrĂ©es souris et clavier. Cela comprend les mĂ©thodes d’entrĂ©e de texte (par exemple pour le Japonais) ainsi que des filtres permettant de manipuler et d’intercepter ces Ă©vĂšnements d’entrĂ©e avant leur distribution dans les applications.

AmĂ©liorations du filtre PadBlocker pour bloquer le touchpad quand le clavier est en cours d’utilisation sur les PC portables: gestion des rĂ©pĂ©titions de touches, blocage uniquement du touchpad et pas des autres pĂ©riphĂ©riques de pointage.

net_server

Le net_server se charge de la configuration des interfaces réseau.

ArrĂȘt du client d’autoconfiguration (DHCP par exemple) lors de la perte du lien sur un port Ethernet, pour ne pas essayer d’envoyer des paquets alors que le cĂąble est dĂ©branchĂ©.

notification_server

notification_server se charge de l’affichage de panneaux de notification pour divers Ă©vĂšnements tels que la connexion et dĂ©connexion d’interfaces rĂ©seau, un niveau dangereusement bas de la batterie, la fin d’un tĂ©lĂ©chargement


La fenĂȘtre de notification a Ă©tĂ© retravaillĂ©e pour mieux s’adapter Ă  la taille de police d’affichage choisie par l’utilisateur.

mail_daemon

mail_daemon permet d’envoyer et de recevoir des e-mails. Les messages sont stockĂ©s sous forme de fichiers avec des attributs Ă©tendus pour les mĂ©tadonnĂ©es (sujet, expĂ©diteur
). Plusieurs applications clientes permettent de rĂ©diger ou de lire ces fichiers. Ainsi chaque application n’a pas besoin de rĂ©implĂ©menter les protocoles IMAP ou SMTP.

AmĂ©lioration de la fenĂȘtre de logs pour la compatibilitĂ© avec le mode sombre.

runtime_loader

Le runtime_loader est l’outil qui permet de dĂ©marrer un exĂ©cutable. Il se charge de trouver toutes les bibliothĂšques partagĂ©es nĂ©cessaires et de les placer dans la mĂ©moire.

Ajout du flag PF_EXECUTE qui rend exĂ©cutable uniquement les sections ELF qui le nĂ©cessitent (auparavant, toutes les sections qui n’étaient pas accessibles en Ă©criture Ă©taient exĂ©cutables). Cela est utilisĂ© en particulier par clang, qui sĂ©pare une zone en lecture seule (pour les constantes) et une autre en lecture et exĂ©cution (pour le code). Avec gcc, les deux sont habituellement regroupĂ©es dans la mĂȘme section.

Drivers

Périphériques de stockage

Correction de bugs dans la couche SCSI (utilisĂ©e Ă©galement pour d’autres pĂ©riphĂ©riques de stockage qui encapsulent des commandes SCSI). Des drapeaux d’état n’étaient pas remis Ă  0 au bon moment, ce qui causait des kernel panic avec le message « no such range! ».

Cela a Ă©tĂ© l’occasion de faire du mĂ©nage : suppression de champs inutilisĂ©s dans des structures de donnĂ©es, et suppression du module d’allocation mĂ©moire locked_pool qui n’était utilisĂ© que par la pile SCSI. À la place, utilisation des fonctions d’allocation mĂ©moire standard du noyau, qui sont amplement suffisantes pour rĂ©pondre aux besoins de ce module (waddlesplash).

Cartes son

Correction d’erreurs dans le code de gestion mĂ©moire des pilotes es1370 et auvia. Ces drivers utilisaient deux copies d’un code d’allocation identique, mais avaient divergĂ© l’un de l’autre. Ils ont Ă©tĂ© rĂ©unifiĂ©s mais cela a provoquĂ© quelques rĂ©gressions, avec des difficultĂ©s pour trouver des machines permettant de tester chacune des cartes son concernĂ©es. Haiku peut heureusement compter sur des utilisateurs « avancĂ©s » qui testent rĂ©guliĂšrement les nightly builds pour dĂ©tecter ce type de rĂ©gression (korli).

RĂ©seau

Correction d’une fuite mĂ©moire lors de l’utilisation de sockets « raw » permettant d’envoyer et de recevoir directement des paquets ethernet (en contournant la couche IP).

Pilotes FreeBSD

Une grande partie des pilotes de carte rĂ©seau de Haiku sont en fait ceux de FreeBSD ou d’OpenBSD. Une couche de compatibilitĂ© permet de rĂ©utiliser ces pilotes avec trĂšs peu de changement dans leur code source. Ainsi, les Ă©volutions et corrections peuvent ĂȘtre partagĂ©es avec l’un ou l’autre de ces systĂšmes. La collaboration avec les *BSD pour les pilotes rĂ©seau se passe de mieux en mieux : suite au dĂ©veloppement d’une couche de compatibilitĂ© permettant d’utiliser les pilotes OpenBSD dans Haiku, les dĂ©veloppeurs de FreeBSD Ă©tudient la possibilitĂ© de rĂ©utiliser Ă©galement ces pilotes. De plus, les dĂ©veloppeurs de Haiku et d’OpenBSD sont en contact pour coordonner les mises Ă  jour et les tests.

Génération de statistiques plus fiables sur les paquets réseaux dans la couche de compatibilité FreeBSD et remontée des statistiques générées par les pilotes associés.

Synchronisation du pilote realtekwifi avec la version de FreeBSD et reconnaissance d’un identifiant de pĂ©riphĂ©rique USB supplĂ©mentaire dans ce pilote.

Amélioration de la couche de compatibilité pour se comporter plus précisément comme FreeBSD, et suppression de patchs correspondants dans les pilotes qui sont devenus superflus.

AmĂ©lioration des performances de la couche de compatibilitĂ©: retrait de comparaisons de chaĂźnes de caractĂšres et d’allocations inutiles.

Pilotes spécifiques à Haiku

AmĂ©lioration du comportement du pilote USB RNDIS (partage de connexion sur USB de certains tĂ©lĂ©phones Android) lorsque le cĂąble USB est dĂ©connectĂ©. Le pilote incluait du code pour tenter de restaurer la connexion existante si le mĂȘme appareil est reconnectĂ©, mais les pĂ©riphĂ©riques RNDIS utilisent des adresses MAC alĂ©atoires qui changent Ă  chaque connexion, donc cela ne pouvait pas fonctionner. De plus, certains transferts USB n’étaient pas correctement annulĂ©s pour laisser la pile USB dans un Ă©tat propre aprĂšs la dĂ©connexion du pĂ©riphĂ©rique.

USB

Ajout d’une annulation de transferts de donnĂ©es en attente dans le pilote pour les pĂ©riphĂ©riques de stockage USB, ce qui corrige un kernel panic lors de l’utilisation de lecteurs de disquettes USB. ArrĂȘt immĂ©diat des opĂ©rations (au lieu de rĂ©-essayer pendant quelques secondes) si le pĂ©riphĂ©rique indique « no media present » (CD ou disquette Ă©jectĂ©e de son lecteur par exemple).

Ajout d’une vĂ©rification de pointeur NULL et de libĂ©ration de mĂ©moire manquantes dans la pile USB, ce qui corrige des fuites de mĂ©moires (qui Ă©taient lĂ  depuis longtemps) et une assertion qui se dĂ©clenchait (introduite plus rĂ©cemment).

Le pilote de webcam UVC est mis Ă  jour pour utiliser des constantes (identifiants de types de descripteurs
) partagĂ©es avec le reste du systĂšme au lieu de toutes les redĂ©finir une deuxiĂšme fois. L’affichage des descripteurs dans listusb est Ă©galement complĂ©tĂ© pour dĂ©coder toutes les informations disponibles. Le pilote n’est toujours pas complĂštement fonctionnel: l’établissement des transferts au niveau USB fonctionne, mais pour l’instant le pilote ne parvient pas Ă  dĂ©coder les donnĂ©es vidĂ©o reçues correctement.

Le pilote HID sait reconnaĂźtre les « feature reports », qui permettent de configurer un pĂ©riphĂ©rique. Par exemple, cela peut permettre de configurer un touchpad en mode multi-point (dans lequel le systĂšme doit effectuer lui-mĂȘme le suivi de chaque doigt sur la surface tactile pour convertir cela en mouvements de pointeur de souris) ou en mode Ă©mulation de souris (oĂč on ne peut utiliser qu’un doigt Ă  la fois, mais avec un pilote beaucoup plus simple).

Le pilote pour les tablettes Wacom reconnaĂźt la tablette CTH-470.

PS/2

Les ports PS/2 ont disparu de la plupart des machines ces derniĂšres annĂ©es, mais le protocole reste utilisĂ© pour le clavier des ordinateurs portables, ainsi que pour certains touchpads. Malheureusement, le protocole est seulement Ă©mulĂ© au niveau de l’« embedded controller » (le microprocesseur qui se charge de l’interfaçage de divers composants annexes). Le rĂ©sultat est que l’implĂ©mentation du protocole et des registres d’interface peut s’éloigner considĂ©rablement des documents officiels.

AmĂ©lioration de la dĂ©tection des contrĂŽleurs PS/2 supportant le protocole « active multiplexing » permettant de connecter Ă  la fois une souris et un touchpad. La procĂ©dure de dĂ©tection officielle peut gĂ©nĂ©rer des faux positifs: certains contrĂŽleurs rĂ©pondent bien Ă  cette commande, mais n’implĂ©mentent en fait pas du tout le protocole. Cela provoquait un long dĂ©lai au dĂ©marrage alors que le pilote tente d’énumĂ©rer des pĂ©riphĂ©riques de pointage qui n’existent pas. Une vĂ©rification supplĂ©mentaire aprĂšs l’activation du mode multiplexĂ© permet de dĂ©tecter ce cas.

virtio_pci

virtio est un standard matĂ©riel pour les machines virtuelles. PlutĂŽt que d’émuler un vrai matĂ©riel (carte rĂ©seau, carte graphique
), une machine virtuelle peut Ă©muler un matĂ©riel qui n’a jamais Ă©tĂ© fabriquĂ©, mais dont la programmation est beaucoup plus simple. Cela permet Ă©galement des opĂ©rations inimaginables sur du matĂ©riel rĂ©el, comme la possibilitĂ© de changer la taille de la RAM en cours d’exĂ©cution pour mieux partager la mĂ©moire de l’hĂŽte entre diffĂ©rentes machines virtuelles.

Le pilote virtio_pci est Ă  la racine du systĂšme virtio. Il dĂ©tecte la « carte PCI » virtio et implĂ©mente les primitives de base d’envoi et de rĂ©ception de messages entre l’hĂŽte et la machine virtualisĂ©e (du cĂŽtĂ© virtualisĂ©, pour le cĂŽtĂ© hĂŽte, c’est le virtualisateur, par exemple QEMU, qui s’en charge).

Correction de plusieurs problÚmes avec les numéros de files virtio qui rendaient les pilotes instables.

ACPI

ACPI est un cadriciel pour la gestion de l’énergie et l’accĂšs au matĂ©riel. Le fabricant du matĂ©riel fournit (dans la ROM du BIOS) un ensemble de « tables » contenant une description du matĂ©riel disponible, ainsi que des mĂ©thodes compilĂ©es en bytecode pour piloter ce matĂ©riel. Le systĂšme d’exploitation doit fournir un interprĂ©teur pour ce bytecode, puis rĂ©aliser les entrĂ©es-sorties vers le matĂ©riel demandĂ© lors de l’exĂ©cution.

Haiku utilise actuellement ACPICA, une bibliothÚque ACPI développée principalement par Intel.

Correction d’un problĂšme d’accĂšs Ă  de la mĂ©moire non cachĂ©e. Une modification faite pour les machines ARM a dĂ©clenchĂ© un problĂšme sur les machines x86.

Sondes de température

Ajout d’un nouveau pilote amd_thermal, ajout de ce dernier ainsi que des pilotes pch_thermal et acpi_thermal dans l’image disque par dĂ©faut. Ces pilotes devraient permettre de rĂ©cupĂ©rer la tempĂ©rature du processeur sur la plupart des machines. Il reste maintenant Ă  intĂ©grer cela dans les outils en espace utilisateur pour faire un bon usage de ces informations.

Pilotes graphiques

Ajout de deux nouvelles générations de cartes graphiques dans le pilote intel_extreme.

Le pilote VESA est capable de patcher le BIOS de certaines cartes graphiques Ă  la volĂ©e pour y injecter des modes graphiques supplĂ©mentaires (la spĂ©cification VESA permettant Ă  l’OS uniquement de choisir un mode parmi une liste fournie par la carte graphique, liste souvent assez peu fournie). Ce mode est dĂ©sormais activĂ© par dĂ©faut sur les cartes graphiques oĂč il a pu ĂȘtre testĂ© avec succĂšs.

SystĂšmes de fichiers

FAT

FAT est un systÚme de fichier développé par Microsoft et qui remonte aux premiers jours de MS-DOS. Il est encore utilisé sur certaines clés USB et cartes SD, bien que exFAT tend à le remplacer petit à petit. Il est également utilisé pour les partitions systÚmes EFI.

Le pilote de Haiku a Ă©tĂ© rĂ©cemment rĂ©Ă©crit Ă  partir de celui de FreeBSD. L’amĂ©lioration de ce nouveau pilote se poursuit, avec ce mois-ci :

  • Les noms de volumes FAT sont convertis en minuscules comme le faisait l’ancien pilote FAT,
  • Le cache de blocs implĂ©mente maintenant un mĂ©canisme de prefetch pour rĂ©cupĂ©rer plusieurs blocs disque d’un coup, et le pilote FAT utilise cette nouvelle possibilitĂ© pour amĂ©liorer en particulier le temps de montage,
  • Correction de problĂšmes dans le cache de fichiers si deux applications accĂšdent au mĂȘme fichier mais avec des noms diffĂ©rents par la casse (le systĂšme de fichier ignorant ces diffĂ©rences).

BFS

BFS est le systĂšme de fichier principal de BeOS et de Haiku. Il se distingue des autres systĂšmes de fichiers par une gestion poussĂ©e des attributs Ă©tendus, avec en particulier la possibilitĂ© de les indexer et d’effectuer des requĂȘtes pour trouver les fichiers correspondants Ă  certains critĂšres.

Clarification de la description des options disponibles lors de l’initialisation d’un volume BFS.

Correction des fonctions d’entrĂ©es/sorties asynchrones pour rĂ©fĂ©rencer correctement les inodes, ce qui corrige un trĂšs ancien rapport de bug. Des corrections similaires ont Ă©tĂ© faites Ă©galement dans les pilotes FAT et EXFAT.

Correction des requĂȘtes sur l’attribut « derniĂšre modification », et amĂ©lioration de la gestion du type « time » pour Ă©viter les conversions inutiles (ce type d’attribut est historiquement stockĂ© en 32 bits mais migrĂ© en 64 bits lorsque c’est possible pour Ă©viter le bug de l’an 2038, aussi le code doit ĂȘtre capable de traiter ces 2 formats de stockage).

packagefs

Le systĂšme de fichier packagefs est au centre de la gestion des paquets logiciels dans Haiku. Les paquets ne sont pas extraits sur le disque, mais montĂ©s dans un systĂšme de fichier spĂ©cifique (qui implĂ©mente une version tout-en-un de ce qui pourrait ĂȘtre rĂ©alisĂ© sous Linux avec squashfs et overlayfs).

Ce systĂšme de fichier se trouve donc sur le chemin critique en termes de performances, ce qui fait que mĂȘme de petites optimisations peuvent dĂ©boucher sur de gros gains de performance.

Optimisation de la gestion de la mĂ©moire: utilisation d’un allocateur dĂ©diĂ© pour allouer et dĂ©sallouer trĂšs rapidement de la mĂ©moire de travail avec une durĂ©e de vie courte.

Ajout d’une vĂ©rification manquante sur la prĂ©sence du dossier parent, qui pouvait dĂ©clencher un kernel panic.

NFS4

Le pilote NFS4 permet de monter des partages réseau NFS. Cependant, le pilote ne fonctionne pas toujours, et certains utilisateurs doivent se rabattre sur le pilote NFS v2 (ancienne version du protocole de moins en moins utilisée), ou encore sur des systÚmes de fichiers FUSE comme SMB ou sshfs.

Le pilote NFS4 peut maintenant ĂȘtre compilĂ© avec userlandfs (Ă©quivalent de FUSE pour Haiku) pour s’exĂ©cuter en espace utilisateur. Cela facilitera le dĂ©boguage.

ramfs et ram_disk

ram_disk est un pĂ©riphĂ©rique de stockage qui stocke les donnĂ©es en RAM, il a une taille fixe et doit ĂȘtre formatĂ© avec un systĂšme de fichiers avant de pouvoir ĂȘtre utilisĂ©.
ramfs est un systÚme de fichier stockant les données directement en RAM sans passer par un périphérique de stockage de type bloc. Sa taille est dynamique en fonction des fichiers qui sont stockés dedans.

Ces deux pilotes ont reçu divers nettoyages et corrections, suite à des problÚmes mis en évidence par des assertions ajoutées précédemment dans le code.

Dans le ramfs, nettoyage de code dupliquĂ©, rĂ©duction de la contention sur les verrous, amĂ©lioration de la fonction readdir pour retourner plusieurs entrĂ©es d’un coup au lieu de les Ă©grĂ©ner une par une.

Ajout de la gestion des fichiers « spĂ©ciaux » (FIFOs nommĂ©s, sockets UNIX) dans ramfs.

Autres

Refonte de l’algorithme de « scoring » des requĂȘtes sur les systĂšmes de fichiers. Cet algorithme permet d’estimer quels sont les termes de la requĂȘte les moins coĂ»teux Ă  Ă©valuer, afin de rĂ©duire rapidement le nombre de fichiers rĂ©pondant aux critĂšres, et d’effectuer les opĂ©rations complexes seulement sur un petit nombre de fichiers restants. Les requĂȘtes s’exĂ©cutent ainsi encore plus rapidement (waddlesplash).

RĂ©Ă©criture du code pour identifier les partitions dans mount_server. Ce code permet de re-monter les mĂȘmes partitions aprĂšs un redĂ©marrage de la machine, mais l’ancien algorithme pouvait trouver de faux positifs et monter des partitions supplĂ©mentaires (OscarL et waddlesplash).

Correction d’une option de debug pour intercepter les accĂšs aux adresses non initialisĂ©es (0xcccccccc) ou dĂ©jĂ  libĂ©rĂ©es (0xdeadbeef). Cela permet de dĂ©tecter certains accĂšs Ă  des pointeurs invalides. Cette option ne fonctionnait correctement que sur les systĂšmes 32 bit, maintenant, l’adresse correspondante pour les machines 64 bit est Ă©galement protĂ©gĂ©e.

libroot

La libroot est la librairie C de base de Haiku. Elle regroupe les fonctions parfois implĂ©mentĂ©es dans les libc, libm, libpthread, librt et libdl pour d’autres systĂšmes. Haiku choisit une approche tout-en-un, car il est excessivement rare qu’une application n’ait pas besoin de toutes ces bibliothĂšques.

Du fait de la grande diversité des services rendus par cette bibliothÚque, il est difficile de présenter les changements de façon cohérente et organisée.

Correction de quelques cas particuliers dans le traitement des tableaux de descripteurs de fichiers pour select() et dĂ©placement d’une partie des dĂ©finitions de sys/select.h vers des en-tĂȘtes privĂ©s non exposĂ©s aux applications (waddlesplash).

Ajout d’une fonction manquante dans les « stubs » de la libroot, qui sont utilisĂ©s lors de la compilation de Haiku en mode « bootstrap » (sans aucune dĂ©pendance prĂ©compilĂ©e externe). Les stubs sont normalement gĂ©nĂ©rĂ©s Ă  l’aide d’un script, mais celui-ci n’avait pas pris en compte une fonction nĂ©cessaire seulement sur les architectures x86.

Poursuite du travail d’unification des fonctions de manipulation des temps d’attentes pour toutes les fonctions de la libroot qui peuvent dĂ©clencher un timeout. Correction d’un cas oĂč la fonction pthread_testcancel retournait NULL au lieu de la valeur attendue PTHREAD_CANCELED.

Optimisation de la fonction strcmp, remplacement d’autres fonctions avec de meilleures implĂ©mentations provenant de la bibliothĂšque C musl.

Compatibilité POSIX-2024

La spĂ©cification POSIX Issue 8 a Ă©tĂ© publiĂ©e et comporte de nombreux changements. AprĂšs la version 7, la façon de travailler est devenue plus ouverte, avec un outil de suivi de bugs permettant de proposer des amĂ©liorations. Cela conduit Ă  la standardisation de nombreuses extensions qui sont communes entre les systĂšmes GNU et BSD, rendant plus facile d’écrire du code portable entre tous les systĂšmes compatibles POSIX.

  • Ajout de fonctions qui ouvrent des descripteurs de fichiers avec le drapeau O_CLOEXEC activĂ© par dĂ©faut (dup2, pipe3)
  • Ajout de reallocarray (un mĂ©lange de calloc et realloc)
  • Ajout de memmem (recherche d’une suite d’octets dans une zone de mĂ©moire)
  • Ajout de mkostemp
  • Ajout de posix_devctl et modifications de l’implĂ©mentation de ioctl
  • Ajout de pthread_getcpuclockid pour mesurer le temps CPU consommĂ© par un thread
  • Ajout de la constante d’erreur ESOCKTNOSUPPORT bien qu’elle ne soit jamais utilisĂ©e (cela facilite le portage d’applications qui attendent l’existence de ce code d’erreur)
  • Correction d’une boucle infinie dans pipe2
  • Suppression des fonctions *randr48_r des en-tĂȘtes publics. Il s’agit d’une extension disponible uniquement dans la glibc, et qui ne devrait donc pas ĂȘtre disponible dans la libroot. Cependant, l’implĂ©mentation est conservĂ©e pour assurer la compatibilitĂ© d’ABI avec les applications existantes.

ioctl et posix_devctl

La fonction ioctl existe depuis le dĂ©but de UNIX et permet de rĂ©aliser des opĂ©rations spĂ©ciales sur les descripteurs de fichiers (tout ce qui n’est pas une simple lecture ou Ă©criture). En particulier, elle est beaucoup utilisĂ©e pour les pilotes de pĂ©riphĂ©riques qui exposent une interface sous forme de fichiers dans /dev.

L’existence de cette fonction Ă©tait demandĂ©e dans la spĂ©cification POSIX, mais son fonctionnement n’était pas documentĂ© Ă  l’exception de quelques cas particuliers. La documentation spĂ©cifie une fonction avec un nombre d’arguments variable : un numĂ©ro de descripteur de fichier, un identifiant de l’opĂ©ration Ă  effectuer, puis des paramĂštres qui dĂ©pendent de l’opĂ©ration. On trouve des opĂ©rations avec aucun, un, ou deux paramĂštres.

Dans UNIX et la plupart de ses dĂ©rivĂ©s, la liste des opĂ©rations possibles est dĂ©finie Ă  l’avance, et le format des numĂ©ros identifiants permet de dĂ©terminer de façon prĂ©dictible quel est le nombre de paramĂštres attendus. Ce n’est pas le cas dans Haiku : les pilotes de pĂ©riphĂ©riques ont le choix d’assigner n’importe quelle valeur Ă  n’importe quelle opĂ©ration, et la mĂȘme valeur numĂ©rique peut donc avoir une signification diffĂ©rente selon le type de fichier.

L’opĂ©ration ioctl est donc en rĂ©alitĂ© implĂ©mentĂ©e avec toujours 4 arguments pour Haiku : en plus des deux dĂ©jĂ  mentionnĂ©s, il faut ajouter un pointeur vers une zone de mĂ©moire, et un entier indiquant la taille de cette zone. Des acrobaties Ă  base de macros permettent de remplir ces deux paramĂštres avec des valeurs par dĂ©faut lorsqu’ils ne sont pas nĂ©cessaires (au moins pour les programmes Ă©crits en C ; en C++, ces deux paramĂštres sont simplement dĂ©clarĂ©s avec une valeur par dĂ©faut).

Heureusement, ces problĂšmes avec ioctl vont ĂȘtre rĂ©solus, puisque POSIX a introduit une nouvelle fonction en remplacement : posix_devctl. Celle-ci fonctionne comme l’implĂ©mentation de ioctl dans Haiku, mais les arguments doivent toujours ĂȘtre spĂ©cifiĂ©s explicitement. Cela va donc permettre de disposer d’une interface rĂ©ellement portable pour ces opĂ©rations.

Kernel

Correction de la taille du tampon mémoire par défaut de la classe KPath qui permet au noyau de manipuler des chemins dans le systÚme de fichiers (waddlesplash).

VFS

Le VFS (virtual filesystem) est l’interface entre les appels systĂšmes d’accĂšs aux fichiers (open, read, write
) et les systĂšmes de fichiers proprement dit. En plus de ce travail d’interfaçage (par exemple : convertir un chemin de fichier absolu en chemin relatif Ă  un point de montage), cette couche regroupe un ensemble de fonctionnalitĂ©s qui n’ont pas besoin d’ĂȘtre rĂ©implĂ©mentĂ©es par chaque systĂšme de fichier: vĂ©rification des permissions, mĂ©moire cache pour limiter les accĂšs au disque.

Si les systĂšmes de fichiers identifient chaque objet par un inode (en gĂ©nĂ©ral liĂ© Ă  la position de l’objet sur le disque ou dans la partition de stockage), le VFS travaille lui avec des vnode qui existent uniquement en RAM et sont allouĂ©s dynamiquement pour les fichiers en cours d’utilisation.

D’autre part, les systĂšmes de fichiers peuvent se reposer sur un cache de blocs. Ce dernier se trouve plutĂŽt Ă  l’interface entre un systĂšme de fichier et le support de stockage correspondant, puisqu’il fonctionne au niveau des blocs de donnĂ©es stockĂ©es sur disque. Mais son intĂ©gration avec le VFS est nĂ©cessaire pour savoir quels sont les fichiers en cours d’utilisation et les opĂ©rations prĂ©visibles sur chacun (par exemple, il est utile de prĂ©-charger la suite d’un fichier lorsque un programme demande Ă  en lire le dĂ©but, car il est probable que ces informations vont bientĂŽt ĂȘtre nĂ©cessaires).

Le VFS est donc un Ă©lĂ©ment central en particulier pour obtenir de bonnes performances sur les accĂšs aux fichiers, en minimisant les accĂšs aux vrais systĂšmes de fichiers qui doivent maintenir beaucoup d’informations Ă  jour sur les disques. Tout ce qui peut ĂȘtre traitĂ© en utilisant uniquement la RAM grĂące Ă  la mise en cache est beaucoup plus rapide.

Investigation et amĂ©lioration des performances de la commande git status qui prenait beaucoup plus de temps Ă  s’exĂ©cuter que sur d’autres systĂšmes (waddlesplash):

  • Meilleure gestion des vnodes inutilisĂ©s Ă  l’aide d’une liste chaĂźnĂ©e 'inline' protĂ©gĂ©e par un spinlock, Ă  la place d’un mutex peu performant dans ce code trĂšs frĂ©quemment appelĂ©.
  • Modification de la structure io_context pour utiliser un verrou en lecture-Ă©criture (permettant plusieurs accĂšs concurrents en lecture, mais un seul en modification).
  • Ajout d’un chemin rapide dans le cas le plus simple de la recherche de vnode.

Avec ces changements, les performances sont améliorées au moins lorsque les données nécessaires sont déjà disponibles dans le cache disque.

Nettoyage et corrections dans les fonctions d’entrĂ©es-sorties vectorisĂ©es et asynchrones do_iterative_fd_io et do_fd_io utilisĂ©es par les systĂšmes de fichiers: meilleure gestion des rĂ©fĂ©rences et prise en compte de certains cas particuliers. Cela permet de simplifier un peu le code de prĂ©-remplissage du cache de blocs (waddlesplash).

La prise en compte des drapeaux O_RDONLY|O_TRUNC lors de l’ouverture d’un fichier est maintenant faite directement dans le VFS, il n’est plus nĂ©cessaire de transmettre la requĂȘte au systĂšme de fichier. Cette combinaison de drapeaux est un comportement indĂ©fini dans POSIX, et supprime le contenu du fichier dans Linux. Dans Haiku, elle remonte une erreur.

Correction du comportement de l’ouverture d’un symlink invalide (ne pointant pas sur un fichier) avec le flag O_CREAT.

Le parser de requĂȘtes pouvait essayer de lire des donnĂ©es invalides (la taille de clĂ© d’un index inexistant) dans certains cas particuliers.

Nettoyage de logs dans tous les systĂšmes de fichiers qui affichaient un message lors de chaque tentative d’identification. On avait donc un message de chaque systĂšme de fichier pour chaque partition. Maintenant, le cas le plus courant (le systĂšme de fichier ne reconnaĂźt pas du tout la partition) ne dĂ©clenche plus de logs.

Correction d’une erreur dans userlandfs sur la fonction file_cache_read pour les tentatives d’accĂšs aprĂšs la fin d’un fichier (cas particulier nĂ©cessaire pour implĂ©menter correctement mmap).

Correction d’une mauvaise gestion du errno dans le cache de blocs, qui pouvait aboutir à un kernel panic.

Diverses amĂ©liorations, nettoyages et corrections de fuites mĂ©moire: dans la gestion des fichiers montĂ©s comme image disques, dans les entrĂ©es-sorties asynchrones, dans l’enregistreur d’évĂšnements scheduling recorder.

Console et affichage

Unification du code d’affichage du splash screen (par le bootloader) et des icĂŽnes de la sĂ©quence de dĂ©marrage (par le kernel) pour Ă©viter qu’ils prennent des dĂ©cisions diffĂ©rentes sur le positionnement (par exemple si l’un est compilĂ© pour afficher le logo de Haiku, et l’autre en version « dĂ©griffĂ©e » sans ce logo qui est une marque dĂ©posĂ©e) (waddlesplash).

Initialisation de la console framebuffer beaucoup plus tĂŽt dans le dĂ©marrage du noyau, ce qui permet d’afficher un message Ă  l’écran en cas de kernel panic y compris dans les premiĂšres Ă©tapes du dĂ©marrage (par exemple, l’initialisation de la mĂ©moire virtuelle). Auparavant, ces informations Ă©taient disponibles uniquement dans le syslog (inaccessible si le systĂšme ne dĂ©marre pas) ou via un port sĂ©rie (en voie de disparition sur les machines modernes) (waddlesplash).

RĂ©seau

RemontĂ©e des donnĂ©es annexes (ancillary data) en une seule fois lorsque c’est possible. Ces donnĂ©es sont utilisĂ©es en particulier dans les sockets de domaine AF_UNIX pour permettre d’échanger des descripteurs de fichiers entre processus. Ce regroupement de donnĂ©es n’est pas exigĂ© par la spĂ©cification POSIX, mais c’est le comportement attendu par le code de communication interprocessus de Firefox et de Chromium (ils utilisent tous les deux le mĂȘme code) (waddlesplash).

Gestion de la mémoire

Comme indiquĂ© plus haut dans la dĂ©pĂȘche, l’apparition du navigateur Iceweasel a mis en Ă©vidence de nombreux problĂšmes autour de la gestion de la mĂ©moire. Cela a donc Ă©tĂ© l’objet d’un gros travail de stabilisation et d’amĂ©lioration.

  • Le cache d’objets du noyau pouvait parfois ignorer le paramĂštre indiquant la rĂ©serve minimum d’objets devant toujours ĂȘtre disponibles (waddlesplash)
  • AmĂ©lioration de l’implĂ©mentation de la famille de fonctions autour de mprotect, qui permettent une gestion fine et bas niveau de la mĂ©moire. En particulier, plusieurs problĂšmes se posaient lors de l’utilisation de ces fonctions lors d’un appel Ă  fork, les deux processus se retrouvant dans un Ă©tat incohĂ©rent,
  • Suppression de logs prĂ©sents dans les mĂ©thodes de dĂ©faut de page, qui sont peu appelĂ©es pour les applications classiques, mais exploitĂ©es volontairement par d’autres applications (machines virtuelles Java ou Javascript par exemple). Les logs Ă©taient donc superflus dans ce cas (waddlesplash),
  • Optimisation de l’écriture par lot de plusieurs pages de mĂ©moire vers le swap,
  • Meilleure gestion des permissions d’accĂšs page par page,
  • Correction de plusieurs problĂšmes conduisant Ă  un blocage ou fort ralentissement du systĂšme quand il n’y a plus assez de mĂ©moire libre,
  • AmĂ©lioration de la stratĂ©gie d’allocation de la table des descripteurs de fichiers,
  • Regroupement de code dupliquĂ© pour chaque plateforme qui Ă©tait en fait gĂ©nĂ©rique.

Ce travail se poursuit avec un remplacement de l’allocateur mĂ©moire actuel, qui est basĂ© sur hoard2. Cette implĂ©mentation est assez ancienne et montre aujourd’hui ses limites. Des essais sont en cours avec l’implĂ©mentation de malloc d’OpenBSD, ainsi qu’avec mimalloc de Microsoft, pour dĂ©terminer lequel des deux sera utilisĂ©. D’autres allocateurs ont Ă©tĂ© rejetĂ©s, car ils ne rĂ©pondent pas au besoin de Haiku, en particulier la possibilitĂ© de fonctionner efficacement sur un systĂšme 32 bits ou l’espace d’adressage est une ressource limitĂ©e.

Autres

SĂ©curisation des permissions sur les zones mĂ©moire partagĂ©es: une application ne peut pas ajouter des permissions en Ă©criture aux zones mĂ©moire d’une autre application. Une application qui n’est pas lancĂ©e par l’utilisateur root ne peut pas inspecter la mĂ©moire d’une application lancĂ©e par l’utilisateur root. Ajout toutefois de cas particuliers pour permettre au Debugger de faire son travail (il a besoin d’accĂ©der Ă  la mĂ©moire d’autres applications).

Ajout et amĂ©lioration de commandes dans le debugger noyau pour investiguer l’état de l’ordonnanceur d’entrĂ©es-sorties, qui se charge de programmer les accĂšs disque dans un ordre le plus efficace possible (waddlesplash).

La fonction vfork n’appelle plus les fonctions pre-fork. Haiku n’implĂ©mente pas complĂštement vfork, mais peut se permettre des optimisations sur le travail qu’un duo fork + exec classique demanderait normalement.

La configuration de la randomization de l’espace mĂ©moire (ASLR) est maintenant faite par la libroot et pas par le noyau. Ainsi une application peut utiliser une version diffĂ©rente de la libroot pour avoir une politique de randomization diffĂ©rente.

Optimisation de l’accùs par un thread à sa propre structure Thread

Chargeur de démarrage

L’écran de dĂ©marrage s’affiche correctement sur les systĂšmes EFI utilisant un mode Ă©cran avec une profondeur de couleur 16 bits (korli).

Affichage de la taille des partitions démarrables dans le menu de démarrage, pour faciliter leur identification (waddlesplash).

Activation des warnings du compilateur sur les chaĂźnes printf invalides.

Augmentation de la zone de mĂ©moire utilisĂ©e pour la dĂ©compression de l’archive de dĂ©marrage lors du boot sur le rĂ©seau, l’archive Ă©tait devenue trop grosse suite Ă  l’ajout de nouveaux pilotes.

Refactorisation du code de gestion de la mĂ©moire entre le bootloader et le runtime_loader, ajout de tests pour cette implĂ©mentation, et optimisation de l’utilisation mĂ©moire du bootloader.

Amélioration du comportement si le device tree définit un port série sans spécifier de baudrate: le bootloader suppose que le baudrate est déjà configuré, et utilise le port sans essayer de le réinitialiser.

Outils de compilation

La compilation de Haiku est un processus relativement complexe: il faut utiliser deux compilateurs pour Haiku lui-mĂȘme (un gcc rĂ©cent plus une version plus ancienne pour assurer la compatibilitĂ© avec BeOS) ainsi que un compilateur pour le systĂȘme hĂŽte de la compilation (qui peut ĂȘtre Linux, BSD, Mac OS ou Windows) pour gĂ©nĂ©rer des outils nĂ©cessaires Ă  la compilation elle-mĂȘme. L’outil retenu est Jam, une alternative Ă  Make avec une meilleure gestion des rĂšgles gĂ©nĂ©riques rĂ©utilisables.

  • Ajout de vĂ©rification pour Ă©viter d’avoir un build partiellement configurĂ©, avec des ConfigVars dĂ©finies mais vides.
  • Retrait d’un warning incorrect dans l’outil de build jam si on spĂ©cifie Ă  la fois un profil et une cible de compilation sur la ligne de commande.
  • Reconnaissance des processeurs hĂŽtes ARM et RISC-V pour la compilation croisĂ©e, correction d’autres problĂšmes avec les architectures non-x86.
  • Ajout de dĂ©pendances manquantes dans les rĂšgles de compilation de packagefs.
  • Suppression de fichiers de licence fournis avec Haiku mais concernant du code qui avait Ă©tĂ© supprimĂ© de Haiku auparavant.
  • AmĂ©lioration de la remontĂ©e d’erreur du script configure si un interprĂ©teur Python n’a pas Ă©tĂ© trouvĂ©.
  • Correction de messages d’avertissement de awk pour l’utilisation de fonctions qui n’existent plus dans le traitement des fichiers d’identifiants matĂ©riels USB et PCI.

Documentation

Documentation interne

Ajout de documentation sur les dĂ©tails d’implĂ©mentation de ioctl et posix_devctl et les spĂ©cificitĂ©s de Haiku pour la premiĂšre (PulkoMandy).

Correction de fautes de frappe dans l’introduction au launch_daemon.

Remplacement de toutes les références à "OpenBeOS" par "Haiku".

Documentation d’API

Ajout de documentation pour les méthodes GetFontAndColor et SetFontAndColor de BTextView.

Ajout de documentation pour les classes BShelf et BGameSound.

RĂ©organisation de la liste des caractĂšres de contrĂŽles dans la documentation du clavier, ajout d’entrĂ©es manquantes dans cette liste et ajoute de commentaires indiquant Ă  quelles combinaisons de touches ces caractĂšres sont normalement associĂ©s.

Traductions de Haiku

La traduction du systĂšme dans diffĂ©rentes langues est un facteur important d’inclusivitĂ© et d’accessibilitĂ© (mĂȘme si la communication avec l’équipe de dĂ©veloppeurs pour le support n’est pas toujours simple).

Haiku est disponible dans 30 langues, la trentiÚme étant le coréen, pour lequel il y a un nouveau responsable des traductions (le précédent avait cessé toute activité et laissé la traduction inachevée).

Haiku recherche des volontaires pour s’occuper des traductions en biĂ©lorusse, croate, bulgare, hindi, punjabi et slovĂšne, pour lesquelles les prĂ©cĂ©dents responsables de relectures n’ont plus le temps d’assurer le rĂŽle. Ainsi bien sĂ»r que de l’aide pour la traduction du systĂšme, du manuel d’utilisation, et des applications tierces, que ce soit pour ajouter de nouvelles langues ou pour renforcer les Ă©quipes s’occupant de langues existantes. Le point d’entrĂ©e est le portail d’internationalisation de Haiku.

La traduction du systĂšme Haiku s’effectue avec Pootle. L’outil n’est plus dĂ©veloppĂ© et des investigations sont en cours pour le remplacer par Weblate. La traduction du manuel d’utilisation s’effectue avec [un outil spĂ©cifiquement dĂ©veloppĂ© pour cela](https://github.com/haiku/userguide-translator. La traduction des applications s’effectue Ă©galement avec un outil personnalisĂ© nommĂ© Polyglot.

Commentaires : voir le flux Atom ouvrir dans le navigateur

  •  

GIMP 3.0 RC2 est sorti

Note : cette dĂ©pĂȘche est une traduction de l'annonce officielle de la sortie de GIMP 3.0 RC2 du 27 dĂ©cembre 2024 (en anglais).

AprĂšs la premiĂšre sĂ©rie de retours de la communautĂ©, nous sommes heureux de partager la deuxiĂšme version candidate de GIMP 3.0 ! Les gens nous ont donnĂ© des commentaires trĂšs utiles sur la premiĂšre version candidate et nous avons pu corriger de nombreux bugs.

C’est notre petit cadeau sous le sapin 🎄 pour vous tous ! (NdM: disons fourrĂ© dans la galette/le gĂąteau des rois dĂ©sormais ?)

GIMP 3.0 RC2: écran de démarrage

Écran de dĂ©marrage de la nouvelle version candidate, par Sevenix (CC by-sa 4.0) - GIMP 3.0 RC2

Sommaire

Corrections de bugs importantes

Plusieurs correctifs ont été apportés depuis la version RC1. Nous souhaitons mettre en évidence les bugs les plus importants afin que les utilisateurs en soient informés et puissent effectuer des tests supplémentaires. Pour plus de détails sur les autres correctifs de bugs, veuillez consulter notre page NEWS sur GitLab.

Migration des paramĂštres de la 2.10

Lors des tests communautaires, nous avons dĂ©couvert que les paramĂštres des utilisateurs de la 2.10 n’étaient pas migrĂ©s vers GIMP 3.0 en raison de certaines hypothĂšses incorrectes dans le code d’importation. Étant donnĂ© que la plupart des dĂ©veloppeurs utilisent exclusivement GIMP 3.0 depuis un certain temps, nous n’avions pas remarquĂ© ce problĂšme. Le bug devrait maintenant ĂȘtre corrigĂ©, nous demandons donc des rapports de bugs si des prĂ©fĂ©rences 2.10 ne sont pas importĂ©es correctement dans RC2. Notez que si vous avez dĂ©jĂ  utilisĂ© 3.0 RC1, vous devrez d’abord supprimer ces configurations, sinon RC2 n’essaiera pas d’importer les prĂ©fĂ©rences 2.10 (assurez-vous de sauvegarder vos paramĂštres bien sĂ»r !).

Console Windows

Dans les versions de dĂ©veloppement 2.99, les versions Windows lançaient automatiquement un affichage de console en plus de GIMP lui-mĂȘme. C’est trĂšs utile pour les dĂ©veloppeurs Windows pour voir les messages de dĂ©bogage, mais la console n’était pas destinĂ©e Ă  ĂȘtre affichĂ©e pendant les versions stables. Comme nous avons modifiĂ© notre processus de construction pour utiliser Meson au lieu d’Autotools, nous avons appris que nous devions apporter des modifications supplĂ©mentaires pour empĂȘcher l’affichage de la console. Cela devrait ĂȘtre corrigĂ© maintenant grĂące Ă  Jehan - si vous voyez toujours la console sous Windows, veuillez remplir un nouveau rapport de bogue !

Problùmes de polices d’interface utilisateur manquantes sur macOS

Il y a un problĂšme de longue date oĂč certains utilisateurs de macOS ne voyaient que des symboles « Unicode manquants Â» au lieu des textes d’interface dans GIMP (Ă  la fois dans la version 2.10 et dans la version 3.0). Cela Ă©tait dĂ» Ă  un bug dans Pango, la bibliothĂšque que nous utilisons pour les mises en page de texte. Ce problĂšme a Ă©tĂ© rĂ©solu avec la rĂ©cente version Pango 1.55.0, nous encourageons donc tous les empaqueteurs macOS tiers Ă  mettre Ă  jour vers cette version lorsqu’ils construisent GIMP pour le distribuer.

GIMP 3.0.0 RC2 : le package officiel de macOS contient dĂ©sormais Pango sans polices cassĂ©es

Si vous aviez ce problĂšme de polices cassĂ©es sur macOS (Ă  gauche), il est dĂ©sormais rĂ©solu (Ă  droite) - captures d’écran de rapporteurs de bug - GIMP 3.0.0 RC2

Intégration de darktable

AprĂšs la sortie de la version 3.0 RC1, nous avons reçu des rapports de certains utilisateurs indiquant qu’ils ne pouvaient toujours pas importer et exporter d’images entre GIMP et darktable. Nous avons travaillĂ© avec les dĂ©veloppeurs de darktable pour Ă©liminer les bugs restants, de sorte que l’intĂ©gration entre darktable 5.0.0 et GIMP 3.0 RC2 devrait dĂ©sormais fonctionner pour tout le monde. Cependant, veuillez dĂ©poser un nouveau rapport de bogue si vous continuez Ă  rencontrer des problĂšmes pour connecter les deux !

Améliorations

Bien que l’objectif principal du dĂ©veloppement de la version 3.0 RC2 ait Ă©tĂ© la correction de bugs et le peaufinage, certaines nouvelles fonctionnalitĂ©s ont Ă©galement Ă©tĂ© implĂ©mentĂ©es.

API de filtre GEGL

De nombreux anciens wrappers d’API pour les opĂ©rations GEGL ont Ă©tĂ© supprimĂ©s dans la version RC1. Bien que cela ait rĂ©duit la dette technique, cela a Ă©galement causĂ© des problĂšmes Ă  de nombreux dĂ©veloppeurs de greffons et de scripts tiers qui souhaitaient porter leurs greffons vers la version 3.0. Alors que notre plan initial Ă©tait d’implĂ©menter la nouvelle API publique de filtre aprĂšs la sortie de la version 3.0, les commentaires de la communautĂ© nous ont convaincu de l’ajouter pour la version 3.0 RC2.

Applying filters through libgimp 3.0.0 API (Script-fu et al.) - GIMP 3.0.0 RC2

Application de filtres via l’API libgimp 3.0.0 (Script-fu et al.) - GIMP 3.0.0 RC2

Le travail de Jehan permet aux dĂ©veloppeurs d’appliquer des effets de filtre soit immĂ©diatement, soit de maniĂšre non destructrice. Vous pouvez voir des exemples de la maniĂšre de procĂ©der en C, Python et Script-Fu dans la requĂȘte de fusion, ou en recherchant gimp-drawable-filter dans le navigateur de procĂ©dures de GIMP. Nous avons Ă©galement commencĂ© Ă  utiliser l’API de filtre dans nos scripts Python pour crĂ©er automatiquement des effets d’arriĂšre-plan flou pour le programme d’installation Windows, et avec cette mĂȘme API en C, Alx Sa a ajoutĂ© la prise en charge de l’importation de l’ancien style de calque Color Overlay de Photoshop.

Nous sommes preneurs des retours et des rapports de bugs d’auteurs de greffons et de scripts qui utilisent la nouvelle API de filtrage dans leur travail ! Nous avons Ă©galement prĂ©vu d’autres mises Ă  jour pour GIMP 3.0.

Espaces de fusion de calques et composition dans les fichiers XCF

Les discussions entre les experts en science des couleurs Elle Stone et Øyvind KolĂ„s ont rĂ©vĂ©lĂ© un autre domaine nĂ©cessitant des amĂ©liorations dans le cadre de notre projet Color Space Invasion. Plus prĂ©cisĂ©ment, les images avec des profils de couleurs qui ont des courbes de reproduction des tons non perceptives peuvent ne pas ĂȘtre rendues correctement lorsqu’elles sont dĂ©finies sur certains modes de calque.

Øyvind a implĂ©mentĂ© une correction pour ce problĂšme en ajoutant un espace perceptuel appropriĂ© par dĂ©faut Ă  des modes de calque spĂ©cifiques. Bien que nous pensions que cette amĂ©lioration ne devrait pas avoir d’impact sur les fichiers XCF plus anciens, n’hĂ©sitez pas Ă  rapporter tous problĂšmes de compatibilitĂ© avec la version 3.0 RC2 !

Paquets

AppImage

GrĂące aux efforts continus de Bruno Lopes et avec l’aide de Samueru et de la communautĂ© AppImage, notre AppImage expĂ©rimentale fonctionne dĂ©sormais sur la plupart des distributions Linux. Nous souhaitons encourager davantage de tests, dans l’espoir de pouvoir la proposer comme une autre version Linux en plus de notre Flatpak. Vous pouvez consulter les instructions pour installer les paquets expĂ©rimentaux AppImage sur notre page de tĂ©lĂ©chargement des versions de dĂ©veloppement.

Flatpak

Notre flatpak journalier a maintenant un App-ID dĂ©diĂ© org.gimp.GIMP.Nightly. Cela signifie principalement qu’il peut ĂȘtre installĂ© cĂŽte Ă  cĂŽte avec le flatpak stable tandis que les deux sont visibles dans vos menus (plus besoin de sĂ©lectionner quelle version doit ĂȘtre affichĂ©e avec flatpak make-current).

Mais cela signifie Ă©galement que tous ceux qui avaient le flatpak journalier jusqu’à prĂ©sent ne verront pas de mise Ă  jour arriver de sitĂŽt. Afin de continuer Ă  utiliser le flatpak journalier, dĂ©sinstallez celui existant et installez le nouveau avec ces commandes :

flatpak uninstall org.gimp.GIMP//master
flatpak install https://nightly.gnome.org/repo/appstream/org.gimp.GIMP.Nightly.flatpakref

⚠ Rappel : le flatpak journalier contient le code de dĂ©veloppement actuel tel qu’il se prĂ©sente dans le dĂ©pĂŽt source. Parfois, il peut mĂȘme ĂȘtre trĂšs cassĂ© ou rendre vos fichiers de projet invalides. Nous ne le recommandons pas pour la production ! Utilisez cette version pour nous aider Ă  dĂ©boguer en signalant les problĂšmes ou si vous aimez vraiment les risques pour tester les derniĂšres fonctionnalitĂ©s.

Améliorations du greffon BMP

Le nouveau contributeur Rupert Weber a Ă©tĂ© trĂšs occupĂ© depuis la derniĂšre mise Ă  jour avec de nouvelles mises Ă  jour de notre greffon BMP. Quelques points de son travail Ă  mettre en avant :

  • Les fichiers BMP sont dĂ©sormais importĂ©s sans perte dans leur prĂ©cision d’origine, plutĂŽt que d’ĂȘtre convertis en prĂ©cision entiĂšre de 8 bits.
  • Le greffon prend dĂ©sormais en charge le chargement de fichiers BMP avec compression RLE24 et Huffman.
  • Nous chargeons dĂ©sormais les fichiers BMP par morceaux plutĂŽt que d’essayer de charger l’image entiĂšre en une seule fois. Des travaux connexes nous permettent Ă©galement de charger des fichiers BMP beaucoup plus volumineux.
  • Rupert a Ă©galement effectuĂ© beaucoup de nettoyage et de maintenance du code, afin de rendre le greffon plus facile Ă  maintenir Ă  l’avenir.

Mises Ă  jour diverses

  • Jehan a apportĂ© quelques amĂ©liorations d’usage de la console Python. Vous pouvez dĂ©sormais utiliser les raccourcis Ctrl+R et Ctrl+S pour parcourir votre historique de commandes, et Page prĂ©cĂ©dente et Page suivante vous permettent dĂ©sormais de faire dĂ©filer l’historique en plus des touches flĂ©chĂ©es Haut et Bas.

History search in Python Console - GIMP 3.0.0 RC2
Recherche dans l’historique de commande (console Python) - GIMP 3.0.0 RC2

  • Alx Sa a implĂ©mentĂ© le chargement des fichiers CMJN PAM dans le greffon PNM.

  • Sous Windows, nous avons Ă©galement ajoutĂ© la possibilitĂ© d’ouvrir des images via des raccourcis Windows (fichiers .lnk) directement depuis la boĂźte de dialogue de sĂ©lection de fichiers. Ce travail est Ă©galement rĂ©alisĂ© par Alx Sa.

  • D’autres modifications et amĂ©liorations ont Ă©tĂ© apportĂ©es au thĂšme. En particulier, le style du « curseur compact » a Ă©tĂ© considĂ©rablement amĂ©liorĂ© aprĂšs les commentaires et le travail de Denis Rangelov. Denis a Ă©galement crĂ©Ă© de nouvelles icĂŽnes pour la boĂźte de dialogue de navigation ancrable, remplaçant les doublons par des symboles distincts. Anders Jonsson a Ă©galement rĂ©visĂ© le thĂšme et supprimĂ© certaines solutions de contournement qui Ă©taient nĂ©cessaires dans GIMP 2.10, mais qui ne sont plus nĂ©cessaires avec nos nouveaux thĂšmes 3.0.

  • Idriss Fekir a apportĂ© des amĂ©liorations Ă  notre code de chargement de polices XCF, pour amĂ©liorer la compatibilitĂ© lors de l’importation d’anciens fichiers XCF.

Aperçu des changements depuis la version 2.10

Pour ceux qui n’ont pas suivi de prĂšs le dĂ©veloppement de GIMP, cet article ne couvre que les changements progressifs depuis la derniĂšre version. Ils ne rĂ©pertorient pas tous les changements ou amĂ©liorations apportĂ©s Ă  GIMP 3.0 - ce serait un article trĂšs long !

Bien que nous aurons des notes de version complĂštes pour la version finale 3.0, nous avons pensĂ© qu’il serait utile de rĂ©sumer quelques-uns des changements majeurs apportĂ©s au cours du processus de dĂ©veloppement de la version 2.99 :

  • Le travail initial de portage de GIMP vers GTK3 a eu lieu dans 2.99.2. Cette version a Ă©galement introduit la sĂ©lection multi-calque, ainsi que des modifications initiales de l’API et des amĂ©liorations de la gestion de l’espace colorimĂ©trique.
  • D’autres mises Ă  jour de l’API ont Ă©tĂ© effectuĂ©es dans 2.99.4, notamment la possibilitĂ© de gĂ©nĂ©rer automatiquement des interfaces utilisateur de greffon en fonction des entrĂ©es de l’utilisateur. Diverses amĂ©liorations de convivialitĂ© ont Ă©galement Ă©tĂ© apportĂ©es, ainsi que l’introduction de l’outil expĂ©rimental Paint Select.
  • 2.99.6 a apportĂ© davantage de mises Ă  jour de l’API et de travaux internes. D’autres fonctionnalitĂ©s destinĂ©es Ă  l’utilisateur incluent la possibilitĂ© de placer des guides en dehors du canevas, une meilleure prise en charge du pavĂ© tactile et une meilleure prise en charge des diffĂ©rentes mĂ©tadonnĂ©es de couleur PNG.
  • Le pipeline de dĂ©veloppement a Ă©tĂ© considĂ©rablement amĂ©liorĂ© dans 2.99.8, permettant des temps de construction et une automatisation plus rapides. La prise en charge de nouveaux formats de fichiers tels que PSB et JPEGXL a Ă©tĂ© ajoutĂ©e dans cette version, ainsi que la prise en charge des pilotes Windows Ink de tablette graphique.
  • 2.99.10 a introduit des « ensembles de calques Â», remplaçant l’ancien concept de calques liĂ©s. La dynamique de peinture a Ă©tĂ© rationalisĂ©e dans cette version, ainsi que la premiĂšre version de la boĂźte de dialogue de bienvenue.
  • La prise en charge de la liaison anticipĂ©e CMJN a Ă©tĂ© implĂ©mentĂ©e dans 2.99.12. Les thĂšmes de l’interface graphique CSS ont Ă©galement fait l’objet d’une refonte majeure dans cette version, ainsi que davantage de prise en charge de formats de fichiers et d’amĂ©liorations majeures de Script-Fu.
  • 2.99.14 a vu l’introduction de contours non destructifs pour l’outil de texte. L’outil d’alignement a Ă©galement Ă©tĂ© rĂ©visĂ©, la mise Ă  l’échelle des thĂšmes et des icĂŽnes a Ă©tĂ© amĂ©liorĂ©e et les sĂ©lections flottantes ont Ă©tĂ© largement remplacĂ©es dans le flux de travail.
  • Le portage GTK3 a finalement Ă©tĂ© achevĂ© dans 2.99.16. La fenĂȘtre contextuelle de recherche / a Ă©tĂ© mise Ă  jour pour afficher le chemin du menu pour toutes les entrĂ©es, ainsi que pour permettre de chercher parmi les filtres.
  • Les filtres non destructifs ont Ă©tĂ© introduits pour la premiĂšre fois dans 2.99.18. Des amĂ©liorations majeures de la gestion des couleurs ont Ă©galement Ă©tĂ© apportĂ©es, et de nouvelles options d’extension automatique des limites de calque et d’accrochage ont Ă©galement Ă©tĂ© implĂ©mentĂ©es.

GEGL

Tout comme pour GIMP, la version 0.4.52 de GEGL a Ă©tĂ© corrigĂ©e. Øyvind KolĂ„s a corrigĂ© certaines Ă©tiquettes gĂ©nĂ©riques « EntrĂ©e auxiliaire Â» pour qu’elles soient plus significatives. Elles seront Ă©galement visibles dans les filtres de GIMP. Il a Ă©galement amĂ©liorĂ© la prĂ©cision du traitement des couleurs de certains filtres. Thomas Manni, contributeur de longue date, a Ă©galement corrigĂ© les plantages lorsque certains filtres Ă©taient exĂ©cutĂ©s sur de trĂšs petits calques.

Statistiques de sortie

Depuis GIMP 3.0 RC1, dans le dĂ©pĂŽt principal de GIMP :

  • 73 rapports ont Ă©tĂ© fermĂ©s comme CORRIGÉS.
  • 71 demandes de fusion ont Ă©tĂ© acceptĂ©es.
  • 277 commits ont Ă©tĂ© poussĂ©s.
  • 18 traductions ont Ă©tĂ© mises Ă  jour : bulgare, catalan, chinois (Chine), chinois (TaĂŻwan), danois, finnois, gĂ©orgien, islandais, italien, letton, lituanien, norvĂ©gien nynorsk, persan, portugais, russe, slovĂšne, suĂ©dois, ukrainien.

35 personnes ont contribuĂ© Ă  des modifications ou des correctifs Ă  la base de code de GIMP 3.0.0 RC2 (l’ordre est dĂ©terminĂ© par le nombre de commits ; certaines personnes sont dans plusieurs groupes) :

  • 12 dĂ©veloppeurs pour le code principal : Jehan, Alx Sa, Michael Schumacher, Anders Jonsson, Lloyd Konneker, Øyvind KolĂ„s, Idriss Fekir, Andre Klapper, Jacob Boerema, Michael Natterer, Rupert Weber, Thomas Manni.
  • 11 dĂ©veloppeurs de plug-ins ou modules : Jehan, Lloyd Konneker, Alx Sa, Rupert Weber, Daniel NovomeskĂœ, Jacob Boerema, Aki, Bruno, Ryan Sims, Simon Munton.
  • 19 traducteurs : Alan Mortensen, Cheng-Chia Tseng, KolbjĂžrn StuestĂžl, RĆ«dolfs Mazurs, Jiri Grönroos, Sveinn Ă­ Felli, Alexander Shopov, Aurimas Černius, Marco Ciampa, Danial Behzadi, Hugo Carvalho, Jordi Mas, Anders Jonsson, Ekaterine Papava, Julia Dronova, Luming Zh, Martin, Michael Schumacher, Youri Chornoivan.
  • 2 concepteurs de thĂšmes : Alx Sa, Anders Jonnson.
  • 2 contributeurs Ă  la documentation : Jehan, Bruno.
  • 5 contributeurs pour la compilation, l’empaquetage ou l’intĂ©gration continue : Bruno, Jehan, Lloyd Konneker, Alx Sa, Jacob Boerema, Rupert Weber.

Contributions sur d’autres dĂ©pĂŽts du GIMPverse (l’ordre est dĂ©terminĂ© par le nombre de commits) :

  • GEGL 0.4.52 est composĂ© de 31 commits de 16 contributeurs : Øyvind KolĂ„s, Sam L, Thomas Manni, lillolollo, Alan Mortensen, Anders Jonsson, Ekaterine Papava, Hugo Carvalho, Jordi Mas, Juliano de Souza Camargo, KolbjĂžrn StuestĂžl, Lukas Oberhuber, Luming Zh, Marco Ciampa, Martin, Yuri Chornoivan.
  • ctx a enregistrĂ© 48 commits depuis la sortie de la RC1 par 1 contributeur : Øyvind KolĂ„s.
  • gimp-data a enregistrĂ© 6 commits de 5 contributeurs : Anders Jonsson, Jehan, Sevenix, Alx Sa et Denis Rangelov.
  • gimp-test-images (nouveau rĂ©fĂ©rentiel pour les tests de prise en charge des images) a enregistrĂ© 2 commits de 1 contributeur : Rupert.
  • La version gimp-macos-build (scripts d’empaquetage pour macOS) a reçu 5 commits de 1 contributeur : Lukas Oberhuber.
  • La version flatpak a reçu 4 commits de 2 contributeurs : Bruno Lopes, Jehan.
  • Notre site Web principal a reçu 29 commits de 3 contributeurs : Jehan, Alx Sa, Andrea Veri.
  • Notre site Web de dĂ©veloppement a reçu 16 commits de 2 contributeurs : Jehan, Bruno Lopes.
  • Notre documentation pour GIMP 3.0 a reçu 157 commits de 10 contributeurs : Andre Klapper, KolbjĂžrn StuestĂžl, Jacob Boerema, Alan Mortensen, Anders Jonsson, Marco Ciampa, Jordi Mas, Yuri Chornoivan, Alx Sa, Jiri Grönroos.

N’oublions pas de remercier toutes les personnes qui nous aident Ă  trier dans Gitlab, Ă  signaler les bugs et Ă  discuter des amĂ©liorations possibles avec nous. Notre communautĂ© est Ă©galement profondĂ©ment reconnaissante envers les guerriers d’Internet qui gĂšrent nos diffĂ©rents canaux de discussion ou comptes de rĂ©seaux sociaux tels que Ville PĂ€tsi, Liam Quin, Michael Schumacher et Sevenix !

Remarque : compte tenu du nombre de parties dans GIMP et de la façon dont nous obtenons des statistiques via les scripts git, des erreurs peuvent se glisser dans ces statistiques. N’hĂ©sitez pas Ă  nous dire si nous avons oubliĂ© ou mal classĂ© certains contributeurs ou contributions.

Autour de GIMP

Miroirs de téléchargement

GNOME a abandonnĂ© l’utilisation de miroirs lors de sa derniĂšre mise Ă  jour d’infrastructure. Comme nos miroirs de tĂ©lĂ©chargement sont hĂ©bergĂ©s par eux, on nous a demandĂ© si nous voulions Ă©galement faire la mĂȘme chose. En tant que projet communautaire, nous apprĂ©cions tous ceux qui contribuent un miroir pour rendre GIMP plus accessible dans leur rĂ©gion. Par consĂ©quent, nous avons dĂ©cidĂ© de continuer Ă  utiliser des miroirs pour distribuer GIMP.

Si vous souhaiter contribuer à un miroir pour votre région, voici la nouvelle procédure :

Comment devenir un miroir officiel (mise à jour de la procédure)

  1. Créez une demande de miroir sur le tracker gimp-web
  2. Dites-nous pourquoi vous souhaitez crĂ©er un miroir de GIMP, pour quels autres logiciels libres vous en contribuez dĂ©jĂ  un, quelle est votre configuration, l’emplacement du serveur

  3. Parlez-nous de vous : ĂȘtes-vous une organisation ou un particulier ? Donnez-nous le nom et l’URL spĂ©cifiques Ă  afficher dans la liste des sponsors de miroir.
  4. Une fois que nous aurons terminé de vérifier votre organisation, les identifiants rsync seront échangés de maniÚre sécurisée, vous permettant de synchroniser votre miroir avec le serveur source
  5. Il n’y a rien de particulier Ă  faire pour apparaĂźtre sur la page des sponsors qui sera mise Ă  jour rĂ©guliĂšrement via des scripts. Pourtant, cela peut prendre quelques jours, voire quelques semaines parfois. Ne vous inquiĂ©tez donc pas si le nom de votre organisation n’apparaĂźt pas immĂ©diatement !

🛈 Nous vĂ©rifions automatiquement Ă  intervalles alĂ©atoires que les miroirs sont mis Ă  jour suffisamment rapidement et que les donnĂ©es correspondent pour des raisons de sĂ©curitĂ© Ă©videntes.

Changements dans les miroirs

De plus, depuis la publication de la nouvelle 3.0RC1, un nouveau miroir a été ajouté :

  • Sahil Dhiman, Mumbai, Inde

Les miroirs sont importants, car ils aident le projet en répartissant la charge des dizaines de milliers de téléchargements quotidiens. De plus, en ayant des miroirs répartis dans le monde entier, nous garantissons que tout le monde peut avoir un accÚs rapide au téléchargement de GIMP.

Financer des exécuteurs ("runner") GitLab

Le dĂ©pĂŽt de code de GIMP est Ă©galement hĂ©bergĂ© sur la plateforme GitLab de GNOME. Andrea Veri a demandĂ© si nous pouvions financer un exĂ©cuteur [NDA: un "runner" est une sorte de serveur dĂ©diĂ© Ă  la compilation ou Ă  l’intĂ©gration continue de maniĂšre gĂ©nĂ©rale] sur la plateforme, ce qui permet Ă  tout projet sur la plateforme de tester la construction de son logiciel avant, pendant et aprĂšs les modifications de code. AprĂšs un vote du comitĂ© de GIMP, nous avons acceptĂ© et sommes dĂ©sormais les sponsors d’un exĂ©cuteur CI/CD x86 !

Télécharger GIMP 3.0 RC2

Vous trouverez toutes nos versions officielles sur le site officiel de GIMP (gimp.org) :

  • Paquets Linux flatpaks pour x86 et ARM (64 bits)
  • Installateur Windows universel pour x86 (32 et 64 bits) et pour ARM (64 bits)
  • Paquet MSIX (aperçu GIMP) pour x86 et ARM (64 bits)
  • Paquets macOS DMG pour le matĂ©riel Intel
  • Paquets macOS DMG pour le matĂ©riel Apple Silicon

D’autres paquets rĂ©alisĂ©s par des tiers devraient Ă©videmment suivre (paquets de distributions Linux ou *BSD, etc.).

🛈 Notes:

  • Les 2 paquets DMG macOS seront probablement en retard, car nous attendons la validation de la mise Ă  jour Apple par la Fondation GNOME avant de pouvoir signer nos paquets.
  • Le paquet MSIX prend gĂ©nĂ©ralement quelques jours ouvrables de validation par Microsoft. (le paquet MSIX est disponible)

Et ensuite ?

GrĂące au grand nombre de retours que nous avons reçus pour notre premier candidat Ă  la version finale, nous sommes en mesure de vous prĂ©senter cette deuxiĂšme version qui en est d’autant plus robuste. Comme vous l’avez vu, quelques surprises supplĂ©mentaires 🎁 sont arrivĂ©es avec les corrections de bugs, notamment la nouvelle API de filtre, qui a dĂ©clenchĂ© la prise en charge de l’importation de l’ancien effet Color Overlay de PSD, des modes de fusion et de composition amĂ©liorĂ©s, et plus encore. Nous avons pensĂ© que cela valait la peine de rompre le gel des fonctionnalitĂ©s pour ces changements et que cela fera toute la diffĂ©rence !

Avec cette deuxiĂšme version candidate, nous sommes plus proches que jamais de la version 3.0.0 de GIMP. Comme d’habitude, nous attendons avec impatience les nouveaux rapports de problĂšmes de la communautĂ© qui nous permettront de finaliser la version 3.0.0 ! đŸ€—

N’oubliez pas que vous pouvez faire un don et financer personnellement les dĂ©veloppeurs de GIMP, afin de donner en retour et d’accĂ©lĂ©rer le dĂ©veloppement de GIMP. L’engagement de la communautĂ© aide le projet Ă  se renforcer ! đŸ’ȘđŸ„ł

🎅🎄🎉 Et bien sĂ»r, toute l’équipe vous souhaite de joyeuses fĂȘtes de fin d’annĂ©e (MAJ de Jehan) nos meilleurs vƓux pour la nouvelle annĂ©e ! đŸ„łđŸ„‚đŸŽ†

Commentaires : voir le flux Atom ouvrir dans le navigateur

  •