Techno Barje

OCaml, Embarqué Et Flash

Qu’on le veuille ou non, OCaml est utilisable dans l’embarqué!

Chumby

Cette sorte de nabaztag en forme de radio reveil propose de développer des interfaces/widgets en flash, à l’aide du compilateur ActionScript de Motion twin : MTASC
Donc l’équipe a intégré dans son sdk le compilateur MTASC et … le compilateur OCaml puisqu’il est lui même écrit en caml!
Chumby
Annonce sur le forum chumby

Ming

Tant que nous parlons de flash, il faut noter l’existence d’un binding pour la librairie ming pour générer des animations flash :
Binding ming
Exemple d’animation

IPhone

L’interpréteur caml est aussi cross compilable pour l’iphone.
Patch et guide tutorial de compilation

Un Noyau en OCaml

Cette idée doit souvent revenir dans l’esprit des développeurs Haskell ou OCaml : Pourquoi n’entendons-nous pas parler d’expériences de noyaux écris avec un langage fonctionnel ?

En effet, le fait de ne jamais avoir de segfault ou de null pointer exception est tout de même un sacré avantage dans un noyau!!! Alors oui, il y a à coup sûr d’énormes problèmes comme le garbage collector, on perdrait surement en contrôle et en efficacité. Mais je reste convaincu que des fonctions en fonctionnel pur (donc sans effets de bords) seraient une sacrée avancée dans le développement kernel où l’on manipule plusieurs threads et plusieurs coeurs d’exécution en même temps!

Et bien après une longue recherche, on peut trouver deux projets en OCaml :

