Question

Je suis recherche sur le Web à la recherche d'une définition pour la programmation déclarative et impérative qui faire la lumière pour moi. Cependant, la langue utilisée à quelques-unes des ressources que j'ai trouvé est de taille - par exemple à Wikipedia . Quelqu'un at-il un exemple réel qu'ils pouvaient me montrer que pourrait apporter une perspective à ce sujet (peut-être en C #)?

Était-ce utile?

La solution

Un grand exemple C # de par rapport à la programmation impérative déclarative est LINQ.

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

Par exemple, nous allons commencer par cette collection, et choisissez les nombres impairs:

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

Avec la programmation impérative, nous aimerions suivre cet, et de 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ésultat
  2. étape par chaque numéro dans la collection
  3. Vérifiez le numéro, si elle est bizarre, l'ajouter aux résultats

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

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

Ici, nous dit: « Donnez-nous tout où il est étrange », pas « étape par la collection. Vérifiez ce point, si c'est bizarre, l'ajouter à une collection de résultat ».

Dans de nombreux cas, le code sera un mélange des deux conceptions, aussi, il est donc pas toujours en noir et blanc.

Autres conseils

La programmation déclarative est quand vous dites ce que que vous voulez, et la langue est impératif 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éclarative parce que nous ne spécifions pas « les détails de mise en œuvre » de la construction de la liste.

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

L'un des avantages de la programmation déclarative est qu'il permet au compilateur de prendre des décisions qui pourraient donner lieu à un meilleur code que ce que vous pourriez faire à la main. Courir avec l'exemple SQL, si vous aviez une requête comme

SELECT score FROM games WHERE id < 100;

SQL « compilateur » peut « optimiser » cette requête car il sait que id est un champ indexé - ou peut-être est pas indexé, auquel cas il devra parcourir l'ensemble des données de toute façon. Ou peut-être le moteur SQL sait que c'est le moment idéal pour utiliser tous les 8 cœurs pour une recherche parallèle rapide. , en tant que programmeur, ne sont pas concernés par l'une de ces conditions, et vous ne devez pas écrire votre code pour gérer des cas particuliers de cette façon.

déclarative par rapport Impératif

Un paradigme de programmation est un style fondamental de la programmation informatique. Il existe quatre principaux paradigmes: impératif, déclarative, fonctionnelle (qui est considéré comme un sous-ensemble du paradigme déclarative) et orientée objet

.

programmation déclarative : est un paradigme de programmation qui exprime la logique d'un calcul (Qu'est-ce que) sans décrire son flux de contrôle (Comment). Voici quelques exemples de domaines déclarative langues spécifiques bien connues (DSLs) comprennent CSS, les expressions régulières, et un sous-ensemble de SQL (requêtes SELECT, par exemple) De nombreux langages de balisage tels que HTML, MXML, XAML, XSLT ... sont souvent déclarative. La programmation déclarative essayer de brouiller la distinction entre un programme comme un ensemble d'instructions et un programme comme une affirmation au sujet de la réponse souhaitée.

programmation Impératif : est un paradigme de programmation qui décrit le calcul en termes de déclarations qui changent un état de programme. Les programmes déclaratives peuvent être considérés comme des commandes duellement de programmation ou assertions mathématiques.

Programmation fonctionnelle: est un paradigme de programmation qui traite le calcul comme l'évaluation des fonctions mathématiques et évite les données d'état et mutables. Il met l'accent sur l'application des fonctions, contrairement au style de programmation impératif, qui met l'accent sur les changements d'état. Dans un langage fonctionnel pur, 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 la programmation impérative MSDN , boucles à travers les numéros 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 on est ni meilleur ni pire que l'autre. Le premier exemple nécessite plus de code, mais le code est testable, et l'approche impérative vous donne un contrôle total sur les détails de mise en œuvre. Dans le deuxième exemple, le code est sans doute plus facile à lire; Cependant, LINQ ne vous donne pas le contrôle sur ce qui se passe dans les coulisses. Vous devez faire confiance que LINQ fournira le résultat demandé.

