2013-05-19 18 views
5

In che modo esattamente il codice oop che scrivo in C++ o C#, ad esempio, traduce in codice macchina o nel caso di C# in bytecode? Voglio dire, come traducono gli oggetti?Come si traduce il codice orientato agli oggetti in codice macchina?

Nella programmazione procedurale è piuttosto ovvio come appare dopo la compilazione perché c'è effettivamente un vero supporto per le funzioni nel linguaggio macchina. Ma nel caso di programmazione oop non ci sono oggetti nel linguaggio macchina.

La mia teoria è che compila l'oggetto stesso in una sorta di struct C like che contiene solo dati (nessuna funzione membro) e quando viene chiamata una funzione memeber, se accetta un parametro addizionale che è la struttura dati dell'oggetto si. Ho ragione?

risposta

1

E 'a carico di attuazione. Ma in pratica, la cosa comune è usare una tabella virtuale ("vtable"). C'è una tabella virtuale per ogni classe, che contiene un elenco di puntatori all'implementazione di ciascuna funzione membro. Ogni oggetto ottiene un puntatore al vtable appropriato.

A seconda della lingua e dei flag del compilatore, il puntatore appropriato nel vtable può essere cercato dalla firma della funzione (nome e argomenti) o semplicemente da un indice.

Quando la funzione membro viene chiamata tramite il suo puntatore vtable, di sicuro ha bisogno di un puntatore ai dati dell'oggetto. Ma potrebbe essere passato in pila o in un registro.

2

Non c'è bisogno di indovinare, basta guardare il "montaggio" generato (MSIL, appunto) Codice:

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

+0

E per quanto riguarda il caso C++? Entrambi dovrebbero guardare nella stessa struttura o nella struttura della memoria alla fine no? Ci può essere più di un modo per farlo? Perché ad esempio puoi avere questa struct anche con le funzioni, ma io sottolineo che è improbabile perché costa più memoria se gli oggetti duplicano le stesse funzioni su ans over. – UnTraDe

+0

Scrivi un programma C "ciao mondo". Compilalo con gcc -o hw hw.c. Problema objdump -d hw. È la stessa storia, quali cambiamenti sono solo i nomi degli strumenti e le istruzioni specifiche. IOW la CPU di destinazione è diversa: è virtuale in .net, reale in C++. –

0

Tutte le object oriented-ness in OOP sono solo un costrutto di programmazione di livello superiore per consentire allo sviluppatore di scrivere codice modulare e organizzato in un paradigma contenente prototipi e relative istanze. il codice oop non ha il suo equivalente nel codice macchina.

Più simile a come abbiamo le interfacce in dattiloscritto che poi si traduce in javascript che non ha il concetto di interfacce. (questo potrebbe non essere un ottimo esempio)

Problemi correlati