Frage

Ich habe das Suchen im Internet für eine Definition für deklarative und imperative Programmierung suchen, die etwas Licht für mich vergossen würden. Jedoch wird die verwendete Sprache auf einige der Ressourcen, dass ich gefunden habe, ist erschreckend - zum Beispiel bei Wikipedia . Hat jemand ein reale Welt Beispiel, dass sie mir zeigen konnten, dass eine Perspektive zu diesem Thema bringen könnte (vielleicht in C #)?

War es hilfreich?

Lösung

Ein großes C # Beispiel für deklarative vs. imperative Programmierung ist LINQ.

Mit Imperativ Programmierung Sie den Compiler sagen, was Sie wollen passieren, Schritt für Schritt.

Zum Beispiel, lassen Sie sich mit dieser Sammlung zu starten, und wählen Sie die ungeraden Zahlen:

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

Mit imperativen Programmierung, wir durch diesen Schritt würde, und entscheiden, was wir wollen:

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

Hier wir sagen:

  1. Erstellen Sie eine Ergebnis Sammlung
  2. Schritt durch jede Nummer in der Sammlung
  3. Überprüfen Sie die Nummer, wenn es seltsam ist, fügen Sie es zu den Ergebnissen

Mit deklarativem Programmierung, auf der anderen Seite, schreiben Sie Code, der beschreibt, was Sie wollen, aber nicht unbedingt, wie es zu erhalten (erklärt die gewünschten Ergebnisse, aber nicht der Schritt-für-Schritt) :

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

Hier wir sagen: „Gib uns alles, wo es ist seltsam“, nicht „Schritt durch die Sammlung. Sie diese Option, wenn es seltsam ist, fügen Sie es zu einem Ergebnis Sammlung.“

In vielen Fällen Code wird eine Mischung aus beiden Design sein, auch, so ist es nicht immer schwarz-weiß.

Andere Tipps

deklarative Programmierung ist, wenn Sie sagen, was Sie wollen, und imperative Sprache ist, wenn Sie sagen, wie bekommen, was Sie wollen.

Ein einfaches Beispiel in 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)

Das erste Beispiel ist deklaratives, weil wir alle nicht angeben „Implementierungsdetails“ die Liste der Gebäude.

in einem C # Beispiel zu binden, in der Regel, LINQ Ergebnisse in einem deklarativen Stil, weil man nicht sagen, wie zu erhalten, was Sie wollen; Sie sagen nur was Sie wollen. Man könnte das gleiche über SQL sagen.

Ein Vorteil der deklarativen Programmierung ist, dass es die Compiler, um Entscheidungen ermöglicht, die in besserem Code führen könnten als das, was man von Hand machen könnte. Laufen mit dem SQL Beispiel, wenn Sie eine Abfrage wie

haben
SELECT score FROM games WHERE id < 100;

die SQL „Compiler“ kann „optimieren“ diese Abfrage, weil es, dass id weiß ein indiziertes Feld ist - oder vielleicht ist es nicht indiziert, wobei in diesem Fall wird es über die gesamten Daten ohnehin auf Iterierte hat. Oder vielleicht die SQL-Engine weiß, dass dies die perfekte Zeit, um alle 8 Cores für eine schnelle parallele Suche zu verwenden. Sie , als Programmierer, die nicht mit einer dieser Bedingungen betroffen, und Sie haben keinen Code schreiben auf diese Weise einen besonderen Fall zu behandeln.

deklarative vs. Imperative

Paradigma Programmierung eine grundlegende Art der Computer-Programmierung ist. Es gibt vier Hauptparadigmen. Imperativ, deklarative, funktional (die eine Teilmenge des deklarativen Paradigma betrachtet wird) und objektorientierte

deklarativ Programmierung: ist ein Programmierparadigma, das die Logik einer Berechnung zum Ausdruck bringt (Was tun), ohne seinen Kontrollfluss zu beschreiben (Wie macht). Einige bekannte Beispiele für deklarative domänenspezifische Sprachen (DSLs) umfassen CSS, reguläre Ausdrücke, und eine Teilmenge von SQL (SELECT-Abfragen, zum Beispiel) Viele Markup-Sprachen wie HTML, MXML, XAML, XSLT ... sind oft deklarative. Die deklarative Programmierung versuchen, den Unterschied zwischen einem Programm als eine Reihe von Anweisungen und ein Programm als eine Aussage über die gewünschte Antwort zu verwischen.

