56 Stimmen

Was ist der Unterschied zwischen einer Funktion und einem Unterprogramm?

Was ist der Unterschied zwischen einer Funktion und einer Subroutine? Mir wurde gesagt, dass der Unterschied zwischen einer Funktion und einer Subroutine wie folgt ist:

Eine Funktion nimmt Parameter entgegen, arbeitet lokal und ändert keinen Wert und arbeitet nicht mit Werten außerhalb ihres Bereichs (hohe Kohäsion). Sie gibt auch einen Wert zurück. Eine Subroutine arbeitet direkt mit den Werten des Aufrufers oder des Code-Segments, das sie aufgerufen hat, und gibt keine Werte zurück (niedrige Kohäsion), d.h. sie verzweigt bestimmten Code zu anderem Code, um Verarbeitungen durchzuführen und zurückzukehren.

Ist das wahr? Oder gibt es keinen Unterschied, nur zwei Begriffe für dasselbe?

4voto

Azeem Akhter Punkte 476

Einer der Unterschiede könnte aus dem Ursprung stammen, wo die Terminologie herkommt.

Subroutine ist eher eine Begrifflichkeit aus der Computerarchitektur/-organisation, was eine wiederverwendbare Gruppe von Anweisungen bedeutet, die eine Aufgabe ausführt. Sie wird einmal im Speicher gespeichert, aber so oft wie nötig verwendet.

Funktion stammt ursprünglich aus der mathematischen Funktion, wo die Grundidee darin besteht, eine Menge von Eingaben auf eine Menge zulässiger Ausgaben abzubilden, mit der Eigenschaft, dass jede Eingabe genau einer Ausgabe zugeordnet ist.

0voto

Vlad Bezden Punkte 71128

Gemäß der Definition von Wikipedia-Unterroutine:

In der Computerprogrammierung ist eine Unterprozedur eine Sequenz von Programmanweisungen, die eine bestimmte Aufgabe ausführen und als Einheit verpackt sind. Diese Einheit kann dann in Programmen verwendet werden, wo auch immer diese bestimmte Aufgabe ausgeführt werden sollte.

Unterprozeduren können innerhalb von Programmen oder separat in Bibliotheken definiert werden, die von vielen Programmen verwendet werden können. In verschiedenen Programmiersprachen kann eine Unterprozedur als Verfahren, Funktion, Routine, Methode oder Unterprogramm bezeichnet werden. Der generische Begriff Aufrufbares Element wird manchmal verwendet.

In Python gibt es keinen Unterschied zwischen Unterprozeduren und Funktionen. In VB/VB.NET kann eine Funktion ein Ergebnis/Daten zurückgeben, während eine Unterprozedur/Unterprozedur dies nicht kann. In C# beziehen sich sowohl Unterprozedur als auch Funktion auf eine Methode.

Manchmal in OOP wird die Funktion, die zur Klasse gehört, als Methode bezeichnet.

Es ist nicht mehr erforderlich, zwischen Funktion, Unterprozedur und Prozedur zu unterscheiden, da aufgrund von Sprachen auf hohem Niveau dieser Unterschied abstrahiert wird. Letztendlich gibt es also sehr wenig semantischen Unterschied zwischen den beiden.

0voto

akgren_soar Punkte 327

Ja, sie sind unterschiedlich, ähnlich wie du erwähnt hast.

Eine Funktion hat deterministische Ausgabe und keine Seiteneffekte.
Eine Unterfunktion hat diese Einschränkungen nicht.

Ein klassisches Beispiel für eine Funktion ist int multiply(int a, int b)
Es ist deterministisch, da multiply(2, 3) dir immer 6 geben wird.
Es hat keine Seiteneffekte, da es keine Werte außerhalb seines Bereichs modifiziert, einschließlich der Werte von a und b.

Ein Beispiel für eine Unterfunktion ist void consume(Food sandwich)
Es hat keine Ausgabe, daher ist es keine Funktion.
Es hat Seiteneffekte, da durch Aufrufen dieses Codes das Sandwich konsumiert wird und du keine Operationen mehr auf dem gleichen Sandwich aufrufen kannst.

Man kann eine Funktion als f(x) = y betrachten, oder für den Fall der Multiplikation als f(a, b) = c. Ja, das ist Programmierung und nicht Mathematik. Aber Mathematik modelliert und drängt dazu, verwendet zu werden. Also verwenden wir Mathematik in der Informatik. Wenn du daran interessiert bist, warum es eine Unterscheidung zwischen Funktion und Unterfunktion gibt, solltest du dir funkitionales Programmieren ansehen. Es funktioniert wie Magie.

0voto

ChrisoLosoph Punkte 170

Vom Standpunkt des Benutzers gibt es keinen Unterschied zwischen einer Programmierfunktion und einer Unterprozedur, aber in der Theorie gibt es definitiv einen!

Das Konzept selbst unterscheidet sich zwischen einer Unterprozedur und einer Funktion. Formell ist die Definition des OP korrekt. Unterprozeduren nehmen keine Argumente entgegen oder geben Rückgabewerte zurück nach formalen Semantik. Das ist nur eine Auslegung mit Konventionen. Und Variablen in Unterprozeduren sind in anderen Unterprozeduren derselben Datei zugänglich, obwohl dies auch in C mit einigen Schwierigkeiten erreicht werden kann.

Zusammenfassung:

Unterprozeduren funktionieren nur auf der Grundlage von Seiteneffekten, aus der Sicht der Programmiersprache, mit der Sie programmieren. Das Konzept selbst hat keine expliziten Argumente oder Rückgabewerte. Sie müssen Seiteneffekte verwenden, um sie zu simulieren.

Funktionen sind Zuordnungen von Eingabe zu Ausgabewert(en) im ursprünglichen Sinne, eine Art allgemeine Substitutionsoperation. Im angenommenen Sinne der Programmierwelt sind Funktionen eine Abstraktion von Unterprozeduren mit Informationen über Rückgabewert und Argumente, inspiriert von mathematischen Funktionen. Die zusätzliche formale Abstraktion unterscheidet eine Funktion von einer Unterprozedur im Programmierkontext.

Details:

Die Unterprozedur ist ursprünglich einfach ein wiederholbarer Code-Schnipsel, den Sie zwischen anderen Codes aufrufen können. Ursprünglich stammt sie aus der Assembly- oder Maschinensprachenprogrammierung und bezeichnet die Anweisungssequenz selbst. In diesem Sinne verwendet auch Perl den Begriff Unterprozedur für seine aufrufbaren Codeschnipsel.

Unterprozeduren sind konkrete Objekte.

Das ist es, was ich verstanden habe: das Konzept einer (reinen) Funktion ist ein mathematisches Konzept, das ein Spezialfall mathematischer Relationen mit einer eigenen formalen Notation ist. Sie haben eine Eingabe oder ein Argument und es ist definiert, welchen Wert die Funktion mit dem gegebenen Argument darstellt. Das ursprüngliche Funktionskonzept ist vollkommen unabhängig von Anweisungen oder Berechnungen. Mathematische Operationen (oder Anweisungen in der Programmierwelt) sind nur eine beliebte formale Darstellung (Beschreibung) der tatsächlichen Zuordnung. Der ursprüngliche Funktionsbegriff selbst ist nicht als Code definiert. Berechnungen stellen die Funktion nicht dar, sodass Funktionen tatsächlich keinen Rechenaufwand haben, weil sie direkte Zuordnungen sind. Überlegungen zur Funktionenkomplexität kamen erst auf, als es einen Aufwand gab, die Zuordnung zu finden.

Funktionen sind abstrakte Objekte.

Da nun das gesamte PC-Zeug auf kleinen Maschinenanweisungen läuft, ist der einfachste Weg, Mathematik darzustellen (oder zu instanziieren), eine Sequenz von Anweisungen selbst. Die Informatik wurde von Mathematikern gegründet (bemerkenswert: Alan Turing) und die ersten Programmierkonzepte basieren darauf, daher besteht die Notwendigkeit, Mathematik in die Maschine zu bringen. So stelle ich mir vor, warum "Funktion" der Name von etwas ist, das als Unterprozedur implementiert ist, und warum der Begriff "reine" Funktion geprägt wurde, um das ursprüngliche Funktionskonzept von der übermäßig breiten Begriffsverwendung in Programmiersprachen zu unterscheiden.

Hinweis: In der Assemblersprachenprogrammierung wird typischerweise gesagt, dass einer Unterprozedur Argumente übergeben wurden und ein Rückgabewert liefert. Dies ist eine Auslegung über den konkreten formalen Semantiken. Aufrufkonventionen legen fest, an welcher Stelle Werte, die als Argumente und Rückgabewerte betrachtet werden sollen, geschrieben werden sollten, bevor eine Unterprozedur aufgerufen oder zurückgegeben wird. Der Aufruf selbst erfolgt nur mit einer Unterprozeduradresse und hat keine formalen Argumente oder Rückgabewerte.

PS: Funktionen in Programmiersprachen müssen nicht unbedingt eine Unterprozedur sein (obwohl sich die Terminologie der Programmsprachen so entwickelt hat). Funktionen in funktionalen Programmiersprachen können Konstantenvariablen, Arrays oder Hashtabellen sein. Ist nicht jede Datenstruktur in ECMAScript eine Funktion?

0voto

Harry Binswanger Punkte 983

Der Unterschied liegt in der Isolation. Ein Unterprogramm ist nur ein Teil des Programms, der mit einem Label beginnt und mit einem go to endet. Eine Funktion befindet sich außerhalb des Namensraums des restlichen Programms. Es ist wie ein separates Programm, das die gleichen Variablennamen wie im aufrufenden Programm haben kann, und was auch immer es mit ihnen macht, beeinflusst nicht den Zustand dieser Variablen mit dem gleichen Namen im aufrufenden Programm.

Aus codetechnischer Sicht bedeutet die Isolation, dass man nicht die Variablennamen verwenden muss, die lokal für die Funktion sind.

Unterprogramm double:

a = a + a

Return

fnDouble(egal was):

egal was = egal was + egal was

Return egal was

Das Unterprogramm funktioniert nur mit a. Wenn du b verdoppeln möchtest, musst du a = b setzen, bevor du das Unterprogramm aufrufst. Dann musst du vielleicht a auf null oder null setzen nachher. Wenn du dann c verdoppeln möchtest, musst du wieder a auf gleich c setzen. Außerdem könnte das Unterprogramm eine weitere Variable, z, enthalten, die sich ändert, wenn das Unterprogramm angesprungen wird, was ein wenig gefährlich ist.

Das Wesentliche ist die Isolation der Namen für die Funktion (sofern in der Funktion nicht global deklariert).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X