【发布时间】:2020-07-23 08:53:27
【问题描述】:
为了好玩,我一直在研究我自己的编译成 C++ 的编程语言。虽然大多数东西打印起来都相当简单,但我在将我的 golang 样式接口编译为 c++ 时遇到了麻烦。在 golang 中,您不需要显式声明特定结构实现接口,如果结构具有在接口中声明的所有函数,它会自动发生。最初我打算将接口编译成一个包含所有虚拟方法的类
class MyInterface {
public:
void DoSomthing() = 0;
}
所有实现结构都可以像在 c++ 中一样简单地从接口扩展
class MyClass: public MyInterface {
// ...
}
但是,这意味着我的编译器必须遍历源代码中定义的每个接口(以及所有依赖项)以及源代码中定义的每个结构,并检查结构是否使用需要执行的操作来实现接口O(N*M) 时间,其中 N 是结构的数量,M 是接口的数量。我做了一些搜索并在这里偶然发现了一些 c++ 代码:http://wall.org/~lewis/2012/07/23/go-style-interfaces-in-cpp.html 这使得 c++ 中的 golang 样式接口成为现实,在这种情况下,我可以将我的接口编译为类似的代码(尽管不完全是因为我犹豫使用原始指针通过智能指针),而不必担心显式地实现它们。然而,作者表示不应该为生产代码做这件事,这让我有点担心。
这是一个有点主观的问题,但是有更多 C++ 知识的人可以告诉我,如果按照文章中建议的方式进行操作是一个非常糟糕的主意,还是实际上并没有那么糟糕并且可以完成,或者是否有更好的方法来编写 c++ 代码,让我无需求助于 O(N*M) 循环即可实现我想要的行为?
【问题讨论】:
-
真的只是一个adapter...
-
顺便说一句,Go 编译器是开源的。你可能想研究他们的源代码。
-
也许使用C++20's Concepts?
标签: c++ compiler-construction code-generation