Je vais ajouter un autre exemple qui apparaît rarement dans les discussions de programmation déclarative / impératif: l'interface utilisateur

En C #, vous pouvez construire une interface utilisateur en utilisant différentes technologies.

Sur la fin impératif, vous pouvez utiliser DirectX ou OpenGL pour dessiner très impérieusement vos boutons, cases à cocher, etc ... ligne par ligne (ou vraiment, triangle par triangle). Il est à vous dire comment dessiner l'interface utilisateur.

A la fin déclarative, vous avez WPF. Vous écrivez essentiellement du XML (ouais, ouais, « XAML » sur le plan technique) et le cadre fait le travail pour vous. Vous dites que ce que l'interface utilisateur ressemble. Il appartient au système de savoir comment le faire.

Quoi qu'il en soit, juste une autre chose à penser. Tout simplement parce que une langue est déclarative ou ne impératif veut pas dire qu'il ne possède pas certaines caractéristiques de l'autre.

En outre, l'un des avantages de la programmation déclarative est à cette fin est généralement plus facile à comprendre à la lecture du code alors impératif vous donne un contrôle plus précis sur l'exécution.

L'essentiel de tout:

déclarative -> what que vous voulez faire

Impératif -> how vous voulez le faire

Toutes les réponses ci-dessus et d'autres messages en ligne mention suivante:

  • déclarative programmation, vous écrivez du 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 comment y parvenir . Pour une partie du programme à être plus déclarative, d'autres parties doivent fournir l'abstraction pour masquer les détails de mise en œuvre (qui sont les codes impératifs ).

  • par exemple., LINQ est plus déclarative que les boucles (pour, tout, etc.), par exemple, vous pouvez utiliser list.Where() pour obtenir une nouvelle liste filtrée. Pour que cela fonctionne, Microsoft a fait tout le levage de charges lourdes derrière l'abstraction LINQ.

En fait, l'une des raisons de programmation fonctionnelle et les bibliothèques fonctionnelles sont plus déclarative est parce qu'ils ont abstraire loin des boucles et des créations de la liste, se cachant tous les détails de mise en œuvre (les plus probables des codes impératifs avec boucles) derrière la scène.

Dans tout programme, vous aurez toujours les deux codes impératifs et déclaratives, ce que vous devriez viser est de cacher tous les impératif codes derrière les abstractions, de sorte que d'autres parties du programme peuvent les utiliser < strong> déclarative .

Enfin, bien que la programmation fonctionnelle et LINQ peuvent rendre votre programme plus déclarative, vous pouvez toujours le rendre encore plus déclarative en fournissant plus des abstractions. Par exemple:

// JavaScript example

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


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

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

J'ai aimé une explication d'un cours Cambridge + leurs exemples:

  • déclarative - spécifier ce pour faire, comment pour le faire
    • .: HTML décrit par exemple ce qui devrait apparaître sur une page web, pas comment il devrait être dessiné à l'écran
  • Impératif - spécifier que et comment
    • int x; - ce que (déclarative)
    • x=x+1; - comment
  

programmation Impératif exige des développeurs de définir étape par étape   doit être exécuté le code. Pour donner des directives de façon impérative,   vous dites: « Allez à 1st Street, tournez à gauche sur Main, conduire deux blocs,   tourner à droite sur Maple, et descendre à la troisième maison sur la gauche. » La   la version déclarative peut sembler quelque chose comme ceci: « Drive à Sue   . Maison » On dit comment faire quelque chose; l'autre dit ce qui doit être   fait.

     

Le style déclaratif a deux avantages sur le style impératif:

     
      
  • Il ne force pas le voyageur à mémoriser une longue série d'instructions.
  •   
  • Il permet au voyageur d'optimiser la route si possible.
  •   

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

La différence a surtout à voir avec le niveau global de l'abstraction. Avec déclarative, à un moment donné, vous êtes si loin des différentes étapes que le programme a beaucoup de latitude en ce qui concerne la façon d'obtenir le résultat.


