几乎静态数据的设计问题

时间:2009-09-10 08:29:31

标签: design-patterns static

我正在开发一种简单编程语言的解释器。

  1. 树状结构的动态数据,其中每个数据节点都有一个关联的(拥有的)类型对象
  2. 有几种类型 - ListType,StructType等 - 还有一种特殊的 - TypeRef 。 TypeRef包含一个名称(一个字符串),它引用一些具体的类型。
  3. 有一个(几乎)全球地图(字典) - 我称之为环境 - (std::map<string, Type*>)将类型名称转换为类型对象。
  4. 问题是,可能会加载多个程序,并且每个程序可能具有与相同名称关联的不同类型。这个单一的假设使得不可能有一个全局(静态)环境,否则这将是一个完美的解决方案。

    因此,似乎我需要(#1)指向每个类型对象中的环境的指针或(#2)来执行环境上下文中的每个操作(例如,通过在任何地方提供它作为第一个参数)。

    我看到的问题:
    (#1)信息冗余,因为所有连接的数据节点都具有相同的环境。对于严格单独的数据,环境只会有所不同。
    (#2)很多琐碎的环境传递给子程序,混淆了代码。

    在我看来,这个问题与我称之为 几乎静态数据 的一般模式相匹配。什么是最好的解决方案?

3 个答案:

答案 0 :(得分:1)

环境有什么区别?如果它是执行上下文(上下文中的对象只调用同一上下文中的对象),那么您可以为每个环境使用一个线程并将“local-globals”存储在线程本地存储中(或者只是带有键的全局映射)是线程ID)。

这有一些缺点。首先,如果存在跨上下文调用,则它不起作用。当然它会迫使你进入一个线程模型。

答案 1 :(得分:0)

您可能希望拥有两个类型存储 - 一个用于具体类型,一个用于TypeRef。本地存储应该放在当前正在解析的程序的上下文中。

答案 2 :(得分:0)

使用线程局部存储的想法很有意思,但我最终得到了另一个解决方案:

我在两个阶段中使用这些类型:首先它们都被创建,然后它们被“编译”。编译需要一个环境,但只执行一次。它包括将所有类型名称转换为适当的类型对象。编译后,不再需要环境。

尽管如此,我认为它仍然是一种解决方法而非一般解决方案。