étrospective

Susan Sarandon
Susan Sarandonoriginal
2025-01-05 15:11:40986parcourir

étrospective

Retour sur 2024 et aperçu de l'année à venir.

2024 a été une année historique pour stdlib, pleine de progrès, d'innovation et de croissance de la communauté. Avec le recul, je suis frappé par le temps et les efforts que les membres de la communauté stdlib ont consacrés à affiner les API existantes, à créer de nouvelles fonctionnalités et à préparer le terrain pour un chemin passionnant à venir. Je me sens incroyablement chanceux de faire partie d'une communauté qui façonne activement l'avenir du calcul scientifique sur le Web, et je suis optimiste quant à notre succès continu dans les mois à venir.

Dans cet article, je vais récapituler quelques faits saillants et préfigurer ce qui nous attend pour 2025. Même si je ferai divers remerciements aux contributeurs individuels, rien de ce que nous avons accompli cette année n'aurait pu se produire sans l'ensemble de communauté stdlib. La communauté a joué un rôle déterminant dans le travail acharné nécessaire au succès de stdlib, de la recherche et de la correction des bogues à l'examen des demandes d'extraction et au tri des problèmes, en passant par la plongée en profondeur dans les mauvaises herbes des algorithmes numériques et de la conception de logiciels. Si je ne vous cite pas nommément, sachez que vos efforts sont reconnus et grandement appréciés. Un grand merci à toutes les personnes impliquées et à tous ceux qui ont aidé tout au long du chemin, de manière petite ou grande. ❤️

TL;DR

L'année écoulée a été transformatrice pour stdlib, marquée par une croissance, une innovation et des contributions communautaires importantes. Voici quelques points saillants :

  • Croissance de la communauté : 84 nouveaux contributeurs ont rejoint stdlib, triplant la taille de notre communauté de développeurs et générant plus de 4 000 commits, 2 200 pull request et la sortie de 500 nouveaux packages.
  • Google Summer of Code : quatre contributeurs exceptionnels ont contribué à faire avancer des projets critiques, notamment des fonctionnalités REPL améliorées, une prise en charge étendue de BLAS et de nouvelles API mathématiques.
  • Outils de développement améliorés : les progrès majeurs en matière d'automatisation comprenaient la génération automatisée de journaux de modifications, des flux de travail CI améliorés et un meilleur suivi de la couverture des tests.
  • Jalons techniques : des progrès significatifs ont été réalisés en algèbre linéaire (BLAS et LAPACK), en indexation sophistiquée, en intégrations WebAssembly et en implémentations C de fonctions mathématiques, tous visant à faire de JavaScript un langage de premier ordre pour le calcul scientifique.
  • Vision d'avenir : à l'horizon 2025, nous visons à étendre nos bibliothèques mathématiques, à améliorer l'interactivité REPL, à explorer WebGPU et à continuer de créer des outils pour rendre le calcul scientifique sur le Web plus puissant et plus accessible.

Grâce à la croissance rapide de stdlib et aux efforts collectifs de notre communauté mondiale, nous façonnons l'avenir du calcul scientifique sur le Web. Rejoignez-nous alors que nous franchissons les prochaines étapes de ce voyage passionnant !

Statistiques

Pour commencer, quelques statistiques de fin d'année de haut niveau. Cette année,

  • 84 nouveaux contributeurs du monde entier ont rejoint stdlib, triplant la taille de notre communauté de développeurs et apportant une nouvelle vie et de nouvelles perspectives au projet.
  • Ensemble, nous avons réalisé plus de 4 000 commits dans la branche principale de développement.
  • Nous avons ouvert près de 2 200 demandes de tirage, avec plus de 1 600 de ces demandes de tirage fusionnées.
  • Et nous avons livré plus de 500 nouveaux packages dans le cadre du projet, allant des nouvelles routines d'algèbre linéaire aux fonctions mathématiques spécialisées en passant par l'infrastructure de base pour les tableaux multidimensionnels et les API prenant en charge WebAssembly et d'autres environnements accélérés.

Ces réalisations reflètent le travail acharné et le dévouement de notre communauté. Ce fut une année chargée et nous avons été obligés de réfléchir de manière critique à la manière dont nous pouvons faire évoluer efficacement le projet et notre communauté à mesure que les deux continuent de croître. Cela signifiait investir dans les outils et l'automatisation, améliorer nos processus de révision et de publication, et trouver des moyens d'identifier et de perfectionner rapidement les nouveaux contributeurs.

