Benutzer Diskussion:TMg/Wirkung (Informatik)

aus Wikipedia, der freien Enzyklopädie
Letzter Kommentar: vor 16 Jahren von TMg in Abschnitt Quellen?
Zur Navigation springen Zur Suche springen

C++, C, Java

[Quelltext bearbeiten]

Könnte mal bitte jemand der den C++ Standard besitzt bzw. sich darin auskennt prüfen, ob der Abschnitt über undefinierte Nebenwirkungen auch auf C++ zutrifft? -- Daniel 19:56, 16. Jun 2005 (CEST)

aus dem Artikel:
Dabei gibt es einen wichtigen Unterschied zwischen Java und den Sprachen C und C++. Während nämlich in Java der rechte Operand der Subtraktion einen um 1 höheren Wert als der linke hat, und dadurch das Resultat eindeutig ist, macht der C und C++ Standard keine Aussageben über das Verhalten. Der C und C++ Standard legt lediglich fest, dass alle Nebenwirkungen bis zum nächsten Sequenzpunkt ausgewertet sein müssen. Im Beispiel ist der Sequenzpunkt das Semikolon am Ende der Zeile (dem Ende des "expressen Statement" wie der Standard dies ausdrückt). Im Gegensatz zur häufigen Darstellung ist ein solcher Ausdruck nicht implementierungsabhängig, was bedeuten würde, dass der Compilerhersteller das Verhalten festlegen und dokumentieren müsste. Tatsächlich ist das Verhalten in C und C++ aber undefiniert, was bedeutet, dass jedes beliebige Ergebnis eintreten kann. Dies reicht vom Ausführung des Ausdrucks wie erwartet bis zum Absturz des Rechners oder sogar Datenverlust. Man sollte deshalb auf solche Ausdrücke verzichten, und zwar auch dann, wenn auf die Portabilität des Programms keinen Wert gelegt wird.
Ich finde, der Text führt zu weit vom Thema weg. Eigentlich soll ja der Begriff "Wirkung" erklärt werden. Vielleicht etwas für Wikibooks? --80.136.238.145 13:36, 25. Jun 2005 (CEST)
Ich finde es wirklich kein guter Stil, einfach hier Teile auf die Diskussionsseite zu verschieben und praktisch den alten Inhalt wieder herzustellen. Es wäre genauso gut eine Überarbeitung oder auch eine Kürzung möglich gewesen. So wie der Artikel jetzt dasteht ist der Sachverhalt aber schlicht falsch:
Zumindest in C (ich kann wie gesagt nicht für C++ sprechen, nehme aber an, dass es dort keinen Unterschied gibt) ist die Reihenfolge nicht nur einfach nicht festgelegt oder implementierungsabhängig, sondern das Verhalten ist undefiniert. Ich zitiere hier mal Francis Glassborow - Mitglied des WG 14 (der Arbeitsgruppe, die mit der Ausarbeitung des C Standards beschäftigt ist):
There are many technical reasons why a general purpose programming language can result in a program whose behavior is completely undefined. Such a program may, under the requirement of the Standard, do anything include such extremes as setting your monitor on fire (there really was hardware on which that was possible) or reformatting your hard drive.
Auch wenn dies hier sehr unwahrscheinlich ist, zeigt das doch, dass es ein Unterschied gibt ob die Reihenfolge einfach nicht festgelegt ist oder im Sinne des C Standards undefiniert ist. Das sollte hier auch so rüberkommen oder das Beispiel ganz entfernt werden.
Und noch etwas zum Thema Wikibooks:
1.) Wikibook ist kein Verschiebebahnhof oder irgendeine Stelle wo man hier nicht mehr gewünschtes einfach abladen kann
2.) Der Inhalt existiert in ähnlicher Form dort bereits (zumindest für C). -- Daniel 21:20, 27. Jun 2005 (CEST)

Die Darstellung des Problems (++i) - (++i) zeigt das Problem der Nebenwirkungen und dürfte daher hier richtig am Platz sein. Das Java sich eindeutig verhält, bei C/C++ die Sache aber nicht definiert ist, sollte man hier auch darstellen, da damit gut dargestellt ist, das neuere Programmiersprachen Mängel aus alten Programmiersprachen beheben. In C war es ursprünglich angedacht, dass das Präincrement vor der Ausführung des Ausdruckes, Postincrement danach ausgeführt wird. Aber offensichtlich legt der C-Standard nicht genau fest, wann davor und danach ist. Ist das Semikolon das Kritirium, dann müsste zuerst zweimal das Inkrementieren ausgeführt werden, dann die Subtraktion, entgegen dem Java-verhalten. ...

