代码之家  ›  专栏  ›  技术社区  ›  Michal Czardybon

几乎静态数据的设计问题

  •  1
  • Michal Czardybon  · 技术社区  · 17 年前

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

    1. 树结构动态数据 ,其中每个数据节点都有一个关联的(拥有的) 类型对象 .
    2. 有几种类型-列表类型、结构类型等-和一种特殊类型- 蒂珀夫 . typeRef包含一个名称(字符串),该名称指的是某种具体类型。
    3. 有一个(几乎)全球地图(字典)-我称之为 环境 -( std::map<string, Type*> )将类型名转换为类型对象。

    问题是,可能加载了多个程序,并且每个程序可能具有与相同名称关联的不同类型。这个单一的假设使得不可能有一个全局(静态)环境,否则这将是一个完美的解决方案。

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

    我看到的问题是:
    (1)信息冗余,因为所有连接的数据节点都具有相同的环境。对于严格分离的数据,环境将是不同的。
    (2)将环境简单地传递给子例程,使代码变得模糊。

    在我看来,这个问题符合我称之为 近乎静态的数据 . 有什么好办法吗?

    3 回复  |  直到 17 年前
        1
  •  1
  •   Rafał Dowgird    17 年前

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

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

        2
  •  0
  •   Basilevs    17 年前

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

        3
  •  0
  •   Michal Czardybon    17 年前

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

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

    尽管如此,我认为这仍然是一个解决方案,而不是一个通用的解决方案。

    推荐文章