Я пытаюсь лучше понять, что потребуется компилятору, чтобы он мог сделать разумный выбор в отношении параллелизма от имени программиста. Я понимаю, что есть много сложных аспектов этой проблемы, например:
- Обеспечение отсутствия условий гонки
Обеспечение того, чтобы код, выполняемый одновременно, не имел побочных эффектов, влияющих на семантическое значение кода
Решение о том, стоит ли накладные расходы от раскручивания потоков, учитывая степень параллелизма, доступную в коде
Насколько я понимаю, два основных промежуточных представления, используемых в современных компиляторах, являются статическим единичным назначением для процедурных и объектно-ориентированных языков и продолжений, передающих стиль для функциональных языков. Рассуждение о любой из проблем, перечисленных выше, кажется трудным при использовании этих промежуточных форм. Даже языки, которые теоретически должны иметь лучшие шансы на автоматическое распараллеливание (чисто функциональные языки, такие как Haskell с гарантией отсутствия побочных эффектов), достигли ограниченного прогресса в этом направлении.
Таким образом, мой вопрос заключается в том, какие промежуточные представления были использованы для решения этой проблемы? Существуют ли другие представления, которые использовались в научных исследованиях, о которых я не знаю, которые лучше подходят для этой задачи? Является ли эта проблема той, которая в основном должна быть решена интерфейсом компилятора путем манипулирования абстрактным синтаксическим деревом, прежде чем компиляция достигнет промежуточного представления?