2010-11-07 6 views
6

J'ai une question très simple je ne trouve pas de réponse nulle part sur internet. Donc, ma question est, dans la programmation procédurale, le code est dans la section de code, qui va dans la zone de mémoire en lecture seule. Les variables sont sur pile ou sur tas. Mais OOP dit que les objets sont créés en mémoire. Cela signifie-t-il que même les fonctions sont écrites dans la zone mémoire R/W?OOP vs procédural en cours d'exécution

Et, Os doit-il avoir des programmes de POO intégrés supportés? Par exemple, si OS ne permet pas de lire les instructions en dehors de la section de code en lecture seule. Merci.

+0

Cela dépend du langage - et plus encore, le temps d'exécution pour ce langage. Le CLR actuel peut créer des objets sur la pile (les types de valeur dans la plupart des cas, à moins qu'ils ne soient levés). Ni la POO, ni la "procédure factuelle" ne disent rien d'inhérent à l'utilisation de la "section de données" - mais la mémoire en lecture seule est en lecture seule dans tous les cas. La fin est tellement confuse que je ne sais même pas comment réagir. Je pense que le problème est d'essayer de répondre à 40 questions en une seule. Concentrez-vous sur une seule chose à la fois. –

Répondre

6

Généralement, la programmation OOP et la programmation procédurale sont des abstractions qui existent uniquement au niveau du code source. Une fois qu'un programme est compilé en code machine exécutable, ces abstractions cessent d'exister. Donc, qu'une langue particulière soit une POO ou une procédure, cela n'a aucune incidence sur les régions de mémoire utilisées ou sur les endroits où les instructions sont placées pendant l'exécution.

L'OS lui-même ne sait généralement pas si un exécutable particulier a été écrit dans un langage OOP ou procédural. Il se soucie seulement que l'exécutable utilise des op-codes binaires compatibles avec son jeu d'instructions natif, et que l'exécutable ait une ABI (interface binaire) qu'il comprend.

+0

OK, mais, par exemple MS Windows vous permet de sauter à la fonction qui serait stockée par exemple dans la zone .data? Après tout, le système n'a aucune idée de ce qu'il est des données ou des instructios. Et, ce qui est aussi intéressant, pourquoi même le code du programme va en lecture seule section? –

+0

@ B.Gen.Jack.O.Neill, cela dépend de l'architecture. La capacité à exécuter du code stocké ailleurs que dans le segment de code a été historiquement exploitée par des pirates informatiques. Par exemple, la plupart des attaques par débordement de pile-tampon sont essentiellement une tentative d'exécution de code shell placé dans un tampon de pile. Pour cette raison, certaines architectures matérielles vont déclencher une erreur si le pointeur d'instruction se termine à une adresse en dehors du segment de code d'un processus. –

+0

la raison de lire seulement les sections de code est d'empêcher l'injection malveillante de code. le système n'a plus de concept de données ou de commande exécutable qu'il ne sait que vous aimez les cheeseburgers ou les pizzas, seulement ce que les opérations doivent exécuter ensuite. C'est pourquoi les compilateurs peuvent créer des exécutables, par exemple. Je pense que vous devriez lire sur l'architecture von Neumann, par exemple. – jcolebrand

1

La POO ne le dit pas. Je n'ai aucune idée d'où vous l'avez lu, si vous ajoutez une citation qui aiderait.

Les objets sont variables, donc ce que vous savez sur les variables est correct pour les objets. Dans des langages comme C# (.net framework), les objets ne peuvent être stockés que dans le tas, car ce sont des types de référence. En C++, ils peuvent vivre n'importe où. Mais OOP dit que les objets sont créés en mémoire. Cela signifie-t-il que même les fonctions sont écrites dans la zone mémoire R/W? De là, j'ai conclu que vous pensez que les fonctions sont des objets. C'est vrai dans toutes les langues OOP. C'est à partir de langages fonctionnels où les fonctions sont des objets de première classe. Les fonctions sont dans la majorité des cas immuables et sont placées dans des sections en lecture seule.

Les systèmes d'exploitation communs tels que Windows, Linux et MacOsx ne sont pas conscients des objets. C'est purement concept de programme. .net framework et java vm fournissent une couche d'abstraction. Ce sont des environnements d'exécution qui ont un support d'objet intégré.

3

Ceci est une bonne question.

considérant que l'objet constitue fonctions et données comme étant placé au même endroit en théorie, la plupart des mises en œuvre diviser. La façon dont vous le faites, c'est que le code est divisé et stocké dans le segment RO. Un objet dans la zone RW peut alors se référer à ce code dans la zone RO. Le couplage du code et des données n'est utilisé conceptuellement que par le programmeur humain et le vérificateur de type pour s'assurer que vous ne violez pas les règles et les principes.

Un langage de type Java/C# sera généralement créé de sorte que chaque objet ait une étiquette identifiant le type de l'objet. L'objet lui-même est simplement une structure contenant tous les champs présentés dans un ordre prédéfini. Cette balise peut ensuite être utilisée pour rechercher la fonction à appeler dans la zone RO.La fonction dans la zone RO est modifiée pour prendre un paramètre supplémentaire, appelé ce ou auto par lequel le contenu dudit objet peut être atteint. Lorsque la méthode doit se référer à des champs, elle connaît l'ordre pré-spécifié, donc elle peut le faire correctement. Notez qu'il y a quelques astuces nécessaires pour résoudre l'héritage, mais c'est le cœur de l'idée. Un langage de type Python/Ruby fera généralement d'un objet une table de hachage où une méthode est un pointeur vers le code dans la zone RO (à condition que le langage soit compilé et ne soit pas exécuté par un interpréteur de bytecode) . Les appels de fonction sont effectués en recherchant le contenu de la table de hachage et en suivant le pointeur de code. Les champs sont également recherchés dans la même table de hachage.

Avec ces bases vers le bas, la plupart des implémentations font des astuces pour éviter la partie où un pointeur est suivi pour trouver la fonction à appeler. Ils essaient de comprendre et d'affiner l'appel possible à une seule fonction. Ensuite, ils peuvent remplacer la recherche par un appel direct à la bonne fonction, une solution beaucoup plus rapide.

la version tl; dr: Le langage sémantique affiche des champs et des méthodes dans le cadre d'un objet. L'implémentation les divise en segments RO et RW. En tant que tel, aucun support OS n'est nécessaire.