source: trunk/doc/why_erlang.txt @ 2

Revision 2, 8.4 KB checked in by dom, 5 years ago (diff)

Importing revision 150 of XP Dojo from BerliOS

Line 
1-*- mode: text; fill-column: 55 -*-
2(utf-8)
3
4* XP et programmation fonctionnelle
5
6XP est applicable et utile quel que soit le langage utilisé. En outre, Le choix du langage dépend de nombreux facteurs (humains, domaine métier, code existant...) autres que ses qualités intrinsÚques.
7
8Cependant, quand c'est possible, choisir un langage puissant et adapté au mode de travail d'XP peut en démultiplier les avantages.
9
10La famille des langages dits "fonctionnels" présente plusieurs caractéristiques les rendant trÚs adaptés à XP et en particulier au TDD.
11
12   "Well, there are agile languages and agile methods. When you put the two together you get agile squared." -- Ward Cunningham.
13
14** Introduction aux langages fonctionnels
15
16Lisp (Common Lisp, Scheme), ML (SML, Ocaml), Haskell, Erlang, Clean...
17
18Ces langages fonctionnels utilisent les fonctions plutÃŽt que les
19objets ou procédures comme briques de base pour la construction de
20programmes.
21
22Leur objectif est de permettre, encourager voire imposer des fonctions sans effets de bord: le résultat en sortie ne dépend que des valeurs en entrée. On ne manipule plus des emplacements en mémoire: on évalue des expressions ne contenant plus que des valeurs et exprimant des relations entre elles.
23
24Pour que ce paradigme soit possible, pragmatique et utile pour la construction de vrais programmes, les langages fonctionnels comportent un sous-ensemble plus ou moins grand des caractéristiques suivantes:
25
26- les fonctions sont des citoyens de premiÚre classe, pouvant être manipulées comme des valeurs (affectées, passées en paramÚtres ou retournées);
27
28- des clÎtures lexicales, fonctions anonymes pouvant être crées à l'exécution, de maniÚre à ce qu'un bloc de code emporte avec lui une partie de son environnement (autres valeurs);
29
30- affectation unique et programmation par cas ("pattern matching") conduisant à un style récursif;
31
32- structures de données natives, notamment les listes;
33
34- constructeur d'ensemble;
35
36- gestion automatique de la memoire (ramasse-miette);
37
38- typage dynamique (ou inférence de type);
39
40- séparation des fonctions et des structures de données.
41
42L'ensemble de tout ça conduit à des programmes réputés:
43
44- courts et concis,
45
46- expressifs,
47
48- corrects et robustes.
49
50Cette derniÚre caractéristique devrait intéresser les développeurs XP, soucieux de qualité, mais dont les tests, s'ils sont omniprésents et considérables par rapport à une culture de développement traditionnelle, sont avant tout des outils de conception et de spécification, et ne sont pas conçus dans un souci d'exhaustivité ou de parade totale face aux facéties des programmes typiques.
51
52Quelques dates:
53
54Lisp: ~1959
55ML: ~1977
56Erlang: ~1988
57Haskell: ~1990
58
59**  Survol du langage Erlang
60
61Erlang est un langage développé et supporte par Ericsson:
62
63- fonctionnel strict
64- dynamiquement typé
65- programmation par cas
66- valeurs immuables
67- programmation concurrente (parallÚle) a base de processus
68  séquentiels communicants
69
70Erlang est compilé en bytecode qui tourne sur une machine virtuelle. Erlang vient avec un 'environnement de dév' complet (compilateur, debugger, profiler), des librairies et diverses applications incluant Mnesia (base de données répartie, un serveur HTTP, un ORB CORBA).
71
72Erlang est développé et supporté par Ericsson ComputerScience lab et est distribué gratuitement sous une licence OpenSource depuis 1998.
73
74Erlang est un langage généraliste mais dont les caractéristiques uniques en termes de programmation concurrente le rende particuliérement adapté au développement de systÚmes distribués (internet), notamment robustes et pseudo-temps-réel (télécommunications, contrÎle-commande...).
75
76** Testabilité
77
78*** Cf. fp_tdd
79
80*** testabilité des programmes multi-"thread"
81
82Les applications actuelles sont de maniÚre courante maintenant multi-threadées. Les problÚmes surviennent lorsque l'on veut tester ces applications. Le but recherché en utilisant des threads est de lancer des traitements en parallÚle. Ces traitements peuvent être, et le ceux généralement, interdépendant entre eux. Les threads sont gÚrées par le systÚme d'exploitation, leur lancement et leur sequencement ne sont donc pas PRÉDICTIBLES. 99% du temps tout se passera bien, mais en fonction de la charge machine ou d'un autre évenement externe, un 'nouvel' sequement de thread va réveler un bug, soit du à un accÚs concurrent à une variable, soit du à un interblocage.
83Il est trÚs dur de tester le comportement d'un application multi-thread. On peut facilement tester le comportement d'UN thread, et encore au prix d'une mise au point importante (lancement du thread, attente de X secondes ... ), mais lorsque l'application comporte un grand nombre de thread, l'ensemble ne sera jamais testé dans TOUS les cas de figures.
84
85>>> lister les outils, techniques... connues (devpartner?)
86
87Hormis les faiblesses de testabilité, le "multithreading", modÚle de concurrence à mémoire partagée, présente plusieurs faiblesses conceptuelles ou contradictions avec l'objet et/ou XP:
88
89- rendre tout thread-safe? pas YAGNI... mais les modifier aprÚs coup est 1) risqué 2) viole OCP, on est obligé de modifier la classe originale.
90- C/C++: obligation de mettre des objets en portée globale, ou de créer/détruire les "objets actifs" à différents endroits...
91- décourage l′encapsulation
92
93Le langage Erlang inclue 'nativement' la notion de 'process'. Les 'process' s'apparentent aux threads dans la mesure où ils permettent dans réaliser des traitements en parallele. Les 'process' erlang, grâce aux propriétés des langages fonctionnels, sont totalement isolés les uns des autres et peuvent uniquement communiquer entre eux que par l'intermédiaire de messages asynchrones. Un process répondant uniquement aux 'excitations' d'un ensemble de messages, ils sont polymorphiques et peuvent être substitués par un nouveau de maniÚre totalement transparent. L'unité de code étant la fonction, different process peuvent partager  trÚs facilement différent 'set' de fonctions.
94
95Démontrer sa testabilité
96Un process reçoit et envoie des messages à n'importe qui, par conséquent l'intégration dans un programme de test est simple à réaliser. Un process testé isolement aura de maniÚre certaine le même comportement dans la vraie "vie".
97
98Au pire, un systÚme complexe révÚlera un comportement inattendu en exploitation, en raison du cÎté aléatoire du séquenceur et/ou des charges machine ou réseau. Toutefois, tous les aléas se traduiront au final, pour un process donné, par une séquence de message qu'il suffira de simuler pour reproduire avec certitude le problÚme découvert.
99
100(On peut même tester localement un systÚme multiprocess puis le déployer en distribué, sans changement de comportement).
101
102Exemple?
103
104** Abstraction, expressivite, DSL
105
106Expressivité:
107  concision (typage dynamique, compréhensions, )
108  clarté (referential transparency - pas d'effets de bord)
109  pattern matching
110 
111Abstraction (équivalent a l'héritage): fonction d'ordre superieur.
112
113DSL:
114
115Externes: fichier de config en langage natif (structures symboliques natives plutÃŽt que XML).
116Internes: pseudo langage spécifique a un besoin, mais qui est en fait code en Erlang... (exemple: parser combinators?)
117Parsers: ...
118
119
120** Tableau comparatif des langages fonctionnels p/r a XP
121
122(indiquer typage dynamique ou statique)
123
124A FAIRE
125Trouver des exemples de code et montrer leur conception via TDD
126Trouver des façons de faire participer l'auditoire
127  - sondage a main levée (qui connaît un langage fonctionnel?)
128  - aprÚs un ou deux exemples (avec TDD ping pong) inviter quelqu'un a
129  essayer l'exemple suivant?
130
131Vérifier qu'on satisfait les remarques et questions ci-dessous.
132Vérifier que ça tient en 90 minutes.
133
134** Q&A
135
136*** Bien pour refactoring?
137
138- typage dynamique + filtrage simplifie la plupart des remaniements.
139- les modules sont indépendants
140- transparence référentielle induit une bonne plasticité (structure gigognes plutÎt que graphes complexes).
141- la correction à chaud accélÚre le cycle de remaniement
142- certains refactorings spécifiques à Erlang.
143
144*** Typage statique ou dynamique?
145
146Typage statique utile pour:
147
1481) documenter
149
1502) vérifier des choses à la compilation
151
152Or, c'est un moyen imparfait d'atteindre ces deux objectifs. Au contraire, le TDD permet de les atteindre tous les deux, et rend alors superflu le typage statique.
153
154(N.B. typage statique est moins "lourd" dans les langages fonctionnels, car ils font en général de l'inférence).
155
Note: See TracBrowser for help on using the repository browser.