Der Artikel stellt "Wirkung" und "Nebenwirkung" als identisch dar (Neben Wirkung werden synonym auch ...). Das ist aber Unsinn. Man sollte Wirkung als gewollte Wirkung erklären, aber zusätzlich auf das Problem der Nebenwirkungne eingehen, (die auch Wirkungen sind, aber oft unbedachte). Stilistisch ist hier Verbesserungsbedarf.

Stilistisch ist der letzte Absatz (Ausdrücke, die keine Wirkung haben, eröffnen ... Außerdem wird manchmal...) geballt und schlecht. Hier werden mehrere Themen angeschnitten. Die Optimierungsmöglichkeiten sind ein Kapitel für sich und bei Compiler ausführlich beschrieben. Die Optimierungsmöglichkeiten hängen auch weniger von Wirkungen ab, sondern davon, wie Informationen bezogen werden (vermeidung von mehreren Lesevorgängen, vom Speicher stattdessen Halten in Registern). Möglicherweise sprengt dieses Thema hier diesen Artikel und sollte ganz raus.

Das Problem des Verständnisses von Programmen liegt an den Nebenwirkungen von solchen Dingen wie ++i innerhalb eines Ausdruckes. Auch bei imperativer Programmierung kann man Ausdrücke so schreiben, dass sie selbst erstmal keine Wirkungen haben, nur deren Ergebnis wird dann irgendwo abgelegt, was dann eine Wirkung ist. Ich vermute mal (in Unkenntnis), bei funktionalen Programmiersprachen ist das genau nicht anders. Also sollte man hier auf einen Programmierstil ohne Nebenwirkungen hinweisen, indem man darauf hinweist, dass die Möglichkeit des Prä/Postincrements in C/++ gar nicht so gut ist. Besser:

data[i] = value; i +=1;  //Zwei getrennte Wirkungen

als

data[i++] = value;  //zwei getrennte Wirkungen, aber schwerer ersichtlich

...und bei komplexen Ausdrücken noch schwerer ersichtlich (=>unbedachte Nebenwirkung) und daher fehlerträchtig:

value = (data[i++] - data[i-2]) * data[i];  //wann wird increment? Nur der Experte weis, erst zum Schluss.

Das seien schnell hingeschriebene Tips zur Überarbeitung .... --HartmutS 10:39, 17. Feb 2006 (CET)


Warum muss man überhaupt ein Beispiel aufführen, das in ANSI-C nicht defniert ist? Reicht nicht einfach (++i)-5 oder ähnliches schreiben? Die aktuelle Beschreibung auf der Seite passt auch zu so einen Ausdruck. Man muss nur i-4 statt 0 schreiben.--Plaicy 00:04, 14. Mär 2006 (CET)

Das Problem des ganzen ist ja, dass zwischen zwei Auswertepunkten (sequence points) eine Variable nicht mehrfach geändert werden darf. Ich habe das Beispiel jetzt etwas abgeändert. Sehr schön ist es noch nicht, aber die Wirkung eines undefinierte Ausdrucks zu erklären macht einfach keinen Sinn. Hier mal ein Programm:

#include <stdio.h>
int main(void)
{
  int i=0;
  printf("%d\n", (++i)-(++i));
  printf("%d\n", i);
  return 0;
}

Um das mal konkret zu machen, dass das wirklich undefiniert umgesetzt wird. Hier mal die Ausführung auf einer Maschine:

$ gcc -Wall -ansi -o test test.c && ./test
test.c: In function `main':
test.c:5: warning: operation on `i' may be undefined
-1
2

Auf einer anderen Maschine:

$ gcc -Wall -ansi -o test test.c  && ./test
test.c: In Funktion »main«:
test.c:5: Warnung: operation on `i' may be undefined
0
2

Damit hat der Ausdruck zumindest nicht immer den Wert 0, wie im Artikel angegeben war. Vom Prinzip her könnte aber alles mögliche passieren (das Programm könnte beispielweise abstürzen).--Plaicy 13:18, 29. Mär. 2007 (CEST)Beantworten

In dem Artikel wird ausgesagt, dass sich i NACH der VErwendung erhoeht. Das ist bei der Syntax ++i aber nicht korrekt.. bei vorranstehenden incrementzeichen wird die Variable VOR der Verwendung erhoeht. Richtig fuer die Aussage waere also (i++)

Seiteneffekt synonym?

[Quelltext bearbeiten]

Nach meinem Verständnis ist Seiteneffekt im Gegensatz zur Darstellung in der Einleitung nicht synonym zu Wirkung: Der Seiteneffekt ist ja eine verborgene Wirkung, die beim Aufruf einer Funktion und Zuweisung des Rückgabewerts nicht offensichtlich ist. (Beim Aufruf einer Subroutine, die keinen Wert zurückgibt, liegt m. E. kein Seiteneffekt vor, weil der Effekt bzw. die Wirkung ja gerade der Zweck des Aufrufs ist)

Außerdem würde ich in der Informatik eigentlich immer von Seiteneffekt reden; Nebeneffekt und Nebenwirkung sind allgemeine Begriffe, die mir im Programmierkontext eher selten begegnen. Mag ja sein, daß es sich um eine Übersetzung von side effekt handelt; da bin ich absolut schmerzfrei... --Tobias 16:06, 2. Aug. 2007 (CEST)Beantworten

Ich habe mal den Seiteneffekt präzisiert und den Entwurf einer Gliederung eingeführt.
Mit dem Satz
Außerdem wird manchmal die Auffassung vertreten, die Notwendigkeit zur Berücksichtigung von Wirkungen erschwere das Verständnis von Programmen.
bin ich noch nicht recht glücklich:
  1. Hier geht es doch um Nebenwirkungen, richtig?
  2. Ist es denn kein allgemein anerkanntes Prinzip, daß man Seiteneffekte aka Nebenwirkungen möglichst vermeidet? Schließlich wurden hierfür Namensräume, Datenkapselung usw. erfunden...
--Tobias 16:42, 2. Aug. 2007 (CEST)Beantworten

Hallo Tobias, Deine Darstellung des Themas ist falsch, um nicht zu sagen haarsträubend. Ich habe Deine Änderungen rückgängig gemacht. Du sollst in den Artikeln nicht Deine persönliche Sichtweise wiedergeben, sondern fundiertes Wissen einbringen. Um das zu erreichen, kommt man nicht umhin, auch mal ein gutes Buch zur Hand zu nehmen, um den eigenen Wissenshorizont zu erweitern und mit dem Stand der Dinge abzugleichen. Bitte gib in Zukunft Deine Quellen an. --Klaustro 12:20, 1. Sep. 2007 (CEST)Beantworten

Ich bin verwundert. Tatsächlich habe ich in meinem Informatikstudium die "Definition" von Seiteneffekt genau so erklärt bekommen, wie Tobias sie hier darstellt: Als Veränderung des Zustands eines Systems abseits von der "eigentlichen Wirkung" einer Funktion, nämlich einen Wert als Ergebnis zu liefern. Auch die englische Wikipedia erklärt "side effect" keineswegs synonym für "Wirkung". Außerdem habe ich den Begriff "Wirkung" so nie kennengelernt, sondern es wurde immer als "Zustandsänderung" bezeichnet, aber das ist vermutlich selbst unter den Dozenten Geschmackssache. Allerdings war ich weder ein schlechter Student noch hatte ich schlechte Dozenten, als dass ich mich da so irren könnte. Ich werde bei Gelegenheit mal in dem Buch "Informatik. Eine grundlegende Einführung. Band 1" (M. Broy, B. Rumpe) nachschlagen; tatsächlich erscheint es mir aber sehr wichtig, zwischen "Wirkung", wie es hier beschrieben ist, und "Seiteneffekt" zu unterscheiden. --Oimel 10:23, 11. Nov. 2007 (CET)Beantworten
Schlag das nach, und zitiere eine Stelle, die deinen Standpunkt unterstützt, dann reden wir weiter. --Klaustro 20:35, 2. Jan. 2008 (CET)Beantworten
Da ich das Buch verliehen und nicht zurück bekommen habe, wird das nicht mehr möglich sein. Und ehrlich gesagt ist mir das Thema nicht so wichtig, als dass ich mir das Buch jetzt neu besorgen werde. Immerhin finde ich es amüsant, dass ich meine Ansicht belegen soll, während Du, Klaustro, das mit Deiner Ansicht genauso wenig machst. Ich würde also sagen, in der Diskussion steht es "unentschieden" ;) --Oimel 23:14, 8. Jan. 2008 (CET)Beantworten

Quellen?

[Quelltext bearbeiten]

Ich kenne den Begriff nicht in dem Zusammenhang, das muss noch nichts heissen. Mir ist der Begriff Zustandsänderung und auch Zustand (Entwurfsmuster) geläufig. Da ich anscheinend nicht der einzige bin, stelle ich die Quellenfrage.

Ausserdem, so richtig gehaltvoll ist der Artikel ja nicht. --Avron 16:26, 17. Jan. 2008 (CET)Beantworten

Wenn man "Links auf diese Seite" benutzt, sieht man, dass der Begriff "side effect"/Seiteneffekt haeufig beim Vergleichen von deklarativen und imperativen Programmierparadigmen verwendet wird. siehe auch Referenzielle Transparenz. Wer allerdings den Begriff als erstes verwendet hat, k.A. arved 16:22, 23. Jan. 2008 (CET)Beantworten
Seiteneffekt ja, aber das hat nichts mit diesem Artikel zu tun.--Avron 16:42, 23. Jan. 2008 (CET)Beantworten

Ich habe in meiner Überarbeitung einige Informationen gelöscht, für die ich keine nachvollziehbaren Quellen finden konnte:

  • a) „Wirkung“ und „Nebenwirkung“ sind keine Synonyme. Eine Nebenwirkung ist zwar eine Wirkung, aber umgekehrt gilt das nicht.
  • b) Dass funktionale Programmiersprachen keine Wirkung hätten, war sehr missverständlich formuliert. Im Artikel Funktionale Programmiersprache steht einiges dazu – dort wird ausdrücklich davon gesprochen, dass Funktionen Nebenwirkungen haben können. Da ich zu den rein funktionalen Programmiersprachen im Moment aber keine brauchbaren Quellen finden konnte, habe ich den Abschnitt vorläufig lieber ganz entfernt. Er müsste wieder ergänzt werden. Wer sich hier auskennt – nur zu.
  • c) Dass moderne Compiler wirkungslose Konstrukte wegoptimieren können (ich nehme an, damit sind z. B. vergessene Quelltextzeilen gemeint, auf die nirgends Bezug genommen wird), habe ich aus dem selben Grund entfernt. Auch das müsste wieder ergänzt werden.

--TM 22:06, 23. Jan. 2008 (CET)Beantworten

Schon besser. Was mir noch nicht gefaellt, das Seiteneffekte nur als Programmierfehler dargestellt werden. Seiteneffekte sind ein wichtiges Ausdrucksmittel von (imperativen) Programmiersprachen ( z.B. I/O und State). arved 22:56, 23. Jan. 2008 (CET)Beantworten
Ein guter Hinweis, danke. Ob ein Seiteneffekt gut oder böse ist, hängt ja letztlich nur davon ob, ob er dokumentiert ist. Das wird beim Lesen noch nicht so richtig klar. --TM 23:25, 23. Jan. 2008 (CET)Beantworten
Eine Möglichkeit waere noch, dass etwas ungluecklich gewaehlte Beispiel zu ersetzen. Das Beispiel in der französischen Version gefaellt mir z.B. besser. arved 08:36, 24. Jan. 2008 (CET)Beantworten

Antwort auf den Beitrag von TM:

  • zu a) "Wirkung" und "Nebenwirkung" sind zwar allgemeinsprachlich keine Synonyme. In diesem Zusammenhang sind sie es aber schon. "Wirkung", "Nebenwirkung", "Nebeneffekt" und "Seiteneffekt" bedeuten in diesem Fall tatsächlich das gleiche.
  • zu c) Nein, mit vergessenen Quelltextzeilen hat das nichts zu tun. Wirkungsfreie (aber nicht "wirkungslose") Ausdrücke erlauben Compilern weitreichende Optimierungsmöglichkeiten. Das ist auch an sich nichts Neues. --Klaustro 17:17, 14. Mär. 2008 (CET)Beantworten
Mein Diskussionsbeitrag hier ist nicht mehr aktuell. Es kommt auf den Kontext an, ob die Begriffe synonym sind oder nicht. Im Artikel habe ich bereits versucht, auf diese verschiedenen Kontexte einzugehen. --TM 00:49, 15. Mär. 2008 (CET)Beantworten
Ah, verstehe, die Diskussion bezieht sich auf eine ältere Version des Artikels. Eine Frage zur Bezeichnung "Wirkung": Ist die Verwendung dieses Ausdrucks durch deine Quellenangaben belegt? --Klaustro 10:48, 15. Mär. 2008 (CET)Beantworten
Jein. Der Begriff „Wirkung“ wird zwar hin und wieder verwendet, aber meist wird nur von „Nebenwirkung“ (side effect) gesprochen und das Wort „Wirkung“ taucht nicht auf. Übrigens wurde der Artikel genau deshalb abgelehnt und hier zwischengelagert. Ich bin mir noch nicht sicher, wie man damit weiter verfahren sollte. Eine Möglichkeit wäre, aus den Inhalten hier einen Artikel Nebeneffekt zu basteln. --TM 20:15, 15. Mär. 2008 (CET)Beantworten