Imperative Programmierung : ist ein Programmierparadigma, die Berechnung in Bezug auf die Aussagen beschreibt, die einen Programmzustand verändern. Die deklarativen Programme können dually als Programmierbefehle oder mathematische Aussagen betrachtet werden.

Funktionale Programmierung: ist ein Programmierparadigma, dass behandelt Berechnung wie die Auswertung von mathematischen Funktionen und vermeidet Zustand und veränderbare Daten. Er betont die Anwendung von Funktionen, im Gegensatz zu dem Imperativ Programmierstil, die Zustandsänderungen betont. In einer reinen funktionalen Sprache wie Haskell, sind alle Funktionen, ohne Nebenwirkungen und Zustandsänderungen werden nur als Funktionen dargestellt, die den Staat zu verwandeln.

Das folgende Beispiel für imperative Programmierung in MSDN , die Zahlen Schleifen durch 1 bis 10, und findet die geraden Zahlen.

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);

ergeben Beide Beispiele das gleiche Ergebnis, und man ist weder besser noch schlechter als die andere. Das erste Beispiel erfordert mehr Code, aber der Code ist prüfbar, und der Imperativ Ansatz gibt Ihnen die volle Kontrolle über die Details der Implementierung. In dem zweiten Beispiel ist der Code, der wohl besser lesbar; jedoch nicht LINQ geben Ihnen Kontrolle darüber, was hinter den Kulissen passiert. Sie müssen darauf vertrauen, dass LINQ das angeforderte Ergebnis liefern wird.

Ich werde ein anderes Beispiel hinzufügen, dass selten erscheint in deklarativen / imperativen Programmierung Diskussion: die Benutzeroberfläche

In C # können Sie eine Benutzeroberfläche mit verschiedenen Technologien aufzubauen.

Auf dem Imperativ Ende könnten Sie DirectX oder OpenGL verwenden sehr dringend Ihre Schaltflächen, Kontrollkästchen zu zeichnen, etc ... line-by-line (oder wirklich, Dreieck Dreieck). Es ist an Ihnen zu sagen, wie die Benutzeroberfläche zu ziehen.

Am deklarativen Ende haben Sie WPF. Sie schreiben im Grunde eine XML (ja, ja, „XAML“ technisch) und der Rahmen macht die Arbeit für Sie. Sie sagen, was die Benutzeroberfläche aussieht. Es ist das System bis herauszufinden, wie es zu tun.

Wie auch immer, nur eine andere Sache zu denken. Nur weil eine Sprache ist deklarative oder Imperativ bedeutet nicht, dass es nicht bestimmte Funktionen des anderen hat.

Auch ein Vorteil der deklarative Programmierung ist, dass Zweck in der Regel leichter versteht sich beim Lesen der Code während Imperativ Sie eine feinere Kontrolle über die Ausführung gibt.

Der Kern des Ganzen:

deklarative -> what Sie wollen getan

Imperative -> how Sie wollen es getan

Alle oben genannten Antworten und andere Online-Beiträge erwähnen folgende:

  • Mit deklarative Programmierung, schreiben Sie Code, der beschreibt, was Sie wollen, aber nicht unbedingt, wie es bekommen
  • Sie sollten lieber deklarative Programmierung über die imperativen Programmierung

Was sie haben uns nicht gesagt, ist , wie es zu erreichen . Für einen Teil des Programms sein deklarative, müssen andere Teile bieten die Abstraktion die Implementierungsdetails zu verbergen (die die Imperativ Codes sind).

  • z. B., ist LINQ mehr deklarative als Schleife (for, while, etc.), zum Beispiel, können Sie list.Where() verwenden, um eine neue gefilterte Liste zu bekommen. Damit dies funktioniert, hat Microsoft alle schweres Heben hinter der LINQ Abstraktion getan.

