Ich versuche besser zu verstehen, was erforderlich wäre, damit ein Compiler im Namen des Programmierers intelligente Entscheidungen in Bezug auf die Parallelität treffen kann. Mir ist klar, dass es bei diesem Problem viele schwierige Aspekte gibt, zum Beispiel:
- Sicherstellen, dass keine Rennbedingungen vorliegen
Sicherstellen, dass der gleichzeitig auszuführende Code keine Nebenwirkungen hat, die sich auf die semantische Bedeutung des Codes auswirken
Die Entscheidung, ob sich der Overhead durch das Hochfahren von Threads lohnt, ist angesichts des im Code verfügbaren Grads an Parallelität sinnvoll
Ich verstehe, dass die beiden in modernen Compilern verwendeten Hauptzwischenrepräsentationen statische Einzelzuweisungen für prozedurale und objektorientierte Sprachen und Fortsetzungsstile für funktionale Sprachen sind. Mit diesen Zwischenformen scheint es schwierig zu sein, über eines der oben aufgeführten Probleme nachzudenken. Sogar Sprachen, die theoretisch die besten Chancen auf automatische Parallelisierung haben sollten (reine Funktionssprachen wie Haskell mit der Garantie, dass keine Nebenwirkungen auftreten), haben diesbezüglich nur begrenzte Fortschritte erzielt.
Meine Frage ist also wirklich, welche Zwischenrepräsentationen verwendet wurden, um dieses Problem anzugehen? Gibt es andere Darstellungen, die in der akademischen Forschung verwendet wurden, von denen ich nichts weiß, und die besser für diese Aufgabe geeignet sind? Ist dieses Problem eines, das vom Compiler-Frontend durch Manipulieren des abstrakten Syntaxbaums grundlegend gelöst werden muss, bevor die Kompilierung eine Zwischendarstellung erreicht?