编程语言开发实践,如何将golang风格的接口编译为c ++?

问题描述 投票:2回答:1

为了好玩,我一直在研究自己的编程语言,并将其编译为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)循环就可以实现所需的行为?

为了好玩,我一直在研究自己的编程语言,并将其编译为C ++。虽然大多数内容都非常易于打印,但是我在编译golang样式时遇到了麻烦...

c++ compiler-construction code-generation
1个回答
0
投票

我最初的想法是利用C ++支持多重继承这一事实。将golang接口分解为单功能接口。通过其唯一签名对所有接口进行哈希处理。现在,它变成了O(N)操作,可以为您的具体类查找C ++抽象接口集。]

类似地,当您使用一个对象时,您会找到所有使用的接口。现在根据相同的逻辑为O(M)。然后,总的编译器复杂度变为O(N)+ O(M),而不是O(N * M)。

© www.soinside.com 2019 - 2024. All rights reserved.