【发布时间】:2012-07-03 07:27:27
【问题描述】:
我正在考虑一个源到源编译器想在标准 C 语法中添加一个关键字(比如 shared)。当一个指针被标记为 shared 时,它是一个特殊的指针,不能直接取消引用。相反,应该调用函数来安全地复制出该值。
如果所有变量都是原始类型,那么一个简单的 C++ 程序就会为我完成翻译。但是,我们有 struct 和 union,然后我们有可能包含共享指针的结构,包含指向共享指针的简单指针的结构等。这听起来像处理 volatile 关键字的严肃类型检查,可能重用或修改现有编译器将是更好的选择。但是我不知道哪个编译器更容易开始修改。你有什么建议吗?顺便说一句,我想查看翻译后的 C 代码,而不是中间代码。它会改变我们的选择吗?谢谢。
【问题讨论】:
-
你将如何标记负责取消引用每个此类指针的函数?
-
@unwind:如果
shared像提问者所建议的那样被视为 cv 限定符,那么大概是你投了。对提问者:这不能回答您的问题,但为什么不为您想要的每种类型Foo转发声明struct shared_Foo;呢?然后shared_Foo*不能被取消引用,而是被任何应该取消引用的人转换为Foo*。通常,当人们需要不透明的指针时,他们很乐意拥有一些可以使用它们的 TU,而另一些则不能。所以他们甚至不需要shared_Foo,他们只需在标头中前向声明struct Foo并在.c 文件中定义它。 -
“标准 C 语法”?实践中不存在:-{很多变种。
-
至于关键字部分,我建议添加一个属性(和#define 你的“关键字”),这是一种更容易做到的方式。应该可以在 clang 级别实现您的分析,但使用中间代码 (llvm ir) 更容易,它本质上是一种逃逸分析。如果您(使用元数据)跟踪所有指针的来源,则可以将分析传播回 AST 级别并发出转换后的代码。