BT

Diffuser les Connaissances et l'Innovation dans le Développement Logiciel d'Entreprise

Contribuez

Sujets

Sélectionner votre région

Accueil InfoQ Articles Interview et Revue du Livre : Real World OCaml

Interview et Revue du Livre : Real World OCaml

Le langage fonctionnel statiquement typé OCaml existe depuis presque deux décennies et a influencé de nombreux langages, comme F# et Scala.

O'Reilly a publié le livre "Real World OCaml" pour introduire aux lecteurs la programmation avec OCaml ainsi que les librairies et outils liés aux langages.

De même que le précédent "Real World Haskell", sorti également chez O'Reilly, le contenu de ce nouveau libre peut être consulté gratuitement sur internet, agrémenté de nombreux commentaires que les lecteurs ont pu laisser.

OCaml se différencie d'Haskell sur plusieurs sujets : la statégie d'évaluation (stricte dans OCaml et lazy en Haskell), l'importance des Monad (voir interview ci-dessous), et bien d'autres points.

Pour avoir une idée de pourquoi OCaml mérite d'avoir de l'attention, InfoQ a discuté avec deux des auteurs de Real World OCaml, Yaron Minsky et Anil Madhavapeddy.

Note : la plupart des réponses sont communes aux deux auteurs, à l'exception de celles qui précisent explicitement leurs noms.

InfoQ : Qui utilise OCaml aujourd'hui et dans quel but ?

Voici quelques-unes des utilisations majeures d'OCaml dans l'industrie :

  • Jane Street est une société de trading (commerce monétaire) qui utilise OCaml comme premier langage. Des milliards de dollars transitent tous les jours sur une plateforme qui est écrite quasi-entièrement en OCaml. Yaron y est Directeur des technologies.
  • Citrix utilise OCaml pour la distribution des serveurs virtuels XenServer, qui ont été téléchargés plus d'un million de fois et ont permis le fonctionnement de plusieurs datacenter comme le cloud Rackspace (un papier à ce sujet est disponible à cette adresse).
  • Facebook a utilisé OCaml pour la création d'outils de développement. Leur plus ancien projet est Pfff, qui est un set d'outils d'analyse statique pour divers langages, notamment PHP, C++ et OCaml. Ils ont égalemment annoncé plus récemment un nouveau compilateur, appelé Hack, pour une variante de PHP à typage statique. Ce projet est un vrai succès, puisqu'il s'agit d'un compilateur optimisé pour un traitement parrallèle, capable de recompiler quasi instantanément les millions de lignes de PHP de Facebook. La démo que nous avons vu montrait le compilateur en action après un large git rebase, dont le travail se finissait en 20 millisecondes.

Une liste de sociétés ayant adopté le langage est disponible sur le site OCaml et s'allonge avec le temps, et plusieurs années d'archives vidéos du groupe Commercial Users of Functional Programming peuvent également aider à répondre à cette question.

Note : InfoQ a récemment interviewé Keith Adams de Facebook , notamment au sujet de Hack.

InfoQ : Qu'est ce qui vous a amené à utiliser OCaml plutôt que d'autres langages fonctionnels, qui peuvent avoir des communautés plus larges ?

Ocaml possède un mélange original de qualités qui en fait un excellent choix de langage.

  • Il est prédictible : il est facile et bon de raisonner sur les performances. A la différence de Scala, il a un GC qui est optimisé pour des concepts fonctionnels, ce qui explique qu'il fonctionne bien avec des allocations lourdes, typiques au code fonctionnel. A la différence d'Haskell, il est strict, ce qui rend le raisonnement sur les performances beaucoup plus simple. Le runtime d'OCaml est également facilement portable vers d'autres plateformes, incluant Javascript (voir js of ocaml).
  • Il est simple : OCaml arrive à avoir un système de type performant qui permet de conserver un code élégant. Cela facilite son apprentissage et rend son utilisation plus agréable.
  • Il est stable : depuis ses débuts, OCaml a évolué modestement et prudemment, en ajoutant seulement les fonctionnalités ayant une vraie valeur ajoutée, donnant ainsi une base stable pour les développeurs.

