Erfahrung mit Qt bzw. .NET

Verschiedenes zu Qt
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Erfahrung mit Qt bzw. .NET

Beitrag von chrislo1976 »

Hallo zusammen!

Ich habe den Auftrag erhalten, hier bei uns in der Firma Qt mit .Net zu vergleichen.
Zwar hab ich schon einiges mit Qt gemacht, mit .Net dafür um so weniger...

Es würde mir sehr helfen wenn mir jemand, der schon mit Qt und .Net gearbeitet hat, ein paar Erfahrungen Pro bzw. Contra dieser beiden Programmiersprachen/Bibliotheken schildern könnte.
(Was auch noch interessant wäre, was besser geeignet wäre für den Stichpunkt "Webfähig" im Sinne von "im Brauser laufen lassen/bzw. dort ausgeben"...)

Als Hintergrundinfo:
Eine Software von uns soll evtl. modernisiert werden, da diese noch in MFC erstellt wurde.
Es geht jetzt praktisch darum, welche Richtung wir zukünftig einschlagen sollten.

Würde mich auf ein paar Infos freuen!

Gruß,
Christian
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Qt ist vor allem Plattformunabhängig.
Du hast keinen Garbage Collector - ich finde die Speicherverwaltung von Qt besser.
Ansonsten hat sicherlich NET im Winumfeld stärken (die ich nicht kenne) aber ich denke das Qt definitiv keine Nachteile hat!
MasterK
Beiträge: 24
Registriert: 10. November 2009 23:10

Beitrag von MasterK »

AuE hat geschrieben:Du hast keinen Garbage Collector - ich finde die Speicherverwaltung von Qt besser.
Ansonsten hat sicherlich NET im Winumfeld stärken (die ich nicht kenne) aber ich denke das Qt definitiv keine Nachteile hat!
Das klingt aber extrem subjektiv ;)

Also Qt ist für C++ wohl mit das beste toolkit was es gibt. Der vergleich mit .NET ist etwas schwierig, da .NET ja in der regel mit C# verwendet wird. Grundsätzlich, also vergleicht man Qt/C++ mit .NET/C#, dann zieht Qt definitiv den kürzeren was anwendungsentwicklung angeht. Punkten kann da Qt eigentlich nur bei der plattformunabhängigkeit, da ist .NET nicht wirklich so weit. Zu .NET gehört eben eine moderne sprache C# mit wirklich extrem umfangreichen bibliotheken und tolle in die sprache integrierte features. Die möglichkeiten sind doch deutlich weiter gefasst als bei den typischen Qt anwendungsgebiten.

Also normalerweise wird eigentlich immer Java mit .NET/C# verglichen und nicht Qt...

Es stellt sich bei deinem vergleich auch die frage, wie wichtig die sprache ist. Ob es machbar ist, die C++ entwickler schnell auf C# zu trainieren.
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Beitrag von chrislo1976 »

Moin!

Schonmal besten Dank für erste Meinungen!
Es stellt sich bei deinem vergleich auch die frage, wie wichtig die sprache ist.
Naja, bei der Software die evtl. "portiert" werden soll, geht es um eine Visualisierungssoftware, bei der es schon auch um Schnelligkeit und Performance geht.
Hätte da natives C/C++ nicht Vorteile? Unsere Software ist aktuell in MFC geschrieben, evtl. könnte man das portieren "schleichend" machen?! (es ist ja beides C/C++)
Also normalerweise wird eigentlich immer Java mit .NET/C# verglichen und nicht Qt...
Das stimmt wohl, aber wir wollen Sprachen vergleichen die wir selbst im Einsatz haben, und das sind MFC,.Net und seit einer Weile Qt.


Wir sind leider, wie wohl sehr viele Firmen, SEHR MS-lastig. Ich finde, es würde nicht schaden sich auf ein zweites Bein zu stellen (auch wenn MS-Produkte so schnell nicht verschwinden werden...).
Aber Qt gibt es ja auch schon ne ganze Weile, und ist sicherlich keine Eintagsfliege. Von einigen namhaften Firmen wird es ja auch eingesetzt...

