Welcher Sprache gehört die Zukunft?



  • Xin schrieb:

    pale dog schrieb:

    Xin schrieb:

    ...
    int a(4);                         // Initialisierung
    int a = 4;                        // Initialisierung
    ...
    

    wer hat sich eigentlich so einen schwachsinn einfallen lassen?

    Es ist kein Schwachsinn, es ist sogar sehr sinnvoll, da bei einer Zuweisung erst das Objekt a erzeugt würde, anschließend ein temporäres Objekt, um dann das Objekt 'a' wieder zu zerstören, weil man das temporäre Objekt drüberkopiert, um das temporäre Objekt dann wieder zu zerstören.

    Man spart also viel Zeit damit, das "=" hier als Initialisierung zu verstehen, statt als Zuweisung.

    Im Gegenzug bedeutet "=" dann aber eben nicht Zuweisung, sondern mal Zuweisung und mal Initialisierung, je nach Kontext.
    Was für den Programmierer im ersten Augenblick einfacher ist, weil er sich nicht von C kommend umgewöhnen muss, bedeutet für die Sprache eine zusätzliche Sonderbedingung. Die Sprache wird damit 'unsauber'.
    Das mag 99,9% der Progammierer nicht negativ auffallen, 99% fällt es vermutlich gar nicht auf.

    Es ändert aber nichts daran, dass "=" trotzdem ein kontextabhängiger Operator ist. Wer sich also in Basic ärgert, dass "=" hier Zuweisung und da Vergleich darstellt, sollte sich im klaren sein, dass C++ auch nicht vollkommen kontextfrei ist.

    Nicht vollkommen kontextfrei? lol?
    Ich sag nur: *, <, =, &, ++, -- usw.

    Ich hab den Thread nicht gelesen (warum auch, is ja eh immer das selbe), aber ich finde es auch nicht gerade elegant, dass Foo f = 2 eine Initialisierung ist. Hab schon seeehr oft gesehen, dass Anfänger fest davon überzeugt sind, dass das eine Zuweisung (operator= ist) - was ja auch konsequenter wäre.



  • Xin schrieb:

    pale dog schrieb:

    Xin schrieb:

    ...
    int a(4);                         // Initialisierung
    int a = 4;                        // Initialisierung
    ...
    

    wer hat sich eigentlich so einen schwachsinn einfallen lassen?

    Es ist kein Schwachsinn, es ist sogar sehr sinnvoll, da bei einer Zuweisung erst das Objekt a erzeugt würde, anschließend ein temporäres Objekt, um dann das Objekt 'a' wieder zu zerstören, weil man das temporäre Objekt drüberkopiert, um das temporäre Objekt dann wieder zu zerstören.

    mal angenommen es würde wirklich so ablaufen (was ich nicht glauben kann) - aber wozu? wieso so umständlich?
    würde es nicht völlig reichen, ein objekt 'a' (egal wie es aussieht, ob nun eingebauter datentyp oder selbstdefiniert) zu erzeugen und es dann mit '4' zu initialisieren?
    🙂



  • Du bist doch derjenige hier, der auch das letzte Quentchen Geschwindigkeit aus dem Code rausquetschen will 😉 (und jetzt denk mal daran, daß dort nicht unbedingt ein int stehen könnte, sondern ein echt großes Objekt, bei dem jeder Ctor-Aufruf eine halbe Ewigkeit benötigt)



  • CStoll schrieb:

    ...und jetzt denk mal daran, daß dort nicht unbedingt ein int stehen könnte, sondern ein echt großes Objekt, bei dem jeder Ctor-Aufruf eine halbe Ewigkeit benötigt

    dann wäre der von Xin beschriebene ablauf ja umso schlimmer, oder verstehe ich jetzt irgendwas nicht?



  • pale dog schrieb:

    CStoll schrieb:

    ...und jetzt denk mal daran, daß dort nicht unbedingt ein int stehen könnte, sondern ein echt großes Objekt, bei dem jeder Ctor-Aufruf eine halbe Ewigkeit benötigt

    dann wäre der von Xin beschriebene ablauf ja umso schlimmer, oder verstehe ich jetzt irgendwas nicht?

    Er hat's erkannt 😮 - und genau aus diesem Grund ist der Ausdruck T b=a; keine (Default)Konstruktion mit anschließender Zuweisung, sondern eine direkte Initialisierung (und um konsistent zu bleiben, gilt das nicht nur für (potentiell große) UDT's, sondern auch für Built-in's).



  • Xin schrieb:

    Mr. N schrieb:

    pale dog schrieb:

    CStoll schrieb:

    ...und wir haben auch kein Problem damit, int-Variablen zu konstruieren 😉

    bitweise? oder darf's auch schneller gehen?

    Da wird nicht wirklich ein Konstruktor aufgerufen.

    int i(0); //in C++
    int i = 0; /*in C*/
    

    Beides ist exakt gleich schnell.

    Ähh... das mit dem Konstruktor kann man so nicht sagen, da derartige Dinge logischerweise 'inline' ablaufen.
    Von der Sprachlogik her, ruft die Initialisierung den Konstruktor von int, welcher in diesem Fall den Setter für int ruft, welcher den ASM Befehl 'move #0, Addr_von_i' schreibt.
    Im zweiten Fall wird lediglich der Setter aufgerufen, was den gleichen Assemblerbefehl ergibt.
    Im Endprodukt kommen in beiden Fällen lediglich die Ausgabe der Setterfunktion für i raus, ergo ist beides gleich schnell.

    Dass Du von einem Konstruktor nicht direkt etwas mitbekommst, muss nicht zwangsläufig bedeuten, dass es keinen gibt.

    Doch. int hat keinen Konstruktor. Versuch mal, int::int(0) aufzurufen.

    Ach ja, meistens reicht doch sowas wie

    xor rbx,rbx
    

    um eine Variable i zu initialisieren...



  • Mr. N schrieb:

    Ich will mal versuchen mir vorzustellen, wie das optimalerweise laufen würde:

    Rede an den Computer schrieb:

    "In the function template Foobar dependent on typename Type One and integral constant Number One specialised on Number One equals 4, after the assignment of a list to Spritzlidi add an assignment of Spritzlidi appended by Spritzlidi to Spritzlidi Two and replace all subsequent occurences of Spritzlidi in scope by Spritzlidi Two."

    Mir würde da das Sprachzentrum zu sehr belastet werden.

    Das ist natürlich Blödsinn. Wenn würde man natürlich eine deklarative Sprache, bei der man also eher die Lösungen statt die Lösungswege beschreibt, verwenden. Und von diesen deklarativen Sprachen eignen sich Logik-Programmiersprachen besonders gut, da dort die Übersetzung aufgrund der logischen Struktur natürlicher Sprachen besonders einfach ist.
    So reicht schon eine handvoll Zeilen aus um ein Programm in Prolog zu schreiben, welches sehr einfache deutsche Sätze "versteht" und mit ihnen arbeiten kann (gerade spaßeshalber getestet - 11 Zeilen hab ich gebraucht). Das ist eine Sache von wenigen Minuten.
    Solange man sich auf Ausschnitte der natürlichen Sprache beschränkt - die aber keinesfalls trivial sein müssen! - ist das ganze überhaupt kein Problem.
    Der Grund warum es sowas nicht gibt ist eher der, dass es nicht produktiv wäre. Ein Aufsatz ist, wie man sich leicht vorstellen kann, schwerer zu warten als ein prägnant formulierter Programmcode. Das ist vielleicht auch ein Grund, weshalb C-Syntax so populär ist. "begin" und "end" sind halt nicht so prägnant wie "{" und "}".



  • minhen schrieb:

    Der Grund warum es sowas nicht gibt ist eher der, dass es nicht produktiv wäre. Ein Aufsatz ist, wie man sich leicht vorstellen kann, schwerer zu warten als ein prägnant formulierter Programmcode.

    Exakt das habe ich doch gemeint.



  • Mr. N schrieb:

    Xin schrieb:

    Ähh... das mit dem Konstruktor kann man so nicht sagen, da derartige Dinge logischerweise 'inline' ablaufen.
    Von der Sprachlogik her, ruft die Initialisierung den Konstruktor von int, welcher in diesem Fall den Setter für int ruft, welcher den ASM Befehl 'move #0, Addr_von_i' schreibt.

    Dass Du von einem Konstruktor nicht direkt etwas mitbekommst, muss nicht zwangsläufig bedeuten, dass es keinen gibt.

    Doch. int hat keinen Konstruktor. Versuch mal, int::int(0) aufzurufen.

    Folgendes bezog sich auf "int a(0);":

    CStoll schrieb:

    pale dog schrieb:

    CStoll schrieb:

    eigene Typen können mit der T a(x); Syntax initialisiert werden, und im Gegensatz zu Java sollen Build-ins weitgehend austauschbar mit eigenen Typen sein).

    ach du schreck 😮 , dann soll das wohl einen konstruktoraufruf andeuten. 🙄
    ich hasse C++!

    Das soll, keinen Konstruktoraufruf andeuten, das ist ein Konstruktor-Aufruf 😉

    Laut CStoll hat int einen Konstruktor. Nach Sprachlogik hat int einen Konstruktor. Du sagst, es hat keinen Konstruktor und belegst das damit, dass Du ein build-in Typ, der keine Klasse ist, als "class int" ansprichst.

    Watt nu?

    Mr. N schrieb:

    Ach ja, meistens reicht doch sowas wie

    xor rbx,rbx
    

    um eine Variable i zu initialisieren...

    Dann realisiere damit mal ein "int a(1);"...



  • Mr. N schrieb:

    minhen schrieb:

    Der Grund warum es sowas nicht gibt ist eher der, dass es nicht produktiv wäre. Ein Aufsatz ist, wie man sich leicht vorstellen kann, schwerer zu warten als ein prägnant formulierter Programmcode.

    Exakt das habe ich doch gemeint.

    Dann hast du das aber falsch oder irreführend formuliert. Denn du argumentierst mit Unverständlichkeit und einer "Überlastung des Sprachzentrums". Ich dagegen halte natürlichsprachige Texte grundsätzlich für ebenso verständlich.
    Der Nachteil ist dagegen schlicht der, dass sie weniger prägnant sind. Man kann einen Satz nicht einfach so nach einem Muster überfliegen sondern muss ihn lesen. Eine Konsequenz die sich automatisch ergibt, wenn man etwas auf mehreren auch völlig anderen aber ähnlich aussehenden Weisen formulieren kann. Programmiersprachen in bester C-Tradition bieten dagegen einen höheren Kontrast an. Der Quellcode ist mit Bezeichnern und Sonderzeichen durchzogen, welche immer wieder einen optischen Orientierungspunkt bieten. Anders ein natürlichsprachlich formulierter Programmtext, bei welchem sich die einzelnen Elemente einfach zu ähnlich sind. Es sind jeweils immer Buchstabenfolgen womit man optisch quasi eine Buchstabensuppe hat bei der die Orientierung schwer fällt.
    Das ist der Unterschied zu dir. Ich sage weder dass es nicht möglich wäre noch dass es schwer wäre etwas natürlichsprachlich zu programmieren, sondern dass es weniger prägnant und damit weniger gut zu warten ist.



  • Xin schrieb:

    Mr. N schrieb:

    Xin schrieb:

    Ähh... das mit dem Konstruktor kann man so nicht sagen, da derartige Dinge logischerweise 'inline' ablaufen.
    Von der Sprachlogik her, ruft die Initialisierung den Konstruktor von int, welcher in diesem Fall den Setter für int ruft, welcher den ASM Befehl 'move #0, Addr_von_i' schreibt.

    Dass Du von einem Konstruktor nicht direkt etwas mitbekommst, muss nicht zwangsläufig bedeuten, dass es keinen gibt.

    Doch. int hat keinen Konstruktor. Versuch mal, int::int(0) aufzurufen.

    Folgendes bezog sich auf "int a(0);":

    CStoll schrieb:

    pale dog schrieb:

    CStoll schrieb:

    eigene Typen können mit der T a(x); Syntax initialisiert werden, und im Gegensatz zu Java sollen Build-ins weitgehend austauschbar mit eigenen Typen sein).

    ach du schreck 😮 , dann soll das wohl einen konstruktoraufruf andeuten. 🙄
    ich hasse C++!

    Das soll, keinen Konstruktoraufruf andeuten, das ist ein Konstruktor-Aufruf 😉

    Laut CStoll hat int einen Konstruktor. Nach Sprachlogik hat int einen Konstruktor. Du sagst, es hat keinen Konstruktor und belegst das damit, dass Du ein build-in Typ, der keine Klasse ist, als "class int" ansprichst.

    Watt nu?

    T a(x); ist für mich kein Konstruktoraufruf (es sei denn T ist ein Non-POD). Wir können uns auf Konstruktion einigen. 🙂

    Xin schrieb:

    Mr. N schrieb:

    Ach ja, meistens reicht doch sowas wie

    xor rbx,rbx
    

    um eine Variable i zu initialisieren...

    Dann realisiere damit mal ein "int a(1);"...

    Schon klar. :p



  • Mr. N schrieb:

    T a(x); ist für mich kein Konstruktoraufruf (es sei denn T ist ein Non-POD). Wir können uns auf Konstruktion einigen. 🙂

    Guck an, ein Komprimisangebot... der König wankt bereits... Gegenargumentation mit "für mich" und Detailveränderung von "Konstruktor" zu "Konstruktion".

    Wie würde diese Konstruktion denn durchgeführt? Mit einer inline Setter-Funktion? ;->

    Mr. N schrieb:

    Xin schrieb:

    Mr. N schrieb:

    Ach ja, meistens reicht doch sowas wie

    xor rbx,rbx
    

    um eine Variable i zu initialisieren...

    Dann realisiere damit mal ein "int a(1);"...

    Schon klar. :p

    SCNR 😉



  • Xin schrieb:

    Mr. N schrieb:

    T a(x); ist für mich kein Konstruktoraufruf (es sei denn T ist ein Non-POD). Wir können uns auf Konstruktion einigen. 🙂

    Guck an, ein Komprimisangebot... der König wankt bereits...

    :p

    Xin schrieb:

    Gegenargumentation mit "für mich" und Detailveränderung von "Konstruktor" zu "Konstruktion".

    Dass ein int konstruiert wird kann man sagen, aber es gibt eben keinen Konstruktor, da Konstruktoren immer die Form T::T(...) haben, und das geht bei int eher nicht.

    Xin schrieb:

    Wie würde diese Konstruktion denn durchgeführt? Mit einer inline Setter-Funktion? ;->

    Wie bitte? Der int wird gesetzt und fertig. Das ist unterhalb der Ebene auf der man von irgendwelchen Setter-Funktionen reden kann.

    Xin schrieb:

    Mr. N schrieb:

    Xin schrieb:

    Mr. N schrieb:

    Ach ja, meistens reicht doch sowas wie

    xor rbx,rbx
    

    um eine Variable i zu initialisieren...

    Dann realisiere damit mal ein "int a(1);"...

    Schon klar. :p

    SCNR 😉

    🕶



  • Mr. N schrieb:

    Dass ein int konstruiert wird kann man sagen...

    na, wer's glaubt ... 😉



  • pale dog schrieb:

    Mr. N schrieb:

    Dass ein int konstruiert wird kann man sagen...

    na, wer's glaubt ... 😉

    Naja man kann, muss aber nicht.


Anmelden zum Antworten