2017-04-25 5 views
0

Dans PostScript, vous avez une VM pour stocker les valeurs des objets composites. Ils peuvent être stockés dans une machine virtuelle locale ou globale en fonction du mode d'allocation de machine virtuelle de l'interpréteur.Mise en œuvre de la gestion de la mémoire PostScript pour le local et le global

Je travaille sur un interpréteur en langage C# (un peu similaire au langage JAVA). Et je n'arrive pas à comprendre comment représenter la VM locale et globale.

Disons que j'ai un objet:

public class StringObj : Composite { 
public string Data { get;set; } 
} 

Les données propriété (valeur de StringObj) est mémorisée dans VM locale ou globale. Mais comment cela pourrait-il être présenté en C# (ou Java).

C# lui-même a déjà la gestion de la mémoire elle-même (stack/heap/...) mais ce sont les internes du langage et de .NET framework, que je ne peux pas contrôler.

Dois-je créer une structure de mémoire? Si oui, comment cela pourrait/pourrait-il être représenté? Ou serait-il autorisé à stocker juste un bool propriété sur chaque objet composite pour savoir si elle est quelque chose de local ou global, comme celui-ci:

public class StringObj : Composite { 
public string Data { get;set; } 
public bool IsGlobal { get; set; } 
} 

Mise à jour:

Peut-être que si je sais comment fonctionne l'opérateur "save", je pourrais mieux comprendre comment implémenter la gestion de la mémoire.

Qu'est-ce que l'opérateur "save" sauvegarde exactement?

"crée un instantané de l'état actuel de la mémoire virtuelle"

À la lecture de l'opérateur restauration Je pense qu'il stocke ceci:

  • Le mode d'emballage array (d'emballage)
  • Mode d'allocation de machine virtuelle (booléen)
  • format de sortie d'objet (?)
  • paramètre interpréteur utilisateur s (?)
  • enregistre une copie de l'état graphique en cours sur l'état graphique pile

Qu'est-ce que sinon il sauver? comme la définition de «l'état actuel de la mémoire virtuelle» n'est pas très bien définie.

Dois-je également vérifier chaque objet sur la pile pour vérifier s'il est composite ou non et enregistrer la valeur de l'objet sur la pile? ou les piles/dictionnaires sont-ils intacts? ou..?

+0

lecture intéressante: http://stackoverflow.com/questions/12778435/why-is-it-called -marshal-allochglobal-if-it-alloue-sur-le-tas-local – juFo

+0

vous devez comprendre le comportement de ces types d'allocation. Ils sont 'type 1' et' type 2'. N'essayez pas de mapper les constructions C# ou java ('global', 'local', 'heap', ....). Pensez simplement, 'j'ai besoin de stocker A de telle sorte que son x, y et z' (a une portée spécifique, durée de vie, taille, ...) – pm100

Répondre

0

Ce n'est pas vraiment une question à laquelle quelqu'un d'autre peut répondre pour vous si vous avez l'intention d'écrire votre propre interpréteur PostScript.

Vous aurez besoin de bien comprendre la gestion de la mémoire des objets PostScript et leur durée de vie, et de concevoir votre propre gestion de la mémoire autour de cela.Je pense qu'il est très improbable que vous puissiez sortir sans en concevant votre propre structure (s) de mémoire, je n'ai certainement jamais vu un interpréteur PostScript qui n'a pas.

Encore une fois, je ne peux pas répondre à une question vague comme «comment cela serait/pourrait-il être représenté?», C'est beaucoup trop général. Il existe de nombreuses façons de concevoir un gestionnaire de mémoire PostScript, le choix vous appartient entièrement. Si la gestion de la mémoire vous intéresse alors vous aurez probablement une approche préférée, si elle ne s'en tient pas à quelque chose de simple, assurez-vous qu'elle couvre toutes les bases. En passant, y a-t-il une raison pour laquelle vous écrivez votre propre interprète, autre que la satisfaction personnelle? Le consensus général est que son travail de plus de 5 ans de travail pour implémenter un interpréteur PostScript (potentiellement moins si vous utilisez une bibliothèque graphique préexistante pour le rendu, en supposant que vous avez un compatible PostScript). Cela semble beaucoup de travail pour une langue de plus de 30 ans qui n'est pas largement utilisée.

En ce qui concerne Economie:

sauver sauve, eh bien, tout .... Tout comme la phrase que vous citez, une sauvegarde est une marque que vous pouvez revenir plus tard, et tout encapsule dans la machine virtuelle PostScript.

Je pense que vous avez manqué le fait que je peux apporter des modifications à un objet composite, et ces modifications sont sujettes à enregistrer et restaurer.

Essayez ceci:

%! 
/mydict <</Test (this is a string)>> def 

save 
mydict /Test (This is not a string) put 

mydict /Test get == flush 
restore 
mydict /Test get == flush 

Notez que le contenu des modifications dictionnaire après la restauration.

Un interprète que je connaissais utilisé en tant que, essentiellement, un «high water mark», combiné avec une architecture copy-on-write. Si vous avez effectué une opération sur un objet composite existant qui se trouvait en dessous d'une marque de sauvegarde, l'objet a été copié et la modification apportée à la copie. Ensuite, une restauration a tout simplement ramené tout à la dernière marque de sauvegarde. Cependant les détails de mise en œuvre ne sont pas spécifiés, à condition que l'interprète se comporte correctement, vous pouvez faire ce que vous voulez.

Notez que les objets dans global VM ne sont pas susceptibles d'être sauvegardés et restaurés. Vous devez également faire attention au contenu de la pile lorsque vous effectuez une restauration pour vous assurer que les objets de la pile ne seront pas supprimés, ce qui déclenche une erreur invalidrestore.

Note 2, la boucle du serveur SauvegarderOffres et restaurer sera effet sur la planète VM .....

+0

un projet de passe-temps devenu fou et un bon intérêt pour ces choses: -). Ce serait génial si l'on pouvait tirer parti du langage C# pour gérer localement/globalement, en cherchant des informations sur la façon dont les autres projets abordent le problème de VM local/global. Comme je n'ai pas vu beaucoup de projets en prendre soin. – juFo

+0

Eh bien, il n'y a pas (de nos jours) autant d'interprètes PostScript autour. Ghostscript est disponible pour la lecture, et "luser droog" a son propre xpost ici https://github.com/luser-dr00g/xpost Ghostscript encapsule le type, les attributs et l'allocation de vm dans un seul short non signé (voir psi/iref. h). J'ai vu d'autres systèmes. – KenS

+0

J'ai mis à jour la question pour essayer de mieux comprendre l'opérateur de sauvegarde. Cela pourrait me donner de meilleurs aperçus, mais que sauver exactement? :-) – juFo