Die verpönten goto´s



  • noobLolo schrieb:

    earli schrieb:

    Multiplikationen sind Kinderkacke

    Kinderkacke macht meine cpu mit einem Takt, Multiplikationen nicht 😉

    Näherungsweise schon, wenn du jetzt nicht gerade mit einem 286er unterwegs bist. (Stichwort: Pipelining.) Und die for-Schleifen machen das Ganze so vorhersehbar für den Compiler, dass nichtmal branch prediction erforderlich ist.



  • earli schrieb:

    Das ist auch mal ganz grober Unfug. Multiplikationen sind Kinderkacke, wenn du in jedem Durchlauf zig Pointer dereferenzierst.

    Ne, spielt keine so große Rolle, weil die meisten Compiler Variablenzugriffe sowieso auf indirekt- indizierten ASM abzubilden versuchen. Weil man so das meiste gebacken bekommt oder sich sonst was mit einem möglichen OS beißt, plagt sich kaum jemand mit auf direkter Adressierung basierender Optimierung rum.
    Ist jetzt eine sehr verkürzte Darstellung und sachlich im Detailbereich nicht zu 100% richtig, aber Deref's sind meistens ziemlich egal, weil der Frame eigentlich immer auch indirekt- indiziert aufgelöst wird.

    Zum Topic:
    Ich habe die gotos für cleanups seit etwa einem Jahr wiederentdeckt und etliche Zeilen Sinnlos- Code aus meinen Libs geschmissen, was zeigt, daß goto nicht nötig ist, aber manchmal saupraktisch und besser lesbaren Code zu erzeugen helfen kann.

    @Lolo
    Ich mag BB's Code auch lieber, weil eher 'Spirit of C'.
    😃



  • knivil schrieb:

    Wir koennen jetzt gerne weitere tolle, allgemeine und nichts-sagende Beispiele entwerfen.

    Also für mich war die Message jedes Beispieles immer leicht versändlich

    knivil schrieb:

    Aber ich wuerde so einen Code nie schreiben. Und es liegt nicht am goto.

    Dann zeig doch mal wie du das machen würdest (am besten anhand eines Beispieles), und jetzt komm nicht mit nem statischen Array daher... :p



  • Dann zeig doch mal wie du das machen würdest (am besten anhand eines Beispieles)

    Hast du ein konkretes Problem?



  • pointercrash() schrieb:

    earli schrieb:

    Das ist auch mal ganz grober Unfug. Multiplikationen sind Kinderkacke, wenn du in jedem Durchlauf zig Pointer dereferenzierst.

    Ne, spielt keine so große Rolle, weil die meisten Compiler Variablenzugriffe sowieso auf indirekt- indizierten ASM abzubilden versuchen. Weil man so das meiste gebacken bekommt oder sich sonst was mit einem möglichen OS beißt, plagt sich kaum jemand mit auf direkter Adressierung basierender Optimierung rum.

    Es handelt sich aber nicht um gewöhnliche Variablenzugriffe, sondern auf Zugriffe in den Heap (malloc()) oder auf unbekannte Variablen im Stack von den aufrufenden Funktionen. Dein Trick geht nur mit Variablen auf dem Stacksegment der Funktion selbst oder mit statischen Fields.



  • knivil schrieb:

    Dann zeig doch mal wie du das machen würdest (am besten anhand eines Beispieles)

    Hast du ein konkretes Problem?

    Herausspringen aus dreifacher Verschachtelung z.B. Und sag nicht, Du willst das mit einem Flag machen, oder den Code nur deshalb in eine Funktion auslagern.



  • Herausspringen aus dreifacher Verschachtelung

    Das ist kein konkretes Problem. Wahrscheinlich wuerde ich keine dreifach verschachtelte Schleife schreiben.

    jetzt komm nicht mit nem statischen Array daher ... Flag machen ... Funktion auslagern

    Du verbietest pauschal ganz schoen viel, ohne ein konkretes Problem genannt zu haben.



  • knivil schrieb:

    Herausspringen aus dreifacher Verschachtelung

    Das ist kein konkretes Problem. Wahrscheinlich wuerde ich keine dreifach verschachtelte Schleife schreiben.

    Wie machst du dann eine Matrixmultiplikation?



  • Wie machst du dann eine Matrixmultiplikation?

    Muss ich bei einer Matrixmultiplikation irgendwann aus den for-Schleifen herausspringen? Und wahrscheinlich hat man sowieso schon Funktionen fuer Skalarprodukt, Matrix * Vektor und Co.



  • knivil schrieb:

    Wie machst du dann eine Matrixmultiplikation?

    Muss ich bei einer Matrixmultiplikation irgendwann aus den for-Schleifen herausspringen? Und wahrscheinlich hat man sowieso schon Funktionen fuer Skalarprodukt, Matrix * Vektor und Co.

    Ja mei natürlich gibt es scheinbar keinen Fall wo sich ein goto nicht ersetzen lässt. Ich such ja auch schon ständig, um mein Bedürfnis zu rechtfertigen 😃



  • noobLolo schrieb:

    knivil schrieb:

    Wie machst du dann eine Matrixmultiplikation?

    Muss ich bei einer Matrixmultiplikation irgendwann aus den for-Schleifen herausspringen? Und wahrscheinlich hat man sowieso schon Funktionen fuer Skalarprodukt, Matrix * Vektor und Co.

    Ja mei natürlich gibt es scheinbar keinen Fall wo sich ein goto nicht ersetzen lässt. Ich such ja auch schon ständig, um mein Bedürfnis zu rechtfertigen 😃

    Java hat kein goto. Aber Java hat auch eine Garbage Collection. Vielleicht ist das kein Zufall. 😃



  • earli schrieb:

    Java hat kein goto. Aber Java hat auch eine Garbage Collection. Vielleicht ist das kein Zufall.

    Java hat "break mit Labels": http://java.sun.com/docs/books/tutorial/java/nutsandbolts/examples/BreakWithLabelDemo.java
    Keine vernünftige Sprache kommt ohne eine Form von GOTO aus. Ausser funktionale Sprachen, aber deren Nutzen ist nur akademisch.



  • Keine vernünftige Sprache kommt ohne eine Form von GOTO aus. Ausser funktionale Sprachen, aber deren Nutzen ist nur akademisch.

    Jetzt geht das schon wieder los.



  • Javaspezialist schrieb:

    Keine vernünftige Sprache kommt ohne eine Form von GOTO aus. Ausser funktionale Sprachen, aber deren Nutzen ist nur akademisch.

    Das ist schon wieder grober Unfug. Was macht denn eine Sprache "vernünftig"?

    Funktionale Sprachen sind auch in der Industrie weit verbreitet. Natürlich nicht unter Waldundwiesen-Hobbyprogrammierern und Windows-Klickapp-Codemonkeys. Aber was meinst du, wie Google und Co. das hinbekommen, dir in Millisekunden Millionen von Ergebnissen zu einem Suchwort zu präsentieren?

    Vielleicht hast du ja schonmal was von Erlang gehört.



  • knivil schrieb:

    Keine vernünftige Sprache kommt ohne eine Form von GOTO aus. Ausser funktionale Sprachen, aber deren Nutzen ist nur akademisch.

    Jetzt geht das schon wieder los.

    C soll doch Maschienennah sein, zeig mir mal 15 Zeilen asm wo kein

    "JMP label"
    "JE label"
    "JNE label"
    ...

    drin ist...

    earli schrieb:

    Aber was meinst du, wie Google und Co. das hinbekommen, dir in Millisekunden Millionen von Ergebnissen zu einem Suchwort zu präsentieren?

    weil sie die besten Algos in feine C-Apps eingebaut haben, bzw. verwendete google nicht mal mysql? oder waren das alles nur gerüchte?



  • C soll doch Maschienennah sein, zeig mir mal 15 Zeilen asm wo kein

    Irrelevant, C ist nicht Assembler.

    weil sie die besten Algos in feine C-Apps eingebaut haben, bzw. verwendete google nicht mal mysql? oder waren das alles nur gerüchte?

    Amazon z.B. hat in den ersten Tagen nur C und Lisp verwendet.

    Without understanding functional programming, you can't invent MapReduce, the algorithm that makes Google so massively scalable. [...] I don't think Microsoft completely understands just how far behind they are on that wave.

    Ihr duerft auch gern den ganzen Artikel lesen: http://www.joelonsoftware.com/items/2006/08/01.html . Andere interessante Artikel sind dort auch verlinkt.



  • noobLolo schrieb:

    C soll doch Maschienennah sein, zeig mir mal 15 Zeilen asm wo kein [...]

    Seit wann SOLL C maschinennah sein? Der Sinn von C ist gerade das Gegenteil, man schreibt ein Programm, das auf vielen verschiedenen Maschinen laufen soll, nur einmal.

    Dass C maschinennah ist, liegt einfach daran, dass zu dieser Zeit sowas wie Java oder CLI (.NET) noch zu ressourcenaufwendig war.

    weil sie die besten Algos in feine C-Apps eingebaut haben, bzw. verwendete google nicht mal mysql? oder waren das alles nur gerüchte?

    Wo hast du das denn aufgegabelt? Also der Satz ergibt im Ganzen wenig Sinn.

    - wahrscheinlich benutzt Google auch C, wo es angemessen ist
    - wahrscheinlich benutzt Google kein MySQL (das ist lahm und unzuverlässig nach Googles Maßstäben)
    - Google hat bestimmt nicht in C direkt ihre komplette Anwendung so schreiben können, dass sie auf zig Rechnern über die Welt verteilt in effizienter Weise beliebig verteilte Informationen zusammensucht, bewertet und sortiert ausgibt.



  • earli schrieb:

    Es handelt sich aber nicht um gewöhnliche Variablenzugriffe, sondern auf Zugriffe in den Heap (malloc()) oder auf unbekannte Variablen im Stack von den aufrufenden Funktionen. Dein Trick geht nur mit Variablen auf dem Stacksegment der Funktion selbst oder mit statischen Fields.

    Ist nicht "mein Trick". :p Zumeist wird ein Kontext- Anker indirekt plus irgendein Offset adressiert, wo immer der auch herkommt. Bei statischen Fields sehen die Zugriffe verdächtig identisch aus, auch, wenn der Prozessor das nicht besonders gut kann (hab' aber jetzt nur zwei Compileroutputs angeschaut, 'x86 nicht dabei).

    earli schrieb:

    Vielleicht hast du ja schonmal was von Erlang gehört.

    Erlang ist eine Hilfsmaßeinheit für den Verkehr in einem Kommunikations-Netz.



  • earli schrieb:

    - wahrscheinlich benutzt Google kein MySQL (das ist lahm und unzuverlässig nach Googles Maßstäben)

    sie haben mal eine erweiterung für MySQL entwickelt, also hatten sie es afaik auch mal in verwendung wenn auch nur auf demo servern?

    earli schrieb:

    - Google hat bestimmt nicht in C direkt ihre komplette Anwendung so schreiben können, dass sie auf zig Rechnern über die Welt verteilt in effizienter Weise beliebig verteilte Informationen zusammensucht, bewertet und sortiert ausgibt.

    ich denke wir sollten mal unterscheiden was google heute ist und wie es vor fast 10 jahren angefangen hat, ist ja kein geheimnis, das man bei google nur mit erstklassigen noten arbeiten darf, das diese geballte intelligenz auch was halbwegs anständiges auf die beine stellt ist doch nicht verwunderlich, das ist fast so als würde man sagen, oh wunder mercedes kann ein formel 1 auto bauen...



  • noobLolo schrieb:

    ... oh wunder mercedes kann ein formel 1 auto bauen...

    Das wird sich noch zeigen müssen 😉
    Aber was zum Geier hat das mit goto zu tun?

    if (mercedes.GOTO){return mercedes.crash}
    

Anmelden zum Antworten