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

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

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

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

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

有帮助吗?

解决方案 3

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

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

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

其他提示

环境有什么区别?如果它是执行上下文(上下文中的对象只调用同一上下文中的对象),则每个环境可以使用一个线程并存储<!> quot; local-globals <!>;在线程本地存储(或只是一个键是线程ID的全局映射)。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top