1. Présentation du projet
1.1. R++, the Next Step?
``R++, the next step?'' est un projet open source de création d'un environnement de travail dédié à l'analyse statistique. Cet environnement s'inspire fortement du logiciel R, avec lequel il est compatible. Par analogie avec C++ et C, il s'appelle R++.
Principales différences avec R, R++ est un langage objet, compilable, intégrant en natif la gestion du parallélisme et permettant la gestion de grandes bases de données.
1.2. Pourquoi un nouveau langage ?
R est un langage riche, en pleine expansion, présentant de nombreux avantages. Il est donc naturel de s'interroger sur la pertinence de la création d'un nouveau langage. Examiner les forces mais aussi les limitations de R met clairement en lumière l'intérêt d'un tel projet.
1.2.1. Les forces de R
Les principales forces de R :
- Gratuit et open source : dans la période actuelle de difficultés financières pour nombre d'instituts académiques, alors que le prix de certains logiciels payant devient une charge lourde, c'est un atout non négligeable.
- Langage permettant rapidement l'intégration de nouvelles méthodes : cet aspect est directement lié au côté open source. Lorsqu'un chercheur en statistique développe une nouvelle méthode, il est ensuite libre de la programmer et de la proposer à la communauté sous forme d'une librairie. Le temps qui s'écoule entre la création de la méthode et sa mise à disposition est potentiellement très court.
- Nombreux packages : corollaire du point précédent, les individus ayant la possibilité d'enrichir eux-mêmes le langage, ils se sont saisis de cette possibilité. Le langage de base est donc enrichi de très nombreux packages. Pratiquement toutes les méthodes statistiques de pointe sont disponibles sous R.
- Large communauté : les trois points précédents font de R un logiciel attractif. De fait, la communauté R est particulièrement dynamique. Les quatre listes de diffusion de R sont très actives, et sont complétées par de nombreux forums. La communauté R ne cesse de grandir.
1.2.2. Les limites de R
Mais malheureusement, les points que nous venons de présenter sont à mettre en regard d'inconvénients et limites :
- Gestion du parallélisme : Comme beaucoup de langage, R n'a pas été conçu comme un langage pouvant gérer le parallélisme ou la concurrence. Les différents packages qui se proposent d'implémenter ce mode de fonctionnement ne présentent pas à ce jour des performances très prometteuses. En tout état de cause, aux dires de certains experts en parallélisme, un langage non initialement conçu comme parallèle pourra difficilement être rendu efficace par des surcouches.
- Données de grande dimension : les appels de fonctions R se font par valeur, ce qui signifie que les variables passées comme arguments sont dupliquées en mémoire. Ce mode de fonctionnement présente de nombreux avantages et prévient bien des erreurs de programmation. Par contre, dans le cadre de manipulation de données de grandes dimensions, il n'est pas optimum.
- Utilisation de la mémoire : les ordinateurs utilisent deux types de mémoire. La pile est d'accès rapide, mais petite et pas très facile à gérer. La RAM a une capacité supérieure mais est lente. La majorité des langages utilise la pile pour les codes critique (code exécuté un grand nombre de fois et qui ont besoin d'être rapide) et la RAM pour le reste. R n'utilise que la RAM.
- Gestion des données : les outils permettant de gérer les données sous R sont parfois difficiles d'accès (comme par exemple la fonction reshape, qui est en fait un mélange de deux fonctions différentes). De même, l'import des données en provenance d'autres logiciels n'est pas toujours aisé.
- Non uniformité des pratiques : la multitude de contributeurs est une force, mais elle fait de R un langage disparate. Cette hétérogénéité nuit grandement à l'apprentissage du langage et à son utilisation. Par exemple, numeric(0) désigne un numérique vide, mais factor(0) désigne un factor avec un élément qui est 0. factor() désigne un factor vide, mais matrix() désigne une matrice 1x1 contenant NA... Il est donc difficile de faire des inférences, d'appliquer ce que l'on sait sur un objet à un autre. Ainsi, connaitre la classe numeric ne donne pas une vraie connaissance de la classe integer ou factor. De même, la syntaxe des différentes fonctions est hétérogène. var dispose d'un argument na.rm alors que cor n'en dispose pas. Certains tests se font avec l'argument A~B, d'autres avec A,B, d'autre avec table(A,B). Les fonctions qui travaillent sur des données les appellent x, object, data...
Toutes les forces de R sont autants de raisons de continuer à l'utiliser, toutes ses limites nous poussent à le faire évoluer. C'est le projet R++.
2. Présentation de R++
R++ a pour vocation de dépasser les limites de R tout en conservant ses forces. A terme, le but est de faciliter la vie de l'utilisateur final, y compris du débutant, tout en permettant au programmeur expert qui conçoit les librairies de travailler efficacement et de manière fiable. Pour cela, R++ suit un certain nombre de règles. Certaines sont fondamentales et structurent le langage. D'autres sont plus liées à des volontés de bonnes pratiques.
2.1. Les fondamentaux
2.1.1. Langage objet
La programmation objet offre sur la programmation classique de nombreux avantages parmi lesquels une plus grande facilité à détecter les erreurs de programmation. Ce point, déjà été évoqué ci-dessus, justifierait à lui seul l'utilisation de l'objet. Une autre caractéristique de l'objet est l'encapsulation, propriété qui permet de cacher les données. Des fonctions sécurisées de manipulation de données sont ensuites mises à disposition de l'utilisateur. Or, R est essentiellement utilisé par des non informaticiens pour qui la programmation est une compétence annexe : ça n'est pas leur métier, c'est un des (nombreux) outils qu'ils doivent maitriser pour faire leur travail (en plus de parler anglais, être pédagogue, parler le LaTeX, savoir rédiger, encadrer des étudiants, répondre à des appels d'offre, ...). Pour de tels utilisateurs, la simplicité apportée par l'objet sera un plus très net.
2.1.2. Intrinsèquement parallèle
Les ordinateurs actuels sont tous multi-c\oe urs. Les cartes graphiques modernes comptent jusqu'à mille processeur parfaitement capables de faire des calculs. Enfin, pratiquement tous les ordinateurs peuvent interagir entre eux via internet. Cela fait trois sources de parallélisassions possibles. Le temps de calcul étant devenu une contrainte forte de nos analyses statistiques, un langage intrinsèquement parallèle offrirait une réelle plus-value à ses utilisateurs.
2.1.3. Gestion des grandes bases de données
Les données sur lesquelles les statisticiens travaillent ont évolué. Il n'est plus rare de travailler sur des dizaines de milliers de variables, ou sur des millions d'individus. Dans ce genre de cas, les logiciels actuels peinent à exploiter les données. Là encore, un langage conçu pour gérer les données de grande dimension serait un plus.
2.1.4. Compilable
Dans R, la seule solution pour optimiser le c\oe ur d'un programme est de l'écrire en C ou en Fortran. Cela nécessite de connaitre un nouveau langage, mais aussi de maitriser l'interface entre les deux. Pourtant, le gain d'une programmation compilée est très loin d'être négligeable (entre x10 et x50). R++ sera donc un langage nativement compilable (car les surcouches permettant la compilation ne sont pas très efficaces).
2.1.5. Compatible avec R
Une des grande forces de R est le nombre impressionnant de méthodes statistiques disponibles via de nombreux packages. Il serait complètement irréaliste de vouloir tous les réécrire. Or, un nouveau langage qui demanderait aux utilisateurs de renoncer à certaines fonctions dont ils ont l'habitude ne serait probablement pas adopté (comme en témoigne les différentes tentatives de réécriture de LaTeX). Il est donc important de rendre R++ compatible avec R afin qu'il puisse bénéficier d'une grande majorité des librairies R.
Note : Cependant, l'efficacité et la propreté du langage seront prioritaire sur la compatibilité. Les instructions impropres, trop lourdes ou inefficaces de R ne seront pas récupérées dans R++. Par contre, nous étudierons la possibilité de mettre en place un ``traducteur automatique'' qui transformera le R en R++.
2.2. Principes
A côté des fondamentaux, R++ suivra également des principes liés aux bonnes pratiques. Ils peuvent paraitre d'importance moindre au premier abord, mais cela serait une erreur de les négliger. En effet, au quotidien, ils seront déterminants quant à la facilité d'utilisation du logiciel, au temps nécessaire au débogage et à son apprentissage. Autant de critères qui seront décisifs quant au succès de R++.
2.2.1. Langage propre
Les règles de programmation (ou bonnes pratiques) permettent de programmer en évitant un certain nombre d'erreurs. Or, si les bugs dans les programmes classiques sont gênants, ceux des langages statistiques peuvent être bien plus graves quant il s'agit d'erreur de calcul (pas nécessairement décelable). Un scientifique peut alors présenter en toute bonne foi un résultat faux, avec toutes les conséquences dramatiques que cela peut avoir (comme le changement de pratiques médicales, des produits non adaptés dans les assurances, la finance,...) Travailler avec un langage fiable peu sujet aux bugs est donc fondamental. A cet égard, R++ essaiera au maximum de respecter les bonnes pratiques (langage typé, pas de surcharge, pas de modification de type, pas d'ambiguïtés syntaxiques...)
2.2.2. Pratiques homogènes
Cela a été détaillé dans les limitations de R, la non uniformité des pratiques nuit grandement à l'apprentissage du logiciel, puis ensuite à son utilisation. Cela n'est pas une fatalité. Ainsi, en LaTeX, si l'on sait qu'une flèche à droite s'écrit \longrightarrow, on peut intuitivement trouver comment faire une flèche à gauche : cela sera simplement \longleftarrow. R++ a entre autre objectif d'harmoniser les pratiques de R. Ainsi, si numeric() désigne l'objet
vide, alors factor(), matrix() et ClassDeLutilisateur() seront également des objets vides. De la même manière, R++ définira une liste de méthodes et le plus grand nombre possible d'objet y auront accès. Ainsi, si l'on sait mesurer le nombre de lignes d'un vecteur, l'on saura aussi mesurer le nombre de lignes d'un data.frame ou d'une matrice. R++ uniformisera toutes les pratiques en proposant une syntaxe unique.
2.2.3. Non compilable et non objet
C'est un des fondamentaux de R++, il sera un langage compilable. Néanmoins, le côté « calculatrice » de R (la possibilité d'ouvrir R, de lire un fichier, de taper quelques instructions) est très agréable. Afin de conserver cette facilité d'utilisation, il sera important de permettre de taper du code « à la volée », sans toute la lourdeur d'un compilateur. R++ offrira donc également une interface permettant d'écrire du code non compilé pour les utilisations légères. De même, les utilisateurs occasionnels n'ont pas nécessairement le besoin de se mettre à l'objet. Il sera donc possible d'écrire des petits programmes simples sans les objets (mais une telle programmation ne permettra pas de faire des packages).
2.2.4. Editeur évolué
Les éditeurs modernes fournissent aux utilisateurs nombre d'options qui facilitent grandement la programmation : coloration syntaxique, indentation automatique, bulles d'aide proposant différents options, complétion automatique, voir débogage en temps réel (typage, cohérence des noms et des appels des fonctions,...) R++ sera intégré dans un éditeur moderne comme Eclipse ou Rstudio offrant par défaut toutes ses options.
2.2.5. Établir une gestion éditoriale des packages
R++ devra inclure un travail éditorial sur plusieurs niveaux.
Qualité du code
- Niveau 0 : Package non compilable.
- Niveau 1 : Package R compilable mais non accepté par le CRAN.
- Niveau 2 : Package R compilable accepté par le CRAN
- Niveau 3 : Package écrit en R++ avec Warnings
- Niveau 4 : Package écrit en R++ sans Warnings
Qualité scientifique
- Niveau 0 : Package non présenté dans une revue
- Niveau 1 : Package présenté dans une revue non référencée
- Niveau 2 : Package présenté dans une revue référencée
- Bonus +log10(n), avec n nombre de citation dans une revue référencée
Clarté de la documentation
Évaluation par des reviewers.
Facilité d'utilisation
Évaluation par des reviewers.
Qualité technique
Évaluation par des reviewers.
Popularité
- Nombre de téléchargements
- Nombre de packages faisant appel à un package donné.
2.2.6. BIEN DOCUMENTÉ !!!
C'est probablement la plus grande faiblesse de R. Le langage est mal documenté. Pour que R++ ne tombe pas dans le même travers, un axe de développement complet sera spécifiquement dédié à la rédaction des documentations. Les aides seront rédigées en deux temps. Une première version sera écrite par un expert du domaine (celui qui a construit la librairie). Une deuxième version sera rédigée par un non expert, un utilisateur potentiel.
3. Faisabilité du projet
R++ est clairement un projet ambitieux. Nous n'avons pas la prétention de penser que cela sera facile, ni que nous sommes certains d'aboutir. Néanmoins, afin de mettre un maximum de chances de notre côté, nous avons adopté un certain nombre de stratégies.
3.1. Ne pas réinventer la poudre
Dans tous les domaines, des langages existent. Ils ont été réfléchis, ont évolué et sont le plus souvent devenus des outils équilibrés, adaptés aux besoins des utilisateurs. Au lieu de repartir de zéro, R++ s'inspirera de ce qui se fait de mieux dans différents langages. Ainsi, SQL est spécifiquement dédié à la gestion de bases de données alors que sous R, ce point est vraiment problématique. En matière de gestion de donnée, R++ adoptera donc une syntaxe proche de SQL. De la même manière, les data.frame seront hérités de R, le ramasse miette sera celui de java, les grandes dimensions s'inspirerons de S+ et ainsi de suite.
3.2. Contacter des experts
Les problèmes comme la gestion du parallélisme et des grandes dimensions ne sont pas l'apanage des logiciels statistiques, ce sont des problèmes globaux qui se posent dans tous les champs disciplinaires utilisant l'informatique. Il serait donc illusoire de penser que nous pouvons les résoudre localement avec nos compétences propres alors que des équipes entières de recherche y consacrent 100\% de leur temps. Pour ce genre de problème, nous contacterons des chercheurs (ou experts) de chaque domaine (équipe parallélisme, équipe base de donnée, équipe ergonomie,...) afin d'avoir une vision d'ensemble des techniques existantes et des techniques d'avenir.
3.3. Contacter des non-experts
``Quel est le langage de vos rêves ?'' La question fait généralement sourire, rare sont ceux qui rêvent de langages. Pourtant, le statisticien-utilisateur est le premier concerné par cette question, et indirectement par la construction d'un langage, puisque c'est lui qui au final décidera de l'adopter, ou pas. Or, cet utilisateur, de par sa grande connaissance des statistiques, sait ce dont il a besoin ; dans les logiciels qu'il connait, il sait ce qui marche bien et ce qui doit être amélioré. Nous aurons donc à c\oe ur de rester au plus proche des utilisateurs, de leur demander régulièrement leur avis sur ce que doit et ne doit pas être R++.
4. Les étapes
R++ V0.1 : L'embryon
- Déclaration des variables (simple, vectorielle, composée)
- Utilisation comme une calculatrice
- Lecture de données, au moins selon un format classique (txt ou csv)
R++ V0.2 : Le bébé
- Structures de contrôle while / for / if / ? / switch
- Ajout de la possibilité d'écrire des fonctions, y compris récursives.
R++ V0.3 : Le tronc commun
- Passage à l'objet : possibilité de créer des objets et leurs méthodes
R++ V0.4x : L'hydre
La version V0.3 est appelé la « version de base ». A partir de là, on peut séparer le projet en différents axes, qui peuvent être mené de front par différentes équipes :
R++ V0.4a : Statistiques de bases
- Ajout des fonctions statistiques de base : summary, mean, plot...
R++ V0.4b : Parallélisme
- Programmation parallèle : parallélisation des boucles (sur plusieurs processeurs ?) et du calcul (sur la carte graphique ?). Parallélisation
explicite ou discrète.
R++ V0.4c : Gestion des bases de donnée
- Gestion des bases de données : exploration et éventuellement intégration de la syntaxe SQL dans R++.
R++ V0.4d : Base des donnée de grande dimension
- Gestion des grandes bases de données : exploration de ce qui marche.
R++ V0.4e : Éditeur
- Intégration de R++ sous un éditeur moderne (Rstudio ? Eclipse ?)
R++ V0.5 : Le (mini) Graal
- Intégration des différents axes développés lors de l'étape V0.4.
- Ré-écriture et uniformisation de toutes les doc.
Citation:
Cette version sera la première version publique !
(YESSSS !!!!)
5. L'équipe
A ce jour (05/07/2013), les membres du projet, actif ou sympathisants :
- Christophe Genolini, Maitre de conférences en bio-statistique, INSERM
- Abdelmalek Haddad, Ingénieur de recherche INRA
- Hervé Richard, Ingénieur de recherche INRA
- Pierre Courtieu, Maitre de conférences au CNAM
- Bruno Falissard , PUPH INSERM
- Gaétant Hains : PU en informatique LACL Université Paris-Est \& LIFO Université d'Orléans
- Jérome Collet, Ingénieur
La répartition des rôles
- Inclusion des fonctions de base :
- Parallélisme : Gaétan Hains
- Base de données :
- Rédaction des docs : Christophe Genolini
- Point de vu utilisateur : Bruno Falissard