cours1 min de lecture

Diversité et unité des langages de programmation

Pourquoi tant de langages, ce qu'ils ont en commun, et la différence entre langage compilé et langage interprété.
programme

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 :

ExigenceExemple de langage qui l'optimise
Performance brute, contrôle du matérielC, C++, Rust
Lisibilité, productivité, apprentissagePython, Ruby
Sûreté à l'exécution, garanties mathématiquesOCaml, Haskell, Rust
Portabilité sur le WebJavaScript, TypeScript
Manipulation de données structuréesSQL, R
Rapidité d'exécution sur serveur ou mobileJava, 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.

On parle aussi de langages dédiés (DSL, domain-specific languages) : des langages spécialisés pour un domaine, comme SQL pour les bases de données ou HTML pour la structure d'une page Web. Ce ne sont pas des langages de programmation généralistes au sens strict, mais ils suivent la même logique d'expressivité.

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 11 à 55 — écrit dans les trois styles.

total = 0
for i in range(1, 6):
    total = total + i * i
print(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.
⏵ Ctrl+↵ pour exécuter
Aucune exécution pour l'instant.

Sortie (varie fortement selon votre machine ou votre interpréteur) :

Version de l'interpréteur Python : (3, 12, 0)
Plateforme : linux
Cas intermédiaire : Java compile vers un bytecode exécuté par une machine virtuelle (la JVM). Python fait de même en interne avec un bytecode .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 :

ConstructionPythonAutre langage (C ici)
Affectationx = 5int x = 5;
Conditionnelleif x > 0:if (x > 0) { … }
Boucle bornéefor i in range(10):for (int i=0; i<10; i++) { … }
Boucle non bornéewhile condition:while (condition) { … }
Fonctiondef 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.