Почему закрытия внезапно полезны для оптимизации программ для работы нескольких ядер?

Никакой C++ не является действительно надмножеством C. Можно проверить эту статью на более обширный список различий, если Вам интересно: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

6
задан eljenso 19 October 2009 в 08:34
поделиться

2 ответа

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

Мое любимое введение в функции высшего порядка - «Почему функциональное программирование имеет значение» , я не буду пытаться представить здесь плохая реплика.

Таким образом, использование замыканий не дает вам бесплатного параллелизма, если вы собираетесь выполнять замыкания в циклах for, например

for (int i = 0; i < numElements; i++) {
  result[i] = closure(inputs[i], i);
}

, потому что язык не может определить, является ли закрытие (a, б) каким-то образом изменяет другие значения в массивах результатов или входов. Но языки с функциями высшего порядка, такими как map , указывают, что функция, переданная в map , не должна ' t просматривать или изменять другие значения во входных данных и предотвращать их влияние на другие результаты. Таким образом, такой код, который является общим для функциональных языков, можно распараллелить за вас, без необходимости создавать пул рабочих потоков и передавать им закрытие:

results = map(closure, inputs, [0..numElements-1]);

В этих языках замыкания снимают боль объявления где-нибудь новой функции для коротких фрагментов кода. Это делает более увлекательным использование функций высшего порядка.

Следующий код Haskell определяет функцию f , которая принимает список чисел и возвращает список, где каждый вход i является заменено на 2i + 1 . Благодаря тому, что вы избавитесь от хлопот по созданию функции для вычисления 2i + 1 , это будет 1 строка кода вместо 2.

f nums = map (\i -> 2*i+1) nums

Снова см. «Почему функциональное программирование имеет значение»

4
ответ дан 16 December 2019 в 21:43
поделиться

Вот хорошее определение замыканий:

«Закрытие» - это выражение (обычно функция), которая может иметь свободные переменные вместе с среда, которая связывает эти переменные (который «закрывает» выражение.)

Я думаю, вы сбиваете с толку определения, так как, например, в javascript мои замыкания часто могут иметь нелокальные побочные эффекты, поскольку я меняю DOM.

полезны, поэтому C # добавил их в язык.

В таких языках, как язык функционального программирования, кажется, что они не обязательно создают потоки, за которые вы должны платить из-за переключения контекста, но создают легкие процессы. Фреймворк или компилятор будет контролировать, что создавать, чтобы обеспечить оптимальное использование процессора.

Пишете ли вы с замыканиями, менее важно, чем если бы вы использовали неизменяемые данные.

Например, если у меня есть приложение, которое не имеет глобальных данных, но каждый поток использует свою локальную копию, тогда ОС и планировщик должны определить, какие ядра будет использовать мое приложение. К сожалению, в C / C ++ компиляторы не знают, как это сделать, поэтому, перейдя на FP, мы можем перейти к фреймворкам, таким как Erlang, которые долгое время имели дело с распределенной обработкой, и использовать их опыт.

Актеры в чем-то вроде Erlang будут иметь меньше накладных расходов, чем поток C / C ++, поскольку переключение с актерами кажется более быстрым.

2
ответ дан 16 December 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: