Próbuję lepiej zrozumieć, co byłoby wymagane, aby kompilator mógł dokonywać inteligentnych wyborów dotyczących współbieżności w imieniu programisty. Zdaję sobie sprawę, że istnieje wiele trudnych aspektów tego problemu, na przykład:
- Zapewnienie, że nie ma warunków wyścigu
Zapewnienie, że kod, który ma być uruchamiany jednocześnie, nie będzie miał skutków ubocznych, które wpływają na semantyczne znaczenie kodu
Zdecydowanie, czy narzut związany z rozpinaniem wątków jest opłacalny, biorąc pod uwagę stopień równoległości dostępnej w kodzie
Rozumiem, że dwa główne reprezentacje pośrednie stosowane we współczesnych kompilatorach to statyczne pojedyncze przypisanie dla języków proceduralnych i obiektowych oraz kontynuacja stylu dla języków funkcjonalnych. Rozumowanie któregokolwiek z wyżej wymienionych problemów wydaje się trudne przy użyciu tych pośrednich form. Nawet języki, które teoretycznie powinny mieć najlepszą szansę na automatyczną równoległość (języki funkcjonalne, takie jak Haskell z gwarancją braku efektów ubocznych), poczyniły ograniczone postępy w tej dziedzinie.
Tak więc moje pytanie brzmi, jakie pośrednie reprezentacje wykorzystano do rozwiązania tego problemu? Czy istnieją inne reprezentacje, które zostały wykorzystane w badaniach akademickich, o których nie wiem, które lepiej pasują do tego zadania? Czy ten problem zasadniczo musi zostać rozwiązany przez interfejs użytkownika kompilatora poprzez manipulowanie abstrakcyjnym drzewem składni, zanim kompilacja osiągnie pośrednią reprezentację?