- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
auto write = [&buf](future<int> size) -> future<bool> {
return streamW.write(size.get(), buf).then(
[](future<int> op){
return op.get() > 0; }); };
auto flse = [](future<int> op){
return future::make_ready_future(false);}; auto copy = do_while(
[&buf]() -> future<bool> {
return streamR.read(512, buf) .then(
[](future<int> op){ return (op.get() > 0) ? write : flse;}); });
///////////////////////////////////////////////////////////////////////////
int cnt = 0;
do {
cnt = await streamR.read(512, buf);
if ( cnt == 0 ) break;
cnt = await streamW.write(cnt, buf);
} while (cnt > 0);
LispGovno 03.12.2013 23:04 # +1
Dummy00001 04.12.2013 00:08 # +4
wvxvw 04.12.2013 00:27 # +1
Сама по себе идея восходит к МакКарти и его запланированому, но никогда не реализованому языку Слону, флюент логике, Остину и его курсу лекций "о том как совершать действия с помощью слов". Другими словами, о том, как програмно описать такие понятия как "принять обязательство", "сделать предложение" и т.д.
Тема вцелом интересная, и предлагающая очень нетрадиционный подход к написанию програм (полный отказ от описания структур данных - задача создания структур данных возлагалась бы на компилятор / интерпретатор, который бы исходя из ситуации сам подбирал бы нужную структуру, оперирование не предикатами / утверждениями а изьявлениями воли / пожеланиями).
Но в полном объеме система никогда не была воплощена, да и не понятно, как даже подступиться, но некоторые элементы приобрели определенную популярност, вот "будущие", "обещания", "ожидания", "уступки" и т.п. - что-то что разные языки в разной степени переняли от этих идей.
Dummy00001 04.12.2013 00:34 # +2
wvxvw 04.12.2013 00:43 # +3
Что до семантики многозадачности: мне еще нигде не попадалась хорошая :) да и по отзывам специалистов, не понятно, что бы из себя представляла така семантика, что в ней должно быть, и какие концепции нужно выражать / какие строительные блоки нужны. Но все прогрессивное человечество семимильными шагами устремилось, так что рано или поздно, что-то будет.
Dummy00001 04.12.2013 01:47 # +2
это был всего лишь пример, но ты раскрыл тему: человеческой семантики прикрутить никто не может.
Ada была и остается самой успешной попыткой которую я видел. Когда-то давно нагуглил:
http://en.wikibooks.org/wiki/Ada_Programming/Tasking
и все еще пользуюсь как справочником по шаблонам синхронизации. Как на микро так и на макро уровне.
anonimb84a2f6fd141 04.12.2013 03:07 # −1
Dummy00001 04.12.2013 03:40 # +1
Очередь - это всего лишь деталь реализации. Причем достаточно низко-уровневая. И одной очередью дело редко заканчивается. Это почти RPC: содержимое очереди на высоком уровне можно описать как сериализованые вызовы функций.
Почитай по линку. Если я концепции из своей головы начну описывать, то это будет скучно и нечитабельно. Но в конце концов, оно маппится на Ada и да же тех же примеров приведенных уже достаточно.
LispGovno 04.12.2013 09:10 # 0
anonimb84a2f6fd141 05.12.2013 02:55 # −2
Из высокоуровневого краем глаза видел akka. Ну и ФП, если его можно туда причислить.
krypt 05.12.2013 11:32 # 0
wvxvw 04.12.2013 16:22 # +3
Например, в Си-подобных языках одна из фундаментальных вещей - это отсутствие абстракции памяти, т.е. управление памятью открыто для программитста и предполагает, на уровне языка, Фон Ноймановскую програму, т.е. программу которая должна выполнятся в одном потоке. Это позволяет, например, сильно оптимизировать массивы, т.как не нужно их передавать по значению, а достаточно передать указатель на массив. Более того, на уровне языка даже нет возможности передать массив произвольной длины по значению.
Что делают в таких языках: начинают отчаяно отстаивать идею указателей, и придумывают всякие ухищения, как приготовить яйцо в микроволновке. Но я все это говорю не потому, что я знаю, как надо было бы сделать - я понятия не имею, а потому что так как оно сейчас, это совсем не хорошо.
anonimb84a2f6fd141 05.12.2013 02:57 # −2
Никогда не слышал.
> Это позволяет, например, сильно оптимизировать массивы, т.как не нужно их передавать по значению, а достаточно передать указатель на массив.
А где массивы передаются по значению?
wvxvw 05.12.2013 03:43 # 0
Ну вот тут более-менее описано.
Я не знаю, где массивы передаются по значению, я это говорю не потому, что где-то уже лучше сделано, а потому что это серьезное препядствие с которым сталкивается любая система пытающаяся описать общение между одновременно выполняющимися задачами.
Бакус (тот самый в честь которого названа форма записи Бакуса-Наура) очень сильно ратовал за то, чтобы искать альтернативные решения. Но как-то чего-то пока никаких существенных наработок в этой области нет, ну или мне не известны.
anonimb84a2f6fd141 05.12.2013 03:45 # −2
> а потому что это серьезное препядствие с которым сталкивается любая система пытающаяся описать общение между одновременно выполняющимися задачами.
То есть сишка не может, и это плохо, а что никто другой тоже не может - как-то пофиг?
Так нифига и не понял про ноймана, наверно не судьба.
wvxvw 05.12.2013 04:32 # 0
Другими словами: то что Си не может - это плохо, а то, что никто другой не может - это тоже плохо. Это ж открытая система, и хочется верить, что языки программирования, вообще не ограничатся только созданными за последние 60 лет. Скорее всего их будет больше и лучших.
Нойман описал компьютер как коробку с одним вводом и одним выводом (в то время как у параллельно выполняющейся системы есть много вводово и, возможно, выводов).
anonimb84a2f6fd141 05.12.2013 05:19 # −1
wvxvw 05.12.2013 10:50 # 0
OpenMP - это про другое. Это не для того, чтобы "параллелить циклы", это набор примитивов для написания програм, которые могут выполнять несколько задач одновременно. То, что там есть какая-то возможность сделать выполнение цикла, в некоторых случаях параллельным - это второстепенная деталь.
wvxvw 05.12.2013 13:56 # 0
Вот, что еще можно почитать по этому поводу (это одна из предполагаемых альтернатив).
Из всех языков, которые там перечислены, я пробовал (или вообще слышал раньше) только про Oz и VHDL. Исходя из чего могу судить, что остальные тоже, либо узко-специализированые, либо чисто академические языки.
roman-kashitsyn 05.12.2013 14:11 # 0
roman-kashitsyn 05.12.2013 15:18 # +1
Я лично хотел бы видеть в мейнстриме годную реализацию task-based concurrency.
В Go очень годно всё, в 1.2 вон сделали возможность вытеснения длинной вычислительной задачи на вызове функции. От длинных числодробильных циклов это, правда, не спасёт.
govnomonad 04.12.2013 09:12 # 0
govnomonad 04.12.2013 09:29 # +2
и реализацию библиотеки, в отличии от кейворда, можно легко заменить
HaskellGovno 06.12.2013 16:17 # 0
можно записать как
Будет тоже самое. Они упоротые?
roman-kashitsyn 06.12.2013 16:37 # 0
Ты уверен? Первое шедулится в юзерспейсе, второе в кернел-спейсе. Люди пишут ОС внутри ОС and we need to go deeper.
HaskellGovno 06.12.2013 16:53 # 0
LispGovno 06.12.2013 21:51 # 0
В данном коде это бесполезно, но если вокруг этого кода много другого асинхронного кода - это благое дело. И если ты думаешь что можно написать высоконагруженный сервер без асинхронного кода и если ты считаешь потоком меньше или больше неважно и ты их насоздаешь целый пул, сервер 128 гб RAM всё стерпит, то поздравляю: сам мудак. Сколько ты памяти сожрешь только на стек в каждом возможно неиспользуемым рационально сейчас потоке? Если ты правда Борманд - не обижайся.
eth0 07.12.2013 18:10 # +4
LispGovno 07.12.2013 21:10 # 0
anonimb84a2f6fd141 07.12.2013 18:12 # 0
Конечный автомат, сука! Повторяй по буквам!
bormand 07.12.2013 18:32 # +1
anonimb84a2f6fd141 07.12.2013 18:48 # 0
inkanus-gray 08.12.2013 10:07 # +2