[X] Die Programmiersprache D



  • nep schrieb:

    GPC schrieb:

    Sollte ich die Schlussbemerkung im PDF rausnehmen?

    Warum? Ist ja letztendlich alles (mehr oder weniger) auf Fakten begründet und passt da IMHO sehr gut rein.

    Wenn ich mal mehr Zeit habe werde ich den Artikel mal komplett durchlesen. Sieht aber sehr ansprechend (in jeder Hinsicht) aus 👍

    thx 🙂

    Ben04 schrieb:

    Mir gefällt der Artikel und auch die Schlussbemerkung finde ich passend. Wahrscheinlich wird zwar irgendwer sie zum Anlassen nehmen einen neuen D vs C Thread zu starten aber dies macht es nicht weniger richtig.

    Hehe, auf den einen kommt's auch nicht mehr an 😉

    Was ich ein wenig schade finde ist, dass du nur die meisten der Kernsyntax Elemente auflistest. Bei Sachen wie Operator Overloading die ein C++ Programmierer bereit von C++ her kennt ist dies sicherlich der beste Weg. Allerdings gibt es auch Sachen die neu sind, so zum Beispiel mixin. Was ist daran so toll und wo wird es eingesetzt? Bereits eine banale aber sinnvolle Beispielanwendung wäre hier super.

    Ja okay, der Abschnitt ist eben aus Platzgründen bisher so kurz geraten (Das Seitenlimit hing über mir wie ein Damoklesschwert 😉 ). Aber es stimmt, ein Beispiel würde viel helfen. Ich werde eins einbauen.

    Bei Sachen die kein äquivalentes buildin C++ haben wo man jedoch mit Hilfe von Bibliotheken nachrüsten kann, könntest du darauf verweisen. Bei Funktionszeiger und Delegates wäre ein Verweis auf boost.bind und boost.function sicherlich nicht verkehrt. Ähnlich beim boxing, hier könnte man auf boost.any verweisen.

    Ich bin mir nicht sicher ob das hineingehört, da ich mich eigentlich auch bei D von jeglichen externen Libs ferngehalten habe und nur die Sprachen an sich verglichen habe. Gut, zur Stdlib hab' ich was gesagt. Ich werde darüber nachdenken.

    Bei den /+ +/ Kommentare könnte man noch hinzufügen, dass diese sich hervorragend zum auskommentieren von Code eigenen.

    ack.

    Von structs kann, nehme ich an, nicht geerbt werden. Können sie dynamisch angelegt werden oder müssen sie dafür in einer Klasse gekapselt werden? Wie sehen Invariants aus? Wie spielt der Destruktor mit dem GC zusammen? Ich habe deinen Artikel stellenweise nur überflogen jedoch glaub ich nicht, dass du hierauf eine Antwort gibst.

    Stimmt, darüber steht noch nichts drin. Werde das, soweit sinnvoll, ergänzen.

    Soll nur positive Kritik sein. Dein Artikel ist bereits gut so wie er ist.

    Kein Thema.



  • Nettes, gutes und ausführliches PDF.
    Aber imho kann ein Artikel doch nicht nur aus einem Verweis auf ein PDF + ein wenig Begleittext bestehen...



  • Das PDF ist der Artikel^^
    Was stellst du dir vor?



  • Ich glaube phlox81 würde etwas in folgendem Stil bevorzugen

    Die Programmiersprache D

    Inhaltsverzeichniss

    ...

    1 Einführung

    1.1 Informationen und Geschichte von D

    D ist eine Systemprogrammiersprache, die im Dezember 1999 von Walter Bright erfunden und am 3. Januar 2007 in der Version 1.0 freigegeben wurde. D lehnt sich von der Syntax stark an C(++) an und übernimmt auch einige Konzepte der Sprache (z.B. Templates, OOP und strukturierte Programmierung). Anderes hat man hingegen verworfen (z.B. Mehrfachvererbung, implizite Typkonvertierung). Ideen für D hat man auch in den Sprachen Java und C# gefunden, wobei Delegates, Mixins und Garbage Collection die auffälligsten Beispiele sind. Mit D ist sowohl eine sehr moderne Programmierweise mit OOP, Design Patterns oder Metaprogrammierung als auch eine sehr systemnahe mittels Binärkompatibilität zur CABI und Inline Assembler möglich.

    Da D noch nicht lange auf dem Markt ist, gibt es wenig Informationen zu D. Aus diesem Grund baut diese Seminararbeit auf der offiziellen D Language Specification auf, die im Moment die exaktesten Informationen zu D liefern kann.

    1.2 D Compiler

    ...

    Würde sicherlich besser zum Magazin passen. Ich sehe es aber nicht als K.O. Argument an. 😉 In welchem Format hast du die ursprüngliche Version vorliegen? Vielleicht lässt sich da etwas drehen.

    Ich bin mir nicht sicher ob das hineingehört, da ich mich eigentlich auch bei D von jeglichen externen Libs ferngehalten habe und nur die Sprachen an sich verglichen habe. Gut, zur Stdlib hab' ich was gesagt. Ich werde darüber nachdenken.

    Ich sehe boost.function und boost.bind aber als Teil der Sprache an. Es fällt mir einfach schwer einen Artikel ernst zu nehmen der Funktionszeiger mit Delegates vergleicht und dies macht deiner implizit. Zuerst zeigst du was C++ bietet und dann was D bietet. Du schreibst sogar, dass C++ um Delegates erweitert wurde. Das ist einfach falsch da so etwas ohne größere Probleme auch in C++ möglich ist. Allenfalls könntest du sagen, dass sich der Syntax dadurch vereinfacht hat, dass man es direkt in den Compiler eingebaut hat.

    Entweder du lässt C++ ganz weg oder vergleichst Äpfel mit Äpfel.

    Ja okay, der Abschnitt ist eben aus Platzgründen bisher so kurz geraten (Das Seitenlimit hing über mir wie ein Damoklesschwert 😉 ). Aber es stimmt, ein Beispiel würde viel helfen. Ich werde eins einbauen.

    Merkt man stark beim durchlesen. Am Anfang ist alles sehr ausführlich gehalten (sogar Auflistung der Sonderzeichen in Strings) und dann wird es immer kürzer und knapper.



  • Ben04 schrieb:

    Ich glaube phlox81 würde etwas in folgendem Stil bevorzugen

    Na ja, sicher, aber das liegt als OpenOffice.org Dokument vor und ich bin gerade etwas zu gestresst, um das zu überführen. Falls der "Artikel" in der "üblichen" Form veröffentlicht werden soll, wird das dann halt dauern.

    Ich bin mir nicht sicher ob das hineingehört, da ich mich eigentlich auch bei D von jeglichen externen Libs ferngehalten habe und nur die Sprachen an sich verglichen habe. Gut, zur Stdlib hab' ich was gesagt. Ich werde darüber nachdenken.

    Ich sehe boost.function und boost.bind aber als Teil der Sprache an. Es fällt mir einfach schwer einen Artikel ernst zu nehmen der Funktionszeiger mit Delegates vergleicht und dies macht deiner implizit. Zuerst zeigst du was C++ bietet und dann was D bietet. Du schreibst sogar, dass C++ um Delegates erweitert wurde. Das ist einfach falsch da so etwas ohne größere Probleme auch in C++ möglich ist. Allenfalls könntest du sagen, dass sich der Syntax dadurch vereinfacht hat, dass man es direkt in den Compiler eingebaut hat.

    Entweder du lässt C++ ganz weg oder vergleichst Äpfel mit Äpfel.

    Gut, überzeugt. Ich werde es erwähnen.

    Ja okay, der Abschnitt ist eben aus Platzgründen bisher so kurz geraten (Das Seitenlimit hing über mir wie ein Damoklesschwert 😉 ). Aber es stimmt, ein Beispiel würde viel helfen. Ich werde eins einbauen.

    Merkt man stark beim durchlesen. Am Anfang ist alles sehr ausführlich gehalten (sogar Auflistung der Sonderzeichen in Strings) und dann wird es immer kürzer und knapper.

    Na ja, das hier ist die Extended Version, es gibt noch eine kürzere. Das ist dann die eigentliche Arbeit, die ich beim abgeben werde, da fehlt einiges bei den Modulen, den Arrays, Konvertierungssachen usw.
    Gibt viel zu sagen 😞



  • GPC schrieb:

    Ben04 schrieb:

    Ich glaube phlox81 würde etwas in folgendem Stil bevorzugen

    Na ja, sicher, aber das liegt als OpenOffice.org Dokument vor und ich bin gerade etwas zu gestresst, um das zu überführen. Falls der "Artikel" in der "üblichen" Form veröffentlicht werden soll, wird das dann halt dauern.

    Wie sieht das aus, wenn du es als html abspeicherst? Unter Umständen reicht es dann die Anfangs- und Endtags wegzuschneiden und dann mit einem Regex replace ranzugehen.

    1.<h1> -> [h1]
    ...Andere Format tags...
    2.</p>\s*<p> -> \n\n
    3.<p> -> empty string
    4.</p> -> empty string

    Wäre in Perl oder PHP schnell umgesetzt.



  • boost.bind und boost.function gibts mittlerweile in std::tr1! Ab C++0x dann direkt im std::-Namespace. Also, man kann da nicht wirklich von externen Libs sprechen. 😉 Ein Vergleich wäre also durchaus angebracht.



  • GPC schrieb:

    Ben04 schrieb:

    Ich glaube phlox81 würde etwas in folgendem Stil bevorzugen

    Na ja, sicher, aber das liegt als OpenOffice.org Dokument vor und ich bin gerade etwas zu gestresst, um das zu überführen. Falls der "Artikel" in der "üblichen" Form veröffentlicht werden soll, wird das dann halt dauern.

    Ja, genau das war meine Intention. Zumindest eine kurze Einleitung über D wäre im Artikel schon hilfreich, sozusagen als Vorschau auf das PDF. Und wer mehr wissen will, kanns dann im PDF nachlesen. Ich hab ja auch nicht in meinem Spirit2 Artikel einfach auf die Präsentation verlinkt 😉



  • Ich will ja nicht stressen, aber imho sollten die Artikel recht einheitlich in ihrer Präsentationsform sein.



  • Tim schrieb:

    Ich will ja nicht stressen, aber imho sollten die Artikel recht einheitlich in ihrer Präsentationsform sein.

    Ich werde mal schauen, wie hoch der (Scripting-)Aufwand wäre, es von HTML in's Forum zu bringen. Im Moment sieht es nach eher viel aus.

    Bzw. was ich anbieten könnte: Ich muss noch eine 2 DIN A4 Seiten umfassende Zusammenfassung für unser BA-Wiki schreiben. Die könnte man als Artikel hernehmen und dann das PDF unter "Wer noch mehr wissen möchte..." verlinken. Wie wäre das?

    @Ben04
    Der Teil mit den Strukturen wurde beantwortet (Strukturen können btw. über Pointer dynamisch allokiert werden, ohne geht nicht, da sie keine Reference Types wie Klassen sind), Invariants werden genauer im Codebeispiel zu OOP erklärt (siehe Anhang), der C++-Vergleich aus den Funktionszeigern ist draußen und der GC-Abschnitt behandelt nun auch die Frage nach dem Dtor.

    Leider fiel mir bisher noch kein passendes Beispiel für die Mixins ein. Habe schon an Factorys, Policy-Design oder so was in der Richtung gedacht. Trug aber bisher noch keine Früchte. Irgendeiner 'ne gute Idee?



  • Habe noch etwas gefunden, das du glaub ich gar nicht behandelst:
    http://www.digitalmars.com/d/mixin.html

    Könnte man mixins nicht gut für das einsetzen wofür boost.operator gedacht ist?



  • Ben04 schrieb:

    Habe noch etwas gefunden, das du glaub ich gar nicht behandelst:
    http://www.digitalmars.com/d/mixin.html

    Das stimmt; habe ich bewusst ausgeklammert. Stellte für die Zielgruppe keine interessante Neuerung dar und Platz war eh rar.

    Könnte man mixins nicht gut für das einsetzen wofür boost.operator gedacht ist?

    Scheint so.

    Edit: Im Übrigen Danke für das tolle Feedback 🙂



  • Ich hab' jetzt das PDF nur überflogen, aber was mir dabei schon aufgefallen ist:

    Abschnitt 3.6:

    Implizite Konvertierungen finden bei einer Zuweisung des Basistyps an den abgeleiteten Typs statt.

    Der Satz ist etwas unklar formuliert - meinst du damit eine Zuweisung "Basis b = Derived();" oder "Derived d = Basis();"? Eventuell solltest du auch ein Beispiel angeben, wo eine implizite Umwandlung in D erlaubt ist.

    Zeiger:
    Du erwähnst zwar, daß es in D noch Pointer gibt, aber was man noch damit machen kann, geht unter. (btw, wenn ich eine struct über Pointer allokiere, wird sie dann vom Garbage Collector übernommen oder müsste ich die selber freigeben?)



  • CStoll schrieb:

    Abschnitt 3.6:

    Implizite Konvertierungen finden bei einer Zuweisung des Basistyps an den abgeleiteten Typs statt.

    Der Satz ist etwas unklar formuliert - meinst du damit eine Zuweisung "Basis b = Derived();" oder "Derived d = Basis();"? Eventuell solltest du auch ein Beispiel angeben, wo eine implizite Umwandlung in D erlaubt ist.

    Done.

    Zeiger:
    Du erwähnst zwar, daß es in D noch Pointer gibt, aber was man noch damit machen kann, geht unter.

    Na ja, das ist mit Absicht so formuliert.
    Man kann damit alles machen, außer auf Methoden zeigen. Aber wie gesagt, man kommt ohne "offensichtliche" Pointer aus.

    (btw, wenn ich eine struct über Pointer allokiere, wird sie dann vom Garbage Collector übernommen oder müsste ich die selber freigeben?)

    Ja, alles was per new allokiert wird, wird vom GC freigegeben. Abschnitt 8:"Man allokiert den benötigten Speicher mittels new und der Garbage Collector (GC) gibt ihn dann wieder frei."



  • Okay, der Abschnitt über Template Mixins ist auch überarbeitet worden.



  • @Konvertierung: Ja, so ist's klarer. (btw, funktioniert die Umwandlung int->double implizit oder muß ich die auch explizit anfordern?

    Nochwas: Wie muß ich mir eigentlich Delegates einstufen? Anhand des Beispielcodes würde ich das "d=&f.bar;" am ehesten als "d=bind1st(mem_fun(&Foo::bar),f);" umschreiben.
    Und gibt es eine Möglichkeit, function's und delegate's gemischt zu verwenden?

    Nicht überladbar sind die Operatoren &&, ||, !, ?= .

    Randfrage: Was genau macht '?='? (vielleicht habe ich es nur übersehen, aber eine Liste zumindest der neuen Operatoren mit ihrer Bedeutung wäre hilfreich)



  • CStoll schrieb:

    @Konvertierung: Ja, so ist's klarer. (btw, funktioniert die Umwandlung int->double implizit oder muß ich die auch explizit anfordern?

    Die funzt implizit. Ich muss den ganzen "Implizierte Konvertierung"-Abschnitt noch mal überarbeiten, aber das ist nicht so easy, da die Informationen dazu über die ganze Language Spec verteilt ist.

    Nochwas: Wie muß ich mir eigentlich Delegates einstufen? Anhand des Beispielcodes würde ich das "d=&f.bar;" am ehesten als "d=bind1st(mem_fun(&Foo::bar),f);" umschreiben.

    Delegates bestehen im Prinzip aus einer Objektreferenz und einem Funktionspointer. Beim "Aufruf" des Delegates stellt die Objektreferenz dann den this-Zeiger dar.

    Und gibt es eine Möglichkeit, function's und delegate's gemischt zu verwenden?

    Versteh' ich nicht. Kannst du das genauer beschreiben oder ein (fiktives) Beispiel machen?

    Nicht überladbar sind die Operatoren &&, ||, !, ?= .

    Randfrage: Was genau macht '?='? (vielleicht habe ich es nur übersehen, aber eine Liste zumindest der neuen Operatoren mit ihrer Bedeutung wäre hilfreich)[/quote]
    Oha, das sollte der ternäre Operator, also ?: sein. Hat sich der Fehlerteufel eingeschlichen.



  • GPC schrieb:

    Und gibt es eine Möglichkeit, function's und delegate's gemischt zu verwenden?

    Versteh' ich nicht. Kannst du das genauer beschreiben oder ein (fiktives) Beispiel machen?

    Bei boost.function kannst du folgendes machen:

    int foo(char c);
    
    class Bar{
    public:
      int bar(char c);
    };
    
    void foobar(){
      boost::function<int(char)>a;
    
      a = foo; // ok, kein this (1)
    
      Bar b;
      a = boost::bind(&Bar::bar, b); // normales Delegate (2)
    }
    

    Geht (1) auch bei D Delegates oder geht nur (2) ?



  • GPC schrieb:

    Nochwas: Wie muß ich mir eigentlich Delegates einstufen? Anhand des Beispielcodes würde ich das "d=&f.bar;" am ehesten als "d=bind1st(mem_fun(&Foo::bar),f);" umschreiben.

    Delegates bestehen im Prinzip aus einer Objektreferenz und einem Funktionspointer. Beim "Aufruf" des Delegates stellt die Objektreferenz dann den this-Zeiger dar.

    Hmm, also lag ich doch richtig (wobei die Lösung von boost::bind wohl allgemeiner ist).

    Und gibt es eine Möglichkeit, function's und delegate's gemischt zu verwenden?

    Versteh' ich nicht. Kannst du das genauer beschreiben oder ein (fiktives) Beispiel machen?

    In Kurzfassung: Einer Funktion wahlweise einen Funktionszeiger oder einen Delagate übergeben:

    int test_func(int f_or_d(int) to_call)
    { return to_call(4711); }
    
    class tester
    {
      private int val;
      int value(int i) { val = i; }
    }
    
    int print(int v)
    { writefln("Der Wert ist ",v); }
    
    ...
    test_func(print);
    tester x;
    test_func(&x.value);
    

    Oha, das sollte der ternäre Operator, also ?: sein. Hat sich der Fehlerteufel eingeschlichen.

    OK, den kenne ich natürlich - trotzdem wäre eine Liste der (gegenüber C++) neuen Operatoren sicher angebracht.
    (aus der Dokumentation kenne ich nur ~ und die erweiterten Möglichkeiten für [], gibt's da noch mehr?)



  • Ben04 schrieb:

    GPC schrieb:

    Und gibt es eine Möglichkeit, function's und delegate's gemischt zu verwenden?

    Versteh' ich nicht. Kannst du das genauer beschreiben oder ein (fiktives) Beispiel machen?

    Bei boost.function kannst du folgendes machen:

    int foo(char c);
    
    class Bar{
    public:
      int bar(char c);
    };
    
    void foobar(){
      boost::function<int(char)>a;
    
      a = foo; // ok, kein this (1)
    
      Bar b;
      a = boost::bind(&Bar::bar, b); // normales Delegate (2)
    }
    

    Geht (1) auch bei D Delegates oder geht nur (2) ?

    (2) geht nur, wenn die Klassenfunktion statisch ist. Sonst nicht.

    CStoll schrieb:

    GPC schrieb:

    Nochwas: Wie muß ich mir eigentlich Delegates einstufen? Anhand des Beispielcodes würde ich das "d=&f.bar;" am ehesten als "d=bind1st(mem_fun(&Foo::bar),f);" umschreiben.

    Delegates bestehen im Prinzip aus einer Objektreferenz und einem Funktionspointer. Beim "Aufruf" des Delegates stellt die Objektreferenz dann den this-Zeiger dar.

    Hmm, also lag ich doch richtig (wobei die Lösung von boost::bind wohl allgemeiner ist).

    Jop, ist sie.

    Und gibt es eine Möglichkeit, function's und delegate's gemischt zu verwenden?

    Versteh' ich nicht. Kannst du das genauer beschreiben oder ein (fiktives) Beispiel machen?

    In Kurzfassung: Einer Funktion wahlweise einen Funktionszeiger oder einen Delagate übergeben:

    Nein, es existiert eine Trennung zwischen function und delegate.

    Oha, das sollte der ternäre Operator, also ?: sein. Hat sich der Fehlerteufel eingeschlichen.

    OK, den kenne ich natürlich - trotzdem wäre eine Liste der (gegenüber C++) neuen Operatoren sicher angebracht.
    (aus der Dokumentation kenne ich nur ~ und die erweiterten Möglichkeiten für [], gibt's da noch mehr?)

    Nur noch den "in" Operator, den man für die assoziativen Arrays braucht. Wird in Abschnitt 2.8.4 auch angesprochen.


Anmelden zum Antworten