Frage

Warum unterscheiden einige Sprachen zwischen Methoden, die einen Wert und Methoden geben, die es nicht tun?

d. in Oracle PL / SQL, wobei der primäre Unterschied zwischen einer Funktion und einem Verfahren ist, dass die Funktion einen Wert zurückgeben muss, und das Verfahren darf nicht.

Das gleiche gilt für Sprachen, die nicht, warum nicht?


EDIT: Ich habe eine ähnliche Frage gefunden, die Menschen interessieren könnte diese Frage zu lesen:

War es hilfreich?

Lösung

Da in den ursprünglichen Vorstellungen der Informatik Theorie und Praxis, Funktionen und Subroutinen praktisch nichts mit ihnen zu tun.

Fortran wird in der Regel als erste Sprache gutgeschrieben, die die Unterschiede diese beiden und zeigten umgesetzt. (Early LISP hatte eine etwas entgegengesetzte Rolle in dieser auch, aber es hatte nur geringe Auswirkungen außerhalb der Hochschule).

von den Traditionen der Mathematik verfolgt (die CS noch Teil der in den 60er Jahren war) funktioniert nur als die Verkapselung von parametrisierte mathematischen Berechnungen zu sehen waren ausschließlich auf einen Wert zurück in einen größeren Ausdruck bestimmt. Dass man es „nackter“ nennen könnte (F = AZIMUT (SEKUNDEN)) war lediglich ein trivialer Anwendungsfall.

Subroutinen, auf der anderen Seite wurden als Möglichkeit gesehen, eine Gruppe von Anweisungen zu nennen bedeutete eine gewisse Wirkung haben. Parameter waren ein großer Schub für ihre Benutzerfreundlichkeit und der einzige Grund, dass sie geändertene Parameterwerte zurückkehren wurden waren, so dass sie ihren Status auf globale Variablen, ohne berichten könnten verlassen.

So hatte sie wirklich keine begriffliche Verbindung, andere als Verkapselung und Parameter.

Die eigentliche Frage ist: „Wie haben so viele Entwickler kommen, um sie als die gleiche sehen“

Und die Antwort ist C.

Wenn K + R ursprünglich ihre High-Level-Makro-Assembler Typ Sprache für die PDP-11 ausgelegt (kann auf der PDP-8 begonnen haben?), Hatten sie keine Illusionen der Hardware-Unabhängigkeit. Praktisch jedes „einzigartig“ Merkmal der Sprache ein Spiegelbild der PDP Maschinensprache und Architektur war (siehe i ++ und --i). Eine davon war die Erkenntnis, die Funktionen und Subroutinen sein könnten (und war immer) umgesetzt identisch in der PDP der Ausnahme, dass der Anrufer nur den Rückgabewert ignoriert (in R0 [R1]) für Subroutinen.

Auf diese Weise wurde die Leeren Zeiger geboren, und nach der C-Sprache über die ganze Welt der Programmierung genommen hatte, die falsche Wahrnehmung, dass dieses HW / O Implementierung Artefakt (obwohl wahr auf fast jede weitere Plattform) war die gleiche wie die Sprachsemantik.

Andere Tipps

In einem reinen oder Effekt typisierte Einstellung gibt es einen großen Unterschied, weil offensichtlich Methoden, die „Rückkehr nicht alles“ nur nützlich sind, für ihre Nebenwirkungen.

Dies ist analog zu der Unterscheidung zwischen Ausdrücke und Aussagen, die eine Sprache entrümpeln und eine Klasse von in der Regel-verwechselt Programmen (das, natürlich, warum C es nicht tun;) beseitigen.)

