Design patterns 近似静态数据的设计问题

Design patterns 近似静态数据的设计问题,design-patterns,static,Design Patterns,Static,我正在开发一种简单编程语言的解释器 有树结构动态数据,其中每个数据节点都有一个关联的(拥有的)类型对象 有几种类型——ListType、StructType等,还有一种特殊的类型——TypeRef。TypeRef包含一个名称(一个字符串),该名称引用某个具体类型 有一个(几乎)全局映射(字典)——我称之为环境(std::map),它将类型名称转换为类型对象 问题是,可能加载了多个程序,并且每个程序都可能具有与相同名称关联的不同类型。这个单一的假设使得不可能有一个全局(静态)环境,否则这将是一个完

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

  • 树结构动态数据,其中每个数据节点都有一个关联的(拥有的)类型对象
  • 有几种类型——ListType、StructType等,还有一种特殊的类型——TypeRef。TypeRef包含一个名称(一个字符串),该名称引用某个具体类型
  • 有一个(几乎)全局映射(字典)——我称之为环境
    std::map
    ),它将类型名称转换为类型对象
  • 问题是,可能加载了多个程序,并且每个程序都可能具有与相同名称关联的不同类型。这个单一的假设使得不可能有一个全局(静态)环境,否则这将是一个完美的解决方案

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

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


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

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


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

    是什么分隔了环境?如果它是执行上下文(上下文中的对象只调用同一上下文中的对象),那么您可能会在每个环境中使用一个线程,并将“本地全局”存储在线程本地存储中(或者只是一个全局映射,其中键是线程ID)


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

    您可能需要两个类型存储—一个用于具体类型的全局存储,一个用于TypeRef的本地存储。本地存储应该放在当前正在解析的程序的上下文中。

    您可能需要两个类型存储—一个用于具体类型的全局存储,一个用于TypeRef的本地存储。本地存储应该放在当前正在解析的程序的上下文中。

    使用线程本地存储的想法很有趣,但我最终找到了另一个解决方案:

    我分两个阶段使用这些类型:首先创建所有类型,然后“编译”。编译需要一个环境,但只执行一次。它包括将所有类型名转换为正确的类型对象。编译完成后,不再需要环境


    尽管如此,我认为与其说它是一个通用的解决方案,不如说它是一个解决方案。

    使用线程本地存储的想法很有趣,但我最终还是找到了另一个解决方案:

    我分两个阶段使用这些类型:首先创建所有类型,然后“编译”。编译需要一个环境,但只执行一次。它包括将所有类型名转换为正确的类型对象。编译完成后,不再需要环境


    尽管如此,我认为这更像是一种变通方法,而不是一种通用解决方案。

    我不太清楚。你能用二级地图吗?一个字符串表示programId,一个字符串表示key(选择第一个字符串)。这与我的($1)非常相似。我不会在每个类型对象中使用指向环境的指针,而是在其中使用程序名。我不太清楚。你能用二级地图吗?一个字符串表示programId,一个字符串表示key(选择第一个字符串)。这与我的($1)非常相似。我不会在每个类型对象中使用指向环境的指针,而是在那里使用程序名。谢谢,这是一个有趣的想法。但不幸的是,我的应用程序不能在PC机和各种嵌入式平台上运行。谢谢,这是一个有趣的想法。但不幸的是,我的应用程序不能,它必须在PC机上以及各种嵌入式平台上工作。