Хорошая новость заключается в том, что исследователи компиляторов говорят, что мы действительно близки к автоматическому распараллеливанию компиляторов.Плохая новость заключается в том, что они говорят об этом уже пятьдесят лет.
Проблема с нечистыми языками, такими как C #, обычно заключается в том, что не хватает параллелизма.На нечистом языке человеку очень трудно и почти невозможно для программы выяснить, взаимодействуют ли два фрагмента кода друг с другом или со средой.
В чистом, ссылочно-прозрачномЯзык, у вас есть противоположная проблема: все распараллеливается, но обычно это не имеет смысла, потому что планирование потока занимает намного больше времени, чем простое выполнение этой проклятой вещи.
ДляНапример, на чистом, ссылочно-прозрачном, функциональном языке, если у меня есть что-то вроде этого:
if a <= b + c
foo
else
bar
end
Я мог бы запустить пять потоков и вычислить a
, b
, c
, foo
и bar
параллельно, затем я вычисляю +
, а затем <=
и, наконец, я вычисляю if
, что просто означает отбрасывание результата либо foo
или bar
, которые обауже были вычислены.(Обратите внимание, как это зависит от функциональности: на нечистом языке вы не можете просто вычислить обе ветви if
и затем выбросить одну. Что, если обе распечатать что-то? Как бы вы «распечатали» это?)
Но если a
, b
, c
, foo
и bar
действительно дешевы, то накладные расходы этих пяти потоков будут намного больше, чем сами вычисления.