192 votes

Quelle est la différence entre les langages de programmation fonctionnels et impératifs ?

La plupart des langages courants, y compris les langages de programmation orientée objet (POO) tels que C#, Visual Basic, C++ et Java, ont été conçus pour prendre en charge principalement la programmation impérative (procédurale), alors que les langages de type Haskell/gofer sont purement fonctionnels. Quelqu'un peut-il nous expliquer la différence entre ces deux modes de programmation ?

Je sais que le choix de la méthode de programmation dépend des besoins de l'utilisateur, mais pourquoi est-il recommandé d'apprendre des langages de programmation fonctionnels ?

259voto

Ingo Points 21438

Voici la différence :

Impératif :

  • Début
  • Mettez vos chaussures taille 9 1/2.
  • Faites de la place dans votre poche pour garder un tableau [7] de clés.
  • Mettez les clés dans la pièce pour les clés dans la poche.
  • Entrez dans le garage.
  • Garage ouvert.
  • Entrez dans la voiture.

... et ainsi de suite ...

  • Mettez le lait au réfrigérateur.
  • Stop.

Déclaratif, dont le fonctionnel est une sous-catégorie :

  • Le lait est une boisson saine, sauf si vous avez des problèmes de digestion du lactose.
  • Habituellement, on stocke le lait dans un réfrigérateur.
  • Un réfrigérateur est une boîte qui garde les objets qui s'y trouvent au frais.
  • Un magasin est un endroit où des articles sont vendus.
  • Par "vente", nous entendons l'échange de choses contre de l'argent.
  • De même, l'échange d'argent contre des objets est appelé "achat".

... et ainsi de suite ...

  • S'assurer que nous avons du lait dans le réfrigérateur (quand nous en avons besoin - pour les langues fonctionnelles paresseuses).

Résumé : Dans les langages impératifs, on indique à l'ordinateur comment modifier les bits, les octets et les mots dans sa mémoire et dans quel ordre. Dans les langages fonctionnels, on dit à l'ordinateur ce que sont les choses, les actions, etc. Par exemple, nous disons que la factorielle de 0 est 1, et que la factorielle de tout autre nombre naturel est le produit de ce nombre et de la factorielle de son prédécesseur. Nous ne disons pas : Pour calculer la factorielle de n, il faut réserver une région de mémoire et y stocker 1, puis multiplier le nombre dans cette région de mémoire avec les nombres 2 à n et stocker le résultat au même endroit, et à la fin, la région de mémoire contiendra la factorielle.

182voto

Définition : Un langage impératif utilise une séquence d'instructions pour déterminer comment atteindre un certain objectif. On dit que ces instructions modifient l'état du programme lorsque chacune d'entre elles est exécutée à tour de rôle.

Exemples : Java est un langage impératif. Par exemple, on peut créer un programme pour additionner une série de chiffres :

 int total = 0;
 int number1 = 5;
 int number2 = 10;
 int number3 = 15;
 total = number1 + number2 + number3; 

Chaque instruction modifie l'état du programme, depuis l'affectation de valeurs à chaque variable jusqu'à l'addition finale de ces valeurs. Une séquence de cinq instructions indique explicitement au programme comment additionner les nombres 5, 10 et 15.

Les langages fonctionnels : Le paradigme de la programmation fonctionnelle a été explicitement créé pour soutenir une approche purement fonctionnelle de la résolution de problèmes. La programmation fonctionnelle est une forme de programmation déclarative.

Avantages des fonctions pures : La principale raison d'implémenter les transformations fonctionnelles en tant que fonctions pures est que ces dernières sont composables, c'est-à-dire autonomes et sans état. Ces caractéristiques apportent un certain nombre d'avantages, notamment les suivants : Une lisibilité et une maintenabilité accrues. En effet, chaque fonction est conçue pour accomplir une tâche spécifique en fonction de ses arguments. La fonction ne dépend d'aucun état externe.

Développement réitératif plus facile. Parce que le code est plus facile à remanier, les modifications de la conception sont souvent plus faciles à mettre en œuvre. Par exemple, supposons que vous écriviez une transformation compliquée et que vous vous rendiez compte que certains codes sont répétés plusieurs fois dans la transformation. Si vous effectuez le remaniement à travers une méthode pure, vous pouvez appeler votre méthode pure à volonté sans vous soucier des effets secondaires.

Tests et débogage plus faciles. Comme les fonctions pures peuvent plus facilement être testées de manière isolée, vous pouvez écrire un code de test qui appelle la fonction pure avec des valeurs typiques, des cas limites valides et des cas limites invalides.

Pour les personnes OOP ou Langages impératifs :

Les langages orientés objet sont bons lorsque vous disposez d'un ensemble fixe d'opérations sur les choses et que, au fur et à mesure que votre code évolue, vous ajoutez principalement de nouvelles choses. Ceci peut être accompli en ajoutant de nouvelles classes qui implémentent des méthodes existantes et les classes existantes sont laissées tranquilles.

Les langages fonctionnels sont bons lorsque vous disposez d'un ensemble fixe de choses et que, au fur et à mesure que votre code évolue, vous ajoutez principalement de nouvelles opérations sur les choses existantes. Cela peut être accompli en ajoutant de nouvelles fonctions qui calculent avec les types de données existants et les fonctions existantes sont laissées tranquilles.

Cons :

Le choix de la méthode de programmation dépend des besoins de l'utilisateur. Il n'y a donc préjudice que si les utilisateurs ne choisissent pas la bonne méthode.

Quand l'évolution va dans le mauvais sens, vous avez des problèmes :

  • L'ajout d'une nouvelle opération à un programme orienté objet peut nécessiter la modification de nombreuses définitions de classes pour ajouter une nouvelle méthode.
  • L'ajout d'un nouveau type de chose dans un programme fonctionnel peut nécessiter la modification de nombreuses définitions de fonctions pour ajouter un nouveau cas.

20voto

old-monk Points 183

La plupart des langages modernes sont, à des degrés divers, à la fois impératifs et fonctionnels, mais pour mieux comprendre la programmation fonctionnelle, il est préférable de prendre un exemple de langage fonctionnel pur comme Haskell, par opposition à du code impératif dans un langage moins fonctionnel comme java/C#. Je crois qu'il est toujours plus facile d'expliquer par un exemple, alors en voici un.

Programmation fonctionnelle : calculer la factorielle de n c'est-à-dire n ! c'est-à-dire n x (n-1) x (n-2) x ...x 2 X 1

-- | Haskell comment goes like
-- | below 2 lines is code to calculate factorial and 3rd is it's execution  

factorial 0 = 1
factorial n = n * factorial (n - 1)
factorial 3

-- | for brevity let's call factorial as f; And x => y shows order execution left to right
-- | above executes as := f(3) as 3 x f(2) => f(2) as 2 x f(1) => f(1) as 1 x f(0) => f(0) as 1  
-- | 3 x (2 x (1 x (1)) = 6

Notez que Haskel permet la surcharge des fonctions au niveau de la valeur des arguments. Voici maintenant un exemple de code impératif en degré croissant d'impérativité :

//somewhat functional way
function factorial(n) {
  if(n < 1) {
     return 1;
  }
  return n * factorial(n-1);   
}
factorial(3);

//somewhat more imperative way
function imperativeFactor(n) {
  int f = 1;
  for(int i = 1; i <= n; i++) {
     f = f * i;
  }
  return f;
}

Ce site lire peut être une bonne référence pour comprendre que le code impératif se concentre plus sur la partie comment, l'état de la machine (i dans la boucle for), l'ordre d'exécution, le contrôle de flux.

Le dernier exemple peut être vu comme du code java/C# lang grossièrement et la première partie comme une limitation du langage lui-même, contrairement à Haskell qui surcharge la fonction par la valeur (zéro) et donc on peut dire que ce n'est pas un langage fonctionnel puriste, d'autre part on peut dire qu'il supporte le programme fonctionnel dans une certaine mesure.

Divulgation : aucun des codes ci-dessus n'a été testé/exécuté mais j'espère qu'ils sont suffisants pour transmettre le concept ; j'apprécierais également des commentaires pour toute correction :)

14voto

Jakub Points 58

Programmation fonctionnelle est une forme de programmation déclarative, qui décrit la logique du calcul et l'ordre d'exécution est complètement dé-emphasé.

Problème : je veux changer cette créature de cheval en girafe.

  • Allonger le cou
  • Allonger les jambes
  • Appliquer des spots
  • Donnez à la créature une langue noire
  • Enlever la queue de cheval

Chaque élément peut être exécuté dans n'importe quel ordre pour produire le même résultat.

Programmation impérative est procédurale. L'état et l'ordre sont importants.

Problème : je veux garer ma voiture.

  1. Notez l'état initial de la porte de garage
  2. Arrêter la voiture dans l'allée
  3. Si la porte du garage est fermée, ouvrir la porte du garage, se souvenir du nouvel état ; sinon continuer.
  4. Tirez la voiture dans le garage
  5. Fermer la porte du garage

Chaque étape doit être réalisée afin d'arriver au résultat souhaité. Si vous entrez dans le garage alors que la porte est fermée, la porte de garage sera cassée.

6voto

Romil pawar Points 61

La programmation fonctionnelle est une "programmation avec des fonctions", où une fonction possède certaines propriétés mathématiques attendues, notamment la transparence référentielle. De ces propriétés découlent d'autres propriétés, en particulier des étapes de raisonnement familières permises par la substituabilité, qui conduisent à des preuves mathématiques (c'est-à-dire justifiant la confiance dans un résultat).

Il s'ensuit qu'un programme fonctionnel est simplement une expression.

Vous pouvez facilement voir le contraste entre les deux styles en notant les endroits dans un programme impératif où une expression n'est plus transparente sur le plan référentiel (et n'est donc pas construite avec des fonctions et des valeurs, et ne peut pas elle-même faire partie d'une fonction). Les deux endroits les plus évidents sont la mutation (par exemple, les variables) autres effets secondaires flux de contrôle non local (par exemple, les exceptions)

Sur ce cadre de programmes en tant qu'expressions composées de fonctions et de valeurs, est construit tout un paradigme pratique de langages, de concepts, de "patrons fonctionnels", de combinateurs et de divers systèmes de types et algorithmes d'évaluation.

Selon la définition la plus extrême, presque n'importe quel langage - même C ou Java - peut être qualifié de fonctionnel, mais les gens réservent généralement ce terme aux langages qui présentent des abstractions spécifiques (comme les fermetures, les valeurs immuables et les aides syntaxiques comme le filtrage). En ce qui concerne l'utilisation de la programmation fonctionnelle, elle implique l'utilisation de fonctions et la construction de code sans effets secondaires. utilisé pour écrire des preuves

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X