Langages et programmation
Cours · NSI (première), chapitre 3 · première, spécialité numérique et sciences informatiques · le début du chapitre, la suite sur Adloun
Les deux premiers chapitres ont montré comment une machine représente l'information. Celui-ci change d'objet : il ne parle plus de ce que la machine stocke mais de ce qu'on lui dit de faire, et de la façon de s'assurer qu'elle le fait vraiment.
Sa place dans ce livre est délibérée. Il précède les types construits et l'algorithmique, alors que le programme le range plus loin, parce que ses trois gestes — spécifier une fonction avant de l'écrire, décrire ce qu'elle exige et ce qu'elle garantit, la soumettre à un jeu de tests — servent dans tous les chapitres suivants. Les apprendre après coup, c'est prendre l'habitude d'écrire d'abord et de vérifier ensuite ; c'est précisément l'habitude que cet enseignement cherche à défaire.
3.1 Le corpus des constructions élémentaires
Capacité attendue
« Mettre en évidence un corpus de constructions élémentaires. »
Il existe des centaines de langages de programmation. Le fait remarquable est qu'on peut écrire n'importe quel programme avec une poignée de constructions, présentes dans presque tous.
- La séquence : exécuter une instruction, puis la suivante, dans l'ordre.
- L'affectation : donner une valeur à une variable.
- La conditionnelle : exécuter des instructions selon qu'une condition est vraie ou fausse.
- La boucle bornée : répéter un nombre de fois connu à l'avance.
- La boucle non bornée : répéter tant qu'une condition reste vraie, sans savoir combien de fois.
- L'appel de fonction : déclencher l'exécution d'un bloc nommé, éventuellement avec des arguments, et récupérer son résultat.
n = 7 # affectation
total = 0 # affectation ; la séquence est l'enchaînement des lignes
for i in range(1, n + 1): # boucle bornée : on sait qu'il y aura n tours
total = total + i
if total > 20: # conditionnelle
message = "grand"
else:
message = "petit"
reste = n # boucle non bornée : on ne sait pas combien de tours
etapes = 0
while reste > 1:
reste = reste // 2
etapes = etapes + 1
print(total, message, etapes) # appel de fonction
Ce n'est pas une question de mot-clé. Une boucle est bornée lorsque le nombre de tours est déterminé avant d'entrer dedans : parcourir les éléments d'un tableau, répéter fois. Elle est non bornée lorsque ce nombre dépend de ce qui se passe pendant l'exécution.
La conséquence est lourde : une boucle bornée s'arrête toujours, une boucle non bornée peut ne jamais s'arrêter. C'est pourquoi il faudra, dès le chapitre 7, démontrer qu'une boucle while se termine.
Repère historique : 1936 : ce qu'une machine peut calculer
Le programme fixe lui-même le repère : « c'est en 1936 qu'apparaît le concept de machine universelle, capable d'exécuter tous les algorithmes, et que les notions de machine, algorithme, langage et information sont pensées comme un tout cohérent ». Cette année-là, Alan Turing décrit un dispositif théorique d'une simplicité extrême — un ruban, une tête de lecture, un petit jeu de règles — et démontre qu'il peut simuler n'importe quel calcul mécanique.
C'est ce résultat qui donne son poids à la section que vous venez de lire : si un langage offre les six constructions ci-dessus, il permet d'écrire tout ce qui est calculable. Les langages ne diffèrent pas par leur puissance, mais par leur commodité.
Hors programme : Un mot que vous n'avez pas à retenir
On dit d'un langage disposant de ce corpus qu'il est Turing-complet. Le programme mentionne la notion mais précise « sans introduire cette terminologie » : le terme ne sera pas exigé. L'idée, elle, mérite d'être comprise.
3.2 Diversité et unité des langages
Capacité attendue
« Repérer, dans un nouveau langage de programmation, les traits communs et les traits particuliers à ce langage. »
3.2.1 Le même programme, quatre fois
Voici la recherche du plus grand élément d'un tableau, écrite dans quatre langages. Vous ne connaissez que le premier ; l'exercice consiste justement à lire les autres sans les connaître.
# Python
def maximum(t):
m = t[0]
for x in t:
if x > m:
m = x
return m
/* C */
int maximum(int t[], int n) {
int m = t[0];
for (int i = 0; i < n; i++) {
if (t[i] > m) {
m = t[i];
}
}
return m;
}
(* OCaml *)
let maximum t =
let m = ref t.(0) in
for i = 0 to Array.length t - 1 do
if t.(i) > !m then m := t.(i)
done;
!m
// JavaScript
function maximum(t) {
let m = t[0];
for (let i = 0; i < t.length; i++) {
if (t[i] > m) {
m = t[i];
}
}
return m;
}
Exercices du chapitre
- Reprendre le premier programme du chapitre (celui qui calcule total… corrigé
- Écrire une boucle bornée et une boucle non bornée qui calculent toutes… corrigé
- Voici le calcul du PGCD par soustractions successives corrigé
- Voici une fonction sans docstring corrigé
- Écrire le prototype, la précondition et la postcondition d'une… corrigé
- Écrire une fonction racine entiere(n) renvoyant ⌊√n⌋ sans utiliser… corrigé