Classes de Terminale
NSI - Numérique et Sciences Informatiques
Le programme de l'enseignement NSI (numérique et sciences informatiques) de terminale s’appuie sur l’universalité de quatre concepts fondamentaux et la variété de leurs interactions : les données, les algorithmes, les langages, les machines, les interfaces.
Paradigme de programmation
Définition ::
Un paradigme de programmation est une façon d’approcher la programmation informatique et de traiter les solutions aux problèmes et leur formulation dans un langage de programmation approprié.
Différents Paradigmes : L'exemple de la pâte à crépes :
Pour faire des crêpes il faut obtenir une pâte fluide.- Le type impératif.
- En mode itératif.
- Rendre la pâte fluide :
- Tant que la pâte n'est pas fluide, ajouter 1cl de lait et remuer.
- En mode récursif.
- Rendre la pâte fluide :
- Si la pâte n'est pas fluide, ajouter 1cl de lait, remuer et rendre la pâte fluide .
- Sinon la pâte est fluide
- Le type déclaratif
- La pâte est fluide :
- Si la pâte n'est pas assez fluide, avec 1cl de lait et en remuant elle est plus fluide .
- Evénementielle
- C'est mardi gras on fait de la pâte à crêpe
- Paralléle
- Chacun prend une portion de pâte et fait de la pâte fluide
Un paradigme de programmation est une façon d’approcher la programmation informatique et de traiter les solutions aux problèmes et leur formulation dans un langage de programmation approprié.
Les exemples paradigmes de programmation
Programmation impérative
La programmation impérative décrit les opérations en séquences d’instructions exécutées par l’ordinateur pour modifier l’état du programme. Ce type de programmation est le plus répandu parmi l’ensemble des langages de programmation existants
Exemple :
On déclare différentes variables auxquelles on attribue des valeurs.
Les opérations sont effectuées sur les variables elles-mêmes.
L’inconvénient immédiat de la programmation impérative et la multiplication des variables.
On doit souvent se questionner sur l’état d’une variable durant le déroulé des instructions.
On peut faire de la programmation impérative en Python, Java, Javascript, C, scratch...
Programmation orienté objet (POO)
D'aprés Wikipédia, la programmation orientée objet (POO), ou programmation par objet consiste en la définition et l'interaction de briques logicielles appelées objets ; un objet représente un concept, une idée ou toute entité du monde physique, comme une voiture, une personne ou encore une page d'un livre. Il possède une structure interne et un comportement, et il sait interagir avec ses pairs. Il s'agit donc de représenter ces objets et leurs relations.
On rappelle que un objet sera définit dans ce cadre par des attributs et des méthodes qu'en python on appelle des classes qui sont décrites dans le cours de programmation objet.
Exemple :
Une carte est représenté par un objet Carte qui a les attributs couleur et valeur et une méthode jouer. couleur et valeur pourraient eux mêmes être des objets.
Pour Python, tout est objet (les entiers, les flottants , les chaines de caractéres, les listes, les fonctions, les classes elles mêmes).
Programmation fonctionnelle
La programmation fonctionnelle est un paradigme de programmation de type déclaratif (Comme le HTML ou le Latex) qui considère le calcul en tant qu’évaluation de fonctions mathématiques.
Le but principale est d'éviter les effets de bords.
Elle interdit toute variable globale et ne fait appel qu'à des fonctions que l'on peut composer (imbriquer)
Exemples d'effet de bord:
En programmation fonctionnelle, on n'utiliste donc pas pop() ou append() sur une liste car ces méthodes modifient l'état de la liste. Si on veut faire ce type d'opération
En programmations fonctionnelle, beaucoup d'objets sont donc immuables comme les tuples en python.
Le plus vieux langage fonctionnel est Lisp (1958) qui a donné naissance à de nombreuses variantes telles que Scheme (1975).
Plus recemment on trouve des langages comme Haskell (1987), OCaml , Scala (2003) qui sont utilisés dans l’industrie.
On peut voir quelques exemples d'utilisation de OCaml sur Capytale .
La récursion et la composition de fonctions sont omniprésents en programmation fonctionnelle. Ceci n’est pas étranger à la proximité de la programmation fonctionnelle et des mathématiques.
Exemples :
- La fonction map:
La fonction map est un outil qui permet de faire de la programmation fonctionnnelle en python et qui existe en OCaml. Elle prend une fonction f et un itérable (une liste par exemple). Elle applique la fonction f à chaque donnée de l'itérable.
Programmation événementielle
la programmation événementielle est un paradigme de programmation fondé sur les événements. Elle s’oppose à la programmation séquentielle (impératif, objet). Le programme sera principalement défini par ses réactions aux différents événements qui peuvent se produire, c’est-à-dire des changements d’état de variable, par exemple l’incrémentation d’une liste, un mouvement de souris ou de clavier.
Elle permet de réaliser des opération asyncrones comme, par exemple, réagir à une action venant de l’extérieur :
“si la souris quitte l’écran, afficher un popup ‘ne partez pas, abonnez vous !’”
Javascript est le langage le plus utilisé qui implémente la programmation événementielle.
En Javascript, par exemple, il est totalement impossible de “figer” l’exécution durant un temps précis.
Alors qu'En Python il suffit de faire :On utilise beaucoup la programmation événementielle pour faire des jeux vidéos.
Par exemple on peux faire des jeux et de la programmation événementielle avec le module Pygame sous Python
Vous pouvez regardez le noteBook d'initiation à la programmation événementielle sur Capytale.
Ou tester l'appuis sur une flêche du clavier sur le petit exemple ci dessous:
Programmation parallèle
D'aprés Wikipédia
Le parallélisme consiste à mettre en œuvre des architectures d'électronique numérique permettant de traiter des informations de manière simultanée, ainsi
que les algorithmes spécialisés pour celles-ci. Ces techniques ont pour but de réaliser le plus grand nombre d'opérations en un temps le plus petit possible.
Les architectures parallèles sont devenues le paradigme dominant pour tous les ordinateurs depuis les années 2000. En effet, la vitesse de traitement qui est liée à l'augmentation de la fréquence des processeurs connait des limites. La création de processeurs multi-cœurs, traitant plusieurs instructions en même temps au sein du même composant, résout ce dilemme pour les machines de bureau depuis le milieu des années 2000.
Exemple :
L'exemple suivant fait le calcul d'une fonction func1 sur un nombre nbValeurs de valeurs. Le programme renvoie le temps de calcul pour le paradigme impératif/itératif ainsi que le temps pour le paradigme paralléle.- On peut changer le nombre de thread (nbThread) utilisés qui correspond en général au nombre de coeur de la machine utilisée;
- On peut aussi changer le nombre de calcul à effectuer (nbCalculs);
- En décommentant la ligne #time.sleep(0.1), on augmente le temps de calcul de func1, ce qui permet de voir l'intéret du parallélisme pour des calculs plus longs.
Mettre le code suivant dans un fichier mafonction.py
Mettre le code suivant dans un fichier comparaison.py et lancer ce code.
On remarquera que Le parallélisme sur quelques coeurs n'est pas forcément très interessant car le chargement des données peut être assez couteux en temps.
Le parallélisme utilisé ici repose sur les quelques coeurs que posséde un PC classique. Mais une carte graphique (GPU) peut contenir des millions de threads qui peuvent réduire des temps de calculs de façon drastique.
Si votre PC contient une carte GPU NVIDIA, vous pouvez faire de la programmation paralléle avec le langage CUDA qui se rajoute au langage C on peut aussi le faire en ligne sur https://colab.research.google.com/ si vous avez un compte Gmail.
Voici un exemple de somme de vecteurs de taille 16 x 1024 = 16384 sur GPU NVIDIA.
- Aller sur google colab
- Ouvrir un nouveau noteBook.
- Dans l'onglet Execution, choisir l'option GPU
- Mettez le code ci-dessous dans un fichier avec une extension .cu comme par exemple monprogramme.cu .
- Compilez dans une cellule avec l'instruction !nvcc monprogramme.cu -o exec.out, cela créée un fichier exec.out executable.
- Lancer le programme en executant !./exec.out dans une autre cellule .
- Vous pouvez changer BLOC et NTHREAD pour voir les résultats avec plus ou moins de calculs. Chosissez plutot des puissances de 2.