[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: logiciel de mail ?



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



Reply to: