Piszę swój pierwszy język programowania, który jest zorientowany obiektowo i do tej pory dobrze tworzy pojedynczą „klasę”. Ale powiedzmy, że chcę mieć lekcje, powiedz ClassA
i ClassB
. O ile ci dwaj nie mają ze sobą nic wspólnego, wszystko jest dobrze. Powiedzmy, że ClassA
tworzy - ClassB
to stawia 2 powiązane pytania:
-Jak to know kompilator podczas kompilacji ClassA
, że ClassB
w ogóle istnieje, a jeśli tak, to w jaki sposób to wie, że to właściwości?
Moje dotychczasowe przemyślenia brzmiały: zamiast kompilować każdą klasę na raz (tj. Skanować, analizować i generować kod) każdy „plik (nie tak naprawdę plik, sam w sobie, ale„ klasa ”), muszę najpierw skanować + parsować , a następnie wygenerować kod dla wszystkich?
źródło
Starsze języki są czasami bardziej surowe; zastanów się, co jest możliwe w Javie:
Widziałem anty-wzór powyżej i jest naprawdę brzydki (zabroniłbym go). Obie jednostki kompilacji używają się nawzajem. Ale Ifc można skompilować do kodu bez skompilowanego Implem. Skompilowany kod .class, porównywalny z C.obj, zawiera „informacje o powiązaniach:” import Implem, wywołujący konstruktor bez parametrów
Implem()
. Klasa Implem może być następnie skompilowana bez problemu. Częściowo ClassLoader - wykonując inicjalizację / kompilację danych klasy JVM, a częściowo samą wirtualną maszynę Java, gra trochę jako linker , integrując wszystko.Na przykład kompilacja z jedną wersją określonej biblioteki i uruchomienie z inną wersją tej biblioteki rozpoznaje błędy w czasie wykonywania.
Tak więc odpowiedź: Kompilacja dostarcza jednostki skompilowanego kodu obiektowego, który należy traktować jako kod + dane + API do łączenia ze sobą.
Kompilator powinien potem również zrobić pakowanie razem i zweryfikować API powiązania; druga faza.
Może to irytować i wyglądać nieelegancko, ale matematyczne dowody mogą działać w ten sam sposób: dowodząc całej poprawności, można już rozważyć część, która jest prawdziwa aż do weryfikacji.
źródło