Sto cercando di capire meglio cosa sarebbe necessario per un compilatore per poter fare scelte intelligenti in merito alla concorrenza per conto del programmatore. Mi rendo conto che ci sono molti aspetti difficili di questo problema, ad esempio:
- Garantire che non ci siano condizioni di gara
Garantire che il codice da eseguire contemporaneamente non abbia effetti collaterali che incidono sul significato semantico del codice
Decidere se vale l'overhead derivante dalla rotazione dei thread, dato il grado di parallelismo disponibile nel codice
La mia comprensione è che le due principali rappresentazioni intermedie utilizzate nei compilatori moderni sono assegnazioni singole statiche per linguaggi procedurali e orientati agli oggetti e continuazioni che passano di stile per linguaggi funzionali. Ragionare su uno dei problemi sopra elencati sembra difficile usando queste forme intermedie. Anche i linguaggi che dovrebbero teoricamente avere le migliori possibilità di parallelizzazione automatica (linguaggi funzionali puri come Haskell con una garanzia di assenza di effetti collaterali) hanno compiuto progressi limitati su questo fronte.
Quindi la mia domanda è davvero quali rappresentazioni intermedie sono state usate per cercare di affrontare questo problema? Ci sono altre rappresentazioni che sono state utilizzate nella ricerca accademica di cui non sono a conoscenza e che sono più adatte a questo compito? Questo problema deve essere sostanzialmente risolto dal front-end del compilatore manipolando l'albero di sintassi astratto prima che la compilazione raggiunga una rappresentazione intermedia?