Question

Je suis en train d'étudier comment fonctionnent les langages de programmation, et certains d'entre eux ont un soi-disant machines virtuelles. Je comprends que c'est une forme d'émulation du langage de programmation dans un autre langage de programmation, et qu'il fonctionne comme la façon dont un langage compilé serait exécuté, avec une pile. Ai-je bien compris?

A la condition que je l'ai fait, ce qui me embobine est que beaucoup de langues non compilées permettent des variables avec des systèmes de type « libéral ». En Python par exemple, je peux écrire ceci:

x = "Hello world!"
x = 2**1000

Les chaînes et les grands entiers sont complètement indépendants et occupent différentes quantités d'espace en mémoire, comment ce code même être représenté dans un environnement basé sur la pile? Qu'est-ce qui se passe exactement ici? Est-x a une nouvelle place sur la pile et les anciennes données de chaîne gauche non référencé? Est-ce que ces langues pas utiliser une pile? Sinon, comment représentent-ils les variables internes?

Était-ce utile?

La solution

Probablement, votre question devrait être intitulé comme "Comment faire langages dynamiques travail ?."

C'est simple, ils stockent les informations de type variable le long avec en mémoire. Et cela est non seulement fait en interprété JIT langages compilés, mais aussi des langues nativement-compilés comme Objective-C.

Autres conseils

Dans la plupart des langues VM, les variables peuvent être conceptualisé comme des pointeurs (ou références) à la mémoire dans le tas, même si la variable elle-même est sur la pile. Pour les langues qui ont des types primitifs (int et bool en Java, par exemple) ceux-ci peuvent être stockés sur la pile aussi bien, mais ils ne peuvent pas être affectés de nouveaux types dynamiquement.

Ignorer types primitifs, toutes les variables qui existent sur la pile ont leurs valeurs réelles stockées dans le tas. Ainsi, si vous réattribuer dynamiquement une valeur pour eux, la valeur initiale est abandonnée (et la mémoire nettoyé via un algorithme de collecte des ordures), et la nouvelle valeur est attribuée dans un nouveau bit de mémoire.

La machine virtuelle n'a rien à voir avec la langue. Toute langue peut fonctionner sur une machine virtuelle (VM Java a des centaines de langues déjà).

Une machine virtuelle permet à un autre type de « langage assembleur » à exécuter, qui est plus apte à l'adaptation d'un compilateur. Tout fait dans une machine virtuelle peut être fait dans une unité centrale de traitement, alors pensez de la machine virtuelle comme une unité centrale de traitement. (Certains sont effectivement mises en œuvre dans le matériel).

Il est extrêmement bas, et dans de nombreux cas, pile fortement basée - au lieu de registres, les mathématiques au niveau de la machine est tout par rapport aux emplacements par rapport au pointeur de la pile actuelle

.

Avec les langages compilés normales, de nombreuses instructions sont nécessaires pour une seule étape. a + pourrait ressembler à « saisir l'élément d'un point par rapport au pointeur de la pile en reg a, saisir une autre dans reg b. ajouter reg a et b. mettre reg a en place par rapport au pointeur de la pile.

Le VM fait tout cela avec une seule instruction courte, peut-être un ou deux octets au lieu de 4 ou 8 octets par instruction en langage machine (selon 32 ou 64 architecture de bits) qui (deviner) devrait signifier environ 16 ou 32 octets x86 pour 1-2 octets de code machine. (Je peux me tromper, mon dernier codage x86 était à l'époque 80286.)

Microsoft a utilisé des machines virtuelles (probablement utilise encore) dans leurs produits de bureau pour réduire la quantité de code.

La procédure de création du code VM est le même que la création d'un langage machine, juste un type de processeur différent essentiellement.

Les machines virtuelles peuvent également mettre en œuvre leur propre sécurité, récupération d'erreur et les mécanismes mémoire qui sont liés très étroitement à la langue.

Une partie de ma description est ici résumé et de la mémoire. Si vous voulez explorer la définition de bytecode vous, il est un peu amusant:

http://java.sun.com /docs/books/jvms/second_edition/html/Instructions2.doc.html

La clé de beaucoup de «comment les machines virtuelles gèrent des variables telles que ceci ou cela vient vraiment aux métadonnées ... Les méta-informations stockées puis mis à jour la machine virtuelle donne une poignée beaucoup mieux sur la façon de répartir et faire la bonne chose avec des variables.

Dans de nombreux cas, cela est le type de frais généraux qui peuvent vraiment obtenir de la manière de la performance. Cependant, les implémentations modernes, etc ont parcouru un long chemin à faire la bonne chose.

En ce qui concerne vos questions spécifiques - des variables traitant comme des objets de vanille / etc ... se résume à réaffectant / réévaluant méta informations sur les nouvelles missions - c'est pourquoi x peut regarder dans un sens puis l'autre.

Pour répondre à une partie de vos questions, je vous recommande un google talk technologie sur Python , où certaines de vos questions concernant sont répondues langages dynamiques; par exemple ce qu'est une variable (il n'est pas un pointeur, ni une référence, mais en cas de python une étiquette).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top