if( Konzept && !Konzept ) { printf( "Lehrmeinung?" );

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Panke
Beiträge: 70
Registriert: So Nov 14, 2010 10:47 am

Re: if( Konzept && !Konzept ) { printf( "Lehrmeinung?" );

Beitrag von Panke » Fr Aug 05, 2011 7:13 am

Du meinst, die Anwendungsebene sollte hier dann "intelligenterweise" entscheiden, noch mal zu suchen, aber dafür halt nicht alles zu suchen?
Das halte ich persönlich für vollkommenen Quatsch.
Das war ein Beispiel. Vielleicht nicht das sinnvollste, weil man eher kleinschrittig anfangen würde und dann die Suchtiefe erweitern. Aber es gibt noch mehr Beispiele, bei denen man ein Problem weiter "oben" in der Logik lösen / angehen kann.

Ein anderes Beispiel wäre, dass man versucht eine Kripke-Struktur (ein großer Graph) für ein Model-Checking-Problem in den Speicher zu laden. Das kann auch mal schief gehen, weil zu groß. Und dann? Muss jeder Fitzelchen Code wissen, dass ich eine Kripke-Struktur in den Speicher lade und da durchaus mal der Speicher ausgehen kann. Damit der "low-level" Code das Problem lösen kann, weil der "high-level" Code dazu eh nicht in der Lage ist?

Jedes Problem, wo ein Fehler auftritt, der "unten" nicht behandelt werden kann und deshalb nach oben durchgereicht werden muss, ist mir hier völlig recht.
Wenn die Suche zu viel Speicher verbraten kann, dann muss sie eine eigene Speicherverwaltung haben.
Eigene Speicherverwaltungen vermehren nicht magisch den Speicher den sie verwalten.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: if( Konzept && !Konzept ) { printf( "Lehrmeinung?" );

Beitrag von Xin » Fr Aug 05, 2011 10:33 am

Panke hat geschrieben:Goto ist ja sehr wohl definiert.
"hier", "da" und "dort" sind Variablen.

Vergleiche nun:

Code: Alles auswählen

on i goto hier, da, dort;
und

Code: Alles auswählen

throw hierException();
Früher hieß das "Spaghetticode", heute sagt man "State of the Art".

----------------
PS (heißt, diesen Text schreibe ich nach dem Text weiter unten, weil es mir erst mit diesem Posting aufgefallen ist)

Das mit Goto passt nicht richtig. On ExceptionID goto ... ist eigenlich noch zu sauber. Fällt mir jetzt erst richtig auf: die richtigere Formulierung wäre eigentlich an ein Intercal-Statement angelehnt:

Code: Alles auswählen

static char const * exceptionDataWhat;

double sqrt( double value )
{
  if( value -1 )
  {
     exceptionDataWhat = "Wurzel aus negativer Zahl gezogen";
SQRT_NEGATIVE_VALUE:
     // entspricht throw NegativeValue();
  }
  ...
  return result;
}

int main()
{
  sqrt(-1);

  goto BEYOND;
  please come from SQRT_NEGATIVE_VALUE:
  {
     // Das Label SQRT_NEGATIVE_VALUE wurde erreicht, also geht der Code hier weiter.

     printf( "Exception: %s\n", exceptionDataWhat );
  }

BEYOND:
  return 0;
Ja, wie geil ist das denn!? ^^
Alles da, das ExceptionObjekt - hier zwar nur ein String - im eigentlichen Code gibt es zwischen catch und came from keinen nennenswerten Unterschied (es gibt einen, der bei der Auswertung der Exceptions auch aufwendig ausformuliert wird und Exceptions so teuer macht).

Exceptions lassen sich wunderbar abbilden mit einem Konzept, dass 1972 SPASSESHALBER entwickelt wurde, um aufzuzeigen, wie man schlecht programmiert.
Und jetzt machen wir das und die Unis lehren das als gute Programmierung... jetzt ich find' das erst richtig geil. Ich fand schon damals, dass vieles im Studium nicht wirklich ernst gemeint gewesen sein konnte... aber das verblüfft mich jetzt auch ein wenig.

Hoffentlich kommen wir bald wieder in der Fehlerbehandlung der 80er an. Wir befinden uns gerade in den frühen 70ern und selbst da hat man das nicht ernst gemeint.
Wikipedia hat geschrieben: INTERCAL wurde mit dem Ziel entwickelt, das Programmieren schwierig zu gestalten und die entstehenden Programme effektiv unlesbar zu machen. Insofern ähnelt INTERCAL keiner der bekannten Programmiersprachen, hat sehr wenige Sprachkonstrukte und ist schwer zu erlernen. Besonders berühmt ist der „ComeFrom“ Befehl, der invers an den Goto-Befehl vieler Programmiersprachen angelehnt ist.
---------------- </PS>


Panke hat geschrieben:Was ist, wenn du den Fehler nur an die aufrufende Funktion weiterreichen willst? Dann reicht die Prüfung einer einzigen Funktion eben nicht aus.
Jede Funktion prüft, ob sie Fehlercodes der gerufenen Funktionen bearbeitet.
Panke hat geschrieben:Außerdem kannst du eh nicht prüfen, ob etwas sinnvolles machst, sondern nur ob du überhaupt etwas machst. Das ist ja gerade der Irrweg, der bei Java zu den fang-alles- und fangen-aber-verwerfen-Fehlern führt.
Das ist korrekt. Ich will aber auch keinen Fehler oder eine Warning geben. Ich will eine Debug-Version, die automatisch protokolliert und mir sagt "Funktion X, File Y, Zeile Z erhielt bei Aufruf von F() Fehlercode "GehtNicht" und Du Depp kümmerst Dich nicht drum."

Und diese Information ist automatisiert beschaffbar, auch dann, wenn der Entwickler den Fehlercode nicht explizit abfragt.

Das Ganze ist sogar zum Teil während der semantischen Analyse während des Compilierens machbar.

Im Sprachdesign heißt das, dass Fehler, die ich nicht erwarte, auch nicht behandelt werden (statt(!) catch all, dass explizit alle Fehler behandelt) und ich vor allem nicht gezwungen werde sie zu behandeln. Treten sie doch auf, kann ich sie automatisiert loggen lassen oder eine Exception werfen lassen, die das Programm in einen Fehlerzustand versetzt und anschließend beendet.
Wenn ich Fehler behandle, dann muss ich sie vor Ort behandeln oder explizit aussagen, dass ich sie durchreiche.
Panke hat geschrieben:Und wenn ein Fehler auftritt, den ich noch nicht behandelt habe, will ich dass mein Programm mit einer hoffentlich halbwegs guten Fehlermeldung abschmiert. Das garantieren - bei Beachtung simpler Programmierregeln - Exceptions.
Die Programmierregeln sind simple und unrealistisch. Sie werden nicht eingehalten.
Das muss man so akzeptieren. Man kann per Gesetz Mord verbieten, aber das garantiert einem nicht, dass man nicht ermordet wird. Und die Regeln, damit Exceptions Vorteile bringen, werden zu selten eingehalten. Und wie beim Mord, reicht von 80 Millionen BRD-Bürgern einer aus, der Dich um die Ecke bringt.
Sobald einer Mist baut, knallt's.
Einer baut immer Mist und das ist selbst in einem Zwei-Mann-Team schon recht optimistisch.

Der Gesetzgeber reagiert darauf: Er verbietet nicht nur Mord, er stellt es unter Strafe. Die Programmiersprache nicht.

Also muss die Sache anders angegangen werden: Das Defaultverhalten der Sprache muss so sein, dass sie nicht kompiliert, wenn der Benutzer nicht exakt formuliert hat, was er will.
Das will der Benutzer bei Fehlerfällen oftmals nicht. Also muss die Sprache eine Möglichkeit bieten, beim Fehlerfall den Entwickler zu nerven.
Panke hat geschrieben:Fehlercodes stützen sich darauf, dass vielleicht der folgende Code abstürzt, das ist aber nicht garantiert.
Das kann man garantieren.
In C kann man dafür Assert() benutzen. Machen aber wenige. Macht die Sprache das automatisch, werden die Entwickler sich klar ausdrücken.
Panke hat geschrieben:Ich schrieb neulich einen kleinen Server. Der stürzte relativ häufig ab mit
what() : Port already in use
Kein Problem, hatte halt eine andere Instanz laufen. Wäre er mit
segmantation fault
oder etwas ähnlichem abgestürzt,
hätte ich einen eher schwierig zu reproduzierenden Fehler gehabt, den
ich erstmal hätte suchen müssen. So hat mich das nicht eine Sekunde gekostet.
Das ist keine Ausnahme!

Das ist genau der Punkt, an dem Ausnahmen ÜBERHAUPT GARNICHTS zu suchen haben.
Du fragst nach einem Port, also gibt es zwei Möglichkeiten: Ja, Du bekommst ihn und Nein, Du bekommst ihn nicht. Da hast Du einfach nur scheiße programmiert.

Mit dem Segmentation-Fault hast Du vielleicht nicht den Text, aber die Zeile, die geknallt hat.
Dort geht Dein ungültiger Socket rein und Du musst Dich fragen, wieso der eigentlich nicht gültig ist.
Dann wirst Du kapieren, dass Du Mist programmiert hast in dem Du einen Regelfall - keine Ausnahme - ignoriert hast und für die Zukunft hoffentlich wissen, dass man Regelfälle sofort abdecken muss. Man findet sie nicht experimentell heraus und gibt das Programm dann weiter, wenn es auf der heimischen Umgebung zufälligerweise keine Exceptions wirft.

Sorry, aber Du konzentrierst Dich auf den Wunschverlauf, den Du behandeln willst und nicht auf den Verlauf, den Dein Programm nehmen kann. Das ist wie bei der Ostereiersuche große Hinweisschilder zu verlangen, damit man sich nicht verläuft und keine Süßigkeit übersieht. Das hat einfach nichts mit Programmierung zu tun. Da kannst Du gleich "programmDasTutWasIchWill();" in main aufrufen und hoffen, dass irgendwer die Funktion schon fertig implementiert hat.
Panke hat geschrieben:Du hast noch gar nicht dargelegt, wie der Fehlercode-Mechanismus von dir aussehen soll. Vielleicht reden wir auch aneinander vorbei.
Im Prinzip wie Exceptions, nur dass man eben maximal bis zur aufrufenden Funktion kommt und nicht weiter.
Panke hat geschrieben: Folgendes Szenario: Ich habe einen relativ komplexen Algorithmus, der viel Speicher frisst. Sagen wir aus dem Bereich KI und Planung. Die sind ja immer im Grunde Suchverfahren mit Backtracking mit kleveren Heuristiken. Ich kann eine gewisse Suchtiefe angeben und der Speicherverbrauch ist exponentiell zur Tiefe. Jetzt will ich folgendes machen können:

Code: Alles auswählen

catch(std::bad_alloc e)
{
    // tja, nicht genug Speicher für depth=20. Zum Glück sind Exceptions
    // mehr als ein goto und "search" garantiert mir, dass es im Falle einer
    // Ausnahme einen konsistenten, aufgeräumten Zustand hinterlässt durch
    // Stack Unwinding und RAII. Also kann ich hier einfach weitermachen.
}
Wenn search jetzt die Funktionen foo, fart, faz, bar, bart, batz aufruft, möchte ich nicht
in so einem Callstack
foo
----fart
-------- faz
------------ bar
---------------- bart
-------------------- batz
In jeder Funktion den Fehlercode bei jeder Allocation prüfen und eventuell reagieren müssen. Mit Exceptions knallt mir mein
Bad-Alloc -- ohne, dass ich mich in foo, fart, faz, bar, bart, batz drum kümmern muss -- einfach bis nach
oben durch. Das ist doch der Vorteil von Exceptions. Das können Fehlercodes leider nicht.
Wenn Du auf Unwinding und RAII vertraust, wieso bekommst Du ein bad_alloc?

Und da Du offenbar doch Speicher alloziierst musst Du sowieso in foo, fart, faz, bar, bart und batz auf den Fehler reagieren, indem Du dort den Speicher und die Handles wieder freigibst, bevor Du die Exception durchreichst.

Ich glaube, ich habe den Vorteil der Exceptions gerade verpasst.
Panke hat geschrieben: Umgekehrt krieg ich mit Exceptions alles hin, was Fehlercodes auch können.

Folgender Code:

Code: Alles auswählen

 
A a;
// a hier richtig initialisiert?
Mit Exceptions kein Problem. Mit Fehlercodes? Entweder immer ein Aufruf mehr oder man macht nicht triviale Initialisierung in einer
init-Methode. Auch nicht schön.
Hier stimme ich Dir zu. Das ist eine Schwachstelle in C++.
Panke hat geschrieben:Ich behaupte nicht, dass Exceptions der Weisheit letzter Schluss sind, aber jeder Ersatz muss mindestens den gleichen Komfort bieten. Die Alternative ist nicht, zu Fehlerbehandlung der 80iger Jahre zurückzukehren. Die ist eben nicht gleichwertig.
Nein, es ist höherwertig, denn das Prinzip ist automatisiert prüfbar.

Java hat auf Exceptions gesetzt, C++ nicht wirklich. C# ist von Java abgekupfert. Java wurde als der Gral der Weisheit verkauft. Ich habe von Professoren (quasi das, was Professionelle ausbilden soll) erfahren, wie toll Java ist, dass man keine Pointer braucht, dass Exceptions toll sind und ich habe Rückfragen gestellt.
Ich weiß wie Exceptions funktionieren. Und ich gehöre auch noch zu der Generation, die selbst Spaghetti-Code geschrieben hat, sich im Debuggen verheddert hat und die Erfahrung hat, den Mist zu debuggen.
Darum vermeide ich sowas aus Erfahrung.

In echten Java-Programmen (nicht sowas, was man an der Uni schreibt), konnte ich die Spaghetti-Code-Erfahrungen wieder gut gebrauchen.
Panke hat geschrieben:Und der Hauptkritikpunkt an Exceptions scheint ja >catch-all, weil faul< zu sein. Das ist aber kein Problem von Exceptions an und für sich, sondern daran, dass Java es einfacher macht, leere catch-Klauseln von Exclipse generieren zu lassen, als erst gar keine hinzuschreiben.
Das ist der Fehler im Konzept. Die Sprache fordert dazu auf, darum wollen die Benutzer es schreiben und darum nimmt ihnen die IDE die Arbeit ab.

---- späteres Posting

Das Beispiel mit der Suche kann ich nicht wirklich nachvollziehen. Eine Suche sucht in vorhandenen Daten, sie produziert keine Daten. Suchfunktionen sind in der Regel Const-Methods. Wenn Du eine CD im Schrank suchst und Du den Fehler "Konnte neue CD nicht in Schrank stellen" erhältst, dann solltest Du das Suchkonzept überarbeiten.
Panke hat geschrieben:Ein anderes Beispiel wäre, dass man versucht eine Kripke-Struktur (ein großer Graph) für ein Model-Checking-Problem in den Speicher zu laden. Das kann auch mal schief gehen, weil zu groß. Und dann? Muss jeder Fitzelchen Code wissen, dass ich eine Kripke-Struktur in den Speicher lade und da durchaus mal der Speicher ausgehen kann. Damit der "low-level" Code das Problem lösen kann, weil der "high-level" Code dazu eh nicht in der Lage ist?
Jeder Knoten ist ein Objekt. Beim Laden stellt ein Knoten fest, dass er den Unterknoten nicht anlegen kann. Er meldet das Problem. Da das ganze Rekursiv läuft, durchläuft die Fehlermeldung den Graphen. Der erste Knoten stellt fest, dass der Graph nicht ladbar ist und ruft die Destruktoren seiner Umgebung. Der Graph ist weg und der Konstruktor (der in dem Fall eine statische Load-Funktion wäre) meldet dem Aufrufer den Fehlercode "PasstNichtInDenSpeicher".

Es sind zwei Fitzel Code, die das wissen müssen - genau wie bei den Exceptions: Die Graph-Knoten legen nur weitere Unterknoten an, wenn die vorherigen Knoten angelegt werden konnten und die Ladefunktion unterscheidet zwischen "alle Knoten angelegt" und "passt nicht".


--------------
Intercal-Website: http://www.catb.org/~esr/intercal/

Die Startseite ist lesenswert...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: if( Konzept && !Konzept ) { printf( "Lehrmeinung?" );

Beitrag von Kerli » Fr Aug 05, 2011 11:51 am

Xin hat geschrieben:Exceptions lassen sich wunderbar abbilden mit einem Konzept, dass 1972 SPASSESHALBER entwickelt wurde, um aufzuzeigen, wie man schlecht programmiert.
Solange ein Konzept eine gewisse Mächtigkeit aufweist oder sogar als turing-vollständig betrachtet werden kann, ist man damit in der Lage jedes andere Konzept damit abzubilden. Nur weil mein also mit einem "schlechten" Konzept ein anderes Konzept nachbilden kann heiße es noch lange nicht, dass dieses auch "schlecht" ist.
Es kommt ja auch keiner auf die Idee ein ganze Programm in eine einzige Funktion zu packen und Funktionsaufrufe über 'goto' zu realisieren. Der kompilierte Code wird vermutlich kaum zu Unterscheiden sein und trotzdem sind es zwei komplett unterschiedliche Konzepte.

Ich würde Exceptions eher als überladenen Rückgabetyp mit implizitem 'return' sehen. Schließlich kann man jeden beliebigen Typ als Exception werfen und innerhalb einer Funktion passiert genau das selbe als würde man die Funktion mit 'return' verlassen - Es wird der Stack abgebaut und alle Objekte die darauf bereits vollständig initialisiert wurden werden wieder schön in umgekehrter Reihenfolge abgebaut. Der einzige Unterschied zu einem normalen 'return' (zb. einem Fehlercode) ist dass falls der Aufrufer nicht auf den Fehler reagiert, dieser an die nächst höhere Ebene weiter gereicht wird.
Xin hat geschrieben:Die Programmierregeln sind simple und unrealistisch. Sie werden nicht eingehalten.
[...]
Also muss die Sache anders angegangen werden: Das Defaultverhalten der Sprache muss so sein, dass sie nicht kompiliert, wenn der Benutzer nicht exakt formuliert hat, was er will.
Das will der Benutzer bei Fehlerfällen oftmals nicht. Also muss die Sprache eine Möglichkeit bieten, beim Fehlerfall den Entwickler zu nerven.
Mit dieser Meinung dürfte der Programmierer eigentlich gar nichts mehr selber entscheiden. Eine gewisse Grundintelligenz würde ich jedem Entwickler doch zutrauen. Und ob ich jetzt den Fehlercode ignoriere oder die Exception mit einem catch all ignoriere läuft genau auf das gleiche hinaus - Der Entwickler hat sich bewusst dazu entschieden einen Fehler zu ignorieren - und dagegen hilft keine noch so tolle Kompiler Fehlermeldung.
Xin hat geschrieben:Das ist keine Ausnahme!

Das ist genau der Punkt, an dem Ausnahmen ÜBERHAUPT GARNICHTS zu suchen haben.
Du fragst nach einem Port, also gibt es zwei Möglichkeiten: Ja, Du bekommst ihn und Nein, Du bekommst ihn nicht. Da hast Du einfach nur scheiße programmiert.
Das ist wohl eher Ansichtssache. Für mich ist eine Ausnahme etwas das das gesamte Programm oder einen Teil davon abhält ordnungsgemäß ausgeführt zu werden. Wenn man jetzt einen Webserver schreibt dann ist wohl das belegt seine des eingestellten Ports eine Ausnahme vom ordnungsgemäßen Programmablauf. Somit kann man auch zum Beispiel ein neues Socket-Objekt anlegen und weiß, dass wenn der Konstruktor keine Exception wirft, der Port erfolgreich geöffnet worden ist. Dabei braucht man nicht an dieser Stelle im Code alle möglichen Fehlercodes überprüfen sondern hat die Fehlerbehandlung sauber aus dem normalen Programmablauf herausgezogen und kann denn Fehler dann außerhalb des Codes für den eigentlichen Webserver abfangen und dort dem Benutzer den Fehler ausgeben. Dieser kann dann zb eine bereits laufendes Programm welches den gewünschten Port belegt beenden oder den Webserver überhaupt mit einem anderen Port neu starten.
Xin hat geschrieben:Da kannst Du gleich "programmDasTutWasIchWill();" in main aufrufen und hoffen, dass irgendwer die Funktion schon fertig implementiert hat.
Das nennt man dann Java :P
Xin hat geschrieben:Wenn Du auf Unwinding und RAII vertraust, wieso bekommst Du ein bad_alloc?
Irgendwie verstehe ich den Zusammenhang nicht so ganz. RAII sorgt nur im Zusammenhang mit Unwinding damit das im Fehlerfall - also zb bei fehlendem Speicher - akquirierte Ressourcen wieder freigegeben werden.
Xin hat geschrieben:Und da Du offenbar doch Speicher alloziierst musst Du sowieso in foo, fart, faz, bar, bart und batz auf den Fehler reagieren, indem Du dort den Speicher und die Handles wieder freigibst, bevor Du die Exception durchreichst.
Das ist die Aufgabe von RAII, die bei deren Anwendung implizit passiert ohne dass man sich selbst explizit darum kümmern muss.
Ich glaube, ich habe den Vorteil der Exceptions gerade verpasst.
Der größte Vorteil ist meiner Meinung das Herauslösen des Codepfades der nur im Ausnahmefall ausgeführt wird, aus dem Codepfad der im Normalfall ausgeführt wird. Wenn ich also Speicher mit new anfordere und nebenbei auch noch ein paar Objekte erstelle, dann kann ich bei ordentlicher Verwendung von Exceptions auch sicher sein dass ich den gesamten Speicher erhalten habe den ich brauche und auch alle Objekte ordentlich initialisiert worden sind - Und das ganze ohne bei jeder Speicheranforderung den erhaltenen Zeiger auf NULL prüfen zu müssen und ohne nach jeder Objektinitialisierung eine 'isInit', 'getError' öä. Methode aufrufen zu müssen.
Xin hat geschrieben:
Panke hat geschrieben:Umgekehrt krieg ich mit Exceptions alles hin, was Fehlercodes auch können.
Folgender Code:

Code: Alles auswählen

A a;
// a hier richtig initialisiert?
Mit Exceptions kein Problem. Mit Fehlercodes? Entweder immer ein Aufruf mehr oder man macht nicht triviale Initialisierung in einer
init-Methode. Auch nicht schön.
Hier stimme ich Dir zu. Das ist eine Schwachstelle in C++.
Warum ist das eine Schwachstelle? Mit Exceptions ist das doch schön gelöst. Wenn ich in die zweite Zeile komme weiß ich implizit, dass mein Objekt auch korrekt angelegt wurde. Im Ausnahmefall wird eine Exception geworfen und ich komme gar nicht weiter ohne mich darum zu kümmern, und kann also auch nicht - zumindest ohne die Exception mutwillig zu ignorieren - mit einem ungültigen Objekt weiterarbeiten.
Xin hat geschrieben:Nein, es ist höherwertig, denn das Prinzip ist automatisiert prüfbar.
Aus welchem Grund sollte das mit Exceptions nicht möglich sein?

Wie ich bereits irgendwo geschrieben habe. Exceptions sind kein Allheilmittel, ihr überlegter Einsatz kann jedoch durchaus sinnvoll sein und für deutlich sichereren und gleichzeitig übersichtlicheren Code sein. Außerdem finde ich nichts nerviger als die Fehlerbehandlung der Win API und Verwandten mit ihren endlosen 'if( ret_val == E_<irgendwas> )'.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: if( Konzept && !Konzept ) { printf( "Lehrmeinung?" );

Beitrag von Dirty Oerti » Fr Aug 05, 2011 12:12 pm

Panke hat geschrieben:Jedes Problem, wo ein Fehler auftritt, der "unten" nicht behandelt werden kann und deshalb nach oben durchgereicht werden muss, ist mir hier völlig recht.[/qoute]
Wie zum Beispiel?
Panke hat geschrieben:Eigene Speicherverwaltungen vermehren nicht magisch den Speicher den sie verwalten.
Nein, nicht magisch, sondern durch die Auslagerung von Speicher in Dateien, somit setzt eine eigene Speicherverwaltung eine weitere Abstraktionsebene zwischen Programm und Daten/Speicher. Wenn die Speicherverwaltung so ausgelegt ist, dann kann dem Programm dadurch auch mehr Speicher zur Verfügung stehen, als vom Betriebssystem/Prozessor her eigentlich vorgesehen.
Genau DAS wird z.B. in Videobearbeitungssoftware gebraucht, wo du mit Unmengen von Daten arbeitest.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: if( Konzept && !Konzept ) { printf( "Lehrmeinung?" );

Beitrag von Xin » Fr Aug 05, 2011 1:05 pm

Kerli hat geschrieben:
Xin hat geschrieben:Exceptions lassen sich wunderbar abbilden mit einem Konzept, dass 1972 SPASSESHALBER entwickelt wurde, um aufzuzeigen, wie man schlecht programmiert.
Solange ein Konzept eine gewisse Mächtigkeit aufweist oder sogar als turing-vollständig betrachtet werden kann, ist man damit in der Lage jedes andere Konzept damit abzubilden. Nur weil mein also mit einem "schlechten" Konzept ein anderes Konzept nachbilden kann heiße es noch lange nicht, dass dieses auch "schlecht" ist.
Ich denke, Exceptions sind mit come from verdammt gut abgebildet.

Dass Objektorientierte Programmierung kein Paradigma darstellt, das man nicht in die anderen Paradigmen einsortieren kann, wie von nicht wenigen behauptet, ist auch nur die schöngeredete Umschreibung für ein Pattern, welches Funktionspointer managet.

Man kann das als neues Konzept bezeichnen. Es wird aber trotzdem nichts anderes daraus, nur weil man den Funktionsaufruf dann "Message" nennt.

Dass Come-From und Exceptions schon in der Syntaxaufbau so gut aufeinander passen finde ich bemerkenswert und darum ich finde es auch durchaus als angebracht, wenn Syntax und Semantik so gut übereinstimmen, daran zu denken, dass es sich um das gleiche Konzept handelt.
Und wenn das gleiche Konzept einerseits als Jux und Beispiel schlechter Programmierung gilt und andererseits als moderne Fehlerbehandlung, dass dann entweder come from oder Exceptions missverstanden werden.
Aber das ganze kann nicht Schrödingers Katze der Informatik sein. Gut und schlecht geht nicht.
Kerli hat geschrieben:
Xin hat geschrieben:Die Programmierregeln sind simple und unrealistisch. Sie werden nicht eingehalten.
[...]
Also muss die Sache anders angegangen werden: Das Defaultverhalten der Sprache muss so sein, dass sie nicht kompiliert, wenn der Benutzer nicht exakt formuliert hat, was er will.
Das will der Benutzer bei Fehlerfällen oftmals nicht. Also muss die Sprache eine Möglichkeit bieten, beim Fehlerfall den Entwickler zu nerven.
Mit dieser Meinung dürfte der Programmierer eigentlich gar nichts mehr selber entscheiden. Eine gewisse Grundintelligenz würde ich jedem Entwickler doch zutrauen. Und ob ich jetzt den Fehlercode ignoriere oder die Exception mit einem catch all ignoriere läuft genau auf das gleiche hinaus - Der Entwickler hat sich bewusst dazu entschieden einen Fehler zu ignorieren - und dagegen hilft keine noch so tolle Kompiler Fehlermeldung.
Richtig. Der Unterschied liegt schließlich auch auf einer anderen Ebene. Ich biete dem Programmierer nicht an Mist zu bauen, erst recht fordere ich ihn nicht dazu auf, mal eben Mist zu bauen, damit er den Quelltext kompilieren darf.
Er darf Mist bauen, wie bei Exceptions muss er ihn fordern, aber er muss ihn nicht explizit hinschreiben, um während der Entwicklungszeit seinen Algorithmus testen zu dürfen.

Ansonsten: Geh bei einem Entwickler davon aus, dass er keine Grundintelligenz hat. Ich programmiere seit 25 Jahren und habe diese Woche zweimal erkennen müssen, dass ich damit offensichtlich nicht ausreichend ausgestattet bin.
Kerli hat geschrieben:
Xin hat geschrieben:Das ist keine Ausnahme!

Das ist genau der Punkt, an dem Ausnahmen ÜBERHAUPT GARNICHTS zu suchen haben.
Du fragst nach einem Port, also gibt es zwei Möglichkeiten: Ja, Du bekommst ihn und Nein, Du bekommst ihn nicht. Da hast Du einfach nur scheiße programmiert.
Das ist wohl eher Ansichtssache. Für mich ist eine Ausnahme etwas das das gesamte Programm oder einen Teil davon abhält ordnungsgemäß ausgeführt zu werden. Wenn man jetzt einen Webserver schreibt dann ist wohl das belegt seine des eingestellten Ports eine Ausnahme vom ordnungsgemäßen Programmablauf.
Das ist eine Abweichung von der Wunschvorstellung des Entwicklers.

Kommen wir mal kurz in die Wirklichkeit. Ich will einparken und sehe einen Parkplatz, also starte ich die Einpark-Prozedur.
Es folgt eine ParkplatzBesetztException, woraufhin ich, der nur einparken will, eine Exceptionbehandlung mache, in dem ich das nun invalide Objekt Stoßstange destrukturiere und ein neues Objekt Stoßstange erzeuge und zum nächsten Parkplatz fahre.
Keine Ahnung, wie das in Österreich ist, aber wir Deutschen sind für unsere Autoliebe bekannt und wir gucken erst, bevor wir die Einparkprozedur aufrufen. Abbildung der Wirklichkeit - auch wenn's nervt erst ein if() zu schreiben - es gehört einfach genau da hin.

Derartiges Programmieren mit Exceptions entspricht nicht einer realistischen Beschreibung eines Vorgangs. In der Wirklichkeit ist es sogar die Regel, dass die meisten Parkplätze belegt sind.
Eine Ausnahme wäre, wenn während des Einparkvorgangs ein Auto vom Himmel fällt. Fahrer in der Wirklichkeit, wie auch Programm dürfen dann in Panik verfallen. Das ist in meinen Augen eine Exception, weil es eben nicht der Regelfall ist.
Kerli hat geschrieben:
Xin hat geschrieben:Da kannst Du gleich "programmDasTutWasIchWill();" in main aufrufen und hoffen, dass irgendwer die Funktion schon fertig implementiert hat.
Das nennt man dann Java :P
Eben.

Soweit ich weiß, war Java ein Haufen Marketing-Buzzwords und große Firmen bauen Java-Entwicklungen zurück. Keiner programmiert offensiv laufende Software in Java, wie Spiele.
Java ist eine Studentensprache und die Vorzeigeprodukte in Java sind Eclipse-die Java Entwicklungsumgebung und OpenOffice, dass vom Java-Hersteller produziert wird.

Konzept gescheitert.
Kerli hat geschrieben:Das ist die Aufgabe von RAII, die bei deren Anwendung implizit passiert ohne dass man sich selbst explizit darum kümmern muss.
RAII von Zeigern funktioniert nicht. ^^
Kerli hat geschrieben:
Xin hat geschrieben:

Code: Alles auswählen

A a;
// a hier richtig initialisiert?
Hier stimme ich Dir zu. Das ist eine Schwachstelle in C++.
Warum ist das eine Schwachstelle? Mit Exceptions ist das doch schön gelöst. Wenn ich in die zweite Zeile komme weiß ich implizit, dass mein Objekt auch korrekt angelegt wurde. Im Ausnahmefall wird eine Exception geworfen und ich komme gar nicht weiter ohne mich darum zu kümmern, und kann also auch nicht - zumindest ohne die Exception mutwillig zu ignorieren - mit einem ungültigen Objekt weiterarbeiten.
Wie ich schon sagte, hier sehe ich die Schwachstelle. Das hätte ich anders gelöst, aber damals probierte man Exceptions aus. Übrigens, ursprünglich war es auch anders gelöst.
Kerli hat geschrieben:
Xin hat geschrieben:Nein, es ist höherwertig, denn das Prinzip ist automatisiert prüfbar.
Aus welchem Grund sollte das mit Exceptions nicht möglich sein?
Weil Du in der semantischen Prüfung absolut keine Chance hast, zu ermitteln, wo die Exception landen wird.
Kerli hat geschrieben:Wie ich bereits irgendwo geschrieben habe. Exceptions sind kein Allheilmittel, ihr überlegter Einsatz kann jedoch durchaus sinnvoll sein und für deutlich sichereren und gleichzeitig übersichtlicheren Code sein. Außerdem finde ich nichts nerviger als die Fehlerbehandlung der Win API und Verwandten mit ihren endlosen 'if( ret_val == E_<irgendwas> )'.
Überlegter Einsatz von Exceptions finde ich ja auch gut. Vom Himmel fallende Autos - Exception, kein Problem.

C++ verlangt heute teilweise Exceptions bei Konstruktoren, bzw. man muss auf new( nothrow ) ausweichen. Das ist - imho - eine, wenn nicht sogar die Schwachstelle von C++. Der new-Operator in C++/Java/C# ist sowieso semantisch schwach ausgelegt.
Da geht noch was.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten