Estoy tratando de comprender mejor lo que se necesitaría para que un compilador pueda tomar decisiones inteligentes con respecto a la concurrencia en nombre del programador. Me doy cuenta de que hay muchos aspectos difíciles de este problema, por ejemplo:
- Asegurarse de que no hay condiciones de carrera
Asegurarse de que el código se ejecute simultáneamente no tendrá efectos secundarios que afecten el significado semántico del código
Decidir si vale la pena la sobrecarga de los subprocesos, dado el grado de paralelismo disponible en el código
Según tengo entendido, las dos representaciones intermedias principales que se utilizan en los compiladores modernos son asignaciones únicas estáticas para lenguajes de procedimiento y orientados a objetos y estilo de paso de continuación para lenguajes funcionales. Razonar sobre cualquiera de los problemas enumerados anteriormente parece difícil usando estas formas intermedias. Incluso los lenguajes que, en teoría, deberían tener la mejor oportunidad de paralelización automática (lenguajes funcionales puros como Haskell con la garantía de que no hay efectos secundarios) han tenido un progreso limitado en este frente.
Entonces, mi pregunta es, ¿qué representaciones intermedias se han utilizado para tratar de abordar este problema? ¿Hay otras representaciones que se hayan utilizado en la investigación académica que no conozca que se adapten mejor a esta tarea? ¿Es este un problema que el compilador tiene que resolver fundamentalmente manipulando el árbol de sintaxis abstracta antes de que la compilación alcance una representación intermedia?