Was ist der Unterschied zwischen einer "Funktion" und einer "Prozedur"?


202

Im Allgemeinen hören wir alle von den Funktionen oder Verfahren in Programmiersprachen. Ich habe jedoch gerade herausgefunden, dass ich diese Begriffe fast austauschbar verwende (was wahrscheinlich sehr falsch ist).

Meine Frage lautet also:

Was ist der Unterschied in Bezug auf Funktionalität, Zweck und Verwendung?

Ein Beispiel wäre willkommen.



6
Ich denke, SICP macht das richtig. Funktionen existieren nur in der Mathematik und repräsentieren das, was Wissen ist. Prozeduren existieren in Programmiersprachen (einschließlich funktionaler) und repräsentieren das Wissen. Funktion : sqrt (x) = das y, so dass y ^ 2 = x. Vorgehensweise : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0)).
mk12

Antworten:


294

Eine Funktion gibt einen Wert zurück und eine Prozedur führt nur Befehle aus.

Die Namensfunktion stammt aus der Mathematik. Es wird verwendet, um einen Wert basierend auf der Eingabe zu berechnen.

Eine Prozedur ist ein Befehlssatz, der der Reihe nach ausgeführt werden kann.

In den meisten Programmiersprachen können sogar Funktionen eine Reihe von Befehlen enthalten. Daher besteht der Unterschied nur in der Rückgabe eines Wertteils.

Wenn Sie jedoch eine Funktion sauber halten möchten (sehen Sie sich nur die funktionalen Sprachen an), müssen Sie sicherstellen, dass eine Funktion keine Nebenwirkungen hat.


Wie können Sie sicherstellen, dass weder in einer imperativen (Java, c) noch in einer deklarativen Sprache (Scala, Schema) Nebenwirkungen auftreten?
Orlybg

1
@orlybg, in deklarativen Sprachen ergibt sich die Konsistenz aus der Implementierung der Sprache. Ihre Anwendungsbereichsbeschränkungen verhindern, dass sie Nebenwirkungen haben. Auf der anderen Seite nutzen imperative Sprachen ihre Nebenwirkungen explizit aus. Nebenwirkungen sind nicht immer schlimm.
Tharindu Rusira

Ich lese das folgende Ada-Tutorial ( goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html ), in dem der zweite Absatz dieser Seite mit "Prozeduren in Ada ähneln denen in Pascal" beginnt Eine Prozedur kann return-Anweisungen enthalten. " Ist das ein Fehler im Text? Oder bedeutet es, dass es return-Anweisungen haben kann, aber keine Werte zurückgibt?
Jviotti

3
In Pascal haben Prozeduren keine return-Anweisungen, sondern nur Funktionen. Muss ein Fehler im Text sein. Eine Prozedur kann jedoch eine "exit" -Anweisung haben, die als "return" -Anweisung ohne Argumente fungieren kann, dh keine Rückgabewerte.
Eric Fortier

Funktion kann Eingaben erhalten und nur eine Ausgabe zurückgeben. Prozedur oder Makro können Eingaben erhalten und keine Daten zurückgeben, sondern nur die Anzahl der Anweisungen ausführen. Der Hauptunterschied besteht darin, dass die Prozedur keinen Datentyp zurückgeben kann.
EsmaeelE

42

Dies hängt vom Kontext ab.

In Pascal-ähnlichen Sprachen sind Funktionen und Prozeduren unterschiedliche Entitäten, die sich darin unterscheiden, ob sie einen Wert zurückgeben oder nicht. Sie verhalten sich anders. die Sprachsyntax (z. B. Prozeduraufrufe bilden Anweisungen; Sie können keinen Prozeduraufruf innerhalb eines Ausdrucks verwenden, während Funktionsaufrufe keine Anweisungen bilden, Sie müssen sie in anderen Anweisungen verwenden). Daher unterscheiden von Pascal gezüchtete Programmierer zwischen diesen.

In C-ähnlichen Sprachen und vielen anderen zeitgenössischen Sprachen ist diese Unterscheidung weg; In statisch typisierten Sprachen sind Prozeduren nur Funktionen mit einem lustigen Rückgabetyp. Dies ist wahrscheinlich der Grund, warum sie austauschbar verwendet werden.

