Quelle est la différence entre le déclaratif et la programmation impérative? [fermé]

j'ai cherché sur le web une définition de la programmation déclarative et impérative qui pourrait m'éclairer. Cependant, le langage utilisé à certaines des ressources que j'ai trouvées est intimidant - par exemple à Wikipedia . Est-ce que quelqu'un a un exemple réel qu'il pourrait me montrer qui pourrait apporter une certaine perspective à ce sujet (peut-être en C#)?

407
demandé sur nbro 2009-11-23 20:24:41

16 réponses

LINQ est un excellent exemple de programmation déclarative ou impérative.

avec programmation impérative , vous dites au compilateur ce que vous voulez arriver, étape par étape.

par exemple, commençons par cette collection, et choisissez les nombres impairs:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

avec une programmation impérative, nous allons passer à travers cela, et décider ce que nous voulons:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

ici, nous disons:

  1. créer une collection de résultats
  2. passer à travers chaque numéro de la collection
  3. Vérifier le nombre, s'il est impair, l'Ajouter aux résultats

avec déclaratif programmation, d'autre part, vous écrivez le code qui décrit ce que vous voulez, mais pas nécessairement comment l'obtenir (déclarer vos résultats souhaités, mais pas le pas-par-étape):

var results = collection.Where( num => num % 2 != 0);

ici, nous disons "Donnez-nous tout là où c'est bizarre", pas "marchez dans la collection. Vérifiez cet article, s'il est impair, ajoutez-le à une collection de résultats."

dans de nombreux cas, le code sera un mélange des deux dessins, aussi, il n'est pas toujours Noir et blanc.

624
répondu Reed Copsey 2015-08-29 00:34:23

programmation déclarative est quand vous dites ce que vous voulez, et le langage impératif est quand vous dites comment pour obtenir ce que vous voulez.

un exemple simple en Python:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

le premier exemple est déclaratif parce que nous ne spécifions aucun" détail de mise en œuvre " de l'établissement de la liste.

pour lier dans un exemple de C#, généralement, en utilisant LINQ résultats dans un style déclaratif, parce que vous ne dites pas comment pour obtenir ce que vous voulez; vous dites seulement ce que vous voulez. On pourrait dire la même chose de SQL.

un avantage de la programmation déclarative est qu'elle permet au compilateur de prendre des décisions qui pourraient conduire à un meilleur code que ce que vous pourriez faire à la main. En cours d'exécution avec L'exemple SQL, si vous aviez une requête comme

SELECT score FROM games WHERE id < 100;

SQL "compilateur" peut "optimiser" ce requête parce qu'il sait que id est un champ indexé -- ou peut-être qu'il n'est pas indexé, auquel cas il devra itérer sur l'ensemble des données de toute façon. Ou peut-être que le moteur SQL sait que c'est le moment idéal pour utiliser les 8 cœurs pour une recherche en parallèle rapide. vous , en tant que programmeur, ne sont concernés par aucune de ces conditions, et vous n'avez pas à écrire votre code pour gérer tout cas spécial de cette façon.

112
répondu Mark Rushakoff 2009-11-23 17:37:12

déclarative vs. Imperative

A paradigme de programmation est un style fondamental de programmation informatique. Il y a quatre grands paradigmes: impératif, déclaratif, fonctionnel (qui est considéré comme un sous-ensemble du paradigme déclaratif) et orienté objet.

programmation déclarative : est un paradigme de programmation qui exprime la logique d'un calcul(que faire) sans décrire son contrôle flux(Comment faire). Certains exemples bien connus de langages spécifiques de domaine déclaratif (DSLs) incluent CSS, des expressions régulières, et un sous-ensemble de SQL (SELECT queries, par exemple).) De nombreux langages de markup tels que HTML, MXML, XAML, XSLT... sont souvent déclarative. La programmation déclarative essaie de brouiller la distinction entre un programme comme un ensemble d'instructions et un programme comme une affirmation à propos de la réponse souhaitée.

programmation impérative : est un paradigme de programmation qui décrit le calcul en termes d'énoncés qui changent l'état d'un programme. Les programmes déclaratifs peuvent être dualement considérés comme des commandes de programmation ou des assertions mathématiques.

programmation fonctionnelle: est un paradigme de programmation qui traite le calcul comme l'évaluation des fonctions mathématiques et évite l'état et les données mutables. Il met l'accent sur l'application des fonctions, contrairement au style de programmation impératif, qui met l'accent sur les changements en état. Dans un langage purement fonctionnel, comme Haskell, toutes les fonctions sont sans effets secondaires, et les changements d'état ne sont représentés comme des fonctions qui transforment l'état.

l'exemple suivant de programmation impérative dans MSDN , boucles à travers les nombres 1 à 10, et trouve les nombres pairs.

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);

les deux exemples donnent le même résultat, et l'un n'est ni meilleur ni pire que l'autre. Première exemple nécessite plus de code, mais le code est testable, et l'approche impérative vous donne le contrôle complet sur les détails de la mise en œuvre. Dans le deuxième exemple, le code est sans doute plus lisible; cependant, LINQ ne vous donne pas le contrôle sur ce qui se passe en coulisse. Vous devez avoir confiance que LINQ fournira le résultat demandé.

82
répondu AliKarimi 2013-07-02 06:43:08

je vais ajouter un autre exemple qui apparaît rarement dans la discussion de programmation déclarative/impérative: L'Interface utilisateur!

dans C#, vous pouvez construire une interface utilisateur en utilisant diverses technologies.

à l'extrémité impérative, vous pouvez utiliser DirectX ou OpenGL pour dessiner de façon très impérative vos boutons, cases à cocher, etc... ligne par ligne (ou triangle par triangle). C'est à vous de dire comment dessiner l'interface utilisateur.

au fin déclarative, vous avez WPF. Vous écrivez essentiellement un peu de XML (ouais, ouais, "XAML" techniquement) et le cadre fait le travail pour vous. Vous dites à quoi ressemble l'interface utilisateur. C'est le système pour savoir comment le faire.

de toute façon, juste une autre chose à laquelle penser. Juste parce qu'une langue est déclarative ou impérative ne signifie pas qu'il n'a pas certaines fonctionnalités de l'autre.

aussi, un avantage de la programmation déclarative est ce but est généralement plus facile à comprendre à partir de la lecture du code tandis que impératif vous donne un contrôle plus fin sur l'exécution.

L'essentiel de lui-même:

Déclarative -> what vous voulez faire

Impératif -> how vous voulez qu'il fait

40
répondu Erich Mirabal 2009-11-23 18:41:48

toutes les réponses ci-dessus et les autres messages en ligne mentionnent ce qui suit:

  • avec déclaratif programmation, vous écrivez le code qui décrit ce que vous voulez, mais pas nécessairement comment l'obtenir
  • Vous devriez préférer la programmation déclarative sur la programmation impérative

ce qu'ils ne nous ont pas dit est comment l'atteindre . Pour la partie du programme à plus déclarative, d'autres parties doivent fournir l'abstraction pour cacher les détails de la mise en œuvre (qui sont les impératif codes).

  • E. G., LINQ est plus déclaratif que loops (for, while, etc.), par exemple, vous pouvez utiliser la liste.Où() pour obtenir une nouvelle liste filtrée. Pour que cela fonctionne, Microsoft a fait tout le travail lourd derrière L'abstraction LINQ.

En fait, l'une des raisons la programmation fonctionnelle et les bibliothèques fonctionnelles sont plus déclaratives parce qu'elles ont abstrait les boucles loin et les créations de liste, cachant tous les détails de mise en œuvre (codes plus probablement impérative avec des boucles) derrière la scène.

