[TechDays 2012] : F# 3.0 in the cloud!


A l’occasion des TechDays 2012, le créateur du langage F#, Don Syme, est venu présenter la nouvelle monture de son bébé F# 3.0. Ce dernier est un langage fonctionnel utilisant l’inférence de type qui reste assez méconnu des développeurs .NET. Pourtant celui-ci permet l’écriture de nombreux algorithmes de façon épurée.

Un exemple vaut mieux qu’un long discours. Voici un petit exemple de code qui renvoie les permutations de deux nombres :

En F# 2.0 :

En C# 4.0 :


Un effort a été également fait pour simplifier la programmation asynchrone. Microsoft s’est ensuite inspiré de cet exemple pour C# 5.0 :
Mais revenons à F# 3.0 !
Nous sommes aujourd’hui dans un monde où l’information est primordiale. C’est même devenu une devise ! Le temps où chaque application interrogeait uniquement ses propres données dans une base interne est révolu. Nous sommes passés de l’ère industrielle à l’ère de l’information. A l’heure du Cloud et de l’explosion des services ouverts (Open API *), les applications peuvent analyser une somme presque illimitée de données. En conséquence les applications manipulent de plus en plus d’informations de sources hétérogènes. Ces applications sont désormais appelées : Information Rich Applications.
Pourtant aucun langage ne tire aujourd’hui parti de ce constat pour faciliter l’accès aux données distantes aux développeurs. Pour obtenir une représentation fortement typée de celles-ci, il faut généralement passer par une génération de code effectuée à partir de métadonnées accompagnant la ressource. Une modification de cette dernière nécessite une nouvelle génération de code qui peut s’avérer dangereuse et fastidieuse. De plus, cette génération peut s’avérer impossible à l’heure des services ouvert comme Facebook qui nécessiteraient la génération de plusieurs dizaines de milliers de types (dans l’API, un pour chaque personne !)
L’équipe de Microsoft Research travaillant sur F# a donc proposé une solution à ces problèmes dans la nouvelle version du langage intégrée dans le futur Visual Studio 2011. Celle-ci se base sur une nouvelle brique appelée Type Providers ainsi que sur le moteur de requête intégré LINQ.
Un Type Provider est un composant s’exécutant pendant l’écriture du code dans Visual Studio ainsi qu’à la compilation. Celui-ci, à partir de l’adresse d’une ressource, crée implicitement une représentation fortement typée de l’information. Au lieu d’un code auto-généré ensuite compilé, les types sont créés dynamiquement puis injectés dans le contexte d’exécution de Visual Studio. Le mot type est ici utilisé à la place de classe, car celui-ci représente une abstraction plus générale**. Ainsi ceux-ci alimentent l’Intellisense pour un meilleur confort du développeur de façon quasi-instantanée !
Ensuite, à la compilation, uniquement les types utilisés sont générés dans l’assembly. Pas d’ajout de service référence ni de création explicite de proxy. Juste la déclaration d’un nouveau type comme ceci :
Pour une source de données OData :
Dans cet exemple ODataService est un Type Provider qui à partir de l’URI d’une ressource OData construit une représentation fortement typée de l’information. Celle-ci est donc nommée ici Northwind. Pour récupérer les données, il suffit alors d’interroger le service en récupérant son contexte. On peut ensuite récupérer par exemple la liste des clients très simplement.
L’objectif des Type Providers est de permettre au client de consommer immédiatement les données d’un service. Plus de perte de temps à unifier les métadonnées de l’information aux types .NET. Tout cela est fait de manière invisible, presque “magique” lors de la déclaration d’un type via un Type Provider. Ici pas de code auto-généré comme WCF ou de fichier de description comme dans Entity Framework !
Mais tout cela ne s’arrête pas là ! Tous les types créés dynamiquement sont totalement compatibles avec LINQ. Ainsi la manipulation des données devient très aisée comme le montre cet exemple qui affiche les noms de tous les clients :
Il existe de nombreux Type Providers selon les différents types de données :
Pour une source de données SQL :

Pour un Web Service :

On peut ainsi créer son propre Type Provider pour une source de donnée personnalisée. Par exemple :
  • MongoDBTypeProvider
  • AppSettingsTypeProvider
  • RegexTypeProvider
  • CSVTypeProvider
Créer un nouveau Type Provider demeure “assez” simple. Il faut pour cela créer une classe implémentant l’interface suivante :



Les nouveaux types peuvent donc être créés ici en fonction de la source de données par l’utilisation de la classe Type. En effet, celle-ci, en plus d’être couramment utilisée pour la réflexion, permet aussi de créer de nouveaux types dynamiquement.

Cette nouvelle approche, dans un monde riche en informations, permet la consommation aisée et directe de celles-ci. Cette méthode est également ouverte et extensible via la création de nouveaux Type Providers selon le besoin. L’union de ceux-ci ainsi que de LINQ ouvre donc la voie d’un langage intégrant nativement les données et les services ainsi que le résumait Don Syme :

F# est donc un langage se focalisant principalement sur les données ainsi que l’a défini Microsoft. Celui-ci n’est donc originellement pas conçu pour faire de l’interface (malgré Silverlight 4 en F#) mais surtout du traitement métier. Il est de même conseillé par Don Syme, pour un projet complet en F#, de créer un projet dédié à l’interface dans un autre langage comme C#.
Pour plus d’informations sur ce langage : http://fsharp.net/, http://www.tryfsharp.org/, http://fssnip.net/
* Services disponibles sur internet dont la description est publique (WSDL, REST…).
** Le terme classe inventé dans Simula 67 et présent dans la plupart de ses successeurs, n’est ainsi pas présent dans certains langages (Ada, Perl, Javascript, …) qui possèdent tout de même un système de typage similaire.

Nombre de vue : 28

AJOUTER UN COMMENTAIRE