Wzajemna zależność

0

Mam problem na poziomie projektowym mojego języka:
Przypuszczalnie mamy trzy pliki:
main.ss

@("module.ss") // `@` to upraszczając odpowiednik `include` z C++

function<int> main()
{
 module();
}

module.ss

@("module2.ss")

function<void> module()
{
 module2();
}

module2.ss

@("module.ss")

function<void> module2()
{
 module();
}

akurat ten kod nie ma większego sensu i jego uruchomienie skończyłoby się stack-overflowem, lecz chodzi tutaj o uproszczone przedstawienie sytuacji

Jak widać - pomiędzy plikami module.ss oraz module2.ss występuje wzajemna zależność: plik module.ss wymaga funkcji module2 zadeklarowanej w pliku module2.ss, a z kolei module2.ss wymaga funkcji module zadeklarowanej w module.ss.

Myślałem nad rozwiązaniem tego w taki sposób, że jeżeli podczas includowania jakiegoś pliku wykryta zostanie wzajemna zależność, wykonam jedynie skan nagłówków funkcji w tym includowanym pliku, a nie będę go kompilował, lecz wydaje mi się, że prędzej czy później wyszłoby na to, że takie rozwiązanie ma więcej wad :P

Dla przykładu, w Pascalu tego problemu nie ma, ponieważ moduł jest podzielony na dwie sekcje - interface oraz implementation i myślałem nad wprowadzeniem czegoś podobnego, lecz doskwiera brak pomysłów :/

Pytanie właściwe: w jaki sposób rozwiązać ten problem (pomijamy oczywiście to, że user może w tym konkretnym przypadku po prostu połączyć te dwa moduły w jeden)?

0

W C++ do tego właśnie wymyślono pliki nagłówkowe ;].
edit - widzę że to zdanie powoduje kontrowersje - spokojnie, nigdzie nie napisałem że to dobre rozwiązanie ;).

Nie wiem jak działają te Twoje moduły, ale typowe rozwiązanie to najpierw przeskanowanie deklaracji funkcji we wszystkich kompilowanych plikach a dopiero później rozpoczęcie kompilacji kodu wewnątrz nich.
Skoro tym konkretnym przypadku po prostu połączyć te dwa moduły w jeden to znaczy że obsługujesz wieloprzebiegową kompilację i da się to u Ciebie zrobić w miarę prosto.

0
msm napisał(a):

W C++ do tego właśnie wymyślono pliki nagłówkowe ;].

i jest to doskonały przykład jak nie należy implementować modułów.

1
MSM napisał(a)

W C++ do tego właśnie wymyślono pliki nagłówkowe ;].

Pliki nagłówkowe w C++ sprawiają czasami więcej problemu, niż pożytku - chciałbym uniknąć stosowania tego typu rozwiązań :P
Więc chyba rozwiązanie ze skanowaniem funkcji będzie w tym wypadku najlepsze - w razie czego zawsze potem można to i owo pozmieniać :>

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0