In funktionalen Sprachen gibt es normalerweise keine Prozedur - alles ist eine Funktion.


Die Dokumentation von Programmiersprachen kann Funktionen und Prozeduren nach Belieben aufrufen, da die Benutzer jeden Namen akzeptieren, da der Hintergrund hinter diesen Namen längst verwaschen wurde.
Arne Babenhauserheide

18

Beispiel in C:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

Obwohl Sie beachten sollten, dass der C-Standard nicht über Prozeduren spricht, sondern nur über Funktionen.


4
... der C-Standard spricht nicht von Prozeduren, sondern nur von Funktionen. Das liegt daran, dass es nur Funktionen hat. Eine Funktion, die nichts zurückgibt, ist a void function. Kernighan & Ritchie Ch 1.7: "In C entspricht eine Funktion einer Unterroutine oder Funktion in Fortran oder einer Prozedur oder Funktion in Pascal." Mit anderen Worten ... diese Antwort ist falsch.
Mogsdad

8
Die Antwort ist nicht falsch und ein gutes Beispiel für den Unterschied zwischen reinen Funktionen und Prozeduren. K & R nannte jede Unterroutine eine "Funktion", um die Dinge einfach zu halten, aber eine Unterroutine mit Nebenwirkungen ist in der Tat eine "Prozedur", keine "Funktion" im kanonischen Sinne aus der Mathematik. C könnte eine bessere Sprache sein, wenn es reale Funktionen von Prozeduren unterscheidet. Dies würde bei der statischen Analyse, Leistungsoptimierung und Parallelisierung helfen.
Sam Watkins

12

Im Allgemeinen ist eine Prozedur eine Folge von Anweisungen.
Eine Funktion kann dieselbe sein, gibt jedoch normalerweise ein Ergebnis zurück.


11

Es gibt einen Begriff Unterprogramm oder Unterprogramm, das für einen parametrisierten Code steht, der von verschiedenen Stellen aus aufgerufen werden kann.

Funktionen und Prozeduren sind Implementierungen davon. Normalerweise geben Funktionen Werte zurück und Prozeduren geben nichts zurück.


6

Grundlegende Unterschiede

  • Eine Funktion muss einen Wert zurückgeben, in gespeicherten Prozeduren ist dies jedoch optional: Eine Prozedur kann 0 oder n Werte zurückgeben.
  • Funktionen können nur Eingabeparameter haben, während Prozeduren Eingabe- / Ausgabeparameter haben können.
  • Für eine Funktion muss ein Eingabeparameter verwendet werden, für eine gespeicherte Prozedur können jedoch 0 bis n Eingabeparameter verwendet werden.
  • Funktionen können von einer Prozedur aufgerufen werden, während Prozeduren nicht von einer Funktion aufgerufen werden können.

Erweiterte Unterschiede

  • Ausnahmen können von Try-Catch-Blöcken in einer Prozedur behandelt werden, während ein Try-Catch-Block in einer Funktion nicht verwendet werden kann.
  • Wir können uns für das Transaktionsmanagement in einer Prozedur entscheiden, während wir dies in einer Funktion nicht können.

In SQL:

  • Ein Verfahren ermöglicht SELECTsowie DML ( INSERT, UPDATE, DELETE) Aussagen darin, während Funktion erlaubt nur SELECTdarin Aussage.
  • Prozeduren können nicht in einer SELECTAnweisung verwendet werden, während Funktionen in eine SELECTAnweisung eingebettet werden können .
  • Gespeicherte Prozeduren können in SQL-Anweisungen nirgendwo in einem WHERE(oder einem HAVINGoder einem SELECT) Block verwendet werden, wohingegen Funktionen dies können.
  • Funktionen, die Tabellen zurückgeben, können als ein anderes Rowset behandelt werden. Dies kann in einem JOINBlock mit anderen Tabellen verwendet werden.
  • Inline-Funktionen können als Ansichten betrachtet werden, die Parameter annehmen und in JOINBlöcken und anderen Rowset-Operationen verwendet werden können.

