Vous êtes sur la page 1sur 44

Programmation Compare

Cours Introductif

Yann Rgis-Gianas yrg@pps.jussieu.fr


PPS - Universit Denis Diderot Paris 7

3 janvier 2011

1/44

Plan

Principe du cours

Programmation : Quels outils ? Quels problmes ?

Objectifs et fonctionnement du cours

2/44

Plan

Principe du cours

Programmation : Quels outils ? Quels problmes ?

Objectifs et fonctionnement du cours

3/44

Quest-ce que la programmation ?

Outils Problemes

(Une dnition plus srieuse vient un peu plus loin.)

Il faut bien comprendre loutil en lui-mme et son utilit.

4/44

Comment progresser en programmation ?


Apprentissage centr sur les mcanismes de programmation

Apprentissage linguistique
1. Comprendre un mcanisme de programmation 2. Raisonner sur des programmes crits laide de ces mcanismes 3. Lintgrer dans sa bote outils

Apprentissage mta-linguistique
I I

Didactique : Apprendre apprendre un nouveau langage Dialectique : Comprendre ce qui se passe


(en comprenant ce qui sest pass)

5/44

Le dveloppement logiciel

QUOI?

Prendre conscience d'un problme

Unedistanceobserveentrece quedoitfaireleprogrammeetce qu'ilpeutfaire.

Dcomposition

Plusieurssousproblmesetleur articulation

Analyse

Unespcificationdesproblmes.

COMMENT?
Conception Programmation

Unespcificationdessolutions cesproblmes.

Uneversionexcutabledeces solutions.

ET ALORS?

Evaluation

Unenouvelledistanceobserve entrelersultateffectifetle rsultatescompt.

6/44

La programmation moderne
La programmation est lactivit qui consiste construire une version excutable de la solution un problme.

Dans un dveloppement moderne de logiciel, cette activit prend de nombreuses formes car les outils matriels et logiciels ont normment volu. Ainsi, on ne construit dsormais que trs rarement un logiciel partir de rien. Le travail du programmeur sappuie sur les mcanismes de langages de programmation dirents, sur des environnements prexistants ( framework) darchitecture particulire, sur des systmes dexploitation varis, . . . Tous ces paramtres inuent sur la faon de dvelopper et sur la qualit du logiciel nal.

Comment faire ces choix ?

7/44

Plan

Principe du cours

Programmation : Quels outils ? Quels problmes ?

Objectifs et fonctionnement du cours

8/44

Langage de programmation

Langage de programmation
Un langage de programmation est un langage formel dni par une syntaxe et une smantique. Plus un langage de programmation fournit de mcanismes de calcul distincts et plus il est dit expressif.

Un langage de programmation est une abstraction du code machine concrtement excut in ne. Son niveau dabstraction dpend de sa distance ce code machine. Plus un langage de programmation est proche de la formulation du problme issue de la phase danalyse et plus il est dit dclaratif.

9/44

Outils autour des langages de programmation


Un compilateur traduit un programme dans un langage de plus bas niveau pour le rendre plus adapt une excution ecace par la machine. Ainsi, un compilateur peut produire du code natif, cest--dire du code excutable directement par le processeur de la machine physique. Il peut aussi produire du code machine pour une machine virtuelle, simule par une ou plusieurs machines concrtes.

Un interprte est un programme qui value le code source crit par le programmeur sans passer par une phase de traduction pralable.

Un analyseur statique est un programme qui, sans excuter le code source, fournit des informations sur ce dernier. Un typeur est un exemple danalyseur statique : il fournit la garantie quun programme pourra sexcuter sans erreur grossire et produire une valeur.

En fonction de la prsence ou de labsence de ses outils, un langage est dit interprt, compil et avec ou sans analyseurs statiques.
10/44

Critres de classication
Il existe des milliers de langages de programmation. Le site suivant en rfrence pas moins de 8512 : http://hopl.murdoch.edu.au/ Il en existe de nombreuses taxonomies : http://hopl.murdoch.edu.au/taxonomy.html http://www.info.ucl.ac.be/~pvr/paradigmsDIAGRAMeng108.pdf La classication que nous allons suivre sappuiera sur une mthode moins systmatique et rigoureuse que ces deux approches au prot dun accent mis sur les familles de langages les plus utilises.