Was ich bei Qt auch gut finde, ist die Möglichkeit Software für Handies und Smartphones erstellen zu können. Ich denke dass sollte man in Zukunft auch nicht ausser Acht lassen.
(Ich weiß jetzt aber nicht genau wie gut/schlecht das mit .Net geht...)


Gruß,
Christian
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

chrislo1976 hat geschrieben: Was ich bei Qt auch gut finde, ist die Möglichkeit Software für Handies und Smartphones erstellen zu können. Ich denke dass sollte man in Zukunft auch nicht ausser Acht lassen.
(Ich weiß jetzt aber nicht genau wie gut/schlecht das mit .Net geht...)
Das sollte mit .Net auch gehen, für windows mobile zumindest, aber auf win mobile würde ich nicht zuviel setzen. Anwendungen für mobile geräte eher auf java basis bringen da glaub ich mehr!

Um smartphone/handy software mit .Net zu entwickeln benötigt man soweit ich weiß aber zumindest die professional version von visual studio, also das geht sehr aufs budget, da ist es leider nichts mit sharp develop und co.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Wirklich seriös kann sowas nicht auf die Schnelle entschieden werden. Stelle diese Frage hier und der Tenor wird sein: "nimm Qt". Frage in einem Java-Forum und die werden sagen "nimm Java"... usw. :wink:

Also: setzt euch in der Firma mal zusammen und führt eine saubere Evaluation durch: Erarbeitet zuerst den Anforderungskatalog (Kriterien und eure Gewichtungen). Berücksichtigt hier eure bestehende Software (Anforderungen an Funktionsumfang, Performance usw) sowie auch eure Skills (welche Erfahrungen hat eure Team.. wieviele Änderungen vertragt ihr...).
Danach stellt ihr diesem Katalog den Markt gegenüber. Meist es es auch gesund, ein eher unwahrscheinliches Produkt (bei euch z.B. neben Qt und .Net auch Java) zu vergleichen..

Ein Arbeitgeber interessiert sich ausserdem immer für die Kosten.. stellt also zusammen, was jedes dieser Produkte kostet (Lizenzen, Wartungsverträge, Ausbildung). Danach bekommt ihr vermutlich ein recht gutes Bild...

Wir selbst migrieren seit ein paar Jahren (ja.. so lange geht das!) von allen möglichen Umgebungen (MFC, VB6, .NET, IlogViews und einigen mehr) nach Qt. Auf unsere Anforderungen passt Qt... das ist also keine Empfehlung an euch..

Nur noch als Kommentar:

Code: Alles auswählen

Hätte da natives C/C++ nicht Vorteile? Unsere Software ist aktuell in MFC geschrieben, evtl. könnte man das portieren "schleichend" machen?! (es ist ja beides C/C++) 
Libraries in Standard-C++ klar.. sonst: keine Chance.. das gilt jedoch für alle anderen Kandidaten auch...
Also normalerweise wird eigentlich immer Java mit .NET/C# verglichen und nicht Qt...
Das die Java/.Net-Fans ihre virtuellen Maschinen miteinander vergleichen ist vollkommen logisch, hat aber nichts mit sauberem Software-Engineering zu tun...
Ob C# oder VB spielt übrigens in der Evaluation überhaupt keine Rolle.. das ist nur Geschmacksache. Ein guter Entwickler kann beides.

hth...
odenter
Beiträge: 36
Registriert: 5. Dezember 2009 10:02

Beitrag von odenter »

Kann mich meinem Vorredner da nur anschliessen.
Die Frage ist was will man und wie schnell will man das? Jede Sprache und jedes Framework hat Stärken und Schwächen.

Die Sprache ist eigentlich egal, denn die Syntax ist zwischen C/C++ und C# fast identisch, gibt nur wenige Ausnahmen.