InfoQ : Pouvez-vous décrire les caractéristiques du langage pour nos lecteurs ? Comment se positionne-t-il par apport aux autres langages fonctionnels : statique/dynamique, compilé/VM, gestion de la mémoire, fonctionnel/objet/hybride, pureté, gestion d'états, etc.

Yaron : Ok, jouons au feature-bingo ! OCaml est fonctionnel, typé statiquement, peu gourmand, fonctionne avec un Garbage Collector, et compile vers du code natif, tout en fournissant un compilateur pour du bytecode portable. Il fournit un bon support pour du développement pur, mais il reste possible d'introduire des side-effect. Il possède un système de modules qui donne accès à des outils d'abstraction efficaces. Il a également un système d'objets, qui est cependant utilisé assez rarement.

Anil : Lorsque j'ai introduit OCaml dans la suite d'outils de XenServer, nous avons trouvé que les trois styles majeurs de programmation avaient une place dans une base de code, même large. Nous avons utilisé OCaml de manière impérative pour créer les fonctions bas-niveau qui s'interfacent avec l'hyperviseur Xen, du code fonctionnel pur pour les algorithmes complexes comme la planification de bin-packing pour le placement des VM, et de l'orienté objet pour certains services comme celui de logs.

Tout cela existe avec les limites du système de type ML, et vous pouvez les utiliser comme vous le souhaitez, partiellement ou non. OCaml est un langage pragmatique qui vous permet d'écrire du code quick'n'dirty lorsque c'est ce qu'il vous faut, puis d'utiliser le système de modules pour réorganiser votre code rapidement.

InfoQ : En tant que langage fonctionnant avec un Garbage Collector, est-il convenable pour des applications low-latency ? Existe-t-il des moyens de gérer des structures de données hors de portée du GC ou de faire des allocations d'objets groupées ?

Yaron : La première chose à comprendre au sujet d'OCaml est que les allocations, et en particulier les allocations d'une durée de vie limitée, sont moins coûteuses que celles auxquelles on peut être habitué de voir dans des langages comme C# et Java. L'allocation d'un bloc sur la heap mineure nécessite seulement trois instructions, et la collecte de ces objets est très peu coûteuse s'ils ne survivent pas au déplacement sur la heap majeure. Donc, le besoin de nombreuses allocations d'objets à durée de vie limitée est moins un problème que ce que l'on peut imaginer naïvement.

Ceci dit, si vous voulez faire des applications réactives capables de gérer des millions de transactions par seconde, vous devrez éviter de faire trop d'allocations, en particulier des allocations à longue vie qui seront sur la heap majeure. La librairie Core de Jane Street (qui est utilisée dans Real World OCaml) fournit les outils pour créer des pools d'objets pour ce genre de cas.

Anil : Le GC d'OCaml est remarquablement prédictible, et c'est l'une des raisons principales pour lesquelles nous l'utilisons pour construire des infrastructures systèmes. Un bon exemple est le projet du système d'exploitation Mirage (openmirage.org), qui est un système écrit en pur OCaml, des drivers à la stack TCP/IP, en passant par la logique du système de fichier et les applications elles-mêmes. Nous compilons ce code vers un noyau spécialisé qui fonctionne directement avec l'hyperviseur Xen sans nécessiter une stack système complète. Conserver une métrique de haute performance requiert des choix de méthodes efficaces, et travailler avec OCaml a été fantastique pour cela. Le GC a été suffisamment bon pour gérer des gigaoctets de données via la couche TCP/IP faite en pur OCaml. Par ailleurs, j'ai développé un serveur DNS et SSH, puis évalué ses performances et les latences observées en le comparant à BIND et OpenSSH en 2007, dans ce papier : Eurosys 2007.

L'article InfoQ traitant de la sortie de Mirage OS 1.0 fournit plus de détails sur le sujet.

InfoQ : OCaml possède un GIL (Global Interpreter Lock), signifiant qu'un seul thread à la fois peut être actif. Cela pose-t-il un problème aux utilisateurs d'OCaml, ou existe-t-il des solutions de contournement ? Existe-t-il des librairies pour supporter des traitements parallèles ?