L'été du code de Google

Le seul événement qui a vraiment déclenché les choses pour stdlib en 2024 a été notre acceptation au Google Summer of Code (GSoC). Nous avions déjà postulé en 2023, mais avons été rejetés. Ainsi, lorsque nous avons postulé en 2024, nous ne pensions pas avoir beaucoup de chances. À notre grande surprise et pour notre plus grand plaisir, stdlib a été accepté, déclenchant ainsi une course folle pour mettre nos affaires en ordre afin de pouvoir gérer l'afflux de contributeurs à venir.

GSoC a fini par être une expérience transformatrice pour stdlib, attirant des contributeurs talentueux et faisant avancer des projets critiques. Comme nous l’avons détaillé dans notre réflexion sur le GSoC, le chemin a été semé d’embûches, mais nous avons beaucoup appris et sommes sortis de l’autre côté. Inutile de dire que nous avons eu la chance d'avoir quatre excellents contributeurs du GSoC : Aman Bhansali, Gunj Joshi, Jaysukh Makvana et Snehil Shah. J'aurai un peu plus à dire sur leur travail dans les sections ci-dessous.

REPL

La boucle de lecture-évaluation-impression (REPL) de Node.js est souvent une réflexion secondaire dans le monde JavaScript, à la fois sous-utilisée et sous-estimée. Dès les premiers jours de stdlib, nous voulions créer une meilleure expérience REPL, avec une prise en charge intégrée des fonctionnalités de calcul scientifique et de traitement des données de stdlib. Le développement de stdlib REPL s'est fait par à-coups, mais l'objectif a toujours été de faire correspondre la puissance et l'ensemble des fonctionnalités de l'IPython de Python afin de faciliter l'analyse exploratoire interactive des données en JavaScript. Nous étions donc très enthousiastes lorsque Snehil Shah a exprimé son intérêt à travailler sur stdlib REPL dans le cadre de GSoC.

Snehil a déjà couvert une partie de son travail dans un article de blog précédent sur "Accueillir les couleurs au REPL !", mais son travail et celui d'autres couvrent bien plus encore. Quelques points forts :

  • Aperçu des complétions : lors de la saisie de caractères correspondant à un symbole connu dans le REPL, un aperçu de la complétion s'affiche désormais, ce qui facilite la saisie semi-automatique et permet aux développeurs d'économiser de précieuses frappes au clavier. Merci à Tudor Pagu, en particulier, pour avoir ajouté ceci !
  • Édition multi-lignes : avant d'ajouter la prise en charge de l'édition multi-ligne, le REPL prenait en charge les entrées multi-lignes, mais ne prenait pas en charge l'édition des lignes précédemment saisies, ce qui conduisait souvent à une expérience utilisateur frustrante. Désormais, le REPL prend en charge l'édition multiligne dans le terminal, similaire aux applications d'édition dédiées.
  • Pagination des sorties longues : une demande de fonctionnalité de longue date consistait à ajouter la prise en charge de quelque chose comme less/more au stdlib REPL. Auparavant, si une commande générait une longue sortie, un utilisateur pouvait être confronté à un mur de texte. Ce problème a maintenant été résolu, dans l'espoir d'ajouter une fonctionnalité de recherche plus avancée et moins similaire dans les mois à venir.
  • Collage entre crochets : coller une entrée multiligne dans le REPL utilisé pour exécuter l'entrée ligne par ligne, au lieu de la coller comme une seule invite. Bien qu'utile dans certains cas, ce n'est souvent pas l'intention souhaitée, en particulier lorsqu'un utilisateur souhaite coller et modifier une entrée multiligne avant l'exécution.
  • Thèmes de mise en évidence de la syntaxe personnalisés : les développeurs habitués à développer dans les IDE peuvent souvent se sentir à la dérive lorsqu'ils passent à un terminal dépourvu de certaines des subtilités de leur éditeur préféré. L'une de ces subtilités est la coloration syntaxique. En conséquence, nous avons travaillé pour ajouter la prise en charge des thèmes personnalisés, comme détaillé dans le billet de blog de Snehil.
  • Appairage automatique : une autre subtilité courante de l'IDE est la fermeture automatique des crochets et des guillemets, ce qui permet d'enregistrer les frappes au clavier et d'atténuer le redoutable crochet manquant. Jamais du genre à craindre une tâche difficile, Snehil a mis en œuvre la prise en charge du couplage automatique comme l'une de ses premières demandes d'extraction menant au GSoC.