zu geben, ein kleines Beispiel, wenn man klar zwischen Ausdrücken und Aussagen unterscheiden, if(x = 3), im Gegensatz zu if(x == 3) ist syntaktisch falsch (für die Verwendung einer Aussage, wo ein Ausdruck erwartet wurde) und nicht nur eine Art Fehler (für die Verwendung einer Ganzzahl, wobei ein boolean wurde erwartet). Dies hat den Vorteil, auch disallowing if(x = true), die durch eine Art basierte Regel in einem Kontext gestattet ist, wenn Zuweisungen Ausdrücke sind, die den Wert ihrer rechten Operanden haben.

In einer Sprache, die Effekte mit Monaden kapselt, wird die wichtige Unterscheidung, die man zwischen:

  • Funktionen, die () zurück, die reinen Funktionen sind und nur ein nutzloser leerer Wert genannt () zurückkehren oder divergieren
  • Funktionen, die IO () (oder Einheit in einem anderen Monade) zurück, die Funktionen ohne „Ergebnis“ außer Effekten im IO (oder welche auch immer) Monade

Entschuldigen Sie eine zwei Jahre alte Frage zu beantworten, vor allem mit etwas Einzigartiges zu meinem eigenen Sprache Felix http: // felix-lang. org aber hier geht sowieso:)

Felix, Funktionen und Prozeduren sind von grundlegender Bedeutung unterschiedlich, und es ist nicht nur, dass die Verfahren Nebenwirkungen haben und sind in Aussagen genannt, während Funktionen Nebenwirkungen nicht aufweisen und in Ausdrücken verwendet (weil Felix auch Generatoren hat die .. sind Funktionen mit Nebenwirkungen:)

Nein, das Ausführungsmodell grundlegend anders, vor allem aus Leistungsgründen, aber nicht ganz. Das Modell ist:

  • Funktionen setzen ihre Absenderadresse auf dem Maschinenstapel und der Rückgabewert zu.
  • Verfahren verwenden, um eine verknüpfte Liste auf dem Heap. Prozeduralen Code ist flach, es nicht die Maschine Stapel verwenden.

Dies ist normalerweise ineffizient, also warum es tun? Die Antwort lautet: Felix Verfahren sind alle potenziell Co-Routinen (Fasern). Sie können zu einem anderen Steuerverfahren umschalten durch einen Kanal zuzugreifen. Dies führt zu einem Austausch von Steuer.

  • Aus Gründen der Performance Kopieren der Maschine Stapel auf Steuer Austausch ist keine Option.
  • Für die Speicherverwaltung Gründen tauschen Stapelzeiger ist keine Option.

Das O tauscht typischerweise Stapelzeiger für Fäden, die einigermaßen schnell, hat aber ein grundsätzliches Problem auf lineare Adresse Maschinen: Sie haben entweder die maximale Größe des Stapels zu einem lächerlich kleinen Wert zu begrenzen, oder die Anzahl der Threads begrenzen zu einem lächerlich kleinen Wert. Auf einer 32-Bit-Maschine, gibt es nicht genügend Adressraum auch diese Lösung in Erwägung ziehen. Auf einer 64-Bit-Maschine, hat Stapel swapping mehr Potenzial, aber natürlich immer die Benutzeranforderungen wachsen Hardware 3 Tage zu überflügeln, nachdem es freigegeben wird ..:)

Felix tauscht nur einen einzigen Zeiger auf den Heap-basierten Stapel, so Kontextschalter sind unglaublich schnell und sehr wenig Adressraum verschwendet wird. Natürlich sind die Kosten Heapzuweisungen auf Prozeduraufrufe.

In den Compiler, eine Menge von der Architektur des theoretischen Modells wird auf einer „as-if“ wegoptimiert Basis, also die tatsächliche Leistung und Umsetzung ganz anders auf das theoretische Modell sein kann, kann der Compiler zur Verfügung gestellt unter Beweis stellen, dass Sie ‚sagen t dem Unterschied .. andere als die Möglichkeit verwehrt wird, um eine Tasse Kaffee mit Freizeit zu machen:)

So, hier haben Sie eine andere Antwort auf die Frage, warum Funktionen und Prozeduren können unterschiedlich behandelt werden.

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