Dans OCaml, la première approche pour faire des systèmes parallèles consiste en un échange de messages. Des librairies comme Async (traité dans Real World OCaml) et Lwt qui rendent la tâche plus facile sont des éléments critiques pour développer de larges applications utilisant des traitements parallèles. Un avantage de l'échange de messages est que les applications peuvent scaler au niveau du data-center plutôt qu'au simple niveau d'un unique ordinateur.

Il existe de multiples librairies pour faciliter l'écriture de traitements parallèles, comme Async_parallel de Jane Street, Lwt du module Release, ou Parmap combinator. Il y a également des extensions comme JoCaml qui fournissent des extensions riches du système de type pour l'échange distribué de messages parallèles.

InfoQ : Quelles fonctionnalités OCaml possède-t-il qui le rendent unique ?

L'aspect le plus distinctif d'OCaml est son système de type statique. Si vous êtes habitués à des langages comme Java, vous serez surpris de voir combien il est efficace pour identifier des bugs dès les premières étapes de développement. Et en plus de cela, OCaml est très léger, avec du code aux performances similaires à un langage compilé mais aussi concis qu'un langage de script comme Python ou Ruby.

L'assertion match d'OCaml est un outil particulièrement efficace, fournissant une forme d'analyse de cas "data-structure-driven", pour laquelle le compilateur fournit au moment de la compilation une garantie qu'aucun cas n'a été oublié (voir ici). Ce système est très concis et efficace. (Plus de détails).

InfoQ : Beaucoup de développeurs préfèrent des langages basés sur la JVM car ils ont accès à de nombreuses librairies. A quoi l'écosystème OCaml ressemble-t-il ?

L'écosystème a fait de grands pas en avant durant les 2 ou 3 dernières années. La principale amélioration est l'arrivée de OPAM, un gestionnaire de paquets sophistiqué pour OCaml qui permet d'installer des packages avec des dépendances complexes avec un minimum de tracas. OPAM permet également de tester des variantes du compilateur, rendant plus facile la tâche des développeurs du compilateur en ayant du feedback sur leur travail.

Bien entendu, l'écosystème de Java est bien plus large que celui d'OCaml, aucun doute là-dessus. Mais les outils et librairies pour OCaml sont vraiment bons, évoluent rapidement, et sont distribués facilement grâce à GitHub ou Bitbucket.

InfoQ : Combien de fois apparaît le mot "Monad" dans le livre ? Est-ce un sujet populaire dans l'espace OCaml ou la communauté doit-elle résoudre différemment les problèmes résolus grâce aux Monades pour Haskell, comme c'est le cas pour le langage F# ? Question bonus : quelle est votre monade favorite ?

Les monades sont importantes en OCaml, mais c'est différent des langages comme Haskell pour lesquels tout le code impératif doit être écrit via une monade. En Haskell, tous les programmes qui interagissent avec leur environnement (soit tout programme utile) a besoin d'utiliser une monade. En OCaml, comme les monades ne sont pas utilisées pour ce besoin de code impératif, elles tendent à être un sujet plus avancé, tout en restant extrêmement pratiques.

Ma monade favorite est sans doute Async, une librairie pour exécuter des traitements parallèles où une monade est utilisée pour représenter une exécution qui peut être bloquante pour une période de temps non déterministe. Nous utilisons cette monade pour faire un client HTTP pour le moteur de recherche DuckDuckGo dans Real World OCaml, en gérant également le traitement des erreurs.

InfoQ : Il existe un compilateur d'OCaml vers Javascript : à quel point est-il abouti ou pratique ?

js_of_ocaml est un outil fantastique pour générer du Javascript avec du code OCaml. Il est suffisamment précis pour compiler le compilateur lui-même en Javascript dans une forme plus interactive, que vous pouvez tester sur http://ocsigen.org/js_of_ocaml.

InfoQ : Concernant la méta-programmation : dans le livre, vous mentionnez les extensions de syntaxe, sont-elles assimilables aux macros ou aux plugins compilateur que l'on peut rencontrer dans d'autres langages ?