11/44

Langage assembleur
Les langages dassemblages, ou simplement assembleur, sont des langages de bas-niveau lis un jeu dinstructions dun processeur particulier. Les assembleurs ont t invents dans les annes 50. Ils taient alors nomms langages de seconde gnration car ils remplacaient les langages machines, de premire gnration. Un programme crit en assembleur est gnralement form laide de trois classes syntaxiques :
I

Les mnmomiques dinstruction dcrivent les oprations eectues par le processeur. Les directives dassemblage donnent des informations externes sur la faon de produire le code excutable partir du code assembleur. Les sections de donnes contiennent des descriptions des constantes utilises par le programme.

12/44

Exemple de programme assembleur i386


Source : Wikipedia .globl _start DATA : .ascii "Hello World" _start : mov $4 , %eax mov $1 , %ebx mov $DATA , %ecx mov $8 , %edx int $0x80 mov $1 , %eax mov $0 , %ebx int $0x80

Pour produire un excutable sous Linux : $ gcc foo.S -c -o foo.o $ ld foo.o -o foo $ ./foo

13/44

Mcanismes principaux du langage assembleur


Par dnition, lassembleur ne fournit pas dabstraction au dessus du processeur. En revanche, tous les mcanismes de calcul du processeur sont accessibles. Ainsi, du point de vue de lutilisation optimale des fonctionnalits de la machine, le langage assembleur est trs expressif.

Par ailleurs, comme la structure du code machine est totalement libre, certains mcanismes sont ralisables alors quils sont inaccessibles dans (la plupart des) les langages de haut niveau :
I

Factorisation de code maximale : les conventions dappel de procdure cr gnralement des barrires dabstraction empchant la factorisation de fragments de code communs entre les procdures. Code auto-gnr et auto-modiant : un programme assembleur peut (gnralement) crire dans son segment de code ce qui lui permet de se modier pour soptimiser (drouler une boucle par exemple) ou encore dcrypter une partie de son code.

14/44

Utilisations courantes de lassembleur


De nos jours, lassembleur est peu utilis car les compilateurs des langages de haut-niveau produisent en gnral du code decacit trs proche de ce que lon pourrait crire la main. En particulier, les algorithmes dallocation des registres modernes peuvent produire des rsultats quun programmeur aurait du mal obtenir. De plus, un programme crit en assembleur est dicile crire et maintenir car il est gnralement moins concis et moins modulaire quun programme crit dans un langage de haut niveau. De plus, il nest pas portable. Il reste nanmoins quelques applications o lassembleur est utilis :
I

Certaines instructions trs spciques des microprocesseurs ne sont pas gres par les compilateurs. Pour en tirer parti, une routine assembleur est ncessaire. Les drivers sappuient sur une interaction trs prcise avec les ports dentres/sorties et les registres spciaux des processeurs que lon ne peut pas forcment contrler dans un langage de haut-niveau.

15/44

Exemple de routine assembleur en ligne

for (number = 0 ; number max ; ++number) { for (i = (number 1), position = 0 ; i != 0 ; ++position) i = 1; result = position ; }

Que fait ce programme C ?

16/44

Exemple de routine assembleur en ligne

for (number = 0 ; number max ; ++number) { asm ("bsr1 %1, %0" : "=r" (position) : "r" (number)) ; result = position ; }

Ce programme sexcute 6 fois plus rapidement.

17/44

Conclusion sur lassembleur

Nous ntudierons pas la programmation assembleur dans ce cours de programmation compare car son utilisation est devenue rare. Nanmoins, il est sans doute enrichissant davoir crit une routine assembleur une fois dans sa vie de programmeur.

18/44

De la programmation non structure . . .

Instruction 1 Instruction 2 Instruction 3 Instruction 4 Instruction 5 Instruction 6 Instruction 7 Instruction 8 Instruction 9 Instruction 10 Instruction 11 Instruction 12 Instruction 13 Instruction 14 Instruction 15

19/44

. . . la programmation structure.

Fonction f (int, int)

Fonction g (int)

Fonction h (int, int)

Fonction i (int, int, int)

20/44

Langages procduraux du premier ordre


