Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于本地和全局的PostScript内存管理实现_C#_Memory Management_Postscript - Fatal编程技术网

C# 用于本地和全局的PostScript内存管理实现

C# 用于本地和全局的PostScript内存管理实现,c#,memory-management,postscript,C#,Memory Management,Postscript,在PostScript中,您有VM来存储复合对象的值。 它们可以存储在本地或全局VM中,具体取决于解释器的VM分配模式 我正在用C#(有点类似于JAVA)语言开发一个解释器。我不知道如何表示本地和全局VM 假设我有一个对象: public class StringObj : Composite { public string Data { get;set; } } 数据属性(StringObj的值)存储在本地或全局VM中。但这怎么能用C#(或Java)表示呢 C本身已经有了内存管理(stac

在PostScript中,您有VM来存储复合对象的值。 它们可以存储在本地或全局VM中,具体取决于解释器的VM分配模式

我正在用C#(有点类似于JAVA)语言开发一个解释器。我不知道如何表示本地和全局VM

假设我有一个对象:

public class StringObj : Composite {
 public string Data { get;set; }
}
数据属性(StringObj的值)存储在本地或全局VM中。但这怎么能用C#(或Java)表示呢

C本身已经有了内存管理(stack/heap/…),但这些是语言和.NET框架的内部结构,我无法控制

我需要创建自己的内存结构吗?如果是的话,这将如何体现? 或者只在每个复合对象上存储一个bool属性就可以知道它是本地的还是全局的,比如:

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

如果我知道“save”操作符是如何工作的,我可能会更好地理解如何实现内存管理

“保存”操作符究竟保存了什么?

“创建虚拟内存当前状态的快照”

通过阅读restore operator,我认为它存储了以下内容:

  • 阵列打包模式(打包)
  • 虚拟机分配模式(布尔)
  • 对象输出格式(?)
  • 用户解释器参数(?)
  • 在图形状态堆栈上保存当前图形状态的副本
它还能保存什么?因为“虚拟内存的当前状态”的定义不是很好


我是否应该检查堆栈上的每个对象,以验证它是否为复合对象,并将对象的值保存在堆栈上?或是书堆/字典未被触动?或者……?

如果你想编写自己的PostScript解释器,那么这不是任何人都能回答的问题

您需要完全了解PostScript对象的内存管理及其生存期,并围绕这一点设计自己的内存管理。我认为如果不设计自己的内存结构,你就不可能逃脱,我肯定从来没有见过一个PostScript解释器不这样做

再一次,我不能回答一个模糊的问题,比如“这将如何表达?”,这太笼统了。有很多方法可以设计PostScript内存管理器,完全由您选择。如果你对内存管理感兴趣,那么你大概会有一个更喜欢的方法,如果它不坚持简单的方法,那么就确保它涵盖了所有的基础知识

顺便问一下,除了个人的满足感之外,还有什么原因让你自己写口译员吗?普遍的共识是,实现PostScript解释器需要5年多的时间(如果您使用预先存在的图形库进行渲染,假设您有一个与PostScript兼容的图形库,则可能需要更少的时间)。对于一门30多年前还没有广泛使用的语言来说,这似乎是一项艰巨的工作

关于保存:

节约节约,好吧,一切。。。。就像您引用的句子一样,save是一个标记,您可以稍后返回,并封装PostScript VM中的所有内容

我想您已经忽略了我可以对复合对象进行更改的事实,这些更改需要保存和恢复

试试这个:

%!
/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
%!
/mydict def
拯救
mydict/Test(这不是字符串)put
mydict/Test get==flush
恢复
mydict/Test get==flush
请注意,字典的内容在还原后会发生更改

我认识的一个解释器使用了save-as,本质上是一个“高水位线”,并结合了一个写时拷贝架构。如果对低于保存标记的现有复合对象执行操作,则会复制该对象,并对副本进行更改。然后,恢复只是将所有内容释放回上次保存标记。但是,没有指定实现的细节,只要解释器行为正确,您就可以做任何您喜欢的事情

请注意,globalVM中的对象不需要保存和恢复。在执行还原时,还需要小心处理堆栈内容,以确保不会丢弃堆栈上的对象,这会触发invalidrestore错误


注意2,作业服务器循环save and restore将影响全局VM…

有趣的阅读:您需要了解这些类型分配的行为。它们是
类型1
类型2
。不要试图映射到c#或java构造(“全局”、“本地”、“堆”等等)。简单地想一想,‘我需要以这样一种方式来存储A,它可以执行x、y和z’(具有特定的范围、寿命、大小……)一个疯狂的爱好项目,并且对这些东西有着浓厚的兴趣:-)。如果能够利用C#语言的优势来管理本地/全局虚拟机,寻找其他项目如何解决本地/全局虚拟机问题的信息,那就太好了。因为我没有看到太多的项目来处理这个问题。嗯,(现在)没有太多的后记翻译。Ghostscript可供阅读,“luser droog”有自己的xpost,Ghostscript将类型、属性和vm分配封装在一个无符号的短文件中(请参阅psi/iref.h)。我见过其他系统。我更新了问题,试图更好地理解save操作符。这可能会让我有更好的见解,但究竟什么是节约呢?:-)