Vous pouvez regarder chaque pièce d'instruction comme relevant quelque part sur un continuum:

Degré d'abstraction:

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

déclarative Exemple réel:

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

Impératif Exemple réel:

  1. Allez dans la bibliothèque
  2. Trouver Syst'eme Organisation (carte Catalogue - Old school)
  3. recherche comment utiliser des catalogues de cartes (Vous avez oublié aussi, à droite)
  4. Figure comment. Étagères sont étiquetés et organisés
  5. Découvrez comment les livres sont organisés sur une étagère.
  6. Référence croisée emplacement du livre de catalogue de cartes avec système d'organisation pour trouver ledit livre.
  7. Prendre livre à un système de check-out.
  8. Vérifiez.

Programmation Impératif est dit explicitement l'ordinateur ce qu'il faut faire et comment le faire, comme spécifiant l'ordre et comme

C #:

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

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

C # est un langage de programmation beaucoup plus impératif, mais certaines fonctionnalités C # sont plus déclarative, 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 écrit impérieusement:

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

(exemple de wikipedia Linq)

  

Dans l'informatique, la programmation déclarative est un paradigme de programmation qui exprime la logique d'un calcul sans décrire son flux de contrôle.

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

en un mot de la langue déclarative est plus simple car il n'a pas la complexité du flux de contrôle (boucles, si les déclarations, etc.)

Une bonne comparaison est 'code-behind' modèle du ASP.Net. Vous avez déclaratives fichiers « .ASPX », puis les fichiers de code l'impératif « aspx.cs ». Je trouve souvent que si je peux faire tout ce que je dois dans la moitié déclarative du script beaucoup plus de gens peuvent suivre ce qui se fait.

Philip Roberts ici:

  • Programmation Impératif indique à la machine comment faire quelque chose (pour résultat ce que vous voulez arriver)
  • La programmation déclarative indique à la machine ce que vous voulez arriver (et l'ordinateur chiffres sur la façon de le faire)

Deux exemples:

1. Doubler tous les numéros dans un tableau

Impérativement:

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éclarative:

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. La somme de tous les éléments dans une liste

Impérativement

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éclarative

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, muter, et retourner cette nouvelle valeur (comment de faire quelque chose), alors que les exemples déclaratives exécutent sur une entrée donnée et retourner la nouvelle valeur sur la base initiale entrée (c.-à-ce que nous voulons arriver).

Programmation Impératif < br> Un langage de programmation qui exige de la discipline de programmation tels que C / C ++, Java, COBOL, FORTRAN, Perl et JavaScript. Les programmeurs d'écriture dans ces langues doivent développer un ordre approprié des actions afin de résoudre le problème, sur la base d'une connaissance du traitement et de la programmation des données.

La programmation déclarative < br> Un langage informatique qui ne nécessite pas l'écriture logique de programmation traditionnelle; Les utilisateurs se concentrent sur la définition entrée et de sortie plutôt que les étapes du programme requis dans un langage de programmation procédural comme le C ++ ou Java.

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

Il suffit d'ajouter un autre exemple en termes de développement d'applications mobiles. Dans iOS et Android, nous avons les constructeurs d'interface, où l'on peut définir l'interface utilisateur des applications.

L'interface utilisateur dessiné à l'aide de ces constructeurs sont de nature déclarative, où nous glisser et déposer les composants. Le draeing actuel se fait en dessous et réalisée par le cadre et le système.

Mais on peut aussi tirer l'ensemble des composants dans le code, et qui est impératif dans la nature.

En outre, de nouvelles langues comme angulaire JS se concentre sur la conception UIs déclarative et nous pouvons voir beaucoup d'autres langues qui offrent le même support. Comme JAVA doesnot ont une bonne façon déclarative de tirer des applications de bureau natives en Java Swing ou JAVA FX, mais dans un avenir proche ils pourraient.

programme déclaratif est juste des données pour son un peu plus ou moins mise en œuvre / vm impératif « universel ».

points positifs: spécifiant seulement les données, dans certains hardcoded (et vérifié) le format, est plus simple et moins sujette aux erreurs que la spécification variante de un algorithme impératif directement. certaines spécifications complexes que ne peuvent pas être écrits directement, uniquement sous une forme DSL. meilleur et fréq utilisés dans les structures de données est DSLs ensembles et des tables. parce que vous avez pas des dépendances entre les éléments / lignes. et quand vous havent dépendances vous avez la liberté de modifier et de la facilité de soutien. (Comparer par exemple des modules avec des classes - avec des modules vous heureux et les classes que vous avez des problèmes fragile de classe de base) tous les biens de déclarativité et DSL suit immédiatement les avantages de ce que les structures de données (tables et ensembles). Un autre avantage - vous pouvez changer la mise en œuvre de vm langage déclaratif, si DSL est plus ou moins abstraite (bien conçu). faire la mise en œuvre parallèle, par exemple. ou port à d'autres os, etc. toutes les bonnes interfaces ou protocoles d'isolement modulaires vous donne une telle spécifiées liberté et easyness de soutien.

Inconvénients: vous devinez juste. générique (et paramétrés par DSL) implémentation de l'algorithme / vm impératif peut être plus lente et / ou de la mémoire d'une faim spécifique. dans certains cas. si que les cas sont rares - tout oublier, que ce soit lent. si elle est frequient - vous pouvez toujours prolonger votre DSL / vm pour ce cas. ralentissant quelque part tous les autres cas, bien sûr ...

P.S. Cadres est à mi-chemin entre DSL et impératif. et que toutes les solutions à mi-chemin ... ils combine, pas d'avantages déficiences. ils pas si sûr et pas si vite :) regarder jack-of-all-trades HASKELL - il est à mi-chemin entre fort simple, ML et metaprog flexibles Prolog et ... quel monstre il est. vous pouvez regarder Prolog comme Haskell avec des fonctions booléennes uniquement / prédicats. et la simplicité de sa flexibilité est contre Haskell ...

Je me demande pourquoi personne ne l'a mentionné des classes d'attributs comme outil de programmation déclarative en C #. La réponse populaire de cette page vient de parler LINQ comme outil de programmation déclarative.

Selon Wikipedia

  

langues déclaratives communes comprennent celles des langages de requête de base de données   (Par exemple, SQL, XQuery), les expressions régulières, la programmation logique,   programmation fonctionnelle et les systèmes de gestion de configuration.

LINQ, comme une syntaxe fonctionnelle, est sans aucun doute une méthode déclarative, mais classes d'attributs en C #, comme outil de configuration, sont déclaratives aussi. Voici un bon point de départ pour en lire davantage: rapide Vue d'ensemble de C # Attribute programmation

De ma compréhension, les deux termes ont des racines dans la philosophie, il existe plusieurs types déclaratifs et impératifs de la connaissance. Les connaissances déclaratives sont des affirmations de la vérité, des déclarations de fait comme axiomes mathématiques. il raconte vous quelque chose. connaissances Impératif, ou la procédure, vous explique pas à pas comment arriver à quelque chose. Voilà ce que la définition d'un algorithme est essentiellement. Si vous voulez, comparer un langage de programmation informatique avec la langue anglaise. phrases déclaratives indiquent quelque chose. Un exemple ennuyeux, mais voici une façon déclarative d'afficher si deux nombres sont égaux entre eux, en Java:

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

phrases en anglais Impératif, d'autre part, donnent une commande ou faire une sorte de demande. programmation Impératif, alors, est juste une liste de commandes (ce faire, le faire). Voici un moyen essentiel d'afficher si deux nombres sont égaux entre eux ou non tout en acceptant l'entrée d'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);
}

Pour l'essentiel, les connaissances déclaratives saute certains éléments pour former une couche d'abstraction sur ces éléments. La programmation déclarative fait la même chose.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top