En grande partie grâce au travail de Snehil, nous nous sommes rapprochés beaucoup plus de la parité IPython en 2024, transformant ainsi l'expérience JavaScript pour le calcul scientifique. Et nous n’avons pas encore fini. Nous avons encore des demandes d'extraction qui parcourent la file d'attente, et une chose qui me passionne particulièrement est que nous avons récemment commencé à explorer l'ajout de la prise en charge du protocole Jupyter. Restez à l'écoute pour des nouvelles supplémentaires sur REPL en 2025 !

BLAS

Un autre domaine d'intérêt a été le développement continu du support BLAS (Basic Linear Algebra Subprograms) de stdlib , qui fournit des API fondamentales pour les opérations courantes d'algèbre linéaire, telles que l'addition de vecteurs, la multiplication scalaire, les produits scalaires, combinaisons linéaires et multiplication matricielle. À partir de 2024, la prise en charge de BLAS dans stdlib était plutôt incomplète, notamment en termes de prise en charge des types de données à virgule flottante à valeurs complexes. La marée a commencé à changer avec les efforts de Jaysukh Makvana pour atteindre la parité des fonctionnalités des structures de données Complex64Array et Complex128Array de stdlib avec des tableaux typés JavaScript intégrés.

Ces efforts ont ensuite ouvert la voie à l'ajout de la prise en charge BLAS de niveau 1 pour les types de données de tableaux typés à valeurs complexes et au travail d'Aman Bhansali, qui a entrepris d'approfondir la prise en charge BLAS de niveau 2 et de niveau 3 dans stdlib. Après s'être initialement concentré sur les interfaces de tableaux striés BLAS de niveau inférieur, Aman a élargi son champ d'action en ajoutant des implémentations WebAssembly et en ajoutant la prise en charge de l'application des opérations BLAS aux piles de matrices et de vecteurs via des API de tableaux multidimensionnels de niveau supérieur (alias ndarray). 🎜>

En plus des routines BLAS conventionnelles, stdlib inclut des routines de type BLAS qui ne font pas partie du BLAS de référence. Ces routines incluent des API pour des algorithmes de sommation scalaires et cumulatifs alternatifs, le tri des tableaux striés, le remplissage et la manipulation des éléments de tableaux striés, la gestion explicite des valeurs NaN et d'autres opérations qui ne relèvent pas clairement de l'algèbre linéaire, mais qui sont courantes lorsque l'on travaille. avec des données.

Pendant le travail d'Aman sur BLAS, nous avons nettoyé et refactorisé les implémentations de BLAS, et Muhammad Haris s'est porté volontaire pour étendre ces efforts à nos routines BLAS étendues. Ses efforts ont consisté à migrer les modules complémentaires natifs de Node.js vers du C pur afin de réduire le passe-partout et d'exploiter notre vaste collection de macros C pour la création de modules complémentaires natifs, ainsi qu'à ajouter des API C dédiées pour faciliter l'interfaçage avec les ndarrays de stdlib.

Ces développements garantissent que stdlib continue de montrer la voie en matière de prise en charge de l'algèbre linéaire pour les développeurs JavaScript, offrant des outils puissants pour le calcul numérique. Bien que beaucoup de choses aient été accomplies, il reste encore du travail à accomplir, et BLAS continuera d'être un point central en 2025.

LAPACK

S'appuyant sur les travaux de BLAS dans le cadre d'un stage chez Quansight Labs, Pranav Goswami a travaillé à poser les bases de LAPACK (Linéaire Algebra Pack age) prise en charge dans stdlib afin de fournir des routines d'algèbre linéaire d'ordre supérieur pour résoudre des systèmes d'équations linéaires, problèmes de valeurs propres, factorisation matricielle et décomposition en valeurs singulières. Détaillé plus en détail dans son article de blog post-stage, Pranav a cherché à établir une approche de test et de documentation des implémentations ajoutées et à exploiter les idées de BLIS pour créer des interfaces LAPACK qui facilitaient l'interfaçage avec les ndarrays de stdlib et minimisaient ainsi les besoins en matière de déplacement et de stockage des données. Alors qu'une bonne partie du temps a été consacrée à résoudre les problèmes et à itérer sur la conception de l'API, Pranav a réalisé des progrès significatifs en ajoutant divers utilitaires d'implémentation et près de 30 routines LAPACK couramment utilisées. Compte tenu de l'énormité de LAPACK (~ 1 700 routines), ce travail se poursuivra dans un avenir prévisible, alors soyez à l'affût d'autres mises à jour dans les mois à venir !

