Chapitre 7
Synthèse et Conclusion
On
reconnaît à chaque langage une certaine spécificité
: le Fortran facilite le
traitement numérique, ADA permet de
développer d'importantes applications temps réel, le C est un langage machine de haut niveau convenant aux applications
proches du système opératoire. Le langage
Lisp quant à lui, porte l'abstraction à un très haut niveau,
l'abstraction étant comprise comme la faculté de représenter simplement des
problèmes complexes.
UN
LANGAGE A HAUT POUVOIR D'EXPRESSION EFFECTIF
Du
point de vue de la théorie du calcul, tous les langages de programmation usuels
sont équivalents (plus précisément Turing
équivalent, du mathématicien anglais
Alan Turing). Ceci concerne le pouvoir d'expression théorique d'un langage de
programmation mais n'exprime en rien le pouvoir
d'expression effectif d'un langage, c'est-à-dire la facilité avec laquelle
un langage permet de programmer un problème donné.
Il
n'y a pas de test formel pour mesurer le pouvoir d'expression effectif d'un
langage. Cependant, il est clair que les moyens d'abstraction particuliers du Lisp contribuent à son pouvoir
d'expression. On peut mesurer le pouvoir d'expression effectif d'un langage de
façon informelle, par la facilité relative avec laquelle il permet la résolution
de certains problèmes fondamentaux réputés difficiles.
En
1983, un problème de ce type fût proposé par Ken Thomson lors d'un exposé dans
le cadre de la chaire Turing (Ken
Thomson est sans doute plus connu comme un des auteurs du système opératoire UNIX); ce "défi", lancé à la
communauté informatique, était d'écrire un programme n'ayant d'autre fonction
que de s'auto-reproduire et qui soit le plus court possible (l'exécution de ce
programme doit donc reproduire une copie exacte du programme tel que le programmeur
l'a écrit; autrement dit, il s'agit d'écrire un programme source qui, une fois
compilé et exécuté, produit le programme source).
Ken
Thomson a écrit une version en langage C
de ce programme; celui-ci comporte 233 lignes d'un code pas très attrayant. En Lisp, ce programme ne prend que 2 lignes
et est d'une lecture aisée dès que l'on comprend un peu de Lisp.
Bien
que ce type de démonstration de la puissance effective d'un langage puisse
paraître académique et sujette à caution, l'expérience montre que ces résultats
sont extrapolables aux applications réelles. On constate en effet que de
nombreux progiciels très élaborés mettent à profit le pouvoir d'expression
effectif du Lisp, comme par exemple, Interleaf, un progiciel destiné à
l'édition de documents techniques complexes. La version 5 de ce progiciel
comporte 1.500.000 lignes de code C
et 250.000 lignes de code Lisp; ce
code Lisp représente environ 25% des
fonctionnalités du système et, selon les concepteurs d'Interleaf, apporte un gain considérable en terme de taille de code.
AutoCAD et l'éditeur EMACS sont
2 autres exemples de mise à profit des caractéristiques du Lisp.
UN
LANGAGE POUR LES DEVELOPPEURS
Ce
haut pouvoir d'abstraction, en réduisant le temps consacré à la programmation,
fait du Lisp un langage
particulièrement intéressant pour les développeurs, c'est-à-dire toutes
personnes chargées non seulement de la programmation mais aussi de l'analyse et
du design d'une application. Dans les Divisions Ingénierie de TRACTEBEL, sont ainsi concernés les
nombreux ingénieurs qui, dans les tâches de conception et d'études, cumulent les rôles d'utilisateur et de
développeur.
UN
LANGAGE FONCTIONNEL, UN LANGAGE ELEGANT
Le Lisp, comme la plupart des langages
fonctionnels (voir ci-dessous), est un langage élégant, c'est-à-dire un langage
qui permet d'écrire des programmes succints
et faciles à lire par d'autres
programmeurs. Selon D. Ince, qui définit ainsi l'élégance d'un langage de
programmation, il n'est pas rare d'écrire un programme dans un langage de très
haut niveau (comme le Lisp), qui soit
dix fois moins long que le programme équivalent écrit dans un langage
conventionnel (voir [INCE88]).
Contrairement
à une idée répandue, le Lisp est un
langage plutôt facile à apprendre (voir les paragraphes 2.4): on constate ainsi
que le Lisp remplace de plus en plus
souvent le Pascal comme langage
d'apprentissage de la programmation. En outre, le Lisp simplifie la tâche de programmation: c'est un corollaire du
haut pouvoir d'abstraction et de la flexibilité de ce langage.
Quelles
sont les caractéristiques du Lisp qui
lui confèrent ce pouvoir d'expression inégalé? D'une part le modèle d'exécution
du Lisp répond au modèle fonctionnel : tout programme Lisp s'exprime en termes d'applications
de fonctions à des objets (c'est-à-dire des données). Une fonction prend zéro
ou plusieurs objets comme arguments, effectue un traitement et renvoie un ou
plusieurs objets comme résultats (un argument pouvant être lui-même une
application de fonction). D'autre part, en Lisp,
il y a équivalence entre le programme et
les données : les fonctions Lisp
peuvent donc être traitées comme n'importe quelle donnée (par exemple être
passées en argument d'un appel de fonction ou encore être stockées dans une
structure de données).
Il
s'ensuit que le Lisp est un langage de programmation auto-programmable,
c'est-à-dire un langage dont il est possible d'étendre la syntaxe et la
sémantique (voir le paragraphe 5.3 du chapitre 5; voir aussi [HASE89], où il
est montré qu'il est possible de créer un langage à objets - pour faire de la
programmation orientée objet - à partir du Common
Lisp en seulement 250 lignes de code
- ce langage à objets disposant de l'héritage multiple).
UN
LANGAGE GENERAL
Le Lisp est un langage général : son domaine d'application est large, loin de se
limiter aux applications de l'"intelligence artificielle".
Aujourd'hui, la vulgarisation de la mémoire centrale fait du Lisp un langage utilisable sur de
nombreux types de machines, y compris les micro-ordinateurs. La standardisation de ce langage simplifie
le portage des applications (voir l'annexe 3 pour la portabilité du Common Lisp); cette simplification
concerne aussi le portage des interfaces hommes-machines, grâce aux efforts de
standardisation en matière de gestionnaires d'interface (CLIM, Common Lisp Interface
Manager).
Le Lisp jouit d'une bonne intégration dans les autres langages : un programme Lisp peut invoquer un programme C
ou Fortran et échanger des données
avec ces programmes (par exemple, voir la description de l'application Tropic dans l'annexe 2).
UN
LANGAGE ADAPTABLE
L'histoire
du Lisp montre comment il s'est
adapté rapidement aux nouvelles idées; cela a été le cas avec la programmation
structurée et avec la programmation orientée objet (CLOS - Common Lisp Object
System). Dans les années 70, dès l'apparition du concept de la
programmation structurée et grâce au caractère auto-programmable du Lisp, les utilisateurs du Lisp ont pu intégrer immédiatement de
nouvelles structures de contrôles à leurs programmes. Lorsque les langages Simula et Smalltalk eurent démontré l'intérêt de la programmation orientée
objet dans la quête de la maîtrise de la complexité, diverses extensions objet
de Lisp apparurent rapidement (dont,
vers 1975, LOOPS et FLAVORS, les ancêtres de l'actuel
système d'objets de Common Lisp - CLOS).
Dès ce moment, ces extensions objet de Lisp
allaient plus loin que Smalltalk ou
même que le récent C++ (par exemple
en permettant l'héritage multiple et la combinaison de méthodes).
Un
phénomène similaire s'est produit lors de la disponibilité des architectures
parallèles : en effet, il existe aujourd'hui diverses extensions de Common Lisp permettant de profiter de
ces nouvelles architectures (voir [MURR 90]); de plus l'aspect
auto-programmable du Lisp permet aux
utilisateurs de ces architectures de définir des instructions parallèles de
haut niveau d'abstraction, appropriées à une application spécifique.
UN
LANGAGE POUR AUJOURD'HUI ET DEMAIN
Cette
adaptabilité est un gage de la pérennité du Lisp, qui, de fait, est un des plus vieux langages de
programmation (1956). Toujours à propos de l'avenir du Lisp (et de ses descendants), il est significatif que le ministère
américain de la défense ait déterminé le Common
Lisp (dont CLOS) comme un des
trois langages de programmation officiels pour ses applications (les deux
autres étant ADA et CPL, un langage de prototypage). Si la
niche occupée par le Lisp dans le
monde des langages de programmation continue de croître, ce n'est pas sans
raisons. Ce dossier aura su, nous l'espérons, en rendre compte avec quelque
clarté.