Programme

Capaticés attendues et commentaires

  • Distinguer sur des exemples les paradigmes impératif, fonctionnel et objet.
  • Choisir le paradigme de programmation selon le champ d’application d’un programme.

Commentaire : avec un même langage de programmation, on peut utiliser des paradigmes différents. Dans un même programme, on peut utiliser des paradigmes différents.

Paradigmes de programmation

Programmation impérative

  • Définition : la programmation impérative est un paradigme de programmation qui décrit les étapes à suivre pour résoudre un problème.
  • Exemple : langages C, Python, Java, …

Langages déclaratifs

  • Définition : la programmation déclarative est un paradigme de programmation qui décrit le résultat attendu sans décrire les étapes pour l’obtenir.
  • Exemple : SQL, Prolog, …

Un langage déclaratif permet d’ecrire la spécification du problème et laisse le soin à l’implémentation de trouver une façon de le résoudre.

En SQL, on décrit le jeu de données, et on demande à la base de données de nous donner les données qui correspondent à notre requête.

Programmation orientée objet

  • Définition : la programmation orientée objet est un paradigme de programmation qui permet de décrire des objets et les interactions entre ces objets.
  • Exemple : Java, Python, C++, C#…

Les objets sont des entités qui ont des propriétés et des méthodes. Les objets interagissent entre eux en utilisant ces méthodes.

Programmation fonctionnelle

  • Définition : la programmation fonctionnelle est un paradigme de programmation qui utilise les fonctions comme élément de base.
  • Exemple : Haskell, OCaml, …

La programmation fonctionnelle implique de décomposer un problème en fonctions. Ces fonctions ne possèdent pas d’état interne et ne modifient pas les données (pas d’effet de bord).

Avantages théoriques : preuves formelles plus faciles, parallélisation plus simple, modularité obligatoire, composition de fonctions plus facile.

Exemple : somme des éléments d’une liste

Impératif

def somme(liste):
    s = 0
    for x in liste:
        s += x
    return s
print(somme([1, 2, 3]))

Fonctionnel

On écrit la somme des élément d’une liste de manière récursive.

En Haskell, on utilise une fonction somme qui prend une liste en argument. La somme d’une liste vide est 0. La somme d’une liste non vide est la somme du premier élément plus la somme du reste de la liste (x:xs).

somme [] = 0
somme (x:xs) = x + somme xs
main = print (somme [1, 2, 3])

En python :

def somme(liste):
    if not liste:
        return 0
    return liste[0] + somme(liste[1:])
print(somme([1, 2, 3]))

Objet

En python, on peut définir une classe Liste qui contient une liste et une méthode somme qui calcule la somme des éléments de la liste (= impératif dans un objet)

class Liste:
    def __init__(self, liste):
        self.liste = liste
    def somme(self):
        s = 0
        for x in self.liste:
            s += x
        return s
l = Liste([1, 2, 3])
print(l.somme())

En Java, on peut définir une classe Liste qui contient un tableau d’entiers et une méthode somme qui calcule la somme des éléments du tableau.

class Liste {
    private int[] liste;
    public Liste(int[] liste) {
        this.liste = liste;
    }
    public int somme() {
        int s = 0;
        for (int x : liste) {
            s += x;
        }
        return s;
    }
}

/// Affichage
public class Main {
    public static void main(String[] args) {
        Liste l = new Liste(new int[]{1, 2, 3});
        System.out.println(l.somme());
    }
}

Déclaratif

Prolog : on décrit la somme des éléments d’une liste en Prolog. https://www.tutorialspoint.com/execute_prolog_online.php

La première ligne est le cas de base, la deuxième ligne est le cas récursif. Le cas de base est la somme d’une liste vide, qui est 0. Le cas récursif est la somme d’une liste non vide, qui est la somme du premier élément plus la somme du reste de la liste ([X|Xs]).

:- initialization(main).
main :- somme([1, 2, 3], S), write(S), nl, halt.
somme([], 0).
somme([X|Xs], S) :- somme(Xs, S1), S is X + S1.

Tuto prolog : http://www.gecif.net/articles/linux/prolog.html