J'essaie de mieux comprendre ce qui serait nécessaire pour qu'un compilateur puisse faire des choix intelligents concernant la concurrence au nom du programmeur. Je me rends compte qu'il existe de nombreux aspects difficiles de ce problème, par exemple:
- S'assurer qu'il n'y a pas de conditions de course
S'assurer que le code à exécuter simultanément n'aura pas d'effets secondaires qui auront un impact sur la signification sémantique du code
Décider si le surcoût de la rotation des threads est utile compte tenu du degré de parallélisme disponible dans le code
Ma compréhension est que les deux principales représentations intermédiaires utilisées dans les compilateurs modernes sont l'affectation unique statique pour les langages procéduraux et orientés objet et les continuations passant le style pour les langages fonctionnels. Il est difficile de raisonner sur l'un des problèmes énumérés ci-dessus en utilisant ces formes intermédiaires. Même les langages qui devraient en théorie avoir les meilleures chances de parallélisation automatique (les langages fonctionnels purs comme Haskell avec une garantie sans effets secondaires) ont fait des progrès limités sur ce front.
Donc ma question est vraiment quelles représentations intermédiaires ont été utilisées pour essayer de résoudre ce problème? Y a-t-il d'autres représentations qui ont été utilisées dans la recherche universitaire que je ne connais pas qui sont mieux adaptées à cette tâche? Ce problème doit-il être fondamentalement résolu par le frontal du compilateur en manipulant l'arbre de syntaxe abstraite avant que la compilation n'atteigne une représentation intermédiaire?