Dans les annes 60, la crise du logiciel a conduit une rexion autour de la mthodologie de la construction des programmes informatiques, aboutissant lmergence du gnie logiciel. Du point de vue des langages de programmation, des mcanismes pour structurer la programmation et les programmes sont apparus :
I I I

Structures de contrle de haut-niveau : while, if-then-else,. . . Procdures et fonctions (de seconde classe). Suppression du goto (Un point unique de sortie et dentre pour les boucles.) Minimisation des variables globales au prot de variables locales.

Un article de recherche de lpoque explique bien pourquoi ces restrictions de lexpressivit des langages de programmation sont bnques : Go To Statement Considered Harmful Edsger Dijkstra
http://www.ifi.uzh.ch/req/courses/kvse/uebungen/Dijkstra_Goto.pdf

21/44

Exemple de programme procdural en ADA


procedure Sort (Item : in out Element_Array) is Pivot_Index : Index_Type ; Pivot_Value : Element_Type ; Right : Index_Type : = ItemLast ; Left : Index_Type : = ItemFirst ; begin if ItemLength > 1 then Pivot_Index : = Index_TypeVal((Index_TypePos(ItemLast) + 1 + Index_TypePos(ItemFirst)) / 2) ; Pivot_Value : = Item(Pivot_Index) ; Left : = ItemFirst ; Right : = ItemLast ; loop while Left < ItemLast and then Item(Left) < Pivot_Value loop Left : = Index_TypeSucc(Left) ; end loop ; while Right > ItemFirst and then Item(Right) > Pivot_Value loop Right : = Index_TypePred(Right) ; end loop ; exit when Left Right ; Swap(Item(Left), Item(Right)) ; if Left < ItemLast and Right > ItemFirst then Left : = Index_TypeSucc(Left) ; Right : = Index_TypePred(Right) ; end if ; end loop ; if Right > ItemFirst then Sort(Item(ItemFirst..Index_TypePred(Right))) ; end if ; if Left < ItemLast then Sort(Item(Left..ItemLast)) ; end if ; end if ;

22/44

La programmation structure

En plus de ces langages de programmation procduraux, cette programmation plus structure est galement caractrise par une mthologie de conception des programmes par ranements successifs descendants. Nous tudierons cette mthode dans le prochain cours et la comparerons aux mthodes de modlisation que vous connaissez dj.

23/44

La programmation en grand
Les logiciels devenant de plus en plus complexes, les besoins de fragmentation de leur dveloppement se sont sentis de plus en plus forts. Des outils linguistiques pour mener une programmation en grand (Programming in the large) ont alors t proposs. Ils visaient faciliter linterconnection de composants logiciels :
By large programs we mean systems consisting of many small programs (modules), possibly written by dierent people. We need languages for programming-in-the-small, i.e. languages not unlike the common programming languages of today, for writing modules. We also need a module interconnection language for knitting those modules together into an integrated whole and for providing an overview that formally records the intent of the programmer(s) and that can be checked for consistency by a compiler. We explore the software reliability aspects of such an interconnection language. Emphasis is placed on facilities for information hiding and for dening layers of virtual machines.

Programming-in-the-large versus programming-in-the-small DeRemer, Frank ; Kron, Hans (1975)


24/44

Des mcanismes pour . . .

Fonction f (int, int)

Fonction g (int)

Fonction h (int, int)

Fonction i (int, int, int)

25/44

. . . limiter les interdpendances

Fonction f ((int, int) int, int, int)

Fonction g (int)

Fonction h (int, int)

Fonction i (int, int, int)

26/44

La modularit
Nous allons tendre la rexion dj entame en POCA sur les proprits de modularit des composants logiciels en tudiant et comparant les mcanismes suivants :
I I I I

Les types abstraits. Les fonctions dordre suprieur. Les modules, les classes, les mixins et les classes de type. Les messages de premire classe.

Nous verrons aussi comment la modularit peut tre obtenue par direntes formes de dcomposition du logiciel en composants et composition des composants en logiciel. En particulier, nous aborderons et comparerons :
I I I I I

La programmation oriente objet. La programmation oriente aspect. La programmation oriente sujet. La programmation oriente rle. La programmation fonctionnelle.

27/44

Les langages dordre suprieur


Une ide au cur de la programmation modulaire est de considrer le code excutable comme un objet de premire classe, cest--dire comme pouvant tre lissue dun calcul ou bien un de ses paramtres. Nous comparerons les direntes ralisations de cette ide, quils sagissent des S-expressions de LISP ou bien des fermetures des langages objets et fonctionnels. Pouvoir crire une fonction dordre suprieur, cest--dire une fonction qui manipule dautres fonctions, induit un gain trs important en expressivit puisque le programmeur peut par exemple dnir lui-mme ses propres oprateurs de contrle. Par ailleurs, nous verrons comment le paradigme de la programmation fonctionnel apporte une augmentation de la dclarativit, facilitant le raisonnement sur les programmes. On peut pousser plus loin encore cette dclarativit en contrlant les eets de bord comme le font les langages de programmation fonctionnelle pure.

28/44

Exemple de programme fonctionnel

mkRands = mapM (randomRIO.(,)0 ). enumFromTo 1. pred replaceAt : : Int a [a] [a] replaceAt i c = let (a,b) = splitAt i l in a++x : (drop 1 b) swapElems : : (Int, Int) [a] [a] swapElems (i,j) xs | i j = xs | _ = replaceAt j (xs ! !i) $ replaceAt i (xs ! !j) xs knuthShue : : [a] IO [a] knuthShue xs = liftM (foldr swapElems xs. zip [1..]) (mkRands (length xs))

29/44

Langages de programmation gnrique et de mtaprogrammation


Certes, les langages dordre suprieur manipulent du code excutable mais dune faon assez limite : il nest par exemple pas possible dcrire une fonction dordre suprieur qui inspecte une fonction qui lui est passe en argument pour en produire une autre plus ecace ou en ladaptant pour traiter une nouvelle forme de donnes. La mta-programmation consiste crire des programmes qui manipulent le code source dautres programmes. De nombreuses transformations automatiques de programmes sont utiles pour viter au programmeur lcriture de code rptitif. La distinction entre run-time et compile-time est souvent supprime dans un langage de mta-programmation. On peut ainsi calculer et recompiler certains fragments dun programme pendant lexcution.

30/44

Exemple de spcialisation de programmes

let lift x = .<x>. let rec member l y = match l with | [] .<false>. | x : : xs .<if . (lift x) = . y then true else . (member xs y)>. let spec_member = .< fun x . (member [1 ;2 ;3] x) >.

spec_member est une version spcialise de la fonction member.

31/44

Le modle de calcul concurrent


Les systmes informatiques peuvent interagir avec un environnement o plusieurs vnements peuvent arriver simultanment, o des processus concurrents sexcutent paralllement des rythmes distincts suivant des lois non ncessairement dterministes (par exemple, probabilistes). Or, un programme sexcute in ne sur une machine dterministe. Comment dcomposer un programme dans ce cadre ? Une des rponses cette question consiste voir le programme lui-mme comme un ensemble de composants concurrents. Ds lors, ces composants peuvent tre excuts sur un mme processeur en entrelaant leurs excutions ou bien sur de multiples processeurs. La communication entre ces composants peut seectuer via une mmoire partage ou encore via des messages envoys sur des canaux de communication.

32/44

La programmation concurrente

Comment programmer dans un modle concurrent ? On trouve aujourdhui de nombreuses approches distinctes pour traiter la concurrence ainsi que dirents points de vue sur celle-ci. Nous comparerons :
I I I I

Le modle mmoire partage. Le modle par passage de messages. Les modles synchrone/asynchrone. La concurrence optimiste/pessimiste.

ainsi que les faons de les programmer laide de langages gnralistes ou ddis la concurrence.

33/44

Exemple de programme concurrent


Une pile concurrente en JoCaml : #let new_stack () = def state (s) & push (v) = state (v : : s) & reply to push or state (x : : s) & pop () = state (s) & reply x to pop in spawn state([]) ; pop, push ;; val new_stack : unit (unit a) (a unit) = <fun>

Dans ce cadre, faire une opration pop sur une pile vide ne plante pas le programme mais le met en attente.

34/44

Langages de programmation logique

Un programme logique est une description purement dclarative dun problme exprim dans une logique particulire. Le caractre excutable de cette description est obtenue laide dun prouveur automatique. Ainsi, le programme est constitu dune base de faits souvent exprims laide de clauses tablissant des contraintes entre des donnes. Pour obtenir une rponse un problme, on interroge cette base de faits pour y montrer la satisabilit ou linsatisabilit dune certaine relation entre des donnes. En pratique, le programmeur a aussi la responsabilit de guider le prouveur automatique pour augmenter lecacit de la rponse certaines requtes. Les langages logiques permettent la sparation entre la logique et le contrle du programme nal.

35/44

Exemple de programme logique


man(adam). man(peter). man(paul). woman(marry). woman(eve). parent(adam,peter). parent(eve,peter). parent(adam,paul). parent(marry,paul). father(F,C) : -man(F),parent(F,C). mother(M,C) : -woman(M),parent(M,C). is_father(F) : -father(F,_). is_mother(M) : -mother(M,_). ?-father(X,paul). ?-father(adam,X).

Une des particularits des programmes logiques est de ne pas spcier les entres et les sorties des programmes.

36/44

Langages ddis un domaine spcique

Certains problmes sont plus facilement expressibles dans un langage ddi. Par exemple, les requtes dans une base de donnes relationnelle sont exprimables dans le langage de lalgbre relationnelle implment par SQL. Un langage spcique un domaine nest pas ncessairement turing complet mais en contrepartie de cette restriction dexpressivit calculatoire, sa syntaxe et sa smantique peuvent capturer de faon plus prcise et concise lespace des solutions lis un problme. Nous tudierons quelques-uns de ces langages et les comparerons avec les solutions similaires programmes laide de langages gnralistes. Nous verrons aussi comment certains langages de programmation gnraliste permettent dembarquer des langages spciques en leur sein.

37/44

Exemple de programme ddi un domaine : CSound


<CsoundSynthesizer> ; <CsOptions> csound -W -d -o tone.wav </CsOptions> <CsInstruments> sr = 44100 ; Sample rate. kr = 4410 ; Control signal rate. ksmps = 10 ; Samples pr. control signal. nchnls = 1 ; Number of output channels. instr 1 a1 oscil p4, p5, 1 ; Simple oscillator. out a1 ; Output. endin </CsInstruments> <CsScore> f1 0 8192 10 1 ; Table containing a sine wave. i1 0 1 20000 1000 ; Play one second of one kHz tone. e </CsScore> </CsoundSynthesizer>

38/44

Exemple de programme ddi un domaine : Shell

% ls -lR | gawk {print $4} | uniq

39/44

Plan

Principe du cours

Programmation : Quels outils ? Quels problmes ?

Objectifs et fonctionnement du cours

40/44

Comparer les approches de programmation


Ce cours de programmation va aborder lensemble des approches de la programmation que nous venons dnumrer en les comparant. Pour cela, nous commencerons par dcrire prcisment les mcanismes de programmation qui les caractrisent puis nous essaierons de comprendre les faons de penser quils induisent chez le programmeur. En eet, les outils qui sont la disposition dun programmeur dans un certain langage conditionne sa faon daborder un problme. Ces outils forment son vocabulaire pour dcrire ce dernier et cette description inue sur la conception de la solution. Cette hypothse appele relativit linguistique ou hypothse de SapirWhorf peut se rsumer ainsi : crire dans un langage signie penser dans ce langage. Si on accepte cette hypothse alors on peut penser quen abordant direntes approches de la programmation, on peut penser les solutions de faon plus libre. Dailleurs, faisons une petite exprience. . .

41/44

Un exemple de problme

Soit un dictionnaire D form par une liste de mots w1 , . . . , wn et un mot w . Calculer tous les anagrammes de w dans D.

42/44

Description du projet

Comme en POCA, le projet de compilation compare se droulera en deux temps avec un premier sujet puis une extension pour excercer la modularit de votre solution. Cependant, cette fois-ci, votre projet devra tre programm deux fois ! Vous devrez programmer en suivant deux approches direntes de la programmation et comparer ces deux approches dans un rapport. (Rassurez-vous le sujet nest pas long.)

43/44

Fonctionnement du cours

La note nale sera gale 50% du projet + 50% dexamen. Le cours aura lieu en 447C le lundi de 8h30 12h30. Il sera compos dune heure de cours magistral et de deux heures de cours interactif sur machine.

44/44