Adloun

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

Un programme dans un éditeur de code : des instructions exécutées de haut en bas.

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.

Définition 3.1Les six constructions élémentaires
  • 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.
Figure : Quatre des six constructions élémentaires. La différence entre les deux dernières n'est pas syntaxique : à droite, rien ne garantit l'arrêt — il faudra le prouver (chapitre 7).

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
ImportantBornée ou non bornée : la vraie différence

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

La suite du cours · Tous les exercices du chapitre