2013-05-19 7 views
5

Wie genau übersetzt der Oop-Code, den ich in C++ oder C# schreibe, zum Beispiel in Maschinencode oder im Fall von C# in Bytecode? Ich meine, wie übersetzen die Objekte?Wie übersetzt objektorientierter Code in Maschinencode?

In der prozeduralen Programmierung ist es ziemlich offensichtlich, wie es nach der Kompilierung aussieht, da es wirklich eine echte Unterstützung für Funktionen in der Maschinensprache gibt. Bei der OOP-Programmierung sind jedoch keine Objekte in der Maschinensprache vorhanden.

Meine Theorie ist, dass es kompiliert das Objekt selbst zu einer Art C wie Struktur, die nur Daten enthält (keine Member-Funktionen) und wenn eine Memberfunktion aufgerufen wird, akzeptiert einen zusätzlichen Parameter, der die Datenstruktur des Objekts ist selbst. Habe ich recht?

Antwort

1

Es ist abhängig von der Implementierung. In der Praxis ist es jedoch üblich, eine virtuelle Tabelle ("vtable") zu verwenden. Es gibt eine virtuelle Tabelle für jede Klasse, die eine Liste von Zeigern zur Implementierung jeder Mitgliedsfunktion enthält. Jedes Objekt erhält einen Zeiger auf die entsprechende vtable.

Je nach Sprache und Compiler-Flags kann der entsprechende Zeiger in der vtable nach der Funktionssignatur (Name und Argumente) oder einfach nach einem Index gesucht werden.

Wenn die Member-Funktion über ihren Vtable-Zeiger aufgerufen wird, benötigt sie sicher einen Zeiger auf die Objektdaten. Aber das könnte auf dem Stapel oder in einem Register weitergegeben werden.

2

Keine Notwendigkeit zu erraten, an der generierten "Versammlung" schaut gerade (MSIL, in der Tat) Code:

How can I view MSIL/CIL generated by C# compiler? Why is it called assembly?

+0

Und was ist mit dem C++ Fall? Beide sollten am Ende in derselben Struktur oder demselben Speicherlayout aussehen? Es kann mehr als eine Möglichkeit geben, dies zu tun? Weil Sie zum Beispiel diese Struktur auch mit den Funktionen haben können, aber ich denke, es ist unwahrscheinlich, weil es mehr Speicher kostet, wenn Objekte die gleichen Funktionen übernehmen. – UnTraDe

+0

Schreiben Sie ein "Hallo Welt" C-Programm. Kompiliere es mit gcc -o hw hw.c. Problem objdump -d hw. Es ist die gleiche Geschichte, was sich ändert, sind nur die Werkzeugnamen und die spezifischen Anweisungen. IOW die Ziel-CPU ist anders: Es ist virtuell in .net, real in C++. –

0

Die Objektorientierung in OOP ist nur ein Programmierkonstrukt auf höherer Ebene, das es Entwicklern ermöglicht, modularen und organisierten Code in einem Paradigma zu schreiben, das Prototypen und ihre Instanzen enthält. oop code hat keine Entsprechung in Maschinencode.

Es ist mehr wie wir Schnittstellen in Typoskript haben, die dann in Javascript übersetzt, die nicht das Konzept der Schnittstellen hat. (Dies ist möglicherweise kein sehr gutes Beispiel)

Verwandte Themen