Ocsigen est une technologie libre de développement de sites et applications Web client-serveur. Une de ses particularités est d'offrir la possibilité d'écrire les côtés client et serveur non seulement dans le même langage, OCaml, mais comme un seul et même programme. Particulièrement bien adaptée au développement d'applications HTML5 très dynamiques, Ocsigen permet également de repenser et simplifier l'implémentation des comportements standard des sites Web traditionnels (signets, bouton « back », liens, formulaires, etc.). En outre, il permet de combiner ces deux approches de manière très naturelle.
Ocsigen met l'accent essentiellement sur deux points : d'une part, offrir un langage très expressif, ce qui permet d'écrire du code simple et court ; d'autre part, aider à produire du code et des applications fiables et faciles à maintenir. C'est la raison pour laquelle Ocsigen utilise OCaml, un langage de programmation compilé très puissant et au système de type très riche. La grande expressivité d'OCaml est complétée par un grand nombre de nouveaux concepts inédits et spécifiques au Web (services, sessions sophistiquées, etc.) qui permettent de simplifier l'implémentation de comportements dynamiques complexes. De plus, Ocsigen exploite au maximum le typage d'OCaml pour qu'un maximum de garanties de fiabilité soient données dès la compilation (par exemple la validité des liens). Cela va même jusqu'à la vérification à la compilation que les pages générées seront conformes aux recommandations du W3C !
NdM : Ocsigen est sous licence LGPL 2.1
Sommaire
Le pouvoir des fonctions
La façon de programmer des sites Web traditionnels a été intégralement repensée, grâce à des concepts de haut niveau qui simplifient énormément l’implémentation de comportements complexes classiques du Web (sessions, bouton « back »…).
Les requêtes sont traitées par le serveur par le biais des « services », notion centrale dans Ocsigen. Un service peut être vu comme un générateur de contenu (HTML, fichiers, redirection, etc.), pouvant être déclenché par un clic sur un lien, un formulaire, ou par une requête du programme client.
Un service est en général associé à une URL et peut prendre des paramètres de types variés. L'identification du service à exécuter ainsi que la vérification et la conversion des paramètres sont faites automatiquement. Par exemple, le morceau de code suivant définit un service s, à l'URL user/profile
, attendant un paramètre d'URL appelé i de type entier.
let s = Html5.register_service
~path:["user"; "profile"]
~get_params:(int "i")
(fun g p -> ... (* an HTML5 page *))
La fonction register_service prend un premier paramètre (étiqueté "path") pour l'URL, un deuxième ("get_params") pour la description des paramètres du service et une fonction, qui génère la page à partir des paramètres GET et POST (ici, g est un entier).
Il existe d'autres types de services, répondant à des besoins différents — par exemple, des services accessibles à n'importe quelle URL pour faire des appels de fonctions distants (par exemple la connexion d'un utilisateur depuis n'importe quelle page). Il est aussi possible de créer dynamiquement des nouveaux services personnalisés pour un utilisateur, ce qui rend triviale la programmation de formulaires en plusieurs étapes.
Grâce aux services, on ne manipule jamais d'URL directement. Dans le code, on fera pointer un lien vers un service et non vers une URL, ce qui garantit l'absence de liens morts internes au site.
Applications distribuées
Un site Web était auparavant une plate-forme de contenu, avec parfois des comportements dynamiques côté client localisés, souvent en utilisant le plug-in Flash. Aujourd'hui, les navigateurs sont en train de devenir des machines virtuelles dans lesquelles s'exécutent des applications complexes. Cette évolution des possibilités des navigateurs ne s’est pas réellement accompagnée d’une évolution des technologies de programmation sous-jacentes. La plupart des applications que nous utilisons aujourd’hui sur le Web sont développées avec des frameworks classiques côté serveur et en Javascript côté client, sans aucune intégration entre les deux parties. Ces techniques de programmation sont de très bas niveau (proches des protocoles), ce qui oblige les programmeurs à se préoccuper de beaucoup de détails eux-mêmes (notamment du point de vue sécurité).
Ocsigen résout ces problèmes en proposant une approche radicalement différente. L'application Web est écrite dans un seul et même langage et correspond à un seul programme regroupant le code exécuté sur le serveur et le code exécuté sur le navigateur. Cela permet d'utiliser les mêmes bibliothèques des deux côtés et cela simplifie grandement la communication client-server car les deux parties partagent les mêmes structures de données et aucune conversion manuelle n'est nécessaire. On peut même par exemple utiliser côté client des variables définies côté serveur. Techniquement, le code client est compilé vers JavaScript à l'aide d'un compilateur très efficace.
Les parties client et serveur sont distinguées dans le code OCaml grâce à une syntaxe spéciale.
{client{
... (* Code OCaml exécuté au chargement de la première page du site *)
}}
{shared{
... (* Code OCaml commun aux côtés client et serveur *)
}}
{server{
... (* Code OCaml exécuté au lancement du serveur (définition de fonctions, etc) *)
let a = ... (* Définition d'une valeur côté serveur appelée a *)
...
(* Génération d'un morceau de page : *)
div
~onclick:{{ (* Code Ocaml exécuté quand l'utilisateur clique sur l'élément
*)
... %a ... (* qui utilise la valeur a définie sur le serveur *)
}}
[ (* contenu du div *) ]}}
La communication entre le serveur et le programme client est également prise en charge automatiquement, dans les deux sens : cela permet par exemple de recevoir des notifications de la part du serveur, en très peu de lignes de code.
Un des points forts d'Ocsigen est la possibilité d'utiliser une application côté client tout en conservant les comportements traditionnels des sites, basés sur les URLS, liens, formulaires et signets, etc. L'application ne s'arrête pas lorsque vous suivez un lien ! Cela permet par exemple d'implémenter un site dans lequel vous pouvez continuer à naviguer tout en écoutant de la musique, et ce, très facilement (c'est même le comprtement par défaut !).
Pour exécuter du code OCaml dans un navigateur, Ocsigen dispose d'un compilateur OCaml vers Javascript très efficace, qui est de plus en plus utilisé pour développer des applications dans un navigateur en bénéficiant du confort apporté par le langage OCaml. Par exemple la société californienne Besport est en train de développer un moteur d'affichage de cartes géographiques depuis les données OpenStreetMap. Et sur le site Try OCaml, le compilateur OCaml lui-même a été compilé vers Javascript pour permettre de tester le langage depuis une page Web.
Fiabilité et validités des applications
L'utilisation d'un langage de script pour écrire des applications complexes conduit la plupart du temps à des programmes très difficiles à maintenir et à faire évoluer lorsque la taille du code devient importante. Ocsigen, au contraire, a fait le choix d’utiliser un langage de programmation compilé. Et plutôt que créer un nouveau langage, il utilise un langage existant, OCaml, ce qui lui permet de bénéficier d’une communauté de développeurs active et d’un ensemble important de bibliothèques utiles. Ce langage a été choisi parce qu’il est l’un des plus évolués en terme d’expressivité et de fiabilité, tout en restant pragmatique dans ses choix.
En particulier, il dispose d’un système de types très sophistiqué, qui permet de vérifier un grand nombre de propriétés du programme à la compilation, avant même de le lancer, et d’éviter ainsi beaucoup de bugs. Ocsigen utilise ce système de types de manière poussée pour aider le programmeur à trouver ses erreurs. Cela a pour conséquence de faire des programmes très fiables et faciles à faire évoluer, avec seulement un peu plus de rigueur au départ.
Un exemple frappant est la vérification à la compilation de la validité du HTML qui garantit que toutes les pages générées par le programme seront valides. Par exemple, si f est une fonction qui renvoie une liste de blocs (
,
, etc.) alors le compilateur vous autorisera à utiliser les valeurs retournées à l'intérieur d'une balise
mais pas à l'intérieur d'un
.
Ocsigen vérifie beaucoup d'autres aspects de l'application : absence de liens cassés, conformité des formulaires par rapport aux services vers lesquels ils pointent, etc.
En résumé, Ocsigen est un framework Web polyvalent, permettant de développer aussi bien des sites à la manière des frameworks MVC que de véritables applications sophistiquées avec interface dans un navigateur. L'utilisation d'un langage très évolué permet de programmer de manière concise et en faisant très peu de bugs.
Lire les commentaires