Diversité et unité des langages de programmation
Introduction
Il existe aujourd'hui des centaines de langages de programmation : Python, C, Java, JavaScript, OCaml, Rust, Haskell, SQL, HTML… Cette profusion peut sembler désordonnée. Elle reflète en réalité l'idée qu'aucun langage n'est universellement adapté : on choisit un langage selon l'usage, la performance, la communauté ou les contraintes du matériel. Pourtant, sous cette diversité, presque tous les langages s'appuient sur les mêmes constructions de base.
Apprendre la programmation, ce n'est donc pas apprendre un langage — c'est apprendre à reconnaître ces constructions universelles, et à les retrouver dans n'importe quel langage que vous croiserez plus tard.
Pourquoi tant de langages ?
Un langage de programmation est conçu autour d'un compromis entre plusieurs exigences difficiles à satisfaire toutes en même temps :
| Exigence | Exemple de langage qui l'optimise |
|---|---|
| Performance brute, contrôle du matériel | C, C++, Rust |
| Lisibilité, productivité, apprentissage | Python, Ruby |
| Sûreté à l'exécution, garanties mathématiques | OCaml, Haskell, Rust |
| Portabilité sur le Web | JavaScript, TypeScript |
| Manipulation de données structurées | SQL, R |
| Rapidité d'exécution sur serveur ou mobile | Java, Kotlin, Go |
Aucun langage ne maximise tout. Python est lisible mais lent à l'exécution. C est rapide mais offre peu de garde-fous. SQL exprime des requêtes sur des bases de données mais ne sert pas à écrire un jeu vidéo.
Les grands paradigmes
Un paradigme est une grande famille de manière de concevoir un programme. Trois paradigmes dominent l'enseignement en NSI :
- Impératif : on décrit une suite d'instructions qui modifient l'état d'une mémoire. C'est le style de Python que vous pratiquez le plus souvent, et celui du langage C.
- Fonctionnel : on décrit le programme comme une composition de fonctions mathématiques sans état mutable. Style natif d'OCaml, Haskell, largement présent en JavaScript moderne.
- Objet : on regroupe données et opérations dans des objets qui s'envoient des messages. Style de Java, C++, et possible en Python.
Python est un langage multi-paradigme : il accepte les trois styles, parfois mélangés. Voici le même programme — calculer la somme des carrés des entiers de à — écrit dans les trois styles.
total = 0
for i in range(1, 6):
total = total + i * i
print(total) # 55
nombres = range(1, 6)
carres = map(lambda n: n * n, nombres)
total = sum(carres)
print(total) # 55
class Compteur:
def __init__(self):
self.total = 0
def ajouter_carre(self, n):
self.total += n * n
c = Compteur()
for i in range(1, 6):
c.ajouter_carre(i)
print(c.total) # 55
Le résultat est le même. Le « grain » d'écriture diffère.
Lequel de ces langages est pensé d'abord pour la performance et le contrôle du matériel ?
Compilation, interprétation, machines virtuelles
Une fois le programme écrit, il faut le transformer en quelque chose que le processeur sait exécuter. Deux grandes approches existent :
- Compilation : un programme spécial, le compilateur, traduit entièrement le code source en code machine une fois pour toutes. On exécute ensuite le résultat compilé. C'est rapide à l'exécution, mais spécifique à un type de processeur. Exemples : C, C++, Rust, Go.
- Interprétation : un interpréteur lit le code source et l'exécute ligne par ligne, sans étape de traduction préalable visible. C'est plus lent à l'exécution mais immédiat à essayer. Exemples : Python, JavaScript (dans un navigateur), Ruby.
import sys en avant-première. Le mot-clé import (utiliser une
bibliothèque externe) sera détaillé au cours 6 de ce chapitre. Ici,
contentez-vous de lire : sys est une bibliothèque standard qui donne accès
à des informations sur l'interpréteur.Sortie (varie fortement selon votre machine ou votre interpréteur) :
Version de l'interpréteur Python : (3, 12, 0)
Plateforme : linux
.pyc, mais l'utilisateur ne le voit pas. Il y a donc un continuum
entre compilation pure et interprétation pure.Unité sous la diversité
Au-delà des paradigmes et des manières d'exécuter, presque tous les langages généralistes partagent les mêmes briques de construction :
| Construction | Python | Autre langage (C ici) |
|---|---|---|
| Affectation | x = 5 | int x = 5; |
| Conditionnelle | if x > 0: | if (x > 0) { … } |
| Boucle bornée | for i in range(10): | for (int i=0; i<10; i++) { … } |
| Boucle non bornée | while condition: | while (condition) { … } |
| Fonction | def f(x): return … | int f(int x) { return …; } |
Quand vous découvrirez un nouveau langage, cherchez d'abord ces cinq constructions. Vous serez productif beaucoup plus vite que si vous abordez le langage comme une nouveauté complète.
Python est-il un langage strictement fonctionnel ?
Pièges courants
- Le « meilleur » langage n'existe pas dans l'absolu — seulement le meilleur langage pour un usage donné.
- Compilé ≠ rapide systématiquement. Un mauvais algorithme en C peut être battu par un bon algorithme en Python.
- Tous les langages n'ont pas la même notion d'erreur. Python lève des exceptions ; C affiche parfois des comportements bizarres sans message clair (« undefined behavior »). C'est culturel autant que technique.
Pour aller plus loin
Le langage que vous apprendrez après Python sera plus facile que Python ne l'a été : vous chercherez juste les constructions équivalentes. C'est ce qu'on appelle le transfert pédagogique. C'est l'objectif central de cet item du programme.