Ahrefs est maintenant construit avec Melange
OCaml, tout en bas
Un peu d'histoire
En 2021, nous avons décidé d'évaluer Melange comme alternative à ReScript pour compiler la base de code frontale d'Ahrefs. Nous avons écrit sur les raisons qui nous ont amenés là, ainsi que les limites que nous avons rencontrées à l'époque, dans un précédent article .
Après cette expérience, les discussions se sont poursuivies au sein de l'équipe. Passer à un autre compilateur, qui en était à un stade très précoce, comportait un certain risque. Mais il en va de même pour l'utilisation continue de ReScript, qui semble s'éloigner de plus en plus d'OCaml.
Enfin, en septembre 2022 (lors de l'ICFP à Ljubljana ), nous avons décidé de mordre la balle et lancé un projet pour approfondir l'intégration entre Dune (le système de construction le plus utilisé d'OCaml) et Melange. Cette meilleure intégration a été la clé pour résoudre deux des trois limitations que nous avions rencontrées lors de notre exploration initiale de Melange :
- La vitesse de construction augmenterait en raison de moins de travail nécessaire pour analyser
dune
les fichiers et d'une planification et d'une exécution plus efficaces des règles. - L'ergonomie des développeurs s'améliorerait, car Melange deviendrait un citoyen de première classe dans Dune, avec des concepts tels que les bibliothèques Dune et d'autres strophes devenant disponibles pour les utilisateurs de Melange.
Tête baissée
Au cours des mois suivants, nous nous sommes concentrés sur deux tâches, itérant sur plusieurs cycles où la progression d'une tâche informerait les prochaines étapes à suivre pour l'autre :
- Faites évoluer Dune pour ajouter des strophes, des champs et de la documentation pour prendre en charge les projets Melange.
- Migrez la base de code frontale d'Ahrefs pour utiliser le compilateur Melange et Dune, adaptez les bibliothèques et les liaisons tierces à Melange et peaufinez l'intégration de l'éditeur, créez des scripts et d'autres aspects de l'expérience de développement.
Un autre avantage de la façon dont le projet a été mis en œuvre est que nous l'avons initialement développé en mode furtif, en le gardant assez privé. En y travaillant au sein d'une équipe soudée, avant de faire une sortie publique, nous pourrions avancer plus vite. Nous pensons que cette approche a épargné aux futurs utilisateurs de Melange beaucoup de désabonnement et de brûlure causés par les multiples changements dans les options de strophe Dune, les drapeaux Melange et d'autres configurations que nous avons modifiées en cours de route, au fur et à mesure que nous en apprenions davantage sur cette intégration.
Stratégies migratoires
Initialement, notre plan était de migrer progressivement le code d'Ahrefs vers Melange. Comme la base de code frontend est divisée en différents outils, chacun étant autonome, nous avons pensé que nous pourrions introduire Melange pour construire un outil, puis un autre outil, en les migrant progressivement un par un.
Cependant, cette approche s'est avérée trop complexe car configurer un environnement de développement qui fonctionne à la fois sur Melange et ReScript est un défi. Comme les développeurs pouvaient travailler sur plusieurs outils au cours de la même semaine, voire au cours de la même journée, nous avons réalisé qu'il était impossible de reconfigurer l'environnement chaque fois qu'un développeur passait d'un outil construit avec Melange à un outil construit avec ReScript.
Par conséquent, nous avons changé d'avis et opté pour une migration ponctuelle. Nous nous assurons que les environnements CI, de développement et de mise en scène fonctionnent avec Melange et Dune. Et nous ferions cela sur des branches séparées, tout en utilisant ReScript sur nos scripts CI et de développement de branche principale. Une fois que nous étions sûrs que tout se construisait et fonctionnait correctement avec Melange, nous avons changé tous les scripts CI et de développement pour utiliser les commandes Melange et Dune. Nous avons essayé de garder le PR qui a appliqué ce commutateur aussi petit que possible, avec seulement quelques centaines de lignes de modifications afin que nous puissions revenir à ReScript si nécessaire. En fait, après une première tentative en mars, nous avons dû revenir à ReScript en raison de problèmes côté expérience développeur, liés aux performances de construction et à l'ergonomie, qui ont mis encore quelques semaines à être résolus.
En termes de gestion des packages et des dépendances tierces Melange, nous avons suivi une approche plus progressive. Dune est assez flexible en matière de vente , donc dans la phase initiale, nous avons téléchargé les bibliothèques Melange avec npm, et Dune les a incluses dans le projet comme s'il s'agissait de sources locales. Nous avons maintenant commencé à migrer certaines de ces bibliothèques afin de pouvoir les consommer à l'aide d'opam, le gestionnaire de packages OCaml. Cela impliquera d'abord de les publier dans notre miroir opam privé, mais le plan est de les publier dans le référentiel opam public à l'avenir afin que d'autres développeurs de Melange puissent également les utiliser.
Horaires
Vous pouvez être curieux de connaître les différences de performances entre les approches précédentes et actuelles. Mesurer les performances est délicat, mais nous avons essayé de mesurer quelques scénarios différents avec les deux configurations. Les résultats peuvent être vus ci-dessous.
Gardez à l'esprit que la configuration du frontend Ahrefs a des caractéristiques spécifiques, qui affectent les mesures de performances :
- Avant la migration : Dune a généré
ml
des fichiers à partiratd
de fichiers, puis l'outil de génération ReScriptbsb
a créé tous les fichiers source écrits à la main, ainsi que ceux générés à partiratd
de fichiers. - Après migration : tout est construit avec Dune et Melange.
Construction à froid :
- Avant :
real 0m28.232s
,user 9m23.883s
,sys 13m33.939s
- Après :
real 1m14.208s
,user 10m33.708s
,sys 5m45.644s
- Avant :
real 0m14.687s
,user 3m17.058s
,sys 3m57.903s
- Après :
real 0m21.895s
,user 0m20.528s
,sys 0m1.372s
- Avant:
1002ms
- Après:
1576ms
- Avant:
7032ms
- Après:
15394ms
Il y a place à l'amélioration dans la façon dont les règles Melange et Dune sont organisées afin que les constructions à froid puissent être plus rapides. Par exemple, retarder certaines optimisations dans Melange pourrait permettre de paralléliser davantage de travail.
conclusion
Les résultats à ce jour sont assez encourageants. Voici quelques-unes des choses qui sont possibles grâce à l'intégration plus profonde entre Dune et Melange, et son application dans la base de code Ahrefs :
- Le même compilateur OCaml est utilisé sur les bases de code frontend et backend.
- Accès à toutes les corrections de bogues, améliorations d'erreurs et nouvelles fonctionnalités ajoutées par l'équipe du compilateur OCaml entre les versions 4.06 et 4.14 du compilateur.
- Un environnement de développement partagé entre les équipes, y compris les extensions d'éditeur, le serveur OCaml LSP, etc. Plus besoin de maintenir un ensemble d'outils différent pour le backend et le frontend.
- Suppression des vérifications CI manuscrites qui garantissaient que différents outils de la base de code frontale n'accéderaient pas aux composants d'autres outils. Ceci est maintenant résolu par les bibliothèques Dune, et le compilateur OCaml se plaindra si les unités logiques tentent de sortir de leurs limites.
- Les dépendances partagées frontend et backend, telles que anuragsoni/routes , peuvent désormais être définies en un seul endroit : un fichier opam.
- Des reconstructions plus rapides et un meilleur mode de surveillance, car Dune contrôle désormais tous les artefacts de construction. Auparavant, Dune et ReScript partageaient les responsabilités, ce qui entraînait des reconstructions inutiles de certains artefacts. Ou bien, les reconstructions ne démarraient pas lorsque cela était nécessaire car le système de construction ne suivait pas les modifications dans certains sous-ensembles des sources.
- Maintenance PPX simplifiée , car il n'est plus nécessaire de publier des versions prédéfinies de ces outils.
- Melange permet d'exécuter tous les ppxs à partir d'un seul fichier exécutable , ce qui présente de beaux avantages en termes de performances.
- Tous les autres avantages de l'utilisation de Dune : bibliothèques virtuelles, mode veille, levier des intégrations avec des outils comme odoc…
Nous sommes ravis que ce projet devienne une réalité, et nous pensons que l'intégration plus profonde entre OCaml et Melange via Dune, ainsi que l'intégration ergonomique de Melange avec l'écosystème JavaScript via ses liaisons, peuvent permettre des projets qui étaient auparavant impossibles à imaginer. Par exemple, React full-stack en hydratant les composants rendus côté serveur à l'aide d'OCaml natif .
Maintenant, nous devons faciliter la tâche aux autres personnes qui souhaitent essayer d'utiliser Melange et Dune. Nous nous concentrons donc sur la documentation du fonctionnement de Melange.
Il y a une section pour Melange dans le manuel de Dune qui sera incluse dans la prochaine version stable, et qui peut être consultée dès aujourd'hui dans la latest
branche :https://dune.readthedocs.io/en/latest/melange.html.
La prochaine étape consistera à concevoir et à créer un site où chacun pourra lire et apprendre ce qui est nécessaire pour créer et maintenir un projet utilisant Melange et Dune. Ce site comprendra un terrain de jeu, dans l'esprit de celui de ReasonML , afin que nous puissions partager des extraits, voir la sortie de compilation JavaScript résultante et itérer sur des idées ensemble.
En plus de ce qui précède, nous avons beaucoup d'autres choses sur lesquelles nous allons travailler dans les prochains mois. Nous partagerons plus d'informations sur la feuille de route dès que Dune 3.8 et sa version Melange respective seront publiées dans le référentiel opam public principal, ce qui devrait arriver dans les prochaines semaines.
Comment contribuer ?
Si vous voulez en faire partie, ou si vous voulez écrire ou porter vos bibliothèques sur Melange, la meilleure façon de le faire est de contacter ReasonML Discord . Il existe un #melange
canal dédié où l'on peut obtenir de l'aide et des conseils sur la façon de commencer.
Sinon, s'il vous manque des fonctionnalités, si vous trouvez des bogues ou si vous rencontrez des erreurs confuses, veuillez ouvrir un problème dans le référentiel public Melange .
Nous espérons que vous partagez notre enthousiasme pour cette mise à jour. Notre parcours pour intégrer plus naturellement notre pile frontale dans l'incroyable langage et écosystème d'OCaml sera bien documenté. Restez à l'écoute pour d'autres mises à jour à l'avenir!