Vous êtes sur la page 1sur 18

L'informatique au lyce

Chapitre 6

http://ow.ly/2xxkI

Chapitre 6
Programmation 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'histoire


En 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 informatiques


On 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 utilisateur 5 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

6.1.2. Quelques langages courants

Il existe environ
2500 langages de
programmation,
certains tant trs
gnraux (C, Java),
d'autres hyperspcialiss.
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.

Source de ce schma : [1]

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 :
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

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

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

Didier Mller

6-3

novembre 2014

Programmation et langages

Assembleur X86 sous DOS

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

cseg 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

BASIC
10 PRINT "Hello world!"
20 END

C
#include <stdio.h>

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

int main()/* ou int argc, char *argv[] */


{
printf("Hello world!\n");
return 0;
}

C++
#include <iostream>

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 .

int main()
{
std::cout << "Hello world!" << std::endl;
return 0;
}

FORTRAN 77
PROGRAM BONJOUR
WRITE (*,*) 'Hello world!'
END

Java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}

Javascript
document.write("Hello world!");

Python 1 et 2
print "Hello world!"

Python 3
print("Hello world!")

Didier Mller

6-4

novembre 2014

L'informatique au lyce

Chapitre 6

6.2. La machine de Turing


Une 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 Dunne


American 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 :

Didier Mller

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.

6-5

novembre 2014

Programmation et langages

Exemple
La 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
e1
e2
e3
e4
e5

Symbole lu

Symbole crit

Mouvement

Nouvel tat

(Arrt)

Droite

e2

Droite

e2

Droite

e3

Droite

e3

Gauche

e4

Gauche

e4

Gauche

e5

Gauche

e5

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

Ruban

e1

11

e2

01

e2

010

e3

0100

e4

0101

e5

0101

e5

0101

e1

1101

e2

1001

10

e3

1001

11

e3

10010

12

e4

10011

13

e4

10011

14

e5

10011

15

e1

16

