我正在开发一种简单编程语言的解释器。
std::map<string, Type*>
)将类型名称转换为类型对象。问题是,可能会加载多个程序,并且每个程序可能具有与相同名称关联的不同类型。这个单一的假设使得不可能有一个全局(静态)环境,否则这将是一个完美的解决方案。
因此,似乎我需要(#1)指向每个类型对象中的环境的指针或(#2)来执行环境上下文中的每个操作(例如,通过在任何地方提供它作为第一个参数)。
我看到的问题:
(#1)信息冗余,因为所有连接的数据节点都具有相同的环境。对于严格单独的数据,环境只会有所不同。
(#2)很多琐碎的环境传递给子程序,混淆了代码。
在我看来,这个问题与我称之为 几乎静态数据 的一般模式相匹配。什么是最好的解决方案?
答案 0 :(得分:1)
环境有什么区别?如果它是执行上下文(上下文中的对象只调用同一上下文中的对象),那么您可以为每个环境使用一个线程并将“local-globals”存储在线程本地存储中(或者只是带有键的全局映射)是线程ID)。
这有一些缺点。首先,如果存在跨上下文调用,则它不起作用。当然它会迫使你进入一个线程模型。
答案 1 :(得分:0)
您可能希望拥有两个类型存储 - 一个用于具体类型,一个用于TypeRef。本地存储应该放在当前正在解析的程序的上下文中。
答案 2 :(得分:0)
使用线程局部存储的想法很有意思,但我最终得到了另一个解决方案:
我在两个阶段中使用这些类型:首先它们都被创建,然后它们被“编译”。编译需要一个环境,但只执行一次。它包括将所有类型名称转换为适当的类型对象。编译后,不再需要环境。
尽管如此,我认为它仍然是一种解决方法而非一般解决方案。