0

Я заинтересован в определении оператора параллельной карты для моего языка. Он преобразует список в новый список с выражением. Он будет иметь синтаксис, похожий на генератор. В отличие от генераторов в C# и Python, это потенциально может быть оценено параллельно, если компилятор желает (например, есть незанятое ядро, а список действительно большой). Он будет называться witheach, чтобы отличить его от foreach, который выполняется последовательно.Оператор параллельной карты (генератор)

Для примера рассмотрим:

var f = function(int x) : int { return x * 2; } 
var my_list = 0..1000000; 
var my_mapped_list = witheach (i in mylist) yield f(i); 

Мой вопрос, как это будет слишком неинтуитивными для программистов, которые могут поставить побочные эффекты в f? Конечно, я бы сказал, не делать этого в документации, но большинство программистов не читают языковой документации. :-)

Я предполагаю, что вопрос большего возраста может заключаться в том, могут ли современные программисты адаптироваться к неявной семантике обработки параллельных списков на своем языке или им нужно, чтобы вещи были более явными?

+0

«им нужно, чтобы вещи были более явными» - да, не называйте это «witheach», но «WARNING_DO_NOT_SIDE_EFFECT_HERE_PARALLEL_MAP». – Svante

+0

Я предполагаю, что это немного утомитесь в щеку? – cdiggins

ответ

2

Вы правы в том, что большинство пользователей не будет читать документацию и, как таковое, вероятно, поместит безопасный код без потоков в блок witheach (особенно с именем и синтаксисом, подобным foreach). Вы либо должны доверять своим пользователям, либо выполнять некоторый статический анализ параллельной безопасности этого блока. Если вы выбрали более позднюю версию, тогда вы можете не беспокоиться о witheach - просто автоматически распараллелите foreach, когда это возможно.

Что касается того, готовы ли пользователи к ответственности за возможность быть потенциально опасными, я бы поставил «да», если они знают, что безопасно. Многие языки заставляют вас делать этот выбор каждый день (указатели, ручное управление памятью, совместное использование разделяемой памяти). Возможно, вы захотите сделать ваш синтаксис менее двусмысленным (т. Е. Назовите его parallelforeach), чтобы люди знали, для чего они подписываются.

+0

Это отличные моменты. – cdiggins

1

Вы имеете в виду что-то вроде pmap?

+0

Да, это практически то же самое, только с более синтаксисом Java-иш. – cdiggins

 Смежные вопросы

  • Нет связанных вопросов^_^