dans n'importe quel programme, vous aurez toujours les codes impératifs et déclaratifs, ce que vous devez viser est de cacher tous les impératif codes derrière les abstractions, de sorte que d'autres parties du programme peuvent les utiliser déclarative .

enfin, bien que la programmation fonctionnelle et LINQ puisse rendre votre programme plus déclaratif, vous pouvez toujours le rendre encore plus déclaratif en fournissant plus d'abstractions. Par exemple:

// JavaScript example

// Least declarative
var bestProducts = [];
for(var i = 0; i < products.length; i++) {
    var product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
var bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
var bestProducts = getBestProducts();
30
répondu engineforce 2018-04-13 23:38:42

la programmation impérative exige des développeurs de définir étape par étape comment le code doit être exécuté. Donner des indications d'une manière impérative, vous dites, " allez sur la 1ère rue, tournez à gauche sur Main, roulez sur deux pâtés de maisons, tourner à droite sur Maple, et s'arrêter à la troisième maison sur la gauche." Le la version déclarative pourrait ressembler à quelque chose comme ceci: maison."On dit comment faire quelque chose; l'autre dit ce qui doit être faire.

le le style déclaratif présente deux avantages par rapport au style impératif:

  • il ne force pas le voyageur à mémoriser un long ensemble d'instructions.
  • il permet au voyageur d'optimiser l'itinéraire lorsque possible.

Calvert,C Kulkarni,D (2009). Essential LINQ. Addison Wesley. 48.

22
répondu GorkemHalulu 2014-04-15 08:46:36

j'ai aimé une explication D'un cours de Cambridge + leurs exemples:

  • déclaratif - préciser ce que à faire, pas comment à le faire
    • par exemple: HTML décrit ce qui doit apparaître sur une page web, et non comment il doit être dessiné à l'écran
  • impératif - préciser à la fois quoi et comment
    • int x; - quel (déclarative)
    • x=x+1; - comment
17
répondu ROMANIA_engineer 2015-02-25 05:00:27

la différence a principalement à voir avec le niveau global d'abstraction. Avec déclaratif, à un moment donné, vous êtes si loin des étapes individuelles que le programme a beaucoup de latitude quant à la façon d'obtenir votre résultat.


vous pourriez considérer chaque instruction comme tombant quelque part sur un continuum:

degré d'abstraction:

Declarative <<=====|==================>> Imperative

Déclarative Monde Réel Exemple:

  1. Bibliothécaire, s'il vous plaît vérifier une copie de Moby Dick. (Bibliothécaire, à leur discrétion choisit la meilleure méthode pour effectuer la demande)

Impératif Monde Réel Exemple:

  1. Allez dans la Bibliothèque
  2. Trouver Livre Organisation (Système de Carte de Catalogue de la Vieille école)
  3. Recherche comment utiliser Catalogues de cartes (vous avez oublié aussi, à droite)
  4. découvrez comment les étagères sont étiquetées et organisées.
  5. comprendre comment les livres sont organisés sur une étagère.
  6. lieu du livre de référence de catalogue de carte avec le système d'organisation pour trouver ledit livre.
  7. Prendre du livre à système.
  8. consulter le livre.
10
répondu Lucent Fox 2017-09-25 23:14:12

En informatique, programmation déclarative est un paradigme de programmation qui exprime la logique d'un calcul sans décrivant ses flux de contrôle.

de http://en.wikipedia.org/wiki/Declarative_programming

en résumé, le langage déclaratif est plus simple parce qu'il n'a pas la complexité du flux de contrôle ( boucles, if statements, etc. )

un bon la comparaison ASP.Net modèle "code-behind". Vous avez déclarative '.Les fichiers ASPX et L'impératif ASPX.CS' fichiers de code. Je trouve souvent que si je peux faire tout ce dont j'ai besoin dans la moitié déclarative du script, beaucoup plus de gens peuvent suivre ce qui est fait.

8
répondu kervin 2009-11-23 17:30:02

la programmation impérative dit explicitement à l'ordinateur ce qu'il doit faire, et comment le faire, comme spécifier l'ordre et tel

C#:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

Déclarative, c'est quand vous dites à l'ordinateur ce qu'il doit faire, mais pas vraiment comment le faire. Datalog / Prolog est la première langue qui vient à l'esprit à cet égard. Fondamentalement, tout est déclaratif. Vous ne pouvez pas vraiment garantir l'ordre.

C# est beaucoup plus impératif le langage de programmation, mais certaines fonctionnalités C# sont plus déclaratives, comme Linq

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

la même chose pourrait être écrite impérativement:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(exemple de wikipedia Linq)

8
répondu McKay 2010-04-14 19:01:56

Voler Philippe Roberts ici :

  • la programmation impérative indique à la machine comment faire quelque chose (résultant en ce que vous voulez arriver)
  • programmation Déclarative dit à la machine ce que vous aimeriez (et l'ordinateur chiffres comment le faire)

deux exemples:

1. Doubler tous les nombres dans un tableau

IMPERATIVEMENT:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

Déclarativement:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

2. Sommation de tous les éléments d'une liste

IMPERATIVEMENT

var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

Déclarativement

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15

notez comment les exemples impératifs impliquent la création d'une nouvelle variable, sa mutation, et le retour de cette nouvelle valeur (i.e., comment faire quelque chose se produire), tandis que les exemples déclaratifs s'exécutent sur une entrée donnée et renvoient la nouvelle valeur basée sur l'entrée initiale (c.-à-d., ce que nous voulons arriver).

7
répondu Chris Eaves-Kohlbrenner 2015-01-29 13:43:23

Juste pour ajouter un autre exemple en termes de développement d'applications mobiles. Dans iOS et Android nous avons des constructeurs D'Interface, où nous pouvons définir L'interface utilisateur des applications.

L'UI dessiné en utilisant ces constructeurs sont de nature déclarative, où nous traînons et laissons tomber les composants. La vidange proprement dite se produit en dessous et est effectuée par le cadre et le système.

mais nous pouvons aussi dessiner l'ensemble des composants en code, et c'est impératif dans la nature.

en outre, certaines nouvelles langues comme L'Angular JS se concentre sur la conception UIS déclarativement et nous pouvons voir beaucoup d'autres langues offrant le même soutien. Comme JAVA n'a pas de bonne façon déclarative pour dessiner des applications de bureau natives dans JAVA swing ou JAVA FX, mais dans un proche avenir, ils pourraient tout simplement.

2
répondu Puneet Sharma 2013-12-22 05:51:29

programmation impérative

Un langage de programmation qui nécessite une discipline de programmation telle que C / C++, Java, COBOL, FORTRAN, Perl et JavaScript. Les programmeurs qui écrivent dans ces langages doivent développer un ordre d'action approprié afin de résoudre le problème, basé sur une connaissance du traitement des données et de la programmation.

programmation déclarative

Un langage informatique qui ne nécessite pas d'écriture de logique de programmation traditionnelle; Les utilisateurs se concentrent sur la définition des entrées et des sorties plutôt que sur les étapes du programme requises dans un langage de programmation procédural tel que c++ ou Java.

exemples de programmation déclarative sont CSS, HTML, XML, XSLT, RegX.

2
répondu Premraj 2015-11-30 10:14:29

programme déclaratif est juste une donnée pour son un plus-ou-moins "universel" mise en œuvre impérative/vm.

plus: spécifier juste une donnée, dans un certain format hardcoded (et Vérifié), est plus simple et moins sujet aux erreurs que spécifier directement une variante d'un algorithme impératif. certaines spécifications complexes ne peuvent pas être écrites directement, seulement sous une forme DSL. best et freq utilisés dans les structures de données DSLs sont des ensembles et des tableaux. parce que vous n'avez pas de dépendances entre les éléments/lignes. et quand vous n'avez pas de dépendances, vous avez la liberté de modifier et la facilité de support. (comparer par exemple des modules avec des classes-avec des modules que vous heureux et avec des classes vous avez problème de classe de base fragile) toutes les marchandises déclaratives et LIS découlent immédiatement des avantages de ces structures de données (tableaux et ensembles). un autre plus - vous pouvez changer la mise en œuvre du langage déclaratif vm, si DSL est plus ou moins abstrait (bien conçu). faire de la mise en œuvre parallèle, par exemple. ou port à un autre système d'exploitation, etc. toutes les interfaces ou les protocoles d'isolement modulaires bien définis vous offrent une telle liberté et facilité de support.

inconvénients: vous devinez juste. la mise en œuvre de l'algorithme/vm impératif générique (et paramétré par DSL) peut être plus lente et/ou avide de mémoire que la mise en œuvre de l'algorithme / VM spécifique. dans certains cas. si ces cas sont rares - oubliez-le, laissez-le être lent. si elle est fréquente - vous pouvez toujours étendre votre DSL / vm pour ce cas. quelque part ralentissant tous les autres cas, c'est sûr...

P.S. Frameworks est à mi - chemin entre DSL et impératif. et comme toutes les solutions à mi-chemin ... ils combinent les défauts, pas les avantages. ils ne sont pas si sûrs et pas si rapides :) regardez jack-of-all - trades haskell-il est à mi-chemin entre forte simple ML et souple metaprog Prolog et... quel monstre qu'il est. vous pouvez regarder Prolog comme un Haskell avec des fonctions/prédicats booléens seulement. et comme sa flexibilité est simple contre Haskell...

2
répondu 4KCheshireCat 2016-01-06 04:52:09

je me demande juste pourquoi personne n'a mentionné les classes D'attributs comme outil de programmation déclarative dans C#. La réponse populaire de cette page vient de parler de LINQ comme un outil de programmation déclarative.

selon Wikipedia

les langues déclaratives communes comprennent celles des langages d'interrogation des bases de données. (par exemple, SQL, XQuery), expressions régulières, programmation logique, la programmation fonctionnelle, et les systèmes de gestion de configuration.

ainsi LINQ, en tant que syntaxe fonctionnelle, est certainement une méthode déclarative, mais les classes D'attribut en C#, en tant qu'outil de configuration, sont aussi déclaratives. Voici un bon point de départ pour en savoir plus à ce sujet: aperçu rapide de la programmation C # attribut

2
répondu Siavash Mortazavi 2016-05-26 11:11:39

d'après ce que j'ai compris, les deux termes ont leurs racines dans la philosophie, il y a des genres de connaissances déclaratives et impératives. Les connaissances déclaratives sont des affirmations de vérité, des déclarations de fait comme des axiomes mathématiques. Il dit quelque chose que vous. La connaissance impérative, ou de procédure, vous dit étape par étape comment arriver à quelque chose. C'est ce que la définition d'un algorithme est essentiellement. Si vous souhaitez comparer un langage de programmation informatique avec la langue anglaise. Déclarative phrases état quelque. Un exemple ennuyeux, mais voici une façon déclarative d'afficher si deux nombres sont égaux l'un à L'autre, en Java:

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}

Impératif phrases en anglais, d'autre part, donner un ordre ou de faire une sorte de demande. La programmation impérative n'est donc qu'une liste de commandes (faites ceci, faites cela). Voici une façon impérative d'afficher si deux nombres sont égaux l'un à l'autre ou non tout en acceptant l'entrée de L'utilisateur, en Java:

private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}

essentiellement, connaissance déclarative passe à côté de certains éléments pour former une couche d'abstraction sur ces éléments. La programmation déclarative fait de même.

1
répondu Matthew Conrad 2015-05-05 23:31:42