L'histoire de la méta-programmation de OCaml est l'un des aspects distinctifs du langage, et est en ce moment-même en plein changement. Depuis plusieurs années, nous avions camlp4, qui est un outil puissant pour changer arbitrairement la syntaxe du langage. Il agit comme une façade distincte pour le compilateur, en convertissant du code en ASTs OCaml pour que le reste de la toolchain puisse les utiliser. Camlp4 permet l'utilisation dynamique d'extensions à la grammaire du langage, pouvant aller de l'ajout de mots-clés à un DSL complet embarqué dans du code OCaml. camlp4 est un vrai succès, amenant à une variété d'extensions de syntaxes importantes.

Les plus largement utilisées sont celles qui auto-génèrent des fonctionnalités pour de nouveaux types, comme sexplib qui génère des convertisseurs pour et depuis des s-expressions, ou encore pa_compare qui génère des fonctions de comparaisons efficaces pour des types spécifiques. L'extension de syntaxe COW (Pour Caml on the Web) permet d'écrire directement du XML, HTML, CSS et JSON dans du code OCaml.

La prochaine version d'OCaml (4.02) ajoute maintenant des "extensions points" au langage pour rendre plus facile l'intégration de cette fonctionnalité avec des IDE. Ces points d'extensions utilisent une unique syntaxe qui pourra s'accorder avec les extensions déjà existantes. Les extensions de syntaxe pourront alors êtres implémentées comme de simples transformeurs AST vers AST, sans avoir besoin d'un autre AST ou d'un parseur spécial. Le code résultant permettra d'avoir plus d'outils comme Merlin, qui est rapidement devenu l'IDE magique de choix pour beaucoup de développeurs OCaml. Nous pourrons ainsi avoir un système de complétion de noms, un Visual Studio-like "intellisense", une intégration de la compilation et bien d'autres fonctionnalités dans Vim et Emacs, ou encore via le support d'autres IDEs en cours de développement.

InfoQ : Où la communauté OCaml se retrouve-t-elle ? Existe-t-il des sites ou des ressources que tout débutant OCaml se doit de connaître ?

Le site OCaml.org liste une partie de ces ressources et peut aider à s'orienter dans la communauté. Les mailing-listes OCaml regroupent différents sujets, la principale étant la plus ancienne et la plus riche en informations sur le langage. Si vous commencez le développement OCaml, vous préférerez sans doute la liste dédiée aux novices.

Il y a de nombreux événements où vous pourrez rencontrer d'autres passionnés d'OCaml, comme l'annuel OCaml Users and Developers Workshop, les périodiques sessions de hacking OCaml à Cambridge aux OCaml Labs, les Meetups OUPS à Paris ou à New York, et bien d'autres !

On peut citer également l'aggrégateur de blog OCaml Planet qui est très utile pour suivre ce que font les autres développeurs OCaml. Le channel IRC sur FreeNode est aussi populaire, et on peut y obtenir des réponses rapides à nos questions.

"Real World OCaml" est disponible en version imprimée ou ebook via O'Reilly, et également en ligne sur le site dédié au livre.

A propos des Auteurs

Anil Madhavapeddy est Chercheur à l'Université de Cambridge, dans le Systems Research Group. Il faisait partie de l'équipe initiale qui a développé l'hyperviseur Xen, et a aidé à faire une suite d'outils à succès écrite entièrement en OCaml pour une gestion du cloud. Avant d'obtenir son Doctorat en 2006 à l'Université de Cambridge, Anil a connu diverses expériences au sein de Network Appliance, Internet Vision et la NASA. En plus de ses activités professionnelles et académiques, il est un membre actif de la communauté open-source autour du système d'exploitation OpenBSD, il est co-Président du groupe Commercial Users of Functionnal Programming, et Auteur du livre Real World OCaml chez O'Reilly.

Yaron Minsky a obtenu son Doctorat en Informatique à l'Université Cornell en 2002 en se focalisant sur les systèmes distribués. En 2003, il a rejoint Jane Street où il a fondé le groupe Quantitative Research and Technology.

Evaluer cet article

Pertinence
Style

Contenu Éducatif

BT