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.
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
.Antworten:
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.
quelle
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.
quelle
Beispiel in C:
Obwohl Sie beachten sollten, dass der C-Standard nicht über Prozeduren spricht, sondern nur über Funktionen.
quelle
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.Im Allgemeinen ist eine Prozedur eine Folge von Anweisungen.
Eine Funktion kann dieselbe sein, gibt jedoch normalerweise ein Ergebnis zurück.
quelle
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.
quelle
Grundlegende Unterschiede
Erweiterte Unterschiede
In SQL:
SELECT
sowie DML (INSERT
,UPDATE
,DELETE
) Aussagen darin, während Funktion erlaubt nurSELECT
darin Aussage.SELECT
Anweisung verwendet werden, während Funktionen in eineSELECT
Anweisung eingebettet werden können .WHERE
(oder einemHAVING
oder einemSELECT
) Block verwendet werden, wohingegen Funktionen dies können.JOIN
Block mit anderen Tabellen verwendet werden.JOIN
Blöcken und anderen Rowset-Operationen verwendet werden können.quelle
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.
quelle
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.
quelle
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
void
als 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
void
Typ 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:
#inert
) funktioniert auch.void
Typ in ALGOL-ähnlichen Sprachen ist genau ein Beispiel für diese Technik. ISO C11_Noreturn
ist 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:
{{{}}, {}}
als Von-Neumann-Kodierung von Ordnungszahlen (die wie ein Bündel von ... aussehen ) behandeln .quelle
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:
Hier ist f die gleiche Funktion wie g, aber eine andere Prozedur.
quelle
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
quelle
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.
quelle
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.
quelle
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
random
Methode 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.
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 :
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-pies
Diese Maschine nimmt Zutaten auf(fruit, milk, flower, eggs, sugar, heat)
und diese Maschine gibt a zurückpie
.Eine Darstellung dieser Maschine könnte aussehen
Natürlich ist das nicht der einzige Weg, einen Kuchen zu machen.
In diesem Fall können wir Folgendes sehen:
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.
quelle
Im Kontext von db : Gespeicherte Prozedur wird ein Ausführungsplan vorkompiliert , wo dies nicht der Fall ist .
quelle
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 .
quelle
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.
quelle
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
quelle
return
nichts. Sie sprechen von Nebenwirkungen, die bei beiden möglich sind (sofern die Sprache dies zulässt).