On Sun, Aug 03, 2003 at 10:13:39PM +0100, Yves Rutschle wrote: > On Fri, Aug 01, 2003 at 05:07:32PM +0100, Nicolas Rueff wrote: > > > Essayes un peu un *vrai* langage fonctionnel (Scheme, Caml, Haskell, > > > ...) et tu me diras si tu penses toujours que C est fonctionnel. > > Un langage fonctionnel est un langage qui gère les fonctions > comme des objets de base du langage. Un exemple typique: en > Caml (ou Lisp ou Perl ou sans doute Scheme Haskell & Co) tu > peux définir une fonction "derive" qui prend un fonction > comme argument, qui retourne une nouvelle fonction. Cette > nouvelle fonction a le même status que toutes les autres > fonctions.
Erm, ... Un peu d'histoire. La difference entre un langage fonctionnel et un langage procedural (ou imperatif, ou ...) vient de la theorie fondamental qui est derriere. Les langages proceduraux (Assembleur, cobol, fortran, basic, C, pascal, C++, Java, ...) sont baser sur la theorie des machines de Turing et de la machine de Von Neuman qui est a l'origine des microprocesseur actuels. Une machine de Turing est en gros un automate a etat finis, et une bande que l'on peut deplacer, lire et ecrire. Les langages fonctionnels (lisp, scheme, sml, caml, ocaml, haskell, erlang, clean, ...) sont base sur la theorie du lambda calcul, qui a ete develope par Alonzo Church vers la fin des annees 30 afin de modeliser les fonctions mathematiques (vous savez, les f : N -> N x|-> 3x+1). Plus tard, on s'est rendu compte que cette theorie logique s'appliquait parfaitement a l'informatique, et qu'il etait possible de programmer tout ce qui etait programmable avec cette theorie somme toute assez simple : on a des variables, l'abstraction fonctionnelle (equivalant a dire f(x) = 3x+1) et l'application (f(5) qui represente 3x5+1 soit 16). On a bien sur rajouter d'autres theories par la suite, comme le lambda calcul type, langage de module et foncteurs, extension oriente objet, programmation par continuation, monades, ...). L'un des avantages de langages fonctionnels type, tel que sml, ocaml et haskell, mais pas lisp ou scheme qui ne sont pas type, c'est qu'un programme qui compile ne peut plus faire de runtime error. Bien sur, on ne peut pas eviter les boucles infinis, ou les exceptions non traite, mais il n'y a plus d'acces a un pointeur nul, ou la manipulation errone d'un certain type de valeur comme si il s'agissait d'un autre type, qui envoie ton programme dans les choux. De plus l'utilisation d'un garbage collector permet d'eliminer toutes gestion manuel de la memoire, qui est la source de toutes les fuites de memoires dans les logiciels actuels. Il y a bien sur une autre famille de langages, dit logique, dont le prolog est le representant le plus fameux. Il y a aussi des langages de reecritures, tel obj3, et d'autre encores. Ces derniers s'apparentes plus aux langages fonctionnels qu'au langages proceduraux si je ne me trompe pas. > > Mmm, c'est vrai que Caml est nettement plus fonctionnel (parait même > > qu'il est utilisé pour des démos de théorème de math, qqun peut > > confirmer ?) Pour en revenir au theoreme mathematico-logique, il existe l'isomorphisme de Curry-Howard qui fait une relation entre le type/programme et le theoreme/preuve. C'est d'ailleurs ce qu'utilise le prouveut Coq pour generer du code ocaml implementant l'algorithme correspondant a un theoreme constructif. Les programmes fonctionnels sont d'ailleurs plus facil a prouver que les programmes proceduraux, bien qu'il existe des choses tel B, qui permet d'ecrire des preuves de problemes, et de generer le code automatiquement. L'informatique de la ligne meteor a paris est un exemple de ce genre de choses. > Je ne pense pas que la "fonctionnalité" soit nécessaire pour > démontrer des choses... Elle est simplement attractive aux > mathématiciens car c'est comme ça qu'ils pensent, du coup > tous les théorèmes sont toujours démontrés par des langages > fonctionnels... Mmm, pas tout a fait exacte mais bon, c'est simplement que les langages fonctionnels sont plus facil a utiliser dans des preuves de programmes, et que les operations de nos langages proceduraux prefere contiennent souvent bien plus de hack divers, qui rende les preuves formelles plus difficiles. > > Ceci dit, dans quel famille de langage classes-tu le C ? > > Procédural. Le C est pratiquement équivalent à Pascal. Ou qu'au C++, ou qu'a l'assembleur, au basic, ... Amicalement, Sven Luther