En passant, si vous souhaitez en savoir plus sur la façon dont stdlib aborde l'interface avec les bibliothèques Fortran, dont beaucoup constituent encore le fondement de l'informatique numérique moderne, assurez-vous de consulter le billet de blog de Pranav sur l'appel de routines Fortran depuis JavaScript utilisant Node.js.

Implémentations en C de fonctions mathématiques spéciales

L'une des priorités de longue date de stdlib est le développement continu de ses routines vectorisées pour les opérations mathématiques et statistiques courantes. Alors que tous les noyaux mathématiques scalaires (par exemple, les fonctions transcendantales, telles que sin, cos, erf, gamma, etc., et les fonctions de densité de distribution statistique) ont des implémentations JavaScript, de nombreux noyaux manquaient d'implémentations C correspondantes, qui sont nécessaires pour débloquer des performances plus rapides dans Node.js et autres environnements d'exécution JavaScript côté serveur prenant en charge les liaisons natives.

Gunj Joshi et d'autres ont cherché à combler cette lacune et ont ouvert plus de 160 demandes d'extraction ajoutant des implémentations C dédiées. À ce stade, il ne reste que quelques-unes des fonctions transcendantales à double précision les plus utilisées (je vous regarde, betainc !). Les efforts se sont maintenant tournés vers la prise en charge de la simple précision et l'ajout d'implémentations C pour les fonctions de distribution statistique. Nous prévoyons que ce travail se poursuivra au cours du premier semestre 2025 avant de porter notre attention sur les API streded array et ndarray de niveau supérieur, avec des implémentations pour les modules complémentaires natifs WebAssembly et Node.js.

Indexation sophistiquée

Un autre domaine dans lequel nous avons réalisé des progrès significatifs est l’amélioration de l’ergonomie du découpage et de la manipulation des tableaux. Les utilisateurs de langages de programmation numérique, tels que MATLAB et Julia, et de bibliothèques de calcul numérique dédiées, telles que NumPy, bénéficient depuis longtemps d'une syntaxe concise pour exprimer des opérations affectant uniquement un sous-ensemble d'éléments de tableau. Par exemple, l'extrait suivant montre la définition de tous les autres éléments d'un tableau à zéro avec NumPy.

import numpy as np

# Create an array of ones:
x = np.ones(10)

# Set every other element to zero:
x[::2] = 0.0

En tant que langage, JavaScript ne fournit pas une syntaxe aussi pratique, obligeant les utilisateurs à utiliser soit des méthodes d'objet plus verbeuses, soit des boucles manuelles. Nous avons donc cherché à combler cette lacune en exploitant les objets Proxy pour prendre en charge une « indexation sophistiquée ». Bien que l'utilisation d'objets proxy entraîne une certaine surcharge de performances en raison de l'indirection des propriétés, il vous suffit désormais d'installer et d'importer un seul package pour bénéficier de tous les avantages du découpage de style Python en JavaScript, évitant ainsi le besoin de boucles for détaillées et de création de tableaux. manipulation nettement plus ergonomique.

import array2fancy from '@stdlib/array-to-fancy';

// Create a plain array:
const x = [ 1, 2, 3, 4, 5, 6, 7, 8 ];

// Turn the plain array into a "fancy" array:
const y = array2fancy( x );

// Select the first three elements:
const v = y[ ':3' ];
// returns [ 1, 2, 3 ]

// Select every other element, starting from the second element:
v = y[ '1::2' ];
// returns [ 2, 4, 6, 8 ]

// Select every other element, in reverse order, starting with the last element:
v = y[ '::-2' ];
// returns [ 8, 6, 4, 2 ]

// Set all elements to the same value:
y[ ':' ] = 9;

// Create a shallow copy by selecting all elements:
v = y[ ':' ];
// returns [ 9, 9, 9, 9, 9, 9, 9, 9 ]

En plus de la sémantique des tranches, Jaysukh a ajouté la prise en charge de stdlib pour les tableaux booléens, jetant ainsi les bases du masquage des tableaux booléens.

