Wieder neue C++ Version?


  • Administrator

    So, jetzt habe ich doch noch Zeit gefunden, mir das ganze Video anzuschauen. So ganz vom Hocker haut es mich nicht. Definitiv eine Verbesserung gegenüber COM oder auch C++/CLI Interop. Aber ein paar Fragen bleiben mir noch offen:
    1. Nur Metro Style Apps?
    2. Ist das Ziel mit WinRT die Win32 zu ersetzen? Aktuell ist die Win32 API ja noch daneben verfügbar. Aber aus dem Video hört man leicht heraus, dass mehr Gewicht auf WinRT gelegt wird. Mit WinRT erhält man zusätzliche Bibliotheken. WinRT soll die Verwendung der Computer revolutionieren. usw.
    3. Wie offen ist WinRT? Heisst: Können andere Kompilerbauer einen Kompiler für WinRT bauen? Möglichst ohne Gebühren bezahlen zu müssen?
    4. Keine eigenen Exceptions über Modulgrenzen?
    5. Hätte man diese WinRT Anbindung nicht auch mit normalen C++ erreichen können und einfach einer mordernen C++ API?

    Und naja, noch so ein paar Dinge ... irgendwie steht ich dem Zeug noch recht skeptisch gegenüber. Nun weiss man zumindest, wohin die ganze C++ Entwicklungsarbeit bei VS11 geflossen ist. In die auf dem PC unbrauchbare Metro Oberfläche 😞

    Ethon__ schrieb:

    Man müsste es eben anschauen...

    Lol, wenn ich dafür nicht Silverlight oder ne andere proprietäre Kacke installieren müsste, die mir angeboten wurde.
    Mach ich unter Linux gleich mal ... oh wait !!11

    Schau dir doch die Webseite mal ein wenig genauer an. Vielleicht gleich unter dem Silverlight-Bereich ... den Download-Bereich? Oder kann man auf Linux keinen Download durchführen? 🤡

    Grüssli

    PS: Um 21:50 im Video wird ein Code gezeigt: DatabaseConnection db();
    Ist das nun keine Funktionsdeklaration mehr in C++11? Oder ist das ein Fehler im Code? 🙂



  • Dravere schrieb:

    1. Nur Metro Style Apps?

    Im Moment ja, denk ich.

    Dravere schrieb:

    2. Ist das Ziel mit WinRT die Win32 zu ersetzen? Aktuell ist die Win32 API ja noch daneben verfügbar. Aber aus dem Video hört man leicht heraus, dass mehr Gewicht auf WinRT gelegt wird.

    Ich vermute mal, dass langfristig wohl zumindest alle neuen APIs auf WinRT basieren werden. Im Moment isses wohl so dass Win32 für den Desktop und WinRT für Metro ist.

    Dravere schrieb:

    3. Wie offen ist WinRT? Heisst: Können andere Kompilerbauer einen Kompiler für WinRT bauen? Möglichst ohne Gebühren bezahlen zu müssen?

    War afaik ja bei COM schon so, denke kaum dass es sich mit WinRT da anders verhalten wird. Vor allem hätte MS doch nix davon, die wollen vor allem eines: Möglichst viele Apps.

    Dravere schrieb:

    5. Hätte man diese WinRT Anbindung nicht auch mit normalen C++ erreichen können und einfach einer mordernen C++ API?

    Nein, da "normales" C++ kein ABI definiert und vor allem will man ja nicht nur C++, sondern alle möglichen Sprachen unterstützen.

    Dravere schrieb:

    PS: Um 21:50 im Video wird ein Code gezeigt: DatabaseConnection db();
    Ist das nun keine Funktionsdeklaration mehr in C++11? Oder ist das ein Fehler im Code? 🙂

    Haha, genau das hab ich mir bei der Slide auch gedacht. Ich vermute mal, dass es ein Typo ist. Wer hätte gedacht, dass Herb Sutter persönlich sowas passiert 😉



  • krümelkacker schrieb:

    Und diese binäre Schnittstellenbeschreibung unterstützt sogar Generics.

    Hast du dazu mehr Infos?

    Dravere schrieb:

    5. Hätte man diese WinRT Anbindung nicht auch mit normalen C++ erreichen können und einfach einer mordernen C++ API?

    Da es letztlich alles COM ist, kannst du schon so eine ATL-artige Bibliothek schreiben, die fast ohne Spracherweiterungen auskommt. Aber die Wartbarkeit von ATL-C++-Code im Vergleich mit einer Sprache, die direkte Unterstützung für COM hat (Delphi, C# etc.), ist einfach miserabel.

    Edit: "ist" eingefügt



  • audacia schrieb:

    krümelkacker schrieb:

    Und diese binäre Schnittstellenbeschreibung unterstützt sogar Generics.

    Hast du dazu mehr Infos?

    Im Video, dass geht soweit, dass du Template-Instanzierte Objekte mit Hilfe von Generic Interface über die Module propagieren kannst.

    generic<typename T, typename U>
    interface class IPair {
    public:
    T getFirst();
    U getSecond();
    
    };
    
    template<typename T, typename U>
    class Pair : IPair<T, U>
    {
    ....
    };
    


  • Zeus schrieb:

    Im Video

    Verflixt, jetzt muß ich es doch ansehen.

    Zeus schrieb:

    dass geht soweit, dass du Template-Instanzierte Objekte mit Hilfe von Generic Interface über die Module propagieren kannst.

    Ich verstehe kein Wort.



  • audacia schrieb:

    Zeus schrieb:

    dass geht soweit, dass du Template-Instanzierte Objekte mit Hilfe von Generic Interface über die Module propagieren kannst.

    Ich verstehe kein Wort.

    Mein nachtragende Code ansehen, eine Instanz von Pair kann aus jede Programmiersprache zugegriffen werden, JavaScript, C#.



  • Zeus schrieb:

    eine Instanz von Pair kann aus jeder Sprache zugegriffen werden, JavaScript, C#.

    Okay, eine Instanz also - aber ich kann nicht cross-boundary instantiations vornehmen, oder?



  • audacia schrieb:

    Zeus schrieb:

    eine Instanz von Pair kann aus jeder Sprache zugegriffen werden, JavaScript, C#.

    Okay, eine Instanz also - aber ich kann nicht cross-boundary instantiations vornehmen, oder?

    Wenn du damit meinst, dass du in JavaScript einen C++ geschriebene WinRT Typ instanzieren kann, dann lautet die Antwort: Doch, natürlich.



  • audacia schrieb:

    Zeus schrieb:

    eine Instanz von Pair kann aus jeder Sprache zugegriffen werden, JavaScript, C#.

    Okay, eine Instanz also - aber ich kann nicht cross-boundary instantiations vornehmen, oder?

    Da bin ich unsicher jetzt, ich denke aber schon, aber beschränkt auf Generics.
    Der Hauptpunkte,der mir im Kopf geblieben sind, sind die Intregationsfeature vom C++/STL Code.



  • dot schrieb:

    audacia schrieb:

    Zeus schrieb:

    eine Instanz von Pair kann aus jeder Sprache zugegriffen werden, JavaScript, C#.

    Okay, eine Instanz also - aber ich kann nicht cross-boundary instantiations vornehmen, oder?

    Wenn du damit meinst, dass du in JavaScript einen C++ geschriebene WinRT Typ instanzieren kann, dann lautet die Antwort:

    Nein. Ich meine das:

    // C++ - Modul 1
    template[generic?] <typename T>
        class vector
    {
        ...
    };
    
    // C# - Modul 2
    struct MyStruct
    {
        public int someData;
    }
    
    ...
    
    vector<MyStruct> myVector; // Template-/Generic-Instantiierung jenseits der Modulgrenze, speziell mit einem auf der "anderen Seite" definierten Typargument
    


  • Ja mit Generics, nicht mit Template.
    btw das ist doch, was dot beschrieben hat o.O


  • Administrator

    audacia schrieb:

    Zeus schrieb:

    dass geht soweit, dass du Template-Instanzierte Objekte mit Hilfe von Generic Interface über die Module propagieren kannst.

    Ich verstehe kein Wort.

    Naja, ca. so:

    public ref class TheInterface
    {
    public:
      void IsHere(IPair<int, int>^ pair);
    };
    
    // ...
    TheInterface^ interface = GetTheInterface();
    interface->IsHere(ref new Pair<int, int>(4, 5));
    

    Die Templateklasse Pair<int, int> wird somit als Genericklasse IPair<int, int> über die Modulgrenze gereicht. Pair<int, int> kann man nicht durchreichen, aber IPair<int, int> schon. Auch ist IPair (ohne Typenangabe) über die Modulgrenze verwendbar, dagegen ist das Klassentemplate Pair nur in C++ verwendbar.
    Man kann schlussendlich aus Templates Genericklassen bauen, welche in der Schnittstelle verwendet werden können.

    Am besten schaust du dir das Video an 😃
    Edit: Wups, da kamen noch ein paar andere Antworten zuvor. Naja, vielleicht ist meine trotzdem noch hilfreich 🙂

    dot schrieb:

    Dravere schrieb:

    5. Hätte man diese WinRT Anbindung nicht auch mit normalen C++ erreichen können und einfach einer mordernen C++ API?

    Nein, da "normales" C++ kein ABI definiert und vor allem will man ja nicht nur C++, sondern alle möglichen Sprachen unterstützen.

    Ich weiss nicht. Klar hat C++ kein ABI, aber man hätte doch etwas in einer Bibliothek zur Verfügung stellen können. Ähnlich wie das andere Bibliotheken, wie zum Beispiel CORBA auch tun. Ich denke, dass es schon möglich gewesen wäre. Man müsste sich das nur mal klar durchdenken, aber dazu fehlt mir aktuell die Zeit.

    Grüssli



  • Ja klar, nach meinem Verständnis sollte das einfach so funktionieren.



  • Okay, dem Video nach verstehe ich das anders. Kein Wort darüber, wie C# einen generischen Typen mit einem eigenen Typparameter instantiieren könnte. Nur Interfaces herumreichen ist möglich, und der dahinterliegende Typ muß natürlich dort instantiiert sein, wo auch die Template-/Generic-Klasse definiert ist. Also

    IPair<foo, bar> myUri = GetUri ();
    

    geht in jeder Sprache, nur GetUri() kann ich nicht in jeder Sprache schreiben, nur weil es ich schon eine Implementierung für IPair<foo, bar> in C++ habe - ich muß dann meine eigene Implementierung für IPair<foo, bar> in der jeweiligen Sprache schreiben.

    00:36:00 schrieb:

    ... the way to think of it is that every instantiation of this ref class template is a ref class. That's all you need to know. So you can't just export the template itself and imagine other languages would know how to deal with it and instantiate it; that's not how it works. You have to instantiate it in C++. [...]

    Bei .NET kann ich ja über Modulgrenzen instantiieren, weil das vom JITter gemacht wird und nicht wie bei C++ zur Übersetzungszeit passiert. Ich hätte mich schon sehr gewundert, wenn sie so etwas auch für WinRT vorgesehen hätten.



  • Ich versteh nicht ganz, was daran so verwunderlich ist. Ich konnte COM Komponenten immer schon in einer Sprache schreiben und einer völlig anderen Sprache verwenden!? COM unterstützt nun eben auch Generics und Exceptions...



  • dot schrieb:

    Ich versteh nicht ganz, was daran so verwunderlich ist.

    Ja, das merke ich. Nevermind; wir werden sehen, wie es funktioniert, wenn's draußen ist.



  • Ich glaub nicht, dass WinRT generics irgendwas mit .NET generics zu tun haben, wo zur Laufzeit Code generiert wird. Ich denk, dass es sich dabei eher um eine Art besseres Namemangling handelt. Denn ich kann damit ja nur generische Interfaces deklarieren.



  • dot schrieb:

    Ich glaub nicht, dass WinRT generics irgendwas mit .NET generics zu tun haben, wo zur Laufzeit Code generiert wird. Ich denk, dass es sich dabei eher um eine Art besseres Namemangling handelt. Denn ich kann damit ja nur generische Interfaces deklarieren.

    So verstehe ich das auch. Dann waren meine Beispiele vorhin nicht klar genug?



  • Ich hab vorhin nicht ganz verstanden, was du gemeint hast. Aber gut, dann waren wir ja sowieso schon von Anfang an einer Meinung 😉



  • Hier hat einer schon etwas tiefer reingeschaut, man kann auch ohne die "C++ Projektion" auf WinRT zugreifen:

    http://www.interact-sw.co.uk/iangblog/2011/09/16/real-native-winrt


Anmelden zum Antworten