, поэтому я пытаюсь записать компилятор для языка OOP с синтаксисом, очень похожим на Java , и я застрял в выяснении, как можно реализовать наследование.
Я уже попробовал написать довольно простой пример наследования C ++ и скомпилировать его с clang -S ${FILES} -emit-llvm
.
Код C ++ выглядит следующим образом:
a.hpp:
class A {
protected:
int a;
};
b.hpp:
#include "a.hpp"
class B : public A {
private:
int b;
public:
explicit B();
};
b.cpp:
#include "b.hpp"
B::B() : A() {}
main.cpp:
#include "b.hpp"
int main() {
B b;
}
Но я, честно говоря, считаю вывод действительно очень запутанным ...
Я обнаружил, что Googling заключается в том, что для обработки виртуальных методов и переопределений мне придется использовать vtables (и об этом, зная, что я уже нашел этот учебник вLLVM
документ, но я не нашел это действительно полезным, есть ли стандартный способ создания vtables в LLVM)?
У меня также есть некоторые сомнения относительно порядка компиляции ...
Допустим, у меня есть этот исходный код:
package test;
class Test extends SuperTest {}
Мне кажется, довольно ясно, что по порядкуЧтобы объединить логические структуры и структуры данных Test
и SuperTest
при анализе Test
, SuperTest
должно быть уже скомпилировано, но как мне организовать компиляцию таким образом, чтобы такие проблемы не возникали?
Спасибо за внимание.