Forum: PC-Programmierung Wie funktioniert Qt/QML under the hood?


von Neugierig (Gast)


Lesenswert?

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!

von NichtWichtig (Gast)


Lesenswert?

QML code parser erzeugt Objekte von entprechenden Klassen welche dann 
die Jobs erledigen.

von Dirk (Gast)


Lesenswert?

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.

von Neugierig (Gast)


Lesenswert?

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.

von Neugierig (Gast)


Lesenswert?

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.

von Überhaupt NichtWichtig (Gast)


Lesenswert?

Neugierig schrieb:
> Als jahrelanger Qt/QML-Enwickler, der damit auch sein Brötchen verdient,

NichtWichtig schrieb:
> QML code parser erzeugt Objekte von entprechenden Klassen

Dirk schrieb:
> https://de.wikipedia.org/wiki/Just-in-time-Kompilierung

Neugierig 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)?

von Dirk (Gast)


Lesenswert?

>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.

von Neugierig (Gast)


Lesenswert?

Ü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.

von Überhaupt NichtWichtig (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von cppbert (Gast)


Lesenswert?

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:)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.