Und Performance ist so ne Sache, die meiste Performance wird ja nicht von der Laufzeitumgebung verschwendet, sondern vom benutzendem Entwickler, mangels Wissen/Erfahrung/Whatever.
Mit anderen Worten auch C/C++ Programme können solangsam wie Java-Programme (böse Unterstellung) sein.
MasterK
Beiträge: 24
Registriert: 10. November 2009 23:10

Beitrag von MasterK »

odenter hat geschrieben:Die Sprache ist eigentlich egal, denn die Syntax ist zwischen C/C++ und C# fast identisch, gibt nur wenige Ausnahmen.
Also das ist definitiv falsch. Nur weil C# ebenfalls {} - klammern verwendet, ist die syntax nicht fast identisch. Da gibt es eine menge unterschiede und sprachfeatures in C# wo es nichts wirklich vergleichbares in C++ gibt (da fallen einem als erstes die delegates ein).
odenter
Beiträge: 36
Registriert: 5. Dezember 2009 10:02

Beitrag von odenter »

MasterK hat geschrieben:
odenter hat geschrieben:Die Sprache ist eigentlich egal, denn die Syntax ist zwischen C/C++ und C# fast identisch, gibt nur wenige Ausnahmen.
Also das ist definitiv falsch. Nur weil C# ebenfalls {} - klammern verwendet, ist die syntax nicht fast identisch. Da gibt es eine menge unterschiede und sprachfeatures in C# wo es nichts wirklich vergleichbares in C++ gibt (da fallen einem als erstes die delegates ein).
Gut das Syntax != Sprachfeature ist.

http://www.google.de/search?hl=de&defl= ... d=0CAcQkAE

Delegates haben nichts mit der Syntax zu tun im übrigen gibt es für c++ vergleichbare Bibliotheken Bsp.: Boost Signals.
Oder hier in Qt die Signale und Slots, solltest Du doch wissen wenn Du hier unterwegs bist. ^^

Bezogen auf Sprachfeatures besteht der größte Unterschied zwischen Generics und Templates, aber die Syntax bleibt deswegen trotzdem, mit wenigen Ausnahmen, identisch.
Arocz
Beiträge: 18
Registriert: 3. Februar 2010 09:06
Wohnort: Edermünde Besse

Beitrag von Arocz »

MasterK hat Folgendes geschrieben:
odenter hat Folgendes geschrieben:
Die Sprache ist eigentlich egal, denn die Syntax ist zwischen C/C++ und C# fast identisch, gibt nur wenige Ausnahmen.
Also das ist definitiv falsch. Nur weil C# ebenfalls {} - klammern verwendet, ist die syntax nicht fast identisch. Da gibt es eine menge unterschiede und sprachfeatures in C# wo es nichts wirklich vergleichbares in C++ gibt (da fallen einem als erstes die delegates ein).
Gut das Syntax != Sprachfeature ist.
Richtig, dennoch ist die syntax sehr verschieden! Also ein Umstieg auf C# sollte gut überlegt sein, denke ich.
Wenn man dennoch .NET nutzen möchte ohne sich C# anzueignen, kann man das auch mit Managed C++ tun(wobei ich damit keine Erfahrung habe, privat nutze ich C#/.NET und geschäftl. c++/qt).

Natürlich ist für .NET, c# besser geeignet, da die .NET-features direkt in der sprache integriert sind (delegates und somit events sind fester bestandteil, muss man sonst mit observer-pattern sonst nachbauen)
...und bei c++ ist das so nachträglich hinzugebaut.

Also wenn .NET dann empfehle ich es mit C#.
odenter
Beiträge: 36
Registriert: 5. Dezember 2009 10:02

Beitrag von odenter »

Arocz hat geschrieben:
MasterK hat Folgendes geschrieben:
odenter hat Folgendes geschrieben:
Die Sprache ist eigentlich egal, denn die Syntax ist zwischen C/C++ und C# fast identisch, gibt nur wenige Ausnahmen.
Also das ist definitiv falsch. Nur weil C# ebenfalls {} - klammern verwendet, ist die syntax nicht fast identisch. Da gibt es eine menge unterschiede und sprachfeatures in C# wo es nichts wirklich vergleichbares in C++ gibt (da fallen einem als erstes die delegates ein).
Gut das Syntax != Sprachfeature ist.
Richtig, dennoch ist die syntax sehr verschieden! Also ein Umstieg auf C# sollte gut überlegt sein, denke ich.
Auch ein mehrfaches wiederholen macht es nicht richtiger, es gibt nur wenige Ausnahmen.
Bring doch mal die Beispiele für die "sehr verschiedene" Syntax.