import BooleanArray from '@stdlib/array-bool';
import array2fancy from '@stdlib/array-to-fancy';

// Create a plain array:
const x = [ 1, 2, 3, 4, 5, 6, 7, 8 ];

// Turn the plain array into a "fancy" array:
const y = array2fancy( x );

// Create a shorthand alias for creating an array "index" object:
const idx = array2fancy.idx;

// Create a boolean mask array:
const mask = new BooleanArray( [ true, false, false, true, true, true, false, false ] );

// Retrieve elements according to the mask:
const z = x[ idx( mask ) ];
// returns [ 1, 4, 5, 6 ]

Nous avons ensuite appliqué nos apprentissages lors de l'ajout de la prise en charge du masquage de tableau booléen pour ajouter la prise en charge de l'indexation de tableau d'entiers.

import Int32Array from '@stdlib/array-int32';
import array2fancy from '@stdlib/array-to-fancy';

// Create a plain array:
const x = [ 1, 2, 3, 4, 5, 6, 7, 8 ];

// Turn the plain array into a "fancy" array:
const y = array2fancy( x );

// Create a shorthand alias for creating an array "index" object:
const idx = array2fancy.idx;

// Create an integer array:
const indices = new Int32Array( [ 0, 3, 4, 5 ] );

// Retrieve selected elements:
const z = x[ idx( indices ) ];
// returns [ 1, 4, 5, 6 ]

Bien que ce qui précède démontre une indexation sophistiquée avec des objets tableaux JavaScript intégrés, nous avons récemment étendu le concept d'indexation sophistiquée aux ndarrays stdlib, un sujet sur lequel nous aurons plus à dire dans un prochain article de blog.

Il va sans dire que nous sommes particulièrement enthousiasmés par ces développements car nous pensons qu'ils amélioreront considérablement l'expérience utilisateur de l'informatique interactive et de l'analyse exploratoire des données en JavaScript.

Tester et construire

Enfin, 2024 a été une année d'automatisation, et je m'en voudrais de ne pas mentionner les efforts de Philipp Burckhardt. Philipp a joué un rôle déterminant dans l'amélioration de notre infrastructure de construction et de test CI et dans l'amélioration de l'évolutivité globale du projet. Son travail a été prolifique, mais il y a quelques points forts que je souhaite mettre en avant.

  • Génération automatique du journal des modifications : Philipp a dirigé le projet vers l'utilisation de commits conventionnels, qui sont un moyen standardisé d'ajouter une signification lisible par l'homme et la machine aux messages de commit, et a ensuite construit un ensemble d'outils robustes pour effectuer des versions automatiques, générant des les journaux des modifications et la coordination de la publication de l'écosystème en constante croissance de stdlib, composé de plus de 4 000 packages autonomes. Ce qui était autrefois un processus de publication manuel peut désormais être réalisé en exécutant un seul workflow GitHub.
  • bot stdlib : Philipp a créé un bot de demande d'extraction GitHub pour automatiser les tâches de révision des demandes d'extraction, publier des messages utiles et améliorer l'expérience globale de développement du responsable. Dans les mois à venir, nous sommes particulièrement désireux d'étendre les fonctionnalités du bot pour faciliter l'intégration de nouveaux contributeurs et signaler les problèmes de contribution courants.
  • Automatisation de la couverture des tests : avec un projet de la taille de stdlib, exécuter l'intégralité de la suite de tests sur chaque commit et pour chaque pull request n'est tout simplement pas possible. Il peut donc s’avérer difficile de rassembler des rapports de couverture de tests de packages individuels afin d’obtenir une vue globale de la couverture globale des tests. Philipp s'est efforcé de résoudre ce problème en créant un pipeline d'automatisation pour télécharger des rapports de couverture de test individuels vers un référentiel dédié, avec prise en charge du suivi des métriques de couverture au fil du temps et en créant les modifications de couverture de test attendues pour chaque demande d'extraction soumise. Inutile de dire que cela a considérablement amélioré notre visibilité sur les mesures de couverture des tests et contribué à améliorer notre confiance dans les tests accompagnant les demandes d'extraction soumises.

Bien que nous ayons fait des progrès considérables dans nos outils d'automatisation de projet, nous ne semblons jamais à court d'idées pour améliorer davantage l'automatisation et les outils. Attendez-vous à plus à venir en 2025 ! ?

Regarder vers l'avant

Alors, que nous réserve 2025 ?! Heureux que vous ayez posé la question !