In der Tat einer der Gründe, die funktionale Programmierung und Funktionsbibliotheken mehr deklarative ist, weil sie weg Schleifen und Liste Kreationen abstrahiert haben, wird alle Implementierungsdetails versteckt (wahrscheinlich zwingend notwendig, Codes mit Schleifen) hinter der Szene.

In jedem Programm werden Sie beide immer unbedingt haben und deklarative Codes, was Sie sollten Ziel ist, alle Imperativ Codes hinter den Abstraktionen zu verstecken, so dass andere Teile des Programms sie verwenden können < strong> deklarativ .

Schließlich obwohl die funktionale Programmierung und LINQ können Ihr Programm mehr deklarative machen, können Sie immer machen es noch deklarative von mehr Abstraktionen bieten. Zum Beispiel:

// 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();

mochte ich eine Erklärung von einem Cambridge Kurs + ihre Beispiele:

  • deklarative - geben Sie was zu tun, nicht, wie , es zu tun
    • Z. B .: HTML beschreibt, was auf einer Webseite angezeigt werden soll, nicht, wie sie auf dem Bildschirm gezeichnet werden sollen
  • Imperative - geben Sie beide was und wie
    • int x; - was (deklarativen)
    • x=x+1; - wie
  

Imperative Programmierung erfordert Entwickler Schritt für Schritt zu definieren, wie   Code ausgeführt werden sollte. Geben Richtungen in einer imperativen Art und Weise,   Sie sagen: „Gehen Sie zu 1st Street, biegen Sie links Haupt, zwei Blöcke fahren,   biegen Sie rechts auf Maple, und Anschlag am dritten Haus auf der linken Seite.“Die   deklarative Version könnte etwa so klingen: „Drive Sues   . Haus“Man sagt, wie etwas zu tun; der andere sagt, was sein muss   getan.

     

Der deklarative Stil hat zwei Vorteile gegenüber dem Imperativ Stil:

     
      
  • Es wird nicht die Reisenden zwingen, eine lange Reihe von Anweisungen zu speichern.
  •   
  • Sie ermöglicht den Reisenden die Route zu optimieren, wenn möglich.
  •   

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

Der Unterschied hat vor allem mit dem Gesamtniveau der Abstraktion zu tun. Mit deklarative, an einem gewissen Punkt, du bist so weit weg von den einzelnen Schritten, dass das Programm viel Spielraum hat darüber, wie Ihr Ergebnis zu erhalten.


Sie bei jedem Stück Anweisung aussehen könnten, als irgendwo auf einem Kontinuum fallen:

Abstraktionsgrade:

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

deklarative Real World Beispiel:

  1. Librarian, überprüfen Sie bitte mir eine Kopie von Moby Dick. (Librarian nach eigenem Ermessen wählt die beste Methode zur Durchführung der Anfrage)

Imperative Real World Beispiel:

  1. Gehen Sie in die Bibliothek
  2. Suchen Buchorganisationssystem (Karten-Katalog - Alte Schule)
  3. Forschung wie Karten Kataloge verwenden (Sie haben vergessen, auch rechts)
  4. Finde heraus, wie Regale sind beschriftet und organisiert.
  5. Finde heraus, wie Bücher in einem Regal organisiert sind.
  6. Cross-Nachschlagewerk Standort aus Kartenkatalog mit Organisationssystem das Buch zu finden.
  7. Buch Nehmen Sie zum Check-out-System.
  8. Überprüfen Sie heraus buchen.

Imperative Programmierung sagt den Computer explizit was zu tun ist, und wie es zu tun, wie um die Angabe und so

C #:

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

deklarative ist, wenn man dem Computer sagen, was zu tun ist, aber nicht wirklich, wie es geht. Datalog / Prolog ist die erste Sprache, die in dieser Hinsicht in den Sinn kommt. Im Grunde ist alles deklarative. Sie können nicht wirklich garantieren, um.

C # ist eine viel imperative Programmiersprache, aber bestimmte C # -Funktionen sind deklarative, wie Linq

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

Das gleiche unbedingt geschrieben werden:

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