Malheureusement, ces projets n’ont plus d’activité notable depuis 2005 :(

Dynamique vs Statique

Les langages dynamiques comme Python, PHP, Ruby ou encore Javascript ont le vent en poupe, car ils apportent un net gain en productivité éphémère instantanée.
Lorsque l’on développe dans ces langages, on boucle sur des cycles : coder puis regarder :

  • on modifie le code source du programme, et,
  • on va directement voir le résultat en exécutant l’application …

Dans le cas des langages à typage statique, nous sommes obligés de rajouter une étape intermédiaire : coder, compiler et éventuellement regarder :

  • on commence toujours pas modifier notre code source, puis,
  • nous sommes obligés de cliquer sur un bouton ou de lancer un make pour la compilation, et enfin,
  • suivant le résultat de la compilation, soit on se lance dans un nouveau cycle en cas d’erreur, ou alors, on exécute l’application pour valider des besoins fonctionnels ou visuels.

Donc oui, un programme développé à l’aide d’un langage statique prendra plus de temps car l’étape de compilation nous oblige à supprimer toute erreur de typage, de syntaxe et souvent bon nombre d’erreurs d’inattention. De plus cette étape de compilation ne supprime pas l’étape "lancer le programme", que nous devons toujours effectuer afin de valider les specs fonctionnelles ou graphiques.

Mais ce temps passé à faire valider notre code par le compilateur n’est pas sans bénéfices, puisque notre programme sera plus fiable et n’émettra aucune erreur purement informatique : typage, syntaxe, …
Ainsi, les erreurs sont présentées au développeur et en aucun cas à l’utilisateur qui ne devrait en aucun cas avoir à gérer, ni comprendre, ni même voir une telle erreur! [1]

Tests unitaires

Oui mais certains diront : on peut développer en mode Extreme programming ou encore Programmation agile en agrémentant une base de tests unitaires tout au long du développement. Cela se tient si l’on fait des tests unitaires doublés de couverture de code maintenue à 100% afin de s’assurer d’exécuter l’intégralité du code source par les tests et ainsi éviter l’affichage de moultes erreurs aux yeux ébahis de nos utilisateurs.
Mais cela engendre un volume de travail supplémentaire loin d’être négligeable! On peut même se demander si les tests ne font pas que reproduire l’action d’un compilateur analysant notre programme ?
Pour rester objectif, je dirais que de tels tests vont plus loin et permettent par exemple de valider des specs fonctionelles et nous obtenons au final un logiciel modulaire, spécifié et solide.[2]
Mais je reste perplexe quand au temps de développement nécessaire si l’on compare à n’importe quel langage statique agrémenté de quelques tests unitaires/fonctionnels (naturellement plus succincts).
D’autre part, il ne faut pas oublier que la règle des 80/20 s’applique à tout, y compris à l’informatique et à notre sujet de discussion : on peut souvent réaliser une application fonctionnelle à 80% avec 20% du temps nécessaire pour faire l’application finale : fiable et maintenable par d’autres développeurs.

Refactoring et évolution [3]

Enfin, je tiens à mettre en avant un problème sérieux lorsque l’on doit faire évoluer une application écrite à l’aide d’un langage dynamique. En effet, dans ce cas de figure, nous devons à coup sûr modifier des structures de données : faire évoluer un attribut entier vers un objet plus complexe, ou encore modifier le nom d’une fonction ou ses paramètres, ou pire encore : changer le type de sortie d’une fonction! Et à moins d’utiliser des outils avancés comme IntelliJ ou Eclipse, les étapes de refactoring(réécriture de code) seront laborieuses, incomplètes et vont décupler le nombre d’erreur signalées à l’exécution
Enfin, il faut rester conscient que ces outils ne pourront jamais rejoindre le niveau de vérification effectué par le compilateur d’un langage typé statiquement, et ce, à cause de la nature dynamique du langage.

Notes

[1] Billet sur les erreurs à l’exécution

[2] les tests unitaires sont une bonne chose et je reviendrais la dessus

[3] Billet sur l’évolutivité du dynamique

La 3D Et Le Fonctionnel

Tim sweeney - unreal engine - pourquoi utiliser le fonctionnel ?

Ce cher monsieur intitule sa présentation : The Next Mainstream Programming Language, en citant à maintes reprises Haskell comme exemple à reproduire pour son langage spécialisé dans le développement de moteur 3D qui sera à même d’exploiter les multiples coeurs des processeurs graphiques. On pourra rapidement faire le lien avec le billet précédent et intel … les raisons d’utiliser le fonctionnel pour la 3D et les processeurs mutli-core sont les mêmes.

Ocaml + SDL + OpenGL

C’est possible, et cela a l’air de marcher plutôt bien : Compiler le triplet sous windows Exemple 1 Exemple 2

Des jeux 3D en OCaml ?

Oui, cela existe aussi : Freetennis. Il y’a même des étudiants qui ont réalisé un jeu pour enfants : Rigobot où ils pourront programmer des robots dans un univers en 3D!

Mais Pourquoi Ocaml ?

Ses performances

C’est un des langages les plus performant avec un garbage collector : Benchmark avec comme critère : vitesse et consommation mémoire
Au final OCaml consomme peu de mémoire tout en restant dans les plus rapides et tout cela sans demander au développeur de gérer la mémoire!

L’environnement par défaut, ses outils :

Mine de rien, lorsque vous télécharger les sources ocaml-3.10.1.tar.bz2 de 2.2 Mo, vous aller avoir accès à un nombre important d’outils avancés :

  • un compilateur en code natif (x86, amd64, power pc, alpha, mips, sparc, …),
  • un compilateur qui génère du bytecode caml. Le programme pourra intégrer l’interpréteur de bytecode afin d’être exécutable n’importe où. L’application peut aussi intégrer un toplevel afin de pouvoir exécuter des commandes dans le programme.(une sorte de shell),
  • Un débugueur pas à pas permettant de revenir en arrière! (uniquement en bytecode),
  • Un toplevel indépendant permettant d’apprendre facilement le langage en exécutant des instruction caml comme dans une ligne de commande,
  • camlp4, un preprocesseur permettant d’étendre le langage en fonction du domaine de notre programme,
  • des générateurs de parser lex/yacc,
  • un outil de création automatique de documentation à partir de code source .ml,
  • ocamlbuild, un assistant de compilation, comme make, mais spécialisé pour OCaml et très simple,
  • et enfin, des outils de profiling.

Sa richesse

C’est à coup sûr un des seuls langage à permettre de choisir le paradigme le plus adapté pour chaque partie de son programme!
Nous pouvons ainsi utiliser selon le contexte du fonctionnel, de l’impératif ou de l’objet.
Mais ce langage va encore plus loin, et intègre des concepts de programmation que tout langage digne de ce nom devrait intégrer:

Voici comment obtenir un quicksort clair et simple avec du filtrage par motif, du fonctionnel, des types inférés ainsi que des fermetures et une fonction d’ordre supérieur :

 let rec quicksort = function                     (* filtrage par motif du paramètre d'entrée qui est la liste à trier *)
    | [] -> []                                                     (* [] est une liste vide *)
    | pivot :: rest ->                                       (* pivot = premier element, rest = le reste de la liste *)
        let is_less x = x < pivot in                 (* fermeture, car nous utilisons la variable pivot *)
        let left, right = List.partition is_less rest in       (* partition est une fonction d'ordre supérieur car is_less est une fonction *)
        (quicksort left) @ [pivot] @ (quicksort right)     (* @ permet de concaténer des listes *)
(* le tout sans avoir à préciser les types ... *)
(* List.partition p l returns a pair of lists (l1, l2), where l1 is the list of all the elements of l that satisfy the predicate p, and l2 is the list of all the elements of l that do not satisfy p. *)

OCaml Est Là

Ocaml et la programmation fonctionnelle sont déjà parmis nous!

  • MediaWiki (le logiciel faisant tourner wikipedia) utilise ocaml pour afficher ses formules mathématiques!
  • KDE fait de même avec son application de tableau périodique des elements chimiques : kalzium, pour résoudre des équations chimiques!

a CH3CH2OH + b O2 -> c H2O + d CO2 => 1 CH3CH2OH + 3 O2 -> 3 H2O + 2 CO2
Code sources

  • XSLT est une langage fonctionnel décrit en XML!
  • Enfin, un phénomène majeur est l’adoption massive des libraries ajax comme jQuery.

Figurez vous que ces libraries utilisent fortement les aspects fonctionnels de javascript.
Examples avec jQuery :

     $('#myButton').bind('click', function() {
         // 'this' is the DOM element that triggered the event
         alert(this.id == 'myButton');
     });
     $('div').each(function() {
         // 'this' is a DOM element
         alert(this.tagName.toLowerCase() == 'div');
     });

Le Fonctionnel Arrive

F#

Le tout dernier langage de Microsoft, F# est basé à 80% sur Ocaml!
Détail des différences entre ocaml et F#

Haskell, HOP et l’INRIA dans la presse du monde php/java

Les magazines de vulgarisation se mettent à parler d’Haskell (langage fonctionnel pur)
Introduction sur programmez.com

Il vont même jusqu’à parler de HOP, un projet de l’inria qui propose un framework de développement d’applications web (html/js) avec un langage basé en grande partie sur Scheme. Et pour ceux qui ne le savent pas, Scheme est un autre langage fonctionnel!
Intro de l’article sur HOP

Intel et Ct

Intel planche sur le calcul parallèle (il y’a effectivement de quoi faire avec les multi core!) et a créé un nouveau langage : Ct is strict and purely functional (description très détaillée de Ct)
C’est un langage pour simplifier le développement sur les machines multicore, et plus particulièrement sur les serveurs de calculs du projet TeraScale (processeur avec 80cores).
Présentation de Ct par un de ses créateurs

OCaml “Existe”.

Commençons simplement en montrant que OCaml EXISTE.

Miniville

Vous avez surement entendu parlé de Miniville, mais si, le jeu en flash où chaque visite permet d’agrandir une ville. C’est sans intérêt, certes, mais cela a le mérite d’exister dans la vraie vie. Donc vous ne le devinerez jamais, mais l’équipe qui a développé ce jeu, Motion twin, utilise OCaml!

En effet, il suffit d’aller sur leur site pour se rendre compte qu’ils ont assimilé les qualité de ce langage. Ils ont ainsi développé une plateforme/langage maison qui sert à générer des applications flash ainsi que le webservice côté serveur.
Le nom de se projet ? Haxe
Un tas de projets gravitent déjà autour!
(Disponible sur linux, mac et win)

Pas convaincu ? Vous n’avez peut être pas le plugin flash ?
Et bah ça tombe bien, j’ai un autre exemple pile poil pour vous!

Xen

Xen, l’hyperviseur de machines virtuelles embarque avec lui quelques 100 000 lignes d’OCaml!
La cerise sur le cadeau, c’est que ce logiciel libre n’est pas développé par des frenchies de l’INRIA! Non, Xen vient tout droit de l’université de Cambridge.

Source de cette info, la recherche de profil "ocaml hacker" par Xen.

EDOS

Environment for the development and Distribution of Open Source software
Ce projet a pour but de faciliter le développement, la maintenance et les tests des distributions libres en améliorant les outils de gestion de paquets. En voici un projet intéressant! Oui, c’est un projet en partie français, oui l’INRIA et des universités sont sur le coup, mais cela a déjà des retombées concrètes : Assurance qualité de Debian et les outils développés peuvent potentiellement devenir des applications courantes.
J’allais oublier de préciser: OCaml est le langage de programmation principal de ce projet.

Liste des outils développés
Accès direct aux sources

Pour ceux qui sont passés à jussieu, il est important de noter la participation de M. Di cosmo


 Conclusion > OCaml existe.

Let’s Go

Bon aller, je me lance!
Rien de bien original en cette fin d’année 2007 à lancer un blog, néanmoins, j’espère l’agrémenter régulièrement de contenu passionné afin de promouvoir ma vision très personnelle de l’informatique.

Ainsi, je vous invite vivement à passer dans le coin si vous êtes intéressés soit par les technologies employées par Mozilla : xul, html, xbl, rdf, xpcom, svg, …, ou si, à l’opposé de l’univers du développement logiciel, vous voyez dans le langage OCaml de grands espoirs.

En effet, je vous montrerais par le biais de projets personnels ou professionnels le potentiel, la viabilité, les défauts et les qualités de ces technologies.

PS : le thème n’est pas super, mais un tout beau arrive, merci Takyon!