3
Diese Antwort ist sehr sprachspezifisch, während die Frage sprachunabhängig war. Die Aussagen hier sind im allgemeinen Fall nicht alle wahr, aber es wäre hilfreich, wenn Sie die Sprache oder Umgebung klären würden, für die Sie sie geltend machen.
Mogsdad

5

Streng genommen gehorcht eine Funktion f der Eigenschaft, dass f (x) = f (y) ist, wenn x = y, dh sie berechnet jedes Mal dasselbe Ergebnis, wenn sie mit demselben Argument aufgerufen wird (und ändert somit nicht den Zustand von System.)

Rand () oder print ("Hallo") usw. sind also keine Funktionen, sondern Prozeduren. Während sqrt (2.0) eine Funktion sein sollte: Es gibt keinen beobachtbaren Effekt oder eine Zustandsänderung, egal wie oft man es aufruft, und es gibt immer 1,41 und einige zurück.


3
Diese Verwendung ist im Zusammenhang mit der "funktionalen" Programmierung relevant. Beachten Sie, dass viele (häufig zwingende) Sprachen, die ihre Unterprogramme "Funktionen" nennen, diese Eigenschaft nicht benötigen.
dmckee --- Ex-Moderator Kätzchen

1
Ich habe nicht vorgeschlagen, dass Programmiersprachen diese Eigenschaft erfordern. Wie auch immer, man kann strenge Funktionen in jeder Sprache schreiben, und ich halte es für eine gute Angewohnheit, so viel wie möglich in sauberen Funktionen zu programmieren und dann die Teile mit einem Hauptverfahren zusammenzukleben.
Ingo

4

Wenn wir hier sprachunabhängig sind, spezifiziert das Verfahren normalerweise eine Reihe von Handlungen, die erforderlich sind, um ein bestimmtes Ergebnis zuverlässig und idempotent zu erzielen. Das heißt, eine Prozedur ist im Grunde ein Algorithmus.

Funktionen hingegen sind ein etwas unabhängiger Code innerhalb eines größeren Programms. Mit anderen Worten, Funktion ist die Implementierung einer Prozedur.


4

Dies ist eine bekannte alte Frage, aber ich möchte einige weitere Einblicke in die Forschung und das Design moderner Programmiersprachen geben.

Grundlegende Antwort

Traditionell (im Sinne einer strukturierten Programmierung ) und informell ist eine Prozedur ein wiederverwendbares Strukturkonstrukt, um "Input" zu haben und etwas Programmierbares zu tun. Wenn innerhalb einer Prozedur etwas getan werden muss, können Sie der Prozedur (tatsächliche) Argumente in einem Prozeduraufruf bereitstellen , der im Quellcode (normalerweise in einer Art Ausdruck) codiert ist, und die Aktionen, die im Prozedurentext codiert sind (bereitgestellt) in der Definition der Prozedur) wird mit der Ersetzung der Argumente in die im Text verwendeten (formalen) Parameter ausgeführt .

Eine Funktion ist mehr als eine Prozedur, da Rückgabewerte auch als "Ausgabe" im Body angegeben werden können. Funktionsaufrufe sind mehr oder weniger mit Prozeduraufrufen identisch, außer dass Sie das Ergebnis des Funktionsaufrufs auch syntaktisch verwenden können (normalerweise als Unterausdruck eines anderen Ausdrucks).

Traditionell werden Prozeduraufrufe (anstelle von Funktionsaufrufen) verwendet, um anzuzeigen, dass keine Ausgabe interessiert sein muss, und es müssen Nebenwirkungen auftreten , um zu vermeiden, dass der Aufruf No-Ops ist, wodurch das zwingende Programmierparadigma betont wird . Viele traditionelle Programmiersprachen wie Pascal bieten sowohl "Prozeduren" als auch "Funktionen", um diesen absichtlichen Unterschied der Stile zu unterscheiden.

(Um klar zu sein, sind die oben erwähnten "Eingaben" und "Ausgaben" vereinfachte Begriffe, die auf den syntaktischen Eigenschaften von Funktionen basieren. Viele Sprachen unterstützen zusätzlich die Übergabe von Argumenten an Parameter durch Referenz / Freigabe, damit Benutzer während der Aufrufe in Argumenten codierte Informationen transportieren können Ein solcher Parameter kann sogar nur als "In / Out-Parameter" bezeichnet werden. Diese Funktion basiert auf der Art der Objekte, die in den Aufrufen übergeben werden, was orthogonal zu den Eigenschaften der Funktion der Prozedur / Funktion ist.)

Wenn das Ergebnis eines Funktionsaufrufs jedoch nicht benötigt wird, kann es einfach (zumindest logisch) ignoriert werden, und Funktionsdefinitionen / Funktionsaufrufe sollten auf diese Weise mit Prozedurdefinitionen / Prozeduraufrufen konsistent sein. ALGOL-ähnliche Sprachen wie C, C ++ und Java bieten alle das Merkmal "Funktion" auf diese Weise: Durch Codieren des Ergebnistyps voidals Sonderfall von Funktionen, die wie herkömmliche Prozeduren aussehen, muss das Merkmal "Prozeduren" nicht bereitgestellt werden "separat. Dies verhindert ein Aufblähen im Sprachdesign.

Da SICP erwähnt wird, ist es auch erwähnenswert, dass in der durch R n RS angegebenen Schemasprache eine Prozedur möglicherweise das Ergebnis der Berechnung zurückgeben muss oder nicht. Dies ist die Vereinigung der traditionellen "Funktion" (Rückgabe des Ergebnisses) und "Prozedur" (Rückgabe von nichts), die im Wesentlichen dem "Funktions" -Konzept vieler ALGOL-ähnlicher Sprachen entspricht (und tatsächlich noch mehr Garantien wie anwendbare Bewertungen der Operanden vor dem Aufruf). Selbst in normativen Dokumenten wie SRFI-96 treten jedoch immer noch altmodische Unterschiede auf .

Ich weiß nicht viel über die genauen Gründe für die Divergenz, aber wie ich erfahren habe, scheinen Sprachdesigner heutzutage glücklicher zu sein, wenn die Spezifikation nicht aufgebläht ist. Das heißt, "Prozedur" als eigenständige Funktion ist nicht erforderlich. Techniken wie voidTyp reichen bereits aus, um die Verwendung zu kennzeichnen, bei der Nebenwirkungen hervorgehoben werden sollten. Dies ist auch natürlicher für Benutzer, die Erfahrungen mit C-ähnlichen Sprachen haben, die seit mehr als einigen Jahrzehnten beliebt sind. Darüber hinaus wird die Verlegenheit in Fällen wie R n RS vermieden, in denen "Prozeduren" tatsächlich "Funktionen" im weiteren Sinne sind.

Theoretisch kann eine Funktion mit einem bestimmten Einheitentyp als Typ des Funktionsaufrufergebnisses angegeben werden, um anzuzeigen, dass das Ergebnis etwas Besonderes ist. Dies unterscheidet die traditionellen Verfahren (bei denen das Ergebnis eines Anrufs nicht interessiert ist) von anderen. Es gibt verschiedene Stile bei der Gestaltung einer Sprache:

  • Wie in R n RS ist es ausreichend, die nicht interessierten Ergebnisse nur als "nicht spezifizierten" Wert (vom nicht spezifizierten Typ, wenn die Sprache dies erwähnen muss) zu markieren, und es reicht aus, ignoriert zu werden.
  • Das uninteressiert Ergebnis als Wert eines speziellen Gerätetyp Die Angabe (zB Kernel ‚s #inert) funktioniert auch.
  • Wenn dieser Typ ein weiterer unterer Typ ist , kann er (hoffentlich) statisch überprüft und als Ausdruckstyp verwendet werden. Der voidTyp in ALGOL-ähnlichen Sprachen ist genau ein Beispiel für diese Technik. ISO C11 _Noreturnist in dieser Art ähnlich, aber subtiler.

Weiterführende Literatur

Als traditionelles Konzept aus der Mathematik gibt es Unmengen schwarzer Magie, die die meisten Menschen nicht kennen. Genau genommen werden Sie wahrscheinlich nicht alle Dinge gemäß Ihren Mathematikbüchern klarstellen. CS-Bücher bieten möglicherweise auch keine große Hilfe.

In Bezug auf Programmiersprachen gibt es mehrere Einschränkungen:

  • Funktionen in verschiedenen Bereichen der Mathematik werden nicht immer mit derselben Bedeutung definiert. Funktionen in verschiedenen Programmierparadigmen können auch sehr unterschiedlich sein (selbst manchmal sehen die Syntaxen von Funktionsaufrufen ähnlich aus). Manchmal sind die Gründe für die Unterschiede dieselben, manchmal jedoch nicht.
    • Es ist idiomatisches Berechnung durch mathematische Funktionen zu modellieren und dann implementieren die zugrunde liegende in Programmiersprachen Berechnung. Vermeiden Sie es, sie eins zu eins zuzuordnen, es sei denn, Sie wissen, worüber gesprochen wird.
  • Verwechseln Sie das Modell nicht mit der zu modellierenden Entität.
  • Mathematisch können Funktionen sein teilweise oder vollständig sein . Unterschiedliche Programmiersprachen werden hier unterschiedlich behandelt.
    • Einige funktionale Sprachen können ehren Gesamtheit der Funktionen sicherzustellen , dass die Berechnung innerhalb der Funktionsaufrufe immer in endlichen Schritten endet. Dies ist jedoch im Wesentlichen nicht Turing-vollständig, daher eine schwächere rechnerische Ausdruckskraft, und wird in Allzwecksprachen neben der Semantik der Typprüfung (die voraussichtlich vollständig ist) nicht viel gesehen.
    • Wenn der Unterschied zwischen den Prozeduren und Funktionen signifikant ist, sollte es "Gesamtprozeduren" geben? Hmm ...
  • Konstrukte, die Funktionen in Kalkülen ähnlich sind, die zur Modellierung der allgemeinen Berechnung und der Semantik der Programmiersprachen verwendet werden (z. B. Lambda-Abstraktionen in Lambda-Kalkülen ), können unterschiedlich sein Bewertungsstrategien für Operanden haben.
    • In der Tradition gibt es keine Nebenwirkungen, die die Ergebnisse der Berechnungen verändern, wenn sowohl reine Kalküle als auch Ausdrücke in reinen funktionalen Sprachen reduziert werden . Infolgedessen müssen Operanden nicht vor dem Körper der funktionsähnlichen Konstrukte ausgewertet werden (da die Invariante zur Definition "gleicher Ergebnisse" durch Eigenschaften wie die durch garantierte β- Äquivalenz erhalten bleibt Church-Rosser-Eigenschaft ).
    • Viele Programmiersprachen können jedoch Nebenwirkungen bei der Auswertung von Ausdrücken haben. Das heißt, strenge Bewertungsstrategien wie die anwendungsbezogene Bewertung sind nicht dasselbe wie nicht strenge Bewertungsstrategien wie Call-by-Need . Dies ist von Bedeutung, da ohne die Unterscheidung keine funktionsähnlichen (dh mit Argumenten verwendeten) Makros von (traditionellen) Funktionen unterschieden werden müssen. Aber je nach Geschmack der Theorien kann dies immer noch ein Artefakt sein. Das sei gesagt, im weiteren Sinne, funktional ähnliche Makros (insb. Hygienischen sind) sind mathematische Funktionen mit einigen unnötigen Einschränkungen (syntaktische Phasen).Ohne die Einschränkungen könnte es sinnvoll sein, (erstklassige) funktionsähnliche Makros als Prozeduren zu behandeln ...
    • Betrachten Sie für Leser, die sich für dieses Thema interessieren, einige moderne Abstraktionen .
  • Verfahren werden normalerweise außerhalb des Bereichs der traditionellen Mathematik betrachtet. Bei der Modellierung der Rechen- und Programmiersprachen-Semantik sowie bei zeitgenössischen Programmiersprachenentwürfen kann es jedoch eine ziemlich große Familie verwandter Konzepte geben, die die "abrufbare" Natur teilen. Einige von ihnen werden verwendet, um Prozeduren / Funktionen zu implementieren / zu erweitern / zu ersetzen. Es gibt noch subtilere Unterschiede.

3

In den meisten Kontexten: Eine Funktion gibt einen Wert zurück, eine Prozedur jedoch nicht. Beide sind Codeteile, die zusammen gruppiert sind, um dasselbe zu tun.

Im funktionalen Programmierkontext (in dem alle Funktionen Werte zurückgeben) ist eine Funktion ein abstraktes Objekt:

f(x)=(1+x)
g(x)=.5*(2+x/2)

Hier ist f die gleiche Funktion wie g, aber eine andere Prozedur.


3

Innerhalb der Prozedur können wir DML-Anweisungen (Insert / Update / Delete) verwenden, aber innerhalb der Funktion können wir keine DML-Anweisungen verwenden.

Die Prozedur kann beide Eingabe- / Ausgabeparameter haben, aber die Funktion kann nur Eingabeparameter haben.

Wir können den Try-Catch-Block in gespeicherten Prozeduren verwenden, aber in der Funktion können wir den Try-Catch-Block nicht verwenden.

Wir können die gespeicherte Prozedur nicht in der Select-Anweisung verwenden, aber in der Funktion können wir sie in der Select-Anweisung verwenden.

Die gespeicherte Prozedur kann 0 oder n Werte (max. 1024) zurückgeben, die Funktion kann jedoch nur 1 Wert zurückgeben, was obligatorisch ist.

Gespeicherte Prozedur kann nicht von Function aufgerufen werden, aber wir können Funktion von Stored Procedure aufrufen.

Wir können Transaktionen in gespeicherten Prozeduren verwenden, aber in Funktionen können wir keine Transaktionen verwenden.

Wir können die gespeicherte Prozedur in der SQL-Anweisung nirgendwo im Abschnitt Wo / Haben / Auswählen verwenden, aber in der Funktion können wir verwenden.

Wir können der gespeicherten Prozedur nicht beitreten, aber wir können der Funktion beitreten.

Für mehr ... klicken Sie hier ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


2
Diese Antwort ist sehr sprachspezifisch, während die Frage sprachunabhängig war. Die Aussagen hier sind im allgemeinen Fall nicht alle wahr, aber es wäre hilfreich, wenn Sie die Sprache oder Umgebung klären würden, für die Sie sie geltend machen.
Mogsdad

Diese Antwort ist für die überwiegende Mehrheit der Programmiersprachen völlig falsch. Prozeduren haben nur Eingabeparameter und Funktionen haben sowohl Eingabe als auch Ausgabe.
AStopher

2

Eine Funktion gibt einen Wert zurück und eine Prozedur führt nur Befehle aus.

Die Namensfunktion stammt aus der Mathematik. Es wird verwendet, um einen Wert basierend auf der Eingabe zu berechnen.

Eine Prozedur ist ein Befehlssatz, der der Reihe nach ausgeführt werden kann.

In den meisten Programmiersprachen können sogar Funktionen eine Reihe von Befehlen enthalten. Daher besteht der Unterschied nur in der Rückgabe eines Wertteils.

Wenn Sie jedoch eine Funktion sauber halten möchten (sehen Sie sich nur die funktionalen Sprachen an), müssen Sie sicherstellen, dass eine Funktion keine Nebenwirkungen hat.


1

Die Funktion kann in einer SQL-Anweisung verwendet werden, während die Prozedur nicht in einer SQL-Anweisung verwendet werden kann.

Anweisungen zum Einfügen, Aktualisieren und Erstellen können nicht in die Funktion aufgenommen werden, aber eine Prozedur kann diese Anweisungen enthalten.

Die Prozedur unterstützt Transaktionen, aber Funktionen unterstützen keine Transaktionen.

Die Funktion muss nur einen Wert zurückgeben (ein anderer kann von der OUT-Variablen zurückgegeben werden), aber die Prozedur gibt so viele Datensätze und Rückgabewerte zurück.

Ausführungspläne für beide Funktionen und Prozeduren werden zwischengespeichert, sodass die Leistung in beiden Fällen gleich ist.


1

Ich widerspreche etwas, das ich in den meisten dieser Antworten immer wieder sehe. Was eine Funktion zu einer Funktion macht, ist, dass sie einen Wert zurückgibt.

Eine Funktion ist nicht irgendeine alte Methode, die einen Wert zurückgibt. Nicht so: Damit eine Methode eine echte Funktion ist, muss sie immer den gleichen Wert zurückgeben, wenn eine bestimmte Eingabe erfolgt. Ein Beispiel für eine Methode, die keine Funktion ist, ist die randomMethode in den meisten Sprachen, da der Wert nicht immer gleich ist, obwohl er einen Wert zurückgibt.

Eine Funktion ähnelt daher eher einer Karte (z. B. wo x -> x'für eine eindimensionale Funktion). Dies ist eine sehr wichtige Unterscheidung zwischen regulären Methoden und Funktionen, da beim Umgang mit realen Funktionen das Timing und die Reihenfolge, in der sie ausgewertet werden, keine Rolle spielen sollten, da dies bei Nichtfunktionen nicht immer der Fall ist.

Hier ist ein weiteres Beispiel für eine Methode, die keine Funktion ist, aber ansonsten trotzdem einen Wert zurückgibt.

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

Ich lehne ferner den Gedanken ab, dass Prozeduren keine Werte zurückgeben. Eine Prozedur ist nur eine bestimmte Art, über eine Funktion oder Methode zu sprechen. Das heißt, wenn die zugrunde liegende Methode, die Ihre Prozedur definiert oder implementiert, einen Wert zurückgibt, raten Sie, was diese Prozedur einen Wert zurückgibt. Nehmen Sie zum Beispiel den folgenden Ausschnitt aus dem SICP :

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

Haben Sie in letzter Zeit viel von rekursiven Prozeduren gehört? Sie sprechen von einer rekursiven Funktion (einer realen Funktion), die einen Wert zurückgibt, und sie verwenden das Wort "Prozedur". Was ist dann der Unterschied?

Nun, eine andere Art, eine Funktion zu denken (neben der oben erwähnten Bedeutung), ist die abstrakte Darstellung eines Ideals wie der Ziffer 1. Eine Prozedur ist die tatsächliche Implementierung dieser Sache. Ich persönlich denke, dass sie austauschbar sind.

(Beachten Sie, wenn Sie dieses Kapitel über den von mir bereitgestellten Link lesen, werden Sie möglicherweise feststellen, dass ein schwieriger zu fassendes Konzept nicht der Unterschied zwischen einer Funktion und einer Prozedur ist, sondern ein Prozess und eine Prozedur. Wussten Sie, dass eine rekursive Prozedur eine haben kann? iterativer Prozess?)

Ein Analogon für Prozeduren sind Rezepte. Beispielsweise; Angenommen, Sie haben eine Maschine namens make-piesDiese Maschine nimmt Zutaten auf (fruit, milk, flower, eggs, sugar, heat)und diese Maschine gibt a zurück pie.

Eine Darstellung dieser Maschine könnte aussehen

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

Natürlich ist das nicht der einzige Weg, einen Kuchen zu machen.

In diesem Fall können wir Folgendes sehen:

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

Diese Analogie ist in Ordnung, bricht jedoch zusammen, wenn Sie berücksichtigen, dass beim Umgang mit einem Computerprogramm alles eine Abstraktion ist. Anders als bei einem Rezept mit einer Maschine vergleichen wir zwei Dinge, die selbst Abstraktionen sind. zwei Dinge, die genauso gut dasselbe sein könnten. Und ich bin der Meinung, dass sie (für alle Absichten und Zwecke) dasselbe sind.


2
Eine Funktion, die für bestimmte Argumente immer den gleichen Wert zurückgibt, wird manchmal als "reine Funktion" bezeichnet. In den meisten Sprachen, die zwischen Prozeduren und Funktionen unterscheiden, müssen Funktionen nicht rein sein, und der Begriff "Funktion" bezieht sich korrekt auf Unterprogramme, die Nebenwirkungen haben können und bei aufeinanderfolgenden Aufrufen mit denselben Argumenten unterschiedliche Ergebnisse zurückgeben können. (Und in C-ähnlichen Sprachen werden sogar Unterprogramme, die keine Werte zurückgeben, ordnungsgemäß als "Funktionen" bezeichnet.)
Keith Thompson

Einverstanden, weshalb ich Bay beende und sage, dass die Wörter austauschbar sind.
Dkinzer

1
Ja, aber Sie beginnen damit, dass "Eine Funktion nicht irgendeine alte Methode ist, die einen Wert zurückgibt", während dies in vielen Sprachen genau das ist , was eine Funktion ist.
Keith Thompson

0

Im Kontext von db : Gespeicherte Prozedur wird ein Ausführungsplan vorkompiliert , wo dies nicht der Fall ist .


0

In Bezug auf С # / Java ist function der Codeblock, der einen bestimmten Wert zurückgibt, aber procedure ist der Codeblock, der void (nichts) zurückgibt. In C # / Java werden sowohl Funktionen als auch Prozeduren häufiger nur Methoden genannt .

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

-3

Prozeduren: 1. Verfahren sind die Sammlungen von Anweisungen, die parametrisierte Berechnungen definieren. 2.Verfahren können keine Werte zurückgeben.

3.Verfahren können nicht von der Funktion aufgerufen werden.

Funktionen 1.Funktionen ähneln strukturell Prozeduren, sind jedoch semantisch mathematischen Funktionen nachempfunden. 2. Es kann Werte zurückgeben. 3.Funktion kann von Prozeduren aufgerufen werden.


3.Verfahren können nicht von der Funktion aufgerufen werden. In welcher Sprache ist das wahr? Keiner, mit dem ich Erfahrung habe, hat diese Einschränkung.
Mogsdad

Es ist wahr. Wenn Sie eine Prozedur von einer Funktion aus aufrufen, handelt es sich nicht um eine Funktion. Welche Sprache dies erzwingt, ist eine gute Frage, auf die ich keine Antwort weiß. Mag eine funktionale sein, aber selbst dann bin ich mir nicht sicher: Die reine Liste ist funktionsfähig (es gibt keine Menge: keine Nebenwirkungen), aber da sie Lambdas hat, ist es möglich, eine Menge zu implementieren. Könnten Sie einen Compiler schreiben, der keine Verwendung von set erzwingt, müsste er alle Implementierungen davon erkennen. Sie könnten Lambdas aus der Sprache entfernen, aber das wäre schlimmer.
Strg-Alt-Delor

Ohh, ich habe gerade an eine Sprache C ++ gedacht: Eine const-Methode kann keine not const-Methode aufrufen (obwohl Sie die richtigen Compiler-Checks
aktivieren

-7

Prozeduren und Funktionen sind beide Unterprogramme. Der einzige Unterschied besteht darin, dass eine Prozedur mehrere Werte zurückgibt (oder zumindest kann), während eine Funktion nur einen Wert zurückgeben kann (aus diesem Grund wird in der Mathematik die Funktionsnotation verwendet, da normalerweise nur ein Wert gefunden wird zu einem bestimmten Zeitpunkt) obwohl einige Programmiersprachen diesen Regeln nicht folgen, ist dies ihre wahre Definition


Ähm, nein. Eine Prozedur macht returnnichts. Sie sprechen von Nebenwirkungen, die bei beiden möglich sind (sofern die Sprache dies zulässt).
Mogsdad

Eine Prozedur kann eine beliebige Anzahl von Werten zurückgeben, diese Menge kann Null sein
user2766296

Ein Nebeneffekt wäre, wenn a ein Array hätte und es an eine Funktion oder Prozedur übergeben würde, die den größten Wert gefunden hat, das Array als Referenz übergeben würde und nachdem die Unterroutine ausgeführt wurde, das Array sortiert wird, die Tatsache, dass es ist sortiert ist ein Nebeneffekt, der zurückgegebene Wert ist der größte Wert im Array
user2766296

Ich mag diese Antwort und auch diejenigen mit mehreren Abstimmungen, weil sie irgendwie irgendwie richtig sind. Paradoxerweise werde ich sie ablehnen, um sie in SO sehr populär zu machen. Eine in SQL Server gespeicherte Prozedur gibt eine Ergebnismenge zurück (was Sie als "mehrere Werte" bezeichnet haben), während eine Funktion nur einen Wert zurückgeben kann (was nicht sehr genau ist, da Sie auch eine Tabellenwertfunktion erstellen können).
Ivanzinho
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.