J’ai participé au MOOC Ocaml qui s’est terminé le 18 décembre 2016. Tous les exercices du MOOC Ocaml pouvaient être faits dans un environnement du type de celui de Try OCaml
Pour continuer d’apprendre OCaml et développer des projets en Ocaml sur son poste, il faut se frotter aux outils gravitant autour du langage Ocaml, principalement ceux de build.
Dans ce journal je parlerais de la solution qui me semble la plus simple pour démarrer un projet OCaml et ensuite des autres outils que j’ai testés.
Prélude
Les essais ont été faits sur une Debian stable.
L’exemple d’application que je souhaite compiler est de la forme suivante:
src
├── main.ml
└── utils.ml
-
main
utiliseutils
etutils
utilise une lib externe. - la lib externe est installée avec opam.
OCaml et Opam
OPAM (OCaml Package Manager) est à la fois le dépôt de paquets OCaml et l’outil en ligne de commande pour les gérer.
Opam sait aussi gérer l’installation de plusieurs versions d’Ocaml.
On l’installe avec le gestionnaire de paquet :
apt install opam
Cela installe aussi Ocaml qui est une dépendance d’Opam.
On peut passer à une version plus récente d’OCaml avec :
opam switch 4.03.0
Note aux utilisateurs de fish : opam init
ne fonctionne pas avec fish, les scripts sont corrigés, mais il n’y a pas eu de release d’Opam depuis, voir #2255
Outils
Il existe un paquet starterkit qui facilite l’installation d’un grand nombre d’outils de développement OCaml, on l’installe avec :
opam install starterkit
C’est un meta-paquet qui installe les paquets suivants : lambda-term, ocp-indent, stringext, utop, ocp-index, merlin, ocamlfind, oasis, ocamlbuild.
Démarrer un projet
On démarre un projet géré par Oasis en créant un fichier _oasis
, exemple ci-dessous:
OASISFormat: 0.4
BuildTools: ocamlbuild
Plugins: META (0.4), DevFiles (0.4)
Name: prog
License: MIT
Authors: xxx
Synopsis: yyy
Version: 1.1.0
Executable prog
Path: src
MainIs: main.ml
CompiledObject: best
BuildDepends:
pcre
Le projet est ensuite initialisé avec la commande :
oasis setup -setup-update dynamic
Le projet se compile alors en lançant make
Le démarrage et la gestion d’un projet avec Oasis est simple et semble assez standard.
Il manque malgré tout la génération des fichiers pour opam avec l’intégration d’oasis2opam et la génération du fichier .merlin
pour Merlin.
Autres tests
ocamlbuild
On peut aussi utiliser directement ocamlbuild en suivant les exemples pour écrire un fichier _tags
et un Makefile
personnalisés.
ocp-build
Il faut créer un fichier en .ocp
dont la syntaxe est relativement simple.
Le projet s’initialise et se compile avec les commandes suivantes:
ocp-build init
ocp-build build
Il ne génère pas plus de fichier qu’Oasis et nécessite de déclarer tous ses fichiers.
Voir ocp-build, a build system for OCaml applications
topkg & carcass
Je n’ai pas réussi à installer carcass qui est un outil pour créer des canvas d’application compilé par topkg.
Voir topkg
Solvuu-build
solvuu-build semblait prometteur, mais je n’ai pas réussi à le faire fonctionner.
Conclusion
Merci à l’auteur de starterkit
qui est aussi l’auteur de l’article So you're learning OCaml! écrit à l’occasion du premier MOOC OCaml en 2015.
Cet article a été repris sur le site ocaml.org sous le titre Crash course on the OCaml ecosystem
Et vous ? Débutant dans ce langage ou non, comment abordez-vous le développement avec OCaml et son écosystème ?
# Sympa
Posté par gasche . Évalué à 4.
Merci pour ton journal (et désolé pour le plombage de moral dans la dépêche). Je ne connaissais pas starterkit, c'est un bon conseil à donner aux débutants, et sa doc est agréable pour se lancer aussi.
Pour répondre à ta question, moi je suis un vieux OCamleux donc j'ai grandi avec les choses d'avants et je me mets aux nouveaux trucs seulement petit à petit. En général pour un nouveau projet je me fais un
.merlin
etopam
à la main (pro tip pour installer les dépendances d'un projet qui vient avec sonopam
local:opam pin leprojet . --no-action ; opam install --deps-only leprojet
), et j'écris mon propre Makefile qui appelle OCamlbuild en dessus.Les gens plus modernes commencent avec OASIS directement, et c'est un chouette outil, mais j'ai toujours un peu peur d'avoir à travers trois niveaux d'abstractions: make (pour diriger la fête, par habitude et convention), oasis derrière, et enfin ocamlbuild (ou omake pour les gens qui préfèrent).
Un truc dont je suis bien conscient et, je pense, tout le monde dans la communauté OCaml, c'est que ce n'est pas vraiment agréable comme expérience pour les débutants. Pour chaque besoin il y a trois outils différents, aucun qui ne fait vraiment le consensus (à part
opam
pour le package management), et des couches de trucs les uns par-dessus les autres. Tout le monde essaie d'améliorer ça et de rendre l'environnement plus agréable pour les nouveaux (et pour les autres aussi), mais ça demande un travail énorme, vraiment considérable, de progresser juste un peu là-dessus. On ne s'en rend pas forcément compte de l'extérieur mais, de base, créer des outils agréables c'est vraiment difficile, et en plus, créer des outils agréables et qui s'intègrent bien à l'existant que les habitués connaissent déjà, c'est encore plus dur.(Je comprends les gens de Reason qui ont décidé de repartir de zéro au niveau de l'écosystème, même si je pense qu'un effort équivalent pour travailler avec les gens existants peut avoir au final plus d'impact.)
[^] # Re: Sympa
Posté par Aluminium95 . Évalué à 1. Dernière modification le 29 décembre 2016 à 10:57.
Pas plus que d'utiliser
gcc
ouclang
avec un makefile et les autotools. Je pense que ce qui est le plus pénible pour un débutant c'est la librairie standard : d'un côté elle existe et répond à certain besoins, d'un autre côté elle est assez mal faite. Le problème, c'est qu'elle n'est pas assez mal faite pour l'abandonner totalement, parce qu'elle répond au moins partiellement à certaines attentes basiques. Un choix plus raisonnable aurait été de ne pas avoir de librairie standard du tout (pas de Map, HashMap, etc …).Ici, le développeur qui vient d'un langage avec une lib correcte (comme python pour citer le lien so you're learning ocaml) se retrouve avec une lib bancale, et soit recode ses fonctions à la main dans un fichier perso qu'il trimballe du genre
utils.ml
(ce que je fais pour le moment), soit il apprend une autre librairie standard, avec ses conventions. Le problème c'est que dans tous les cas, il y a un choix (Core vs Batteries vs truc perso) et que le code devient moins « portable » : quand on arrive sur un truc basique qui devient dur à comprendre parce qu'on ne connait pas la lib, et bah c'est lourd. À la fin, un mec qui lit du code finira par connaître les habitudes des gens qui écrivent leurs propres fonctions, Core et Batteries.Un deuxième point est la syntaxe qui est parfois très pénible, notamment la priorité des opérateurs, en particulier du
if
qui est super chiant. Et le fait d'utiliser desbegin ... end
pour corriger toutes les priorités alors que les constructions standard pourraient facilement l'éviter.[^] # Re: Sympa
Posté par gasche . Évalué à 5.
Je dirais que justement, c'est bien ça le problème.
Le fonctionnement du compilateur OCaml a été calqué sur celui des compilateurs C, donc des gens qui sont à l'aise avec C ne voient pas forcément le problème—mais la plupart des autres langages ont des outils plus agréables. Quand on est à l'aise avec
autotools
on n'est pas forcément représentatif de la population des développeurs et développeuses.[^] # Re: Sympa
Posté par Aluminium95 . Évalué à 1.
En effet, pour reprendre un lien ajouté par Benoît Laurent dans un autre commentaire, voici ce qu'on lit ici
Cela rejoint mon expérience sur la librairie standard, et ajoute que le problème est exactement le même pour le système de build : le problème c'est que ça marche assez bien pour ne pas avoir envie de tout changer. Cela incite fortement les gens à construire des surcouches pour éviter d'avoir à casser l'existant (d'où les 3 niveau de build).
Après, il faut faire attention avec les outils plus agréables, parce que la gestion des librairies c'est pas toujours super. Le système de type NPM/Hackage/OPAM incite à des évolutions rapides et potentiellement incompatibles qui font que parfois, il devient impossible de compiler un projet (en tout cas pour Haskell). De plus ce genre de système ne remplace pas un gestionnaire de paquets, et pourtant il est tentant d'utiliser OPAM comme seul moyen de distribution.
[^] # Re: Sympa
Posté par Ontologia (site web personnel) . Évalué à 3.
A l'époque où je faisais du Lisaac (que ceux qui s'en souviennent s'esclaffent une seconde), on avait énormément discuté de ces problèmes de make, d'autotools et de la boucle sans fin où on créé un outil pour générer la conf de l'outil précédent qui avait lui-même été écrit pour automatiser son précédent…
Le produit de nos cogitations nous avaient amené à créer le LIP (LIsaacProject) qui est une sorte de Lisaac simplifié (on avait pas de tableaux si je me souviens bien) pour gérer des projets.
Il y avait toutes les primitives qu'il fallait pour chercher des fichiers, des paths, des version de librairie, des dépendances, etc…
Je pense que ça serait pas bête de faire ça en OCaml : il y a tout ce qu'il faut pour faire un interpréteur (avec ocamlrun), il n'y a qu'à (YaKaFoKon) implem une lib pour de la gestion de projet, tout est écris en ocaml, et zou on ferait un
Ça serait tellement plus simple…
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
[^] # Re: Sympa
Posté par gasche . Évalué à 2.
Des choses comme ça ont quand même été bien explorées :
ocamlbuild
se configure en OCaml (mais pas seulement) et apporte des concepts pour décrire le build,solvuu
repose surocamlbuild
mais la description de projet se fait totalement en OCaml, etomake
est justement un outil de build avec son langage à part.Tu parles de
ocamlopt -build ...
, mais ça suppose faire rentrer une notion de "build" complexe dans le compilateur, qui aujourd'hui ne fait que des builds simples, de supposer qu'il va distinguer ce qui a déjà été buildé et ce qu'il faut rebuilder, etc. C'est une possibilité, et ça pourrait simplifier beaucoup les choses (en limitant les "couches" différentes), mais pour l'instant les gens ont toujours voulu garder la séparation des responsabilités, et avoir un outil de build séparé du compilateur.[^] # Re: Sympa
Posté par Benoît Laurent (site web personnel) . Évalué à 3.
Oui ça n'est pas facile, mais ça ne me choque pas pour un langage de cet age.
Par contre les langages les plus récents mettent la barre assez haut maintenant, notamment Rust avec Cargo.
Opam est une réussite et à l'air de faire l'unanimité. Qu'est-ce qui empêcherait de reproduire cet effort pour y ajouter l'outil de build ? Le support financier de JaneStreet ? Un consensus technique ?
Merci à tous pour vos retours d'expériences et vos astuces.
[^] # Re: Sympa
Posté par gasche . Évalué à 4. Dernière modification le 30 décembre 2016 à 01:57.
Ce n'est pas clair, pour moi, que l'outil de build soit la source du problème. En supposant par exemple que OASIS permette de faire parfaitement abstraction du build (ce qui est au moins vrai pour les programmes "simples" que peuvent écrire les débutants qui découvrent le langage), il te reste à faire au moins un
_oasis
, unopam
et un.merlin
pour te lancer dans ton projet, et sans doute (ce n'est pas forcément indispensable) unMakefile
par-dessus tout ça.Il y a des langages qui ont un système monolithique qui fait tout : l'installation des dépendances, la configuration, le build, la discussion avec les IDEs, le packaging, etc. Mais d'une part, ça fait un goulot d'étranglement sur le langage (plus difficile d'étudier des alternatives etc.), d'autre part en suivant le principe Unix on aurait envie de comprendre comment découper ce mastodonte en des outils plus simples et indépendants, qui collaborent de façon flexible mais sans ajouter trop de complexité. Mais quelles frontières tracer, comment partager les responsabilités ? Aujourd'hui on n'a sans doute pas trouvé les bons contours en OCaml, parce que le mélange ajoute trop de complexité.
Edward Yang, un membre actif de la communauté Haskell, s'est aussi intéressé à cette question dans son billet The convergence of compilers, build systems and package managers.
[^] # Re: Sympa
Posté par gasche . Évalué à 4.
Par ailleurs, un truc à garder en tête en regardant Cargo par exemple (ou la commande
go
), c'est que ça propose une expérience plus agréable en enlevant souvent des fonctionnalités. Par exemple, faire du préprocessing de sources Rust avec Cargo, c'est très difficile.La communauté compense en mettant le plus de méta-programmation possible directement dans le langage, ce qui est une bonne chose pour certaines fonctionnalités (les macros propres, c'est utile et puissant, les tests unitaires bien intégrés, etc.) mais reste beaucoup moins flexible qu'un langage utilisant un outil de build "généraliste" (qui permet de rajouter des règles localement) comme Make ou ocamlbuild.
Par exemple, je ne crois pas qu'il y ait un générateur de parseur en Rust qui s'intègre bien avec le système de Build.
lalrop
recode la gestion des timestamps etc. de son côté, et copie les fichiers générés dans le répertoire de développement.Ça va sûrement s'améliorer avec le temps, mais il faut aussi voir que l'approche monolithique a aussi des coûts qu'on ne voit pas forcément tout de suite.
# Qualité du-dit MOOC
Posté par Gabbro . Évalué à 2.
Bonjour,
J'ai moi aussi suivi ce MOOC, presque jusqu'à la fin, et je suis, dirai-je poliment, très réservé sur sa qualité. Étant donné que tu as l'air plus enthousiaste que moi, je me demandais ce que tu (ou d'autres personnes l'ayant suivi) en pensait. Ce que tu y as apprécié, ou contraire ce qui t'as rebuté.
[^] # Re: Qualité du-dit MOOC
Posté par Benoît Laurent (site web personnel) . Évalué à 4.
Ça faisait longtemps que je voulais essayer OCaml, ça m'en a donné la possibilité et m'a forcé à maintenir mon l’intérêt sur plusieurs semaines. J'espère avoir passé un premier cap où il me serra plus facile de m'y remettre.
J'ai aimé l'environnement et ainsi pouvoir continuer sur plusieurs machines sans installer quoi que ce soit. Les supports sont bien.
On sent un certain style universitaire dans les choix d'exercice et d'énoncé, j'ai d'ailleurs trouvé ceux-ci plusieurs fois incomplet ou difficilement compréhensible, les messages laissés dans les forums mon parfois débloqué, merci à ceux qui ont en laissé.
Après 3 ou 4 semaines j'ai réduit ma participation par manque de temps/fatigue j'ai alors joué sur la notation et n'ai pas cherché à tout finir.
Note que c'était le premier MOOC auquel je participais.
[^] # Re: Qualité du-dit MOOC
Posté par Gabbro . Évalué à 2.
De manière amusante, ma situation est très proche de la tienne : ça faisait longtemps que je voulais essayer OCaml, ça m'en a donné la possibilité et m'a forcé à maintenir mon l’intérêt sur plusieurs semaines. Et c'était mon premier MOOC. ;)
Après, j'ai profondément détesté l'environnement. Pour le reste, je te rejoint globalement, plutôt universitaire, exercices parfois (trop souvent) difficilement compréhensibles. Je rajouterai juste une mésestimation du temps nécessaire, d'où un retard progressif, ce qui finalement fait que je n'ai pas touché au projet.
Reste que mon ressenti final est plutôt négatif (alors que tu te focalise plus sur le bon côté—c'est une bonne philosophie), et que je finis plutôt déçu par ce MOOC (et par OCaml, un peu par ricochet).
[^] # Re: Qualité du-dit MOOC
Posté par gasche . Évalué à 3.
Je connais les gens qui ont conçus le MOOC et je serait content de leur faire un retour utile sur ce qui t'a posé problème, si tu ne l'as pas déjà fait par d'autres canaux. N'hésite pas à donner plus de détails en réponse ou à m'envoyer un mail si tu préfères (gasche dot dylc chez gmail).
[^] # Re: Qualité du-dit MOOC
Posté par Gabbro . Évalué à 3.
Je leur est fait un (très) long retour détaillé dans le formulaire dédié.
En substance, les problèmes sont liés aux exercices qui sont parfois très compliqués (ne serait-ce que comprendre l'énoncé de certain), un manque de détail sur la récurrence, des outils en ligne très désagréables (l'éditeur de texte qui bouge la position du curseur comme bon lui chante, l'absence d'annuler (Ctrl-Z) sur plus de quelques modifications, le clic milieu qui ne marche pas…), et la troisième semaine (je n'ai littéralement rien retenu de cette semaine, dédiée aux types récursifs et aux structures en arbre — une semaine et demi après avoir vu la récurrence, c'est violent).
[^] # Re: Qualité du-dit MOOC
Posté par audionuma (site web personnel, Mastodon) . Évalué à 2.
J'avais résumé mon retour d'expérience sur ce fil :
http://linuxfr.org/nodes/110032/comments/1681475
Je le copie/colle
Pratiquement, j'ai réussi à peu près tous les exercices hebdomadaires mais j'ai échoué à achever les problèmes de fin de session.
Et je ne vais pas immédiatement aller plus loin sur ce langage.
# Liens supplémentaires
Posté par Benoît Laurent (site web personnel) . Évalué à 2. Dernière modification le 29 décembre 2016 à 22:13.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.