(Beispiel aus wikipedia Linq)

  

In der Informatik deklarative Programmierung ist ein Programmierparadigma, das die Logik einer Berechnung zum Ausdruck bringt, ohne seinen Kontrollfluss beschreibt.

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

Kurz gesagt die deklarative Sprache ist einfacher, weil es die Komplexität des Steuerflusses fehlt (Schleifen, if-Anweisungen, etc.)

Ein guter Vergleich ist der ASP.Net 'Code-Behind' -Modell. Sie haben deklarative ‚.ASPX‘ Dateien und dann der Imperativ ‚aspx.cs‘ Code-Dateien. Ich oft feststellen, dass, wenn ich alles was ich brauche in der deklarativen Hälfte des Skripts können tun können, viel mehr Menschen folgen, was getan wird.

Diebstahl von Philip Roberts hier :

  • Imperative Programmierung erzählt die Maschine, wie etwas zu tun (was, was Sie wollen passieren)
  • deklarative Programmierung erzählt die Maschine, was Sie passieren möchte (und die Computer-Figuren, wie es zu tun)

Zwei Beispiele:

1. Verdopplungs alle Zahlen in einem Array

imperativ:

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]

Deklaratives:

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. Summieren aller Elemente in einer Liste

imperativ

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

Deklaratives

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

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

Beachten Sie, wie die zwingenden Beispiele eine neue Variable beinhalten die Erstellung, mutiert es, und die Rückkehr dieser neue Wert (dh, wie etwas geschehen lassen), während die deklarative Beispiele für eine gegebene Eingabe ausführen und gibt den neuen Wert bezogen auf die Anfangs Eingang (also das, was wir wollen passieren).

Imperative Programmierung < br> Eine Programmiersprache, die Disziplin der Programmierung wie C / C erfordert ++, Java, COBOL, Fortran, Perl und JavaScript. Programmierer in solchen Sprachen zu schreiben müssen eine richtige Reihenfolge der Maßnahmen entwickeln, um das Problem zu lösen, basierend auf der Kenntnis der Datenverarbeitung und Programmierung.

deklarative Programmierung < br> Ein Computersprache, die das Schreiben nicht traditionelle Programmierlogik erfordert; Anwender konzentrieren, um die Ein- und Ausgabe statt der Programmschritte erforderlich in einer prozeduralen Programmiersprache wie C ++ oder Java zu definieren.

deklarative Programmierbeispiele sind CSS, HTML, XML, XSLT, REGx.

Nur ein weiteres Beispiel in Bezug auf die mobile App Entwicklung hinzuzufügen. In iOS und Android haben wir Interface-Builder, wo wir UI der Anwendungen definieren können.

Die Benutzeroberfläche erstellt unter Verwendung dieser Builders in der Natur deklarative sind, wo wir die Komponenten per Drag & Drop. Der tatsächliche draeing geschieht unter und durch den Rahmen und das System durchgeführt werden.

Wir können aber auch die ganzen Komponenten in Code zeichnen, und das ist zwingend notwendig, in der Natur.

Auch einige neue Sprachen wie Angular JS konzentriert sich auf UIs deklarativ Gestaltung und wir können eine Menge anderer Sprachen bietet die gleiche Unterstützung sehen. Wie JAVA hat doesnot gut jede deklarative Weise nativen Desktop-Anwendungen in Java Swing oder JAVA FX zu ziehen, aber in naher Zukunft sie nur könnte.

deklaratives Programm ist nur Daten für seine etwas mehr oder weniger „universal“ zwingend notwendig, Implementierung / vm.