Nous avons déjà fait allusion à diverses initiatives dans les sections ci-dessus, mais, à un niveau général, voici sur quoi nous prévoyons de concentrer nos efforts au cours de l'année à venir :

  • GSoC 2025 : en supposant que Google organise son programme annuel Google Summer of Code et que nous ayons la chance d'être à nouveau acceptés, nous serions ravis de continuer à soutenir la prochaine génération de contributeurs open source.
  • Implémentations mathématiques et statistiques C : extension de notre bibliothèque de noyaux mathématiques et statistiques scalaires et garantie d'une parité double et simple précision.
  • BLAS : compléter notre distribution WebAssembly et des API de niveau supérieur pour fonctionner sur des piles de matrices et de vecteurs.
  • LAPACK : continuer à réduire les ~1700 routines LAPACK (!).
  • FFT : ajout de la prise en charge initiale de la transformation de Fourier rapide (FFT) à stdlib pour aider à débloquer des algorithmes pour le traitement du signal.
  • Opérations vectorisées : automatisation de la création de packages pour les opérations vectorisées sur les noyaux mathématiques et statistiques scalaires.
  • Parité API ndarray : étendre la convivialité et la familiarité des ndarrays en atteignant la parité API avec les tableaux JavaScript intégrés et les tableaux typés.
  • REPL : ajout de la prise en charge du protocole Jupyter et diverses améliorations de l'ergonomie utilisateur.
  • WebGPU : même si nous ne nous sommes pas formellement engagés dans une approche spécifique, nous souhaitons au moins explorer la prise en charge de WebGPU, une norme Web émergente qui permet aux pages Web d'utiliser efficacement l'unité de traitement graphique (GPU) d'un appareil. , y compris pour le calcul GPU à usage général, afin de fournir des API pour le calcul scientifique accéléré sur le Web.
  • Financement de projet : explorer et, espérons-le, obtenir un financement de projet pour accélérer les efforts de développement et soutenir la croissance continue de la communauté stdlib.

C'est certainement beaucoup, et il faudra tout un village, une communauté de personnes dédiées à notre mission : faire du Web une plateforme de premier ordre pour le calcul numérique et scientifique. Si vous êtes prêt à nous rejoindre pour construire l'avenir du calcul scientifique sur le Web, nous serions ravis que vous nous rejoigniez. Consultez notre guide de contribution pour voir comment vous pouvez vous impliquer.

Une note personnelle

Alors que nous regardons vers l'avenir, j'aimerais partager une réflexion personnelle sur ce que cette année a signifié pour moi. Compte tenu de notre croissance cette année, j’avais souvent l’impression de boire dans une lance à incendie. Et, honnêtement, il peut être difficile de ne pas s'épuiser lorsque vous vous réveillez jour après jour avec plus de 100 nouvelles notifications et messages de personnes souhaitant des conseils, des réponses à des questions et des demandes d'extraction examinées. Mais, en réfléchissant à l'année écoulée, je suis terriblement fier de ce que nous avons accompli, et je suis particulièrement réconforté lorsque je vois de nouveaux contributeurs à l'open source grandir et s'épanouir, utilisant parfois les leçons qu'ils ont apprises comme tremplin vers des emplois et des opportunités de rêve. Avoir la chance de voir cela est une motivation motrice et un privilège dans le monde plus large de l'open source que je fais de mon mieux pour ne pas tenir pour acquis.

Et avec cela, ceci conclut la rétrospective 2024. En regardant tout ce que nous avons accompli ensemble, l'avenir du calcul scientifique sur le Web n'a jamais été aussi prometteur ! Merci encore à toutes les personnes impliquées qui ont aidé tout au long du chemin. Le chemin à parcourir est rempli d’opportunités passionnantes, et nous avons hâte de voir ce que nous réaliserons ensemble en 2025. En avant et vers le haut ! ?


stdlib est un projet logiciel open source dédié à fournir une suite complète de bibliothèques robustes et hautes performances pour accélérer le développement de votre projet et vous offrir une tranquillité d'esprit en sachant que vous dépendez d'un logiciel de haute qualité conçu par des experts.

Si vous avez apprécié ce post, donnez-nous une étoile ? sur GitHub et envisagez de soutenir financièrement le projet. Vos contributions et votre soutien continu contribuent à assurer le succès à long terme du projet et sont grandement appréciés !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn