Program Mati On

Embed Size (px)

DESCRIPTION

good

Citation preview

  • L'informatique au lyce Chapitre 6

    http://ow.ly/2xxkI

    Chapitre 6Programmation et langages

    La programmation consiste crer une squence d'instructions pour un ordinateur afin qu'il puisse rsoudre un problme ou excuter une tche.

    partir de ce chapitre, on supposera que le lecteur matrise le langage Python 3.

    6.1. Un peu d'histoireEn 1936, la publication de l'article fondateur de la science informatique On Computable

    Numbers with an Application to the Entscheidungsproblem, par Alan Mathison Turing, allait donner le coup d'envoi la cration de l'ordinateur programmable. Il y prsente sa machine de Turing, le premier calculateur universel programmable, et invente les concepts et les termes de programmation et de programme.

    En 1948, Konrad Zuse publie un article sur son langage de programmation qu'il a dvelopp entre 1943 et 1945 : le Plankalkl. Zuse le considre comme tant le premier langage de haut niveau.

    C'est partir des annes 50 que l'on verra apparatre les premiers langages de programmation modernes. Voici les crateurs des langages les plus utiliss :

    John Backus, inventeur de Fortran (1954) John McCarthy, inventeur de LISP (1958) Grace Hopper, surnomme la mre langage COBOL (1959) John George Kemeny, concepteur du BASIC (1963) Dennis Ritchie et Ken Thompson, inventeurs du langage C (1972) Niklaus Wirth inventeur de Pascal (1970) et Modula-2 (1977) Bjarne Stroustrup, dveloppeur de C++ (1985) Guido van Rossum, crateur de Python (1991) James Gosling et Patrick Naughton, crateurs de Java (1991).

    6.1.1. volution des langages informatiquesOn distingue aujourd'hui cinq gnrations de langages.La premire gnration est le langage machine, ou code machine. On parle aussi de langage

    natif. Il est compos d'instructions et de donnes traiter codes en binaire. C'est le seul langage qu'un ordinateur peut traiter directement.

    Voici quoi peut ressembler un programme en langage machine :

    A1 01 10 03 06 01 12 A3 01 14

    Il s'agit de la reprsentation hexadcimale d'un programme permettant d'additionner les valeurs de deux cases mmoire et de stocker le rsultat dans une troisime case. On voit immdiatement la difficult d'un tel langage...

    Didier Mller 6-1 novembre 2014

  • Programmation et langages

    La deuxime gnration est le langage assembleur1 : le code devient lisible et comprhensible par un plus grand nombre d'initis. Il existe en fait un langage assembleur par type de processeur.

    Le programme prcdent crit en assembleur donnerait ceci :

    MOV AX, [0110]ADD AX, [0112]MOV [0114], AX

    Il reste utilis dans le cadre d'optimisations, mais a t supplant en popularit par les langages plus accessibles de troisime gnration.

    La troisime gnration utilise une syntaxe proche de l'anglais. Proposs autour de 1960, ces langages ont permis un gain norme en lisibilit et en productivit. Ils ne dpendent plus du processeur, comme c'tait le cas des gnrations prcdentes, mais d'un compilateur2 spcifique du processeur. L'ide de portabilit3 des programmes tait lance.

    La plupart des langages de programmation actuels sont de troisime gnration. On trouve dans cette catgorie tous les grands langages : Ada, Algol, Basic, Cobol, Eiffel, Fortran, C, C++, Java, Perl, Pascal, Python, Ruby, ... Cette gnration couvre d'ailleurs tant de langages qu'elle est souvent subdivise en catgories, selon le paradigme4 particulier des langages.

    Les langages de quatrime gnration, abrgs L4G, souvent associe des bases de donnes, se situent un niveau au-dessus, en intgrant la gestion de l'interface utilisateur5 et en proposant un langage moins technique, plus proche de la syntaxe naturelle.

    Ils sont conus pour un travail spcifique : gestion de base de donnes (Microsoft Access, SQL), production graphique (Postscript), cration d'interface (4D).

    La cinquime gnration de langages sont des langages destins rsoudre des problmes l'aide de contraintes, et non d'algorithmes crits. Ces langages reposent beaucoup sur la logique et sont particulirement utiliss en intelligence artificielle. Parmi les plus connus, on trouve Prolog, dont voici un exemple :

    frre_ou_soeur(X,Y) :- parent(Z,X), parent(Z,Y), X \= Y.parent(X,Y) :- pre(X,Y).parent(X,Y) :- mre(X,Y).mre(trude, sally).pre(tom, sally).pre(tom, erica).pre(mike, tom).

    Il en rsulte que la demande suivante est value comme vraie :

    ?- frre_ou_soeur(sally, erica). oui.

    Ce qui signifie que Sally et Erica sont surs. En effet, Sally et Erica ont le mme pre (Tom).

    1 Pour s'initier l'assembleur : www.commentcamarche.net/contents/asm/assembleur.php3

    2 En pratique, un compilateur sert le plus souvent traduire un code source crit dans un langage de programmation en un autre langage, habituellement un langage assembleur ou un langage machine. Le premier compilateur, A-0 System, a t crit en 1951 par Grace Hopper.

    3 En informatique, la portabilit d'un programme est caractrise par sa capacit fonctionner plus ou moins facilement dans diffrents environnements d'excution

    4 Voir paragraphe 6.5

    5 L'interface utilisateur dfinit les moyens et outils mis en uvre pour qu'un humain puisse contrler et communiquer avec une machine.

    Didier Mller 6-2 novembre 2014

  • L'informatique au lyce Chapitre 6

    Il existe environ 2500 langages de programmation, certains tant trs gnraux (C, Java), d'autres hyper-spcialiss.Par exemple, RobotProg permet de dplacer un robot virtuel, R est un langage pour la statistique, etc.

    Par comparaison, on recense environ 6800 langues humaines parles et/ou crites de par le monde.

    6.1.2. Quelques langages courants

    Source de ce schma : [1]

    Le nom Ada a t choisi en l'honneur d'Ada Lovelace, qui est suppose avoir crit le premier programme de l'histoire.La premire version d'Ada remonte 1983.

    6.1.3. Hello world ! C'est dans un memorandum interne de Brian Kernighan, Programming in C : A tutorial, crit en

    1974 dans les laboratoires Bell, que l'on trouve la premire version d'un mini-programme affichant l'cran Hello World! . Voici comment cela s'crit dans divers langages6 :

    Adawith Ada.Text_IO; use Ada.Text_IO; procedure Bonjour is begin -- Bonjour Put("Hello world!"); end Bonjour;

    6 Une liste plus complte est disponible sur Wikipdia : http://fr.wikipedia.org/wiki/Hello_world

    Didier Mller 6-3 novembre 2014

  • Programmation et langages

    BASIC est un acronyme pour Beginner's All-purpose Symbolic Instruction Code.Il a t conu la base en 1963 par John George Kemeny et Thomas Eugene Kurtz.

    Invent au dbut des annes 1970 avec UNIX, C est devenu un des langages les plus utiliss.

    Bjarne Stroustrup a dvelopp C++ au cours des annes 1980. Il s'agissait d'amliorer le langage C.

    Fortran (FORmula TRANslator) est utilis dans les applications de calcul scientifique.

    Java a t cr par Sun Microsystems, et prsent officiellement le 23 mai 1995.

    JavaScript est un langage de programmation de scripts utilis dans les pages web interactives .

    Assembleur X86 sous DOScseg segment assume cs:cseg, ds:cseg org 100h main proc jmp debut mess db 'Hello world!$' debut: mov dx, offset mess mov ah, 9 int 21h ret main endp cseg ends end main

    BASIC10 PRINT "Hello world!"20 END

    C#include int main()/* ou int argc, char *argv[] */{ printf("Hello world!\n"); return 0;}

    C++#include int main(){ std::cout

  • L'informatique au lyce Chapitre 6

    6.2. La machine de TuringUne machine de Turing est une machine thorique, invente par Alan Turing en 1936, pour

    servir de modle idal lors d'un calcul mathmatique. Ce modle est toujours largement utilis en informatique thorique, en particulier pour rsoudre les problmes de complexit algorithmique et de calculabilit.

    Turing Machine par Tom DunneAmerican Scientist, Mars-Avril 2002

    Une machine de Turing se compose des lments suivants :

    Un ruban divis en cases adjacentes. Chaque case contient un symbole parmi un alphabet fini. L'alphabet contient un symbole spcial blanc et un ou plusieurs autres symboles. Le ruban est de longueur infinie vers la gauche ou vers la droite (en d'autres termes, la machine doit toujours avoir assez de longueur de ruban pour son excution). On considre que les cases non encore crites du ruban contiennent le symbole blanc .

    Une tte de lecture/criture qui peut lire et crire les symboles sur le ruban, et se dplacer vers la gauche ou vers la droite du ruban.

    Un registre d'tat qui mmorise l'tat courant de la machine de Turing. Le nombre d'tats possibles est toujours fini, et il existe un tat spcial appel tat de dpart qui est l'tat initial de la machine avant son excution.

    Une table d'actions qui indique la machine quel symbole crire, comment dplacer la tte de lecture ( G pour une case vers la gauche, D pour une case vers la droite), et quel est le nouvel tat, en fonction du symbole lu sur le ruban et de l'tat courant de la machine. Si aucune action n'existe pour une combinaison donne d'un symbole lu et d'un tat courant, la machine s'arrte.

    Les machines de Turing sont une abstraction des ordinateurs :

    Le ruban reprsente la mmoire de l'ordinateur. Ceci comprend la mmoire centrale ainsi que les mmoires externes telles les disques durs. Contrairement un ordinateur, la mmoire d'une machine de Turing est infinie.

    La tte de lecture/criture reprsente le bus qui relie le microprocesseur la mmoire. Une autre diffrence entre une machine de Turing et un ordinateur est que l'ordinateur peut accder la mmoire de manire directe, alors que la tte de lecture de la machine de Turing ne se dplace que d'une position la fois.

    Le registre d'tats et la table d'actions reprsentent le microprocesseur. Le nombre d'tats est fini comme dans la ralit.

    Didier Mller 6-5 novembre 2014

  • Programmation et langages

    ExempleLa machine de Turing qui suit possde un alphabet {0, 1}, 0 tant le blanc . On suppose que le

    ruban contient une srie de 1, et que la tte de lecture/criture se trouve initialement au-dessus du 1 le plus gauche. Cette machine a pour effet de doubler le nombre de 1, en intercalant un 0 entre les deux sries. Par exemple, 111 deviendra 1110111 . L'ensemble d'tats possibles de la machine est {e1, e2, e3, e4, e5} et l'tat initial est e1. La table d'actions est la suivante :

    tat courant Symbole lu Symbole crit Mouvement Nouvel tat

    e10 (Arrt)

    1 0 Droite e2

    e21 1 Droite e2

    0 0 Droite e3

    e31 1 Droite e3

    0 1 Gauche e4

    e41 1 Gauche e4

    0 0 Gauche e5

    e51 1 Gauche e5

    0 1 Droite e1

    L'excution de cette machine pourrait tre par exemple (la position de la tte de lecture/criture sur le ruban est inscrite en caractres gras et rouges) :

    tape tat Ruban1 e1 112 e2 013 e2 0104 e3 01005 e4 01016 e5 01017 e5 01018 e1 11019 e2 100110 e3 100111 e3 1001012 e4 1001113 e4 1001114 e5 1001115 e1 1101116 (Arrt)

    Le comportement de cette machine peut tre dcrit comme une boucle : Elle dmarre son excution dans l'tat e1, remplace le premier 1 par un 0. Puis elle utilise l'tat e2 pour se dplacer vers la droite, en sautant les 1, et le premier 0

    qu'elle rencontre. L'tat e3 est alors utilis pour sauter la squence suivante de 1 (initialement aucun) et

    Didier Mller 6-6 novembre 2014

  • L'informatique au lyce Chapitre 6

    remplacer le premier 0 rencontr par un 1. e4 permet de revenir vers la gauche jusqu' trouver un 0, et passer dans l'tat e5. e5 permet ensuite nouveau de se dplacer vers la gauche jusqu' trouver un 0, crit au

    dpart par l'tat e1. La machine remplace alors ce 0 par un 1, se dplace d'une case vers la droite et passe

    nouveau dans l'tat e1 pour une nouvelle itration de la boucle. Ce processus se rpte jusqu' ce que e1 tombe sur un 0 (c'est le 0 du milieu entre les deux

    squences de 1) ; ce moment, la machine s'arrte.

    Exercice 6.1Exercice 6.1Construisez les machines de Turing suivantes :1. Une machine qui crit 0 1 0 1 0 1 0 ... sur un ruban blanc. 2. Une machine qui multiplie par 2 son entre binaire crite sur le ruban.3. Une machine qui ajoute 1 son entre binaire crite sur le ruban.

    Pour les questions 2 et 3, on suppose que la tte de lecture/criture est positionne sur le symbole le plus gauche.

    6.3. Pseudo-codeEn programmation, le pseudo-code est une faon de dcrire un algorithme en respectant certaines

    conventions, mais sans rfrence un langage de programmation en particulier. L'criture en pseudo-code permet de dvelopper une dmarche structure, en oubliant temporairement la syntaxe rigide d'un langage de programmation.

    6.3.1. ConventionsIl n'existe pas de convention universelle pour le pseudo-code. Afin de bien se comprendre dans la

    suite de ce cours, nous adopterons celle dcrite ci-dessous.

    Nom de l'algorithmePar exemple : Calcul de la date de Pques

    Donnes d'entresPar exemple : Anne > 1582

    Rsultat en sortiePar exemple : Date de Pques pour l'anne donne

    Bloc tant que :TANT QUE condition FAIRE instruction ...FIN TANT QUE

    Bloc rpter jusqu' :REPETER instruction ...JUSQU'A condition

    Bloc pour :POUR i ALLANT DE d f FAIRE instruction ...FIN POUR

    Didier Mller 6-7 novembre 2014

  • Programmation et langages

    Bloc si :SI condition ALORS instruction-si-vrai ...SINON instruction-si-faux ...FIN SI

    Tableau : A[i] : l'lment de rang i dans le tableau A, on suppose les tableaux numrots partir de 0.

    Tableau multidimensionnel A[i,j] : lment en ligne i et en colonne j du tableau A.

    Chaine de caractres : "string" (entre guillemets)

    Affectation :a := 10

    Fonction :FONCTION nom(paramtres) instruction ... RETOURNER rsultat

    Procdure :PROCEDURE nom(paramtres) instruction ... rsultat

    6.3.2. En pratique Le pseudo-code doit tre suffisamment prcis pour que quelqu'un d'autre l'ayant lu sans

    connatre l'algorithme soit capable de le coder. L'objectif est d'avoir le pseudo-code le plus simple possible, afin de le coder facilement et

    sans bug. Le pseudo-code d'un petit algorithme prend en gnral une douzaine de lignes. Pour un problme plus complexe, il faut compter jusqu' 20 ou 25 lignes.

    Prvoyez assez de place pour faire tenir tout le pseudo-code sur une mme page. Lorsqu'on commence crire le pseudo-code, on ne sait pas encore prcisment ce qui va

    venir ensuite. Il est judicieux de laisser des lignes blanches rgulirement pour pouvoir ajouter des choses ensuite tout en gardant quelque chose de propre.

    Pour rendre compte visuellement des imbrications des boucles, indentez vers la droite le corps des boucles et des fonctions. Sur le papier, on peut ajouter de grandes barres verticales pour faire ressortir encore plus les diffrents blocs d'instructions.

    6.3.3. Exemple de pseudo-codeAlgorithme : Tri d'une liste de nombresDonne : Tableau A de n nombresRsultat : Tableau A de n nombres tris par ordre croissant

    Didier Mller 6-8 novembre 2014

  • L'informatique au lyce Chapitre 6

    permut := 1TANT QUE permut = 1 FAIRE permut := 0 POUR i ALLANT DE 0 n-2 FAIRE SI A[i] > A[i+1] ALORS echanger A[i] et A[i+1] permut := 1 FIN SI FIN POURFIN TANT QUE

    6.4. Transformation du code sourceLe code source n'est (presque) jamais utilisable tel quel. Il est gnralement crit dans un langage

    de haut niveau , comprhensible pour l'homme, mais pas pour la machine. Il existe deux stratgies de traduction, ces deux stratgies tant parfois disponibles au sein du mme langage.

    Le langage traduit les instructions au fur et mesure qu'elles se prsentent. Cela s'appelle la compilation la vole, ou l'interprtation.

    Le langage commence par traduire l'ensemble du programme en langage machine, constituant ainsi un deuxime programme (un deuxime fichier) distinct physiquement et logiquement du premier. Ensuite, et ensuite seulement, il excute ce second programme. Cela s'appelle la compilation.

    6.4.1. CompilationCertains langages sont compils . En toute gnralit, la compilation est l'opration qui

    consiste transformer un langage source en un langage cible. Dans le cas d'un programme, le compilateur va transformer tout le texte reprsentant le code source du programme, en code comprhensible pour la machine, appel code machine.

    Dans le cas de langages compils, ce qui est excut est le rsultat de la compilation. Une fois effectue, l'excutable obtenu peut tre utilis sans le code source.

    6.4.2. InterprtationD'autres langages ne ncessitent pas de phase spciale de compilation. La mthode employe

    pour excuter le programme est alors diffrente. Le programme entier n'est jamais compil. Chaque ligne de code est compile en temps rel par un programme. On dit de ce programme qu'il interprte le code source. Par exemple, Python est un langage interprt.

    Cependant, ce serait faux de dire que la compilation n'intervient pas. L'interprte produit le code machine, au fur et mesure de l'excution du programme, en compilant chaque ligne du code source.

    6.4.3. Avantages, inconvnientsLes avantages gnralement retenus pour l'utilisation de langages compils , est qu'ils sont

    plus rapides l'excution que des langages interprts, car l'interprte doit tre lanc chaque excution du programme, ce qui mobilise systmatiquement les ressources.

    Les langages interprts offrent en revanche une certaine portabilit, ainsi qu'une facilit pour l'criture du code. En effet, il n'est pas ncessaire de passer par la phase de compilation pour tester le code source.

    Didier Mller 6-9 novembre 2014

  • Programmation et langages

    6.5. ParadigmesEn informatique, un paradigme est une une faon de programmer, un modle qui oriente notre

    manire de penser pour formuler et rsoudre un problme.Certains langages sont conus pour supporter un paradigme en particulier (Smalltalk et Java

    supportent la programmation oriente objet, tandis que Haskell est conu pour la programmation fonctionnelle), alors que d'autres supportent des paradigmes multiples ( l'image de C++, Common Lisp, OCaml, Python, Ruby ou Scheme).

    6.5.1. Programmation imprativeC'est le paradigme le plus ancien. Les recettes de cuisine et les itinraires routiers sont deux

    exemples familiers qui s'apparentent de la programmation imprative. La grande majorit des langages de programmation sont impratifs. Les oprations sont dcrites en termes de squences d'instructions excutes par l'ordinateur pour modifier l'tat du programme.

    Niklaus Wirth

    Edsger Wybe Dijkstra

    6.5.2. Programmation structure (ou procdurale)La programmation structure constitue un sous-ensemble de la programmation imprative. C'est

    un paradigme important de la programmation, apparu vers 1970. Elle drive de travaux de Niklaus Wirth pour son Algol W et reut son coup d'envoi avec l'article fondateur de Dijkstra dans Communications of the ACM intitul GO TO statement considered harmful.

    Elle est en effet clbre pour son essai de suppression de l'instruction GOTO ou du moins pour la limitation de son usage.

    La programmation structure est possible dans n'importe quel langage de programmation procdural, mais certains, comme le Fortran IV, s'y prtaient trs mal. Vers 1970, la programmation structure devint une technique populaire, et les langages de programmation procduraux intgrrent des mcanismes rendant aise la programmation structure. Parmi les langages de programmation les plus structurants, on trouve PL/I, Pascal et, plus tardivement pour les projets de trs grande taille, Ada.

    ExempleDans certains langages anciens comme le BASIC, les lignes de programmation portent des

    numros, et les lignes sont excutes par la machine dans l'ordre de ces numros. Dans tous ces langages, il existe une instruction de branchement, note aller en pseudo-code, instruction qui envoie directement le programme la ligne spcifie. Inversement, ce type de langage ne comporte pas d'instructions comme Fin Tant Que , ou Fin Si , qui ferment un bloc.

    Prenons l'exemple d'une structure Si Alors Sinon

    Programmation StructureSi condition Alors instructions 1Sinon instructions 2FinSi

    Programmation non structure1000 Si condition Alors Aller En 12001100 instruction 21110 etc.1120 etc.1190 Aller en 14001200 instruction 11210 etc.1220 etc.1400 suite de l'algorithme

    Les programmeurs dcomposent leur code en procdures ne dpassant gure 50 lignes, afin d'avoir le programme en entier sous leurs yeux.

    Une procdure, aussi appele routine, sous-routine, module ou fonction, contient une srie d'tapes raliser. N'importe quelle procdure peut tre appele n'importe quelle tape de l'excution du programme, incluant d'autres procdures, voire la procdure elle-mme (rcursivit).

    Didier Mller 6-10 novembre 2014

  • L'informatique au lyce Chapitre 6

    Il n'y a que des avantages dcouper un programme en procdures : on a la possibilit de rutiliser le mme code diffrents emplacements dans le programme

    sans avoir le retaper ; il est plus simple de suivre l'volution du programme (la programmation procdurale permet

    de se passer d'instructions GOTO ) ; on cre un code plus modulaire et structur ; chaque programmeur peut dvelopper son bout de code de son ct.

    6.5.3. Programmation oriente objetLa programmation oriente objet (POO) ou programmation par objet, est un paradigme de

    programmation informatique qui consiste en la dfinition et l'assemblage de briques logicielles appeles objets. Un objet reprsente un concept, une ide ou toute entit du monde physique, comme une voiture, une personne ou encore une page d'un livre. Le langage Simula-67 jette les prmisses de la programmation objet, rsultat des travaux sur la mise au point de langages de simulation informatique dans les annes 1960 dont s'inspira aussi la recherche sur l'intelligence artificielle dans les annes 1970-80. Mais c'est rellement par et avec Smalltalk 72 puis Smalltalk 80, inspir en partie par Simula, que la programmation par objets dbute et que sont poss les concepts de base de celle-ci : objet, messages, encapsulation, polymorphisme, hritage, etc.

    partir des annes 1980, commence l'effervescence des langages objets : Objective C (dbut des annes 1980), C++ (C with classes) en 1983, Eiffel en 1984, Common Lisp Object System dans les annes 1980, etc. Les annes 1990 voient l'ge d'or de l'extension de la programmation par objet dans les diffrents secteurs du dveloppement logiciel.

    Quelques langages objets : Ada, Java, C#, Objective C, Eiffel, Python, C++, PHP, Smalltalk...

    6.5.4. Programmation fonctionnelleLa programmation fonctionnelle est un paradigme de programmation qui considre le calcul en

    tant qu'valuation de fonctions mathmatiques et rejette le changement d'tat et la mutation des donnes. Elle souligne l'application des fonctions, contrairement au modle de programmation imprative qui met en avant les changements d'tat.

    Le langage fonctionnel le plus ancien est Lisp, cr en 1958 par McCarthy. Lisp a donn naissance des variantes telles que Scheme (1975) et Common Lisp (1984). Haskell (1987) est aussi un langage paradigme fonctionnel. La programmation fonctionnelle s'affranchit de faon radicale des effets secondaires en interdisant toute opration d'affectation.

    Le paradigme fonctionnel n'utilise pas de machine d'tats pour dcrire un programme, mais un embotement de botes noires que l'on peut imbriquer les unes dans les autres. Chaque bote possdant plusieurs paramtres en entre mais une seule sortie, elle ne peut sortir qu'une seule valeur possible pour chaque n-uplet de valeurs prsentes en entre. Ainsi, les fonctions n'introduisent pas d'effets de bord. Un programme est donc une application, au sens mathmatique, qui ne donne qu'un seul rsultat pour chaque ensemble de valeurs en entre. Cette faon de penser, qui est trs diffrente de la pense habituelle en programmation imprative, est l'une des causes principales de la difficult qu'ont les programmeurs forms aux langages impratifs pour aborder la programmation fonctionnelle. Cependant, elle ne pose gnralement pas de difficults particulires aux dbutants qui n'ont jamais t exposs des langages impratifs.

    Exercice 6.2Exercice 6.2Expliquez cette description de Python, tire de Wikipdia :

    Python est un langage de programmation interprt multi-paradigme. Il favorise la programmation imprative structure, et oriente objet.

    Didier Mller 6-11 novembre 2014

  • Programmation et langages

    6.6. Les notions principales de la programmationLa plupart des langages de programmation ont des caractristiques communes que nous allons

    passer rapidement en revue ici.

    6.6.1. L'affectationUne affectation est une opration qui permet d'attribuer une valeur une variable. Pour expliquer

    ce qui se passe lors d'une affectation, il faut imaginer qu'il existe, dans un recoin de l'ordinateur, une case mmoire appele x. L'instruction x=t consiste remplir la case x avec la valeur de l'expression t. Si x contenait dj une valeur, celle-ci est crase.Exemples

    Aprs l'affectation x=3, la variable x contiendra la valeur 3.Aprs y=4+x, la variable y contiendra la valeur 7.

    Affectation et comparaisonIl ne faut pas confondre l'affectation avec la comparaison. Par exemple, la comparaison x==3

    permet de savoir si oui ou non la valeur de la variable x est 3. Dans la plupart des langages, on diffrencie ces deux oprations. En Python, l'affectation est exprime par un = , tandis que la comparaison est exprime par == . D'autres langages (Pascal par exemple) utilisent respectivement les oprateurs := et = .

    Incrmentation / dcrmentationIl arrive frquemment que l'on doive incrmenter (ou dcrmenter) une variable, c'est--dire

    augmenter (ou diminuer) sa valeur d'une ou plusieurs units. Dans ce cas, on peut utiliser l'instruction x=x+17. Voici ce qui se passe : on prend la valeur contenue dans x, on y ajoute 1, puis on remet le nouveau rsultat dans la variable x.

    L'instruction x=x+1 est tellement frquente qu'il existe souvent des raccourcis : x+=1 (Python) ou x++ (C, Mathematica).

    6.6.2. Les testsUn test est une instruction du genre si...alors...sinon. La suite du programme dpendra du rsultat

    du test.

    SI Test 1 ALORS Instruction 1SINON Instruction 2FIN SIInstruction 3

    Par exemple, en Python, on aura :

    if x>=10: x=x-20else: x=x+2

    7 Remarquez bien que cette expression n'a mathmatiquement aucun sens

    Didier Mller 6-12 novembre 2014

  • L'informatique au lyce Chapitre 6

    Le mme test en Java serait :

    if (x>=10) x=x-20 else x=x+2

    On peut enchaner autant d'instructions sinon si que l'on veut : seule la premire dont la condition sera vrifie sera excute. On peut gnralement associer une clause sinon qui ne sera excute que si aucune clause sinon si n'a t vrifie.

    SI Test 1 ALORS Instruction 1SINON SI Test 2 ALORS Instruction 2FIN SIInstruction 3

    Par exemple, en Python 3 :

    if x==0: print("x est nul")elif x

  • Programmation et langages

    heure 0 minute, 1 heure 1 minute, ... On voit qu'une premire boucle parcourra les heures, tandis que la deuxime parcourra les minutes, et que l'on incrmentera l'heure seulement quand 60 minutes seront passes. Voil ce que cela donnera en Python 3 :

    h=0while h

  • L'informatique au lyce Chapitre 6

    En Pascal :

    for i := depart to fin do instruction;

    En C :

    ItrateurUn itrateur est un objet qui permet de raliser une boucle parcourant tous les lments contenus

    dans une structure de donnes (par exemple une liste).

    POUR CHAQUE valeur DANS collection Instruction 1FIN POUR CHAQUEInstruction 2

    Exemple en Python :

    for animal in ["chat", "chien", "poule"] : print(animal)

    6.6.4. Les sous-programmesUn sous-programme est un ensemble d'instructions pouvant tre appel depuis plusieurs endroits

    du programme. Les sous-programmes sont utiliss pour amliorer la structure du programme et sa lisibilit. Ces constructions ajoutent la notion de passage de paramtres et aussi la notion de variables locales qui vite que le sous-programme ait un effet de bord sur la routine appelante.

    Une fonction peut d'une part effectuer une action (par exemple afficher un rsultat), et d'autre part retourner une valeur. Une fonction qui ne renvoie pas de valeur est appele une procdure.

    Porte d'une variableEn Python, une variable dfinie au moment o elle est affecte d'une valeur. Une variable dfinie

    dans le programme principal est visible de l'intrieur des fonctions, mais une variable dfinie dans une fonction n'est pas visible de l'extrieur ( moins d'utiliser l'instruction global). Deux variables peuvent donc avoir le mme nom mais tre diffrentes selon l'endroit o elles sont dfinies.

    Dans une fonction, Python utilise une variable dfinie localement. S'il elle n'est pas dfinie localement, Python recherche la variable au niveau global, mais dans ce cas, il n'est pas possible de modifier la variable globale.

    Prenons un exemple en Python :def ecrire(): n = 3 print(n,end=' ')

    n=5ecrire()print(n)

    Didier Mller 6-15 novembre 2014

  • Programmation et langages

    Tous ces exemples sont trs mauvais du point de vue de la lisibilit. Il faut viter d'crire des programmes pareils ! Ils sont juste l pour prciser le concept de porte d'une variable.

    Ce programme crira 3 5. On voit bien que les deux n sont des variables diffrentes, puisque l'instruction n=3 n'a pas modifi la valeur de l'autre n. Le n de la deuxime ligne est une variable locale la procdure ecrire, tandis que celui de la cinquime ligne est une variable locale.

    Modifions lgrement ce programme :def ecrire(): n += 3 print(n,end=' ')

    n=5ecrire()print(n)

    Ce programme produira une erreur, car le n local dans la procdure crire n'a pas t initialis. Pour finir avec cet exemple, le programme ci-dessous donnera comme rsultat 3 3. La ligne

    global n signale que n est la variable globale initialise dans le programme principal. Il ne s'agit donc plus d'une variable locale. Il n'y a l plus qu'une seule variable n.

    def ecrire(): global n n = 3 print(n,end=' ')

    n=5ecrire()print(n)

    Passage de paramtresOn peut passer des paramtres une procdure ou une fonction sous forme d'une liste de

    paramtres formels entre parenthses. A l'intrieur du corps de la procdure, les paramtres sont des variables locales.

    Il ne faut pas redclarer le nom des paramtres dans la section des dclarations locales. Voici un exemple en Pascal8, qui calcule xn (navement) :

    var n : integer;

    function puissance(x:real; n:integer) : real;var p:real;begin p:=1; while n>0 do begin p:=p*x; n:=n-1 end; puissance:=p end;

    begin n:=3; writeln('Pi au cube =',puissance(3.14159,n)); writeln(n) (*la valeur de n n'a pas t modifie*)end.

    C'est la valeur du paramtre qui est pass la procdure. Si la valeur est modifie l'intrieur de la procdure, la modification n'est pas rpercute la sortie de la procdure. On appelle ce type de passage de paramtre un passage par valeur.

    8 En Pascal, toutes les variables doivent tre dclares, ce qui n'est pas le cas en Python, o les variables viennent au monde en se voyant assigner une valeur et sont automatiquement dtruites lorsqu'elles se retrouvent hors de porte.

    Didier Mller 6-16 novembre 2014

  • L'informatique au lyce Chapitre 6

    Remarquez bien le mot-clef var entre les parenthses qui fait toute la diffrence.

    Dans certains langages, il est possible de passer des variables comme paramtres. On appelle cela un passage par variable ou passage par rfrence. Toute modification du paramtre dans la fonction appele entrane alors la modification de la variable passe en paramtre.

    Voici un autre programme en Pascal, qui change les valeurs de deux variables :

    var x,y : real;

    procedure echanger(var a,b:real)var aux:real;begin aux:=a; a:=b; b:=auxend;

    begin x:=3; y:=4; echanger(x,y); writeln(' x=',x, ', y=',y)end.

    Ce programme crira x=4, y=3.Puisque la procdure attend des variables en paramtres, on ne peut pas appeler echanger avec

    des valeurs (echanger(3,4) est interdit, car 3 et 4 ne sont pas des variables : on ne peut pas les modifier).

    En Python, le passage des paramtres se fait toujours par rfrence, MAIS certains types sont immutables , c'est--dire non modifiables. Les rgles sont les suivantes :

    si un paramtre transmis une fonction est une valeur immutable (les nombres et les chanes de caractres), la fonction n'aura aucun moyen de modifier l'original. La valeur de dpart est conserve ;

    si un paramtre est une valeur mutable (les listes par exemple), la fonction pourra modifier l'original, et avoir ainsi un effet de bord9 (dsir ou non).

    Prenons un exemple (vicieux) :

    def ecrire(x): x=5 print(x,end=' ')

    x=0ecrire(x)print(x)

    Le rsultat sera 5 0, alors que l'on s'attendait plutt 5 5. Cela vient du fait que le type entier est immutable.

    Par contre :

    def ecrire(x): x[0]=5 # on modifie le 1er lment de la liste x print(x[0],end=' ')

    x=[0,1,2,3,4]ecrire(x)print(x[0])

    produira 5 5, car une liste est mutable. D'une manire gnrale, il vaut mieux viter les effets de bords, afin d'avoir un programme plus lisible.

    9 En informatique, une fonction est dite effet de bord si elle modifie un tat autre que sa valeur de retour.

    Didier Mller 6-17 novembre 2014

  • Programmation et langages

    Sources[1] Pixel, Diagram and history of programming languages ,

    [2] Wikipdia, Langages de programmation ,

    [3] Wikipdia, Programmation informatique ,

    [4] Wikipdia, Machine de Turing ,

    [5] Wikipdia, Paradigme (programmation) ,

    [6] Wikipdia, Machine de Turing ,

    Didier Mller 6-18 novembre 2014