Als jahrelanger Qt/QML-Enwickler, der damit auch sein Brötchen verdient,
möchte ich mehr darüber erfahren wie QML "under the hood funktioniert".
Ich weiß, dass...
- jedes QML-Element (Rectangle, TextArea...) im Hintergrund durch eine
gleichnamige C++-Klasse abgebildet wird.
- QML auf der Zielplattform interpretiert wird.
Mir ist aber absolut unklar wie aus QML-Code zur Laufzeit ausführbarer
Code entsteht. Das einzige was ich dazu finden konnte ist diese Seite
hier:
https://www.kdab.com/qml-engine-internals-part-1-qml-file-loading/
Ich habe das mehrmals durchgelesen und verstehe es immer noch nicht.
Vielleicht fehlen mir die Grundlagen dafür oder ich bin als Kind zu heiß
gebadet worden. ;-)
Andere Programmier-/IT-Themen konnte ich mir bisher zumindest immer
autodidaktsch beibringen (habe das ja auch mal studiert ;-) )
Kennt ihr vielleicht noch gute Quellen (gerne auch StackOverflow-Artikel
o.ä.).
Oder könnte ein Profi kurz erklären was auf der Zielplattform passiert?
Vielen Dank!
Schau mal hier:
https://de.wikipedia.org/wiki/Just-in-time-Kompilierung
Mit Qt 6 wird sich aber einiges ändern, weil dann kann der QML Code auch
in C++ kompiliert werden kann, welches bessere Performance, kleineren
Footprint und noch ein paar Verbesserungen verspricht.
NichtWichtig schrieb:> QML code parser erzeugt Objekte von entprechenden Klassen
Aber wie genau funktioniert das? Das ist doch genau das was der Compiler
(gcc) macht - und das ist ein "riesiges" Programm.
Dirk schrieb:> Mit Qt 6 wird sich aber einiges ändern, weil dann kann der QML Code auch> in C++ kompiliert werden kann, welches bessere Performance, kleineren> Footprint und noch ein paar Verbesserungen verspricht.
Klingt interessant. Wenn du das einen Link dazu hast, gerne her damit.
Neugierig schrieb:> Dirk schrieb:>> Mit Qt 6 wird sich aber einiges ändern, weil dann kann der QML Code auch>> in C++ kompiliert werden kann, welches bessere Performance, kleineren>> Footprint und noch ein paar Verbesserungen verspricht.>> Klingt interessant. Wenn du das einen Link dazu hast, gerne her damit.https://www.heise.de/developer/meldung/Qt-Chef-Maintainer-veroeffentlicht-erste-Plaene-fuer-Qt-6-4490900.html
Hier findet man was. Hätte den Vorteil Syntax-Fehler in QML schon zur
Compile-Zeit zu entdecken.
Neugierig schrieb:> Als jahrelanger Qt/QML-Enwickler, der damit auch sein Brötchen verdient,NichtWichtig schrieb:> QML code parser erzeugt Objekte von entprechenden KlassenDirk schrieb:> https://de.wikipedia.org/wiki/Just-in-time-KompilierungNeugierig schrieb:> Aber wie genau funktioniert das?
Was genau hast du nicht verstanden?
Oder bist du vielleicht Analphabet und liest die Antworten überhaupt
nicht?
Irgendwie ist es nicht nachvollziehbar, dass du Entwickler bist ohne
zumindest Grundlagen des Compilerbaus oder auch nur ansatzweise den
heutigen Stand der Technik zu kennen.
Bei welcher Firma arbeitest du (noch)?
>Klingt interessant. Wenn du das einen Link dazu hast, gerne her damit.
Du solltest schon die Blogs verfolgen und auf dem laufenden bleiben,
insbesondere über die Roadmap.
https://www.youtube.com/watch?v=YmwAeS_ojPA>Irgendwie ist es nicht nachvollziehbar, dass du Entwickler bist ohne>zumindest Grundlagen des Compilerbaus oder auch nur ansatzweise den>heutigen Stand der Technik zu kennen.
Braucht man nicht wirklich als reiner Applikationengineer.
Überhaupt NichtWichtig schrieb:> Oder bist du vielleicht Analphabet und liest die Antworten überhaupt> nicht?
Ist es wirklich so schwer zu verstehen, was ich meine: Ich will wissen
wie die QML-Elemente mit den korrespondierenden C++-Klassen
zusammenhängen und wie daraus zur Laufzeit Code entsteht.
Und ja, ich weiß, was JIT ist.
Neugierig schrieb:> Ist es wirklich so schwer zu verstehen, was ich meine: Ich will wissen> wie die QML-Elemente mit den korrespondierenden C++-Klassen> zusammenhängen und wie daraus zur Laufzeit Code entsteht.
QML wird geparst und just in time compiliert. Wenn du es genauer wissen
willst, stell eine konkrete Frage oder guck dir die Qt sources an.
> Und ja, ich weiß, was JIT ist.
Nein. Weißt du nicht. Zumindest weißt du nicht, was das tut und wozu es
gut ist. Sonst würdest du nicht so strunzdumm deine Fragen wiederholen.
Dirk schrieb:> Mit Qt 6 wird sich aber einiges ändern, weil dann kann der QML Code auch> in C++ kompiliert werden kann, welches bessere Performance, kleineren> Footprint und noch ein paar Verbesserungen verspricht.
Soweit ich sehen kann, gibt es das bereits in Qt 5:
https://doc.qt.io/QtQuickCompiler/Neugierig schrieb:> Hier findet man was. Hätte den Vorteil Syntax-Fehler in QML schon zur> Compile-Zeit zu entdecken.
Dafür aber den Nachteil, dass man nach jeder Änderung erst neu
compilieren muss. Das schöne an Skriptsprachen bei der Entwicklung ist,
dass man das nicht braucht.
Neugierig schrieb:> Ist es wirklich so schwer zu verstehen, was ich meine: Ich will wissen> wie die QML-Elemente mit den korrespondierenden C++-Klassen> zusammenhängen und wie daraus zur Laufzeit Code entsteht.> Und ja, ich weiß, was JIT ist.
Na dann hast du ja die Antwort.
Neugierig schrieb:> Überhaupt NichtWichtig schrieb:>> Oder bist du vielleicht Analphabet und liest die Antworten überhaupt>> nicht?>> Ist es wirklich so schwer zu verstehen, was ich meine: Ich will wissen> wie die QML-Elemente mit den korrespondierenden C++-Klassen> zusammenhängen und wie daraus zur Laufzeit Code entsteht.>> Und ja, ich weiß, was JIT ist.
Ich probiers mal:
1. Ob da ein JIT(ter) verwendet wird oder nicht ist erstmal nur für die
Geschwindikeit relevant, so was wie QML kann man auch komplett ohne
Jitter bauen (ist dann eben langsamer) - also hat das Wort JIT leider
hier so gut wie keine Erklärungsbedeutung, auch wenn es ein sooo schönes
Buzzword ist :)
2. Wie Umfangreich QML ist und ob da noch Javascript mit darunter steck
ist fuer ein Grundverständnis auch unrelevant, das sind nur Features und
sehr viel Code aber das Konzept dahinter wird dadurch nicht im Kern
veraendert
3. QT bringt schon mit seinem Mock/Meta System, Signals und
Funktionsufrufe sehr viel Basisarbeit mit - im Grunde kann man ja mehr
oder minder fast alles mit Strings Aufrufen was man in die Qt Welt
integriert d.h die meisten Features lassen sich zur Laufzeit über eine
sehr lockere Schnittstelle erreichen und ausfuehren, auch wenn das so
kaum oder niemand macht
D.h. sich per Metadaten zu Informieren welche Schnittstellen Typen oder
deren Objekte aufweisen und diese ohne direkte Implementation auf
zurufen oder miteinander zu verschränken
Im Grunde kannst du jede Typ/Objekt der String finden oder dir eine
Liste aller bekannten geben lassen und dann per QVariant entweder einen
ValueType abfragen oder per MethodenAufruf(Methode, QVariantList
parameter) alles aufrufen
3. Im Grunde ist QML nichts anderes als eine
Textdatei+Parser+Interpreter+Factories
der sich diese Standard Qt Schnittstellen zu nutze macht um über den
QML(und auch Javascript) Interpreter in die C++ Welt zu kommen und die
Cpp Welt macht das gleiche
Deswegen die vielen Strings wenn man Typen zwischen den Welten zuordnen
will oder das komische es-kann-funktionieren-Verhalten von QML
weil der Interpreter einfach nur per String in eine Property oder
Funktion Map einsticht und strunzdumm die Parameter dran haengt, passen
die nicht passiert erst mal nix, meistens nicht mal eine Fehlermeldung
Woher ich weiss wie sowas funktioniert: Ich baue solche Systeme (Ohne
QML, weil damals noch nicht existent und heute noch zu langsam) und es
ist gar nicht soo kompliziert, nur viel Code der eben in nativem Code
triviales wie assignment oder calls abstrahiert damit man es zur
Laufzeit machen kann und leider habe ich keinen JITer weil meine
Kollegen denken das wäre Voodoo:)