Pluspunkte: um nur Daten, in einigen fest einprogrammiert (und kontrolliert) Format angeben, ist einfacher und weniger fehleranfällig als direkt Variante einiger Imperativ Algorithmus angeben. einige komplexe Spezifikationen kann nicht nur direkt geschrieben werden, nur in einigen DSL-Form. beste und Freq in DSLs Datenstrukturen verwendet wird, Sets und Tabellen. weil Sie keine Abhängigkeiten zwischen den Elementen / Zeilen. und wenn Sie Abhängigkeiten havent haben Sie die Freiheit zu ändern und Unterstützung zu erleichtern. (Vergleiche beispielsweise Module mit Klassen - mit Modulen, die Sie glücklich und mit Klassen, die Sie haben fragile Basisklasse Problem) Alle Waren von declarativeness und DSL folgt unmittelbar aus Nutzen dieser Datenstrukturen (Tabellen und Sets). ein weiteres Plus - Sie können Implementierung von deklarativen Sprache vm ändern, wenn DSL mehr oder weniger abstrakt (gut gestaltet) ist. macht parallele Implementierung, zum Beispiel. oder Portierung auf andere Betriebssystem usw. alle gut specifed modulare Trenn Schnittstellen oder Protokollen gibt Ihnen diese Freiheit und Leichtigkeit der Unterstützung.

minuse: Sie erraten, rechts. Generika (und von DSL parametriert) zwingend notwendig Algorithmus / vm Umsetzung langsamer hungrig und / oder Speicher sein kann als spezifisches. in manchen Fällen. wenn durch diese Fälle selten ist - es einfach vergessen, lassen Sie es langsam sein. wenn es frequient ist - können Sie immer Ihre DSL / vm für diesen Fall erweitern. irgendwo verlangsamt alle anderen Fälle nach unten, sicher ...

P. S. Frameworks ist auf halbem Weg zwischen DSL und zwingend notwendig. und wie alle auf halbem Wege Lösungen ... sie verbindet Mängel, keine Vorteile. sie nicht so sicher und nicht so schnell :) Blick auf Hansdampf haskell - es ist auf halbem Weg zwischen starken einfacher ML und flexible metaprog Prolog und ... was für ein Monster ist. Sie können mit boolean-only-Funktionen / Prädikate als Haskell in Prolog suchen. und wie einfach seine Flexibilität ist gegen Haskell ...

Ich frage mich nur, warum niemand Attributklassen als deklarativen Programmierwerkzeug in C # erwähnt hat. Die beliebte Antwort auf dieser Seite wird über LINQ als deklaratives Programmiertool gerade gesprochen hat.

Laut Wikipedia

  

Gemeinsame deklarativen Sprachen umfassen die der Datenbankabfrage Sprachen   (Beispielsweise SQL, XQuery), reguläre Ausdrücke, Logikprogrammierung,   funktionale Programmierung und Konfigurationsmanagement-Systeme.

So LINQ als funktionelle Syntax, ist auf jeden Fall eine deklarative Methode, aber Attribut Klassen in C #, als Konfigurationswerkzeug, sind zu deklarative. Hier ist ein guter Ausgangspunkt um mehr darüber zu lesen: Schnell Übersicht von C # Attribute Programmierung

Von meinem Verständnis, beiden Begriffe haben ihre Wurzeln in der Philosophie gibt es deklarative und zwingend notwendig Arten von Wissen. Deklarative Wissen sind Behauptungen der Wahrheit, Tatsachenbehauptungen wie Mathematik Axiome. Es sagt Du etwas. Imperative oder prozedurales Wissen, erfahren Sie Schritt für Schritt, wie auf etwas zu kommen. Das ist, was die Definition eines Algorithmus im Wesentlichen ist. Wenn würden Sie, vergleicht Sprache einen Computer-Programmiersprache mit dem Englisch. Deklarativsätze angeben etwas. Ein langweiliges Beispiel, aber hier ist eine deklarative Art der Darstellung, ob zwei Zahlen gleich zueinander sind, in Java:

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

Imperative Sätze in Englisch, auf der anderen Seite, geben Sie einen Befehl oder eine Art von Anfrage machen. Imperative Programmierung, dann ist nur eine Liste von Befehlen (dies tut, tun). Hier ist eine zwingende Art der Darstellung, ob zwei Zahlen sie gleich sind oder nicht, während die Annahme von Benutzereingaben, in 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);
}

Im Wesentlichen deklaratives Wissen überspringt bestimmte Elemente eine Abstraktionsschicht über jene Elemente zu bilden. Deklarative Programmierung macht das gleiche.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top