2013-05-19 15 views
5

W jaki sposób kod Oop, który napisałem w C++ lub C#, przenosi się na przykład na kod maszynowy lub w przypadku C# na kod bajtowy? Mam na myśli, jak obiekty tłumaczą?W jaki sposób kod zorientowany obiektowo przekłada się na kod maszynowy?

W programowaniu proceduralnym jest dość oczywiste, jak wygląda po kompilacji, ponieważ istnieje rzeczywiste wsparcie dla funkcji w języku maszynowym. Ale w przypadku programowania w języku maszynowym nie ma obiektów w języku maszynowym.

Moja teoria polega na tym, że kompiluje sam obiekt do jakiejś struktury podobnej do C, która zawiera tylko dane (bez funkcji składowych) i kiedy wywoływana jest funkcja memeber, jeśli akceptuje parametr dodatkowy, który jest strukturą danych obiektu samo. Czy mam rację?

Odpowiedz

1

Jest zależna od implementacji. Ale w praktyce często używa się wirtualnej tabeli ("vtable"). Dla każdej klasy istnieje wirtualna tabela, która zawiera listę wskaźników do implementacji każdej funkcji składowej. Każdy obiekt otrzymuje wskaźnik do odpowiedniego vtable.

W zależności od języka i flag kompilatora, odpowiedni wskaźnik w vtable może być sprawdzony przez podpis funkcji (nazwa i argumenty) lub po prostu przez indeks.

Gdy wywołuje się funkcję member za pośrednictwem jej wskaźnika vtable, na pewno potrzebuje on wskaźnika do danych obiektu. Ale może to zostać przekazane na stosie lub w rejestrze.

2

Nie trzeba zgadywać, wystarczy spojrzeć na wygenerowanym "Zgromadzenie" (MSIL, w rzeczywistości) Kod:

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

+0

A co z przypadkiem C++? Oba powinny wyglądać w tej samej strukturze lub układzie pamięci w końcu nie? Czy może to być więcej niż jeden sposób? Ponieważ, na przykład, możesz mieć tę strukturę również z funkcjami, ale mogę ją rozcieńczyć, ponieważ jest to mało prawdopodobne, ponieważ kosztuje więcej pamięci, jeśli obiekty powielają te same funkcje. – UnTraDe

+0

Napisz program "hallo world" C. Skompiluj go za pomocą gcc -o hw hw.c. Problem objdump -d hw. To ta sama historia, jakie zmiany to tylko nazwy narzędzi i szczegółowe instrukcje. IOW, docelowy procesor jest inny: jest wirtualny w .net, prawdziwy w C++. –

0

Cała orientacja obiektowa w OOP jest tylko konstruktem programowania wyższego poziomu, aby umożliwić programistom pisanie modularnego i zorganizowanego kodu w paradygmacie zawierającym prototypy i ich wystąpienia. Kod oop nie ma odpowiednika w kodzie maszynowym.

Jest bardziej podobny do tego, jak mamy interfejsy w maszynopisach, które następnie tłumaczą się na javascript, który nie ma koncepcji interfejsów. (może to nie być bardzo dobry przykład)

Powiązane problemy