11011
(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.1
Construisez 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-code
En 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 pseudocode permet de dvelopper une dmarche structure, en oubliant temporairement la syntaxe
rigide d'un langage de programmation.

6.3.1. Conventions
Il 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'algorithme
Par exemple : Calcul de la date de Pques

Donnes d'entres
Par exemple : Anne > 1582

Rsultat en sortie
Par 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-code


Algorithme : Tri d'une liste de nombres
Donne : Tableau A de n nombres
Rsultat : Tableau A de n nombres tris par ordre croissant

Didier Mller

6-8

novembre 2014

L'informatique au lyce

Chapitre 6

permut := 1
TANT 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 POUR
FIN TANT QUE

6.4. Transformation du code source


Le 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. Compilation
Certains 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. Interprtation
D'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, inconvnients


Les 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. Paradigmes
En 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 imprative


C'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.

6.5.2. Programmation structure (ou procdurale)

Niklaus Wirth

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.

Exemple
Edsger Wybe
Dijkstra

Dans 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 Structure

Programmation non structure

Si condition Alors
instructions 1
Sinon
instructions 2
FinSi

1000
1100
1110
1120
1190
1200
1210
1220
1400

Si condition Alors Aller En 1200


instruction 2
etc.
etc.
Aller en 1400
instruction 1
etc.
etc.
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 objet


La 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 fonctionnelle


La 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.2
Expliquez 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 programmation


La plupart des langages de programmation ont des caractristiques communes que nous allons
passer rapidement en revue ici.

6.6.1. L'affectation
Une 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 comparaison
Il 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 / dcrmentation
Il 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 tests


Un test est une instruction du genre si...alors...sinon. La suite du programme dpendra du rsultat
du test.
SI Test 1 ALORS
Instruction 1
SINON
Instruction 2
FIN SI
Instruction 3

Par exemple, en Python, on aura :


if x>=10:
x=x-20
else:
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 1
SINON SI Test 2 ALORS
Instruction 2
FIN SI
Instruction 3

Par exemple, en Python 3 :


if x==0:
print("x est nul")
elif x<0:
print("x est ngatif")
else:
print("x est positif")

6.6.3. Les boucles


Une boucle est une structure de contrle permettant de rpter une ou un ensemble d'instructions
plusieurs fois, tant qu'une condition est satisfaite.

Boucle Tant que


TANT QUE Test
Instruction 1
FIN TANT QUE
Instruction 2

Par exemple, en Python 3, ce programme crira tous les entiers de 0 9 :


x=0
while x<10:
print(x)
x+=1

Le grand danger est ce qu'on appelle des boucles infinies, c'est--dire des boucles qui ne finissent
jamais. Cela arrive quand la condition est toujours satisfaite, typiquement quand on oublie
d'incrmenter un compteur. Voici une boucle qui crira une infinit de 0, car on a oubli
d'incrmenter x :
x=0
while x<10:
print(x)

Boucles imbriques
Il est tout fait possible, et parfois ncessaire, d'imbriquer une boucle dans une autre boucle. Par
exemple, imaginons que l'on veuille crire toutes les heures et minutes d'une journe. Cela
commencera par 0 heure 0 minute, 0 heure 1 minute, 0 heure 2 minutes, ..., 0 heure 59 minutes, 1

Didier Mller

6-13

novembre 2014

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=0
while h<24:
m=0
while m<60:
print(h,"heure(s) ",m,"minute(s)")
m+=1
h+=1

Si l'on veut ajouter les secondes, on imbriquera une troisime boucle :


h=0
while h<24:
m=0
while m<60:
s=0
while s<60:
print(h,"heure(s) ",m,"minute(s)",s,"seconde(s)")
s+=1
m+=1
h+=1

Exercice 6.3
crivez en Python un programme qui imprimera les tables de multiplication de 1 10.

Boucle Jusqu' ce que


Contrairement un boucle Tant que , une boucle Jusqu' ce que excute au moins une fois
les instructions comprises dans la boucles.
REPETER
Instruction 1
JUSQU'A CE QUE condition
Instruction 2

Ce type de boucle n'existe pas en Python, mais on le trouve en Pascal :


x=0;
repeat
x=x+1;
print(x)
until x=10;

Compteur
Un compteur permet de raliser une boucle associe une variable entire qui sera incrmente
(ou dcrmente) chaque itration.
POUR compteur DE 0 A fin
Instruction 1
FIN POUR
Instruction 2

En BASIC :
FOR i = depart TO fin instruction NEXT i

Didier Mller

6-14

novembre 2014

L'informatique au lyce

Chapitre 6

En Pascal :
for i := depart to fin do instruction;

En C :

Itrateur
Un 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 1
FIN POUR CHAQUE
Instruction 2

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

6.6.4. Les sous-programmes


Un 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 variable


En 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=5
ecrire()
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=5
ecrire()
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=5
ecrire()
print(n)

Passage de paramtres
On 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

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;
Remarquez bien le
mot-clef var entre
les parenthses qui
fait toute la
diffrence.

procedure echanger(var a,b:real)


var aux:real;
begin
aux:=a; a:=b; b:=aux
end;
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=0
ecrire(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.

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 ,
<http://merd.sourceforge.net/pixel/language-study/diagram.html>
[2] Wikipdia, Langages de programmation ,
<http://fr.wikipedia.org/wiki/Langage_de_programmation>
[3] Wikipdia, Programmation informatique , <http://fr.wikipedia.org/wiki/Programmation>
[4] Wikipdia, Machine de Turing , <http://fr.wikipedia.org/wiki/Machine_de_Turing>
[5] Wikipdia, Paradigme (programmation) ,
<http://fr.wikipedia.org/wiki/Paradigme_(programmation)>
[6] Wikipdia, Machine de Turing , <http://fr.wikipedia.org/wiki/Machine_de_Turing>

Didier Mller

6-18

novembre 2014

Vous aimerez peut-être aussi