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?