Achja hier ist die Spezifikation viel Spass beim lesen, Kapitel 9 betrifft die Syntax.
http://www.ecma-international.org/publi ... ma-334.htm
MasterK
Beiträge: 24
Registriert: 10. November 2009 23:10

Beitrag von MasterK »

Scheiss auf die "syntax". Ob ich nun "for (int i = ..." schreibe oder "for i = 0 to..." is doch sowieso egal. Fakt ist aber, dass die _sprache_ C# selbst eine menge dinge mitbringt, die es so eben _nicht_ in c++ gibt. Punkt.

Das lernen der sprache besteht nicht darin die syntax zu lernen.
odenter
Beiträge: 36
Registriert: 5. Dezember 2009 10:02

Beitrag von odenter »

MasterK hat geschrieben:Scheiss auf die "syntax". Ob ich nun "for (int i = ..." schreibe oder "for i = 0 to..." is doch sowieso egal. Fakt ist aber, dass die _sprache_ C# selbst eine menge dinge mitbringt, die es so eben _nicht_ in c++ gibt. Punkt.
Das lernen der sprache besteht nicht darin die syntax zu lernen.
C++ ohne Standard-Library ist in etwa so mächtig wie C# ohne das .NET Framework.

Also ich schreibe sowohl in C# als auch in C/C++ meine Schleifen so

Code: Alles auswählen

for(int i = 0; i < 10; ++i) {
}
das

Code: Alles auswählen

for i as int = 0 to 10
...
Ist übrigens VB.NET

Wie gesagt der Hauptunterschied sind Generics und Templates. Generics sehen zwar so aus wie Templates funktionieren aber völlig anders.
http://msdn.microsoft.com/en-us/library/sbh15dya.aspx

Ansonsten gibt es in bzw. für beiden Sprachen/Frameworks die gleichen Features, ggf. durch zusätzliche Bibliotheken.
LINQ ist Schrott, sieht zwar doll aus aber die Performance ist bescheiden.
Auch wird mit dem Framework 4.0 die starke Typisierung aufgeweicht.

Hier ist die Liste der zukünftigen, neuen Features für Deinen Vergleich:
http://code.msdn.microsoft.com/csharpfu ... aseId=1686

Das es im .NET Framework Features gibt die es so ohne weiteres in anderen Standard-Libraries nicht gibt hat ja auch niemand bestritten.
Und beim programmieren geht es ja grundsätzlich nicht um die Sprache sondern darum zu verstehen was da abgeht oder abgehen soll, die Sprache ist zweitrangig.

Der Punkt ist jede Sprache und jedes Framework ist für bestimmte Probleme besser geeignet als andere.
Da der TS ne Webfähige Software will, bzw. die Oberfläche eine Weboberfläche sein soll, ist .NET (Stichwort Webservices) sicher geeignet.

Wenn die Software schnell migriert werden soll, dann Managed C++.
Wenn die Software neu geschrieben werden soll und nur auf Windows-Kisten laufen soll, dann .NET und C# oder Java, ist natürlich in nem Forum was mit C++ zu tun hat nicht populär.
Wenn die Software nicht unbedingt in nem Browser laufen bzw. die Oberfläche dort laufen soll und man sich die Möglichkeit offen halten will auch mal andere Platformen zu unterstützen, dann C++ mit einem Framework wie Qt oder WxWidgets.
MasterK
Beiträge: 24
Registriert: 10. November 2009 23:10

Beitrag von MasterK »

odenter hat geschrieben:Also ich schreibe sowohl in C# als auch in C/C++ meine Schleifen so

Code: Alles auswählen

for(int i = 0; i < 10; ++i) {
}
Und wie schreibst du in C++ deine delegates/events? Properties? Wie sieht die foreach-schleife in C++ aus? Schreibst du in c++ auch sowas wie "5.toString()"? Anonyme methoden? Partielle klassen? LINQ (auch wenns dir nicht gefällt, das ist ja kein kriterium)? Attribute?

Das (und das war ja bei weitem nicht alles) sind alles sprachelemente, also syntax. Die syntax einer sprache besteht ja nun nicht nur aus der art und weise, wie man blöcke kennzeichnet.

Und wenn man mit C++ programmierern ein project praktisch komplett neu in C# aufziehen will, dann verwette ich meinen arsch, dass der erste versuch nach einer weile als eher suboptimal angesehen wird. Ist das gleiche wie wenn du c++ entwickler an ein java-projekt setzt. Auch da kommt nicht sofort die krone der entwickler-schöpfung bei raus. Und wenn die C++ entwickler dann auch noch C-altlasten mit sich rumschleppen, siehts ganz schnell ganz übel aus.
Daher ist es durchaus nicht unwichtig, ob du nun einen haufen C++ entwickler hast oder auch leute mit C# erfahrung. Da reicht ja ein teil, aber wenn du nur leute mit c++ erfahrung hast, da geht dann einfach viel zeit für einlernen und erfahrung sammeln drauf. Und die zeit hat man nunmal eher selten.
odenter
Beiträge: 36
Registriert: 5. Dezember 2009 10:02

Beitrag von odenter »

MasterK hat geschrieben: Und wie schreibst du in C++ deine delegates/events? Properties? Wie sieht die foreach-schleife in C++ aus? Schreibst du in c++ auch sowas wie "5.toString()"? Anonyme methoden? Partielle klassen? LINQ (auch wenns dir nicht gefällt, das ist ja kein kriterium)? Attribute?
Delegates/Events:
Das hängt vom Framework ab, daher in meinen Augen kein Feature der Sprache an sich.
In WxWidgets läuft das Win32 API like über Callbacks, wobei hier die Möglichkeit besteht über zusätzliche Bibliotheken das selbe zu erreichen.
In Qt läuft das letztlich über das gleiche System, 2 Methoden werden durch ein Objekt verbunden
Mit MFC grausam über Macros, was aber auch am ehesten mit Qt/.NET vergleichbar ist, weil hier vorm compilieren der Code noch verändert wird.
Und in .NET muss man teilweise auch auf das Callback Konzept zurückgreifen z.B. bei der Benutzung der Win32Api oder auch bei Threads.

Properties:
Sind Methoden, get_*/set_*. Daher würde ich auch das als Compiler-Feature bezeichnen, und damit indirekt als Sprachfeature, denn hier baut der Compiler dir die Methoden. Also vergleichbar mit dem Meta-Object Compiler aus Qt.
Potenziell kann sich jeder sowas selbst bauen in dem er ein eigenen Programm/Script vor dem übersetzen über den Code laufen lässt und "x" durch "y" ersetzt.

foreach:
Das würde ich klar als Compiler-Feature bezeichnen, denn durch z.B. ein Macro würde man genau das gleiche erreichen. Syntaktisch ist es in der Tat nur ähnlich, weil halt in der einen Sprache/Framework ein "in" statt "," verwendet wird und entsprechend durch den Compiler ersetzt wird.

Code: Alles auswählen

QList<int> _list;
foreach(int val, _list) {
}
oder mit der STL so
http://www.cplusplus.com/reference/algorithm/for_each/
Grundsätzlich aber Feature-Technisch auch mehr oder weniger überall vorhanden.
Wobei, in diesem Zusammenhang, vielleicht interessant wäre das diese Vereinfachung (foreach in .NET) auf Kosten der Performance geht, solange man keine Collection durchläuft(!) und bei Collections immer über den Key laufen, es fallen mindestens 2 Operationen pro foreach Schleife mehr an als bei einer vergleichbaren for-Schleife. 5 Operationen für eine foreach-Schleife gegenüber 3 Operationen bei einer for-Schleife. Teilweise werden auch die Objekte vorher noch kopiert.

partielle Klassen:
Ich weiss nicht ob sowas auch in C++ geht, ich denke das kann man ruhig als Sprach, und damit als Compiler, Feature bezeichnen.

LINQ:
Ist letztlich ja auch nur etwas das vor dem übersetzen durch Code ersetzt wird. Daher Sprach/Compiler-Feature.

Code: Alles auswählen

5.ToString();
Das ist für mich ein Compiler-Feature,
denn vollständig würde der Code so aussehen:

Code: Alles auswählen

var i = 5;
String s = i.ToString();
Hier wird eine Variable durch den Compiler stark typisiert, also so als wenn ich selbst:

Code: Alles auswählen

int i = 5;
String s = i.ToString();
geschrieben hätte.
Das Feature an sich, würde ich dem Compiler/Präprozessor zuordnen, da halt Code erzeugt wird. Ist halt ne Vereinfachung für mich. Syntaktisch aber in meinen Augen gleich.
Objekt/Struct-Punkt-Methode
MasterK hat geschrieben: Das (und das war ja bei weitem nicht alles) sind alles sprachelemente, also syntax. Die syntax einer sprache besteht ja nun nicht nur aus der art und weise, wie man blöcke kennzeichnet.
Dann haben wir beide einfach eine andere Auffassung davon was Sytax bedeutet, das ist aber ja auch in Ordnung.
In meinen Augen besteht die Syntax nur daraus wie man Klassen definiert, Enums, Böcke, Variablen, Schleifen, Operatoren, Methoden und Kontrollstrukturen. Und da gibt es eben nur das ";" mehr in c++ bei Enums und Klassen, "::" in c++ statt "." in C# für Namespaces. Und ein paar, drei oder vier die mir spontan einfallen, Unterschiede bei den Operatoren.
MasterK hat geschrieben: Und wenn man mit C++ programmierern ein project praktisch komplett neu in C# aufziehen will, dann verwette ich meinen arsch, dass der erste versuch nach einer weile als eher suboptimal angesehen wird. Ist das gleiche wie wenn du c++ entwickler an ein java-projekt setzt. Auch da kommt nicht sofort die krone der entwickler-schöpfung bei raus. Und wenn die C++ entwickler dann auch noch C-altlasten mit sich rumschleppen, siehts ganz schnell ganz übel aus.
Daher ist es durchaus nicht unwichtig, ob du nun einen haufen C++ entwickler hast oder auch leute mit C# erfahrung. Da reicht ja ein teil, aber wenn du nur leute mit c++ erfahrung hast, da geht dann einfach viel zeit für einlernen und erfahrung sammeln drauf. Und die zeit hat man nunmal eher selten.
Hier würde ich mit ja und nein zustimmen. :-D
Also was Leute angeht die mit C großgeworden sind, ganz klar ja. Da war halt prozedural angesagt, jetzt ist Objektorientierung angesagt. Und wir Menschen sind halt faul und wählen schnell mal den "quick and dirty" Weg statt den designtechnisch sauberen zu wählen, mache ich selbst ja auch ab und an mal. :-D
Leute die mit C++ groß geworden sind, und gelernt haben nicht diese c Altlasten zu verwenden, da denke ich schon das die keine größeren Probleme hätten bei einem Umstieg da sich meiner Meinung nach eben nur das Framework, also die Bibliothek(en) ändert.
Interfaces z.B. sind ja keine neue Erfindung, in C++ wäre das eine Klasse mit lauter virtuellen Methoden.

Abschliessend würde ich die meisten der Punkte als Framework oder Bibliothek spezifische Konzepte bezeichnen.
Bei der Trennung zwischen Sprach- und Compiler-Feature tue ich mich in der Tat auch etwas schwer bzw. dessen Definition.

EDIT:
Hauptsächlich Rechtschreibung korrigiert.
Antworten