Re[3]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 17.06.13 05:51
Оценка: 1 (1) +4 :)))
Здравствуйте, IT, Вы писали:

IT>Т.е. ты умный, а JVM и .NET разработчики дураки?


Если отбросить эмоции, то Java/.Net разработчики не задумываются о ресурсах/алгоритмах. Мне прямо говорили: "В бизнес-приложениях алгоритмы не нужны, у нас все в базу упирается".
Re[55]: Что посоветуете как аналог С++
От: alex_public  
Дата: 02.07.13 15:57
Оценка: 28 (2) +3 -1 :)
Здравствуйте, Ikemefula, Вы писали:

I>Чем твой yield лучше await в таком случае ?


Ну так это оно и есть.))) Только await менее удобный и эффективный.

Вообще у нас какое-то странное обсуждение пошло. Давай я один раз опишу свою точку зрения на всё это, а ты скажешь согласен или нет. И так:

1. Существует нормальное многопоточное программирование, которое люди используют уже многие годы. Причём используется практические везде. И соответственно реализации этого есть практически во всех языках. В C++ это сейчас std::thread и std::future/std::async. В C# их аналоги это System.Threading.Thread и System.Threading.Tasks.Task.

2. Одним из частных случаев пункта 1 является программирование задачи по вычислению чего-то в отдельном потоке (с возможным контролем работы) и возврата значения в изначальный поток. Часто такое называет асинхронным кодом. Тривиально реализуется обычными же средствами. Например для C++ код с вызывающим потоком без цикла сообщений:
auto r=async(launch::async, []{return CalcSomething();});
DoAnother();
ProcessResult(r.get());

и с циклом сообщений:
thread([]{PostMessage(CalcSomething());}).detach();
...
OnDataMessage(Data d){ProcessResult(d.get<type>());}

3 Существует такая довольно специфическая вещь как сопроцедуры, позволяющая иметь множественные точки входа во вроде бы линейный код. Реально полезное применение в основном в случае наличия очень большого числа параллельных задач, т.к. реализация подобного через обычные потоки уже весьма неэффективна. Так же может применяться для реализации "генераторов". В силу своей специфичности имеют реализации не во всех языках (реализацию от ОС не рассматриваем). В C++ реализация есть и даже не одна, а много разных. В том числе и наиболее эффективная (stackfull) из всех — Boost.Coroutine. Для C# тоже имеется своя реализация (await), причём встроенная в сам язык, но при этом весьма ограниченная и неэффективная.

4. Агрессивные евангелисты C#'а однажды (не так давно кстати) записав пункт 2 с помощью пункта 3 неожиданно "обнаружили" что:
— совершён очередной великий прорыв в программирование (гыгы)
— естественно не имеющий аналогов в других языках (гыгыгы)
— программировать асинхронный код удобнее именно так (ага, как же, только кривую архитектуру плодить)
— только теперь люди смогут заниматься настоящим асинхронное программированием (гыгы)

Вот такая картинка у меня. Есть возражения? )

P.S. Эх, и всё же куда так резко пропал gandjustas...
Re[6]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.06.13 20:20
Оценка: 7 (1) +2 -3 :)
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, IT, Вы писали:


IT>>Тоже самое можно сказать и о большинстве C++. В своё время доводилось интервьюировать и работать с людьми, которые не воспринимали воообще никак битовую арифметику, не знали как объявить класс (после 3-х лет работы на C++ Builder) и вообще сильно путались в основах ООП, про память могли говорить исключительно в рамках стандартных вопросов/ответов, шаг влево/вправо — попытка к бегству. Так что всё это разговоры в пользу бедных. Дураков, пишущих на плюсах не меньше, а может быть даже больше, потому как писать сегодня на плюсах в подавляющем большинстве случаев — нонсенс.


KP>Т.е. с утверждением: "главное задача, памяти бесконечно много, не хватает мощности — поставим на кластер" ты согласен?


Кластер нужен как минимум для отказоустойчивости. Надежность в серверных приложениях нужна гораздо больше оптимальности. Дешевле добавить память, диск, процессор, чем оптимизировать программу.
Для примера представь что серверу для работы на всю компанию нужно 16гб оперативки. Есть всего восемь.
Вариант — оптимизировать приложение, два месяца работы, два месяца исправления багов, при ЗП в 100к — 400к + упущенная выгода + административные расходы.
Добавить 8гб памяти — 5к + день работы.

Дальше еще интереснее: если вся нагрузка переходит на сервер, то оказывается что на клиенте делать нечего. даже рабочий ноут средней руки имеет 4 гига ОП и 2 процессора. Планшеты тоже не отстают. И пропадает смысл оптимизировать клиентскую часть, проще написать на JS, сделав доставку через веб и забыть о проблемах накатывания апдейтов.

Экономика корпоративных систем оставляет C++ за бортом.

На десктопе ситуация для C++ не лучше, так как ресурсов дофига, даже на планшетах, никто за лишние 30-50 мегабайт не будет беспокоиться и почти везде уже больше одного ядра.
Остаются встраиваемые системы с малыми ресурсами и всяческие HFT. Но это мааааааленькая ниша по сравнению с остальными. разве что по историческим причинам еще много где остается C++, но, как и cobol в свое время, уже движется к вымиранию.
Re[24]: Что посоветуете как аналог С++
От: koodeer  
Дата: 21.06.13 21:10
Оценка: 4 (1) +5
Здравствуйте, Олег К., Вы писали:

IT>>Отсюда вытекает, например, повышение выразительности языка и устранение кучи мусора вроде:


IT>>
IT>>MyObject obj = new MyObject();
IT>>


ОК>По мне, так это не мусор а получше чем писать вар. Возможное исключение: всякие "вложенные" дженерики. Ну и для линка, конечно же.


Когда-то я тоже был ярым сторонником полного описания типов. Я долго не принимал var (использовал его только в линковых выражениях). Время шло, я развивался (во всяком случае мне так кажется), и я осознал удобство краткости кода.


ОК>Объясняю это на протяжении нескольких постов. Плохого в них ничего нет но их не создавали чтобы девелоперы использовали их налево и направо. Теперь ты объясни мне что в них хорошего (кроме анонимных типов и вложенных дженериков). Я пока что не услышал ответа.


Мне попадались такие высказывания на эту тему.

Начинающие программисты много внимания уделяют типу переменной; разбирая чужой код, они в первую очередь смотрят на тип, и таким образом пытаются понять, что можно сделать с этой переменной (этим объектом). И эти джуниоры мало уделяют внимания наименованию переменных.

Более опытные разработчики типу уделяют гораздо меньше внимания. Для них важнее сама семантика кода. Гораздо важнее название переменной, а не её тип. Дав описательное название переменной, можно по сути пренебречь её типом: и так всё ясно.

И я с таким мнением согласен.
Re[4]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 17.06.13 14:22
Оценка: 1 (1) +2 -2
Здравствуйте, kaa.python, Вы писали:

KP>Ну и в целом, большинство JVM и .NET смутно представляют себе то, как работает их код на железе, что тоже не слабо сказывается на его качестве. Этот нюанс прослеживается что на форуме, что в личной беседе.


Тоже самое можно сказать и о большинстве C++. В своё время доводилось интервьюировать и работать с людьми, которые не воспринимали воообще никак битовую арифметику, не знали как объявить класс (после 3-х лет работы на C++ Builder) и вообще сильно путались в основах ООП, про память могли говорить исключительно в рамках стандартных вопросов/ответов, шаг влево/вправо — попытка к бегству. Так что всё это разговоры в пользу бедных. Дураков, пишущих на плюсах не меньше, а может быть даже больше, потому как писать сегодня на плюсах в подавляющем большинстве случаев — нонсенс.
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re: Что посоветуете как аналог С++
От: Константин Россия  
Дата: 16.06.13 09:58
Оценка: +5
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


C++11
Re[13]: Что посоветуете как аналог С++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 18.06.13 13:00
Оценка: +5
Здравствуйте, gandjustas, Вы писали:

N>>Они запущены и работают, у многих не закрываются сутками, неделями, месяцами.

G>Ну приведи пример чтоли, а то как-то абстрактно. У меня месяцами не закрывается onenote и lync. Но вместе они хавают сильно меньше 2 гб. Остальное запускается эпизодически.

На Винде: Skype, Outlook, Firefox, Thunderbird, Miranda, Far, антивирус, эквалайзер для аудио драйвера от реалтека, примочка для видео от интела, Process explorer. Это всё не профессиональные программы. Ещё из часто запускаемых, это компиляторы, линковщики, отладчики, анализаторы кода.
На домашней Убунте и того больше.

N>>А понижение железом частоты шины памяти и отключение неиспользуемых блоков встречается и на десктопах, и на ноутах, и на планшетах, и на телефонах. Там память — это реальный ресурс.

G>Угу, поэтому приложения вытесняются без действий со стороны пользователя.

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

G>>>Сходи на MSDN глянь как в WinRT делать асинхронные вызовы в C++, а потом сравни с .NET и JS.

N>>Примеры программ.
G>Там есть примеры.

Где там? Примеры из MSDN? Я прошу примеры реальных программ.

N>>Практически во всех — это практически во всех.

N>>Метрошные приложения — это просто супер узкая ниша. Может быть их вообще 30 штук в мире и есть.
G>Ты в маркет давно заходил? Или судишь о вкусе устриц не попробовав?

Ни у меня, ни у моих знакомых, друзей и родственников нет устройства, на которое можно что-то поставить с маркета. Это узкая ниша, WinRT есть специально для неё. Мы же говорим о применимости С++.


G>Конечно нет. ОС и дрова отдельная ниша и там совсем не рулит C++, скорее C. Фоторедакторы нормально работают на .NET. "Текстовые процессоры" уже давно и в JS есть. В видеоплеерах кодеки низкоуровневые, причем уже готовые, а обвязка на высокоуровневых языках.


С++ тоже используется в разработке драйверов (лично это делал, ага). А теперь приведи мне примеры фоторедакторов на .Net (Paint.Net???). Или популярный видеоплейер, на (ха-ха!) готовых кодеках. Желательно, чтобы они были сравнимы по распространённости с vlc, media player classic, WinApm, foobar, Aimp. Я тебе даже больше скажу: все эти "обёрточные" программки рождаются и умирают, а ffmpeg, vlc и другие их основы живут и здравствуют. И много кого переживут ещё.

G>Мало, на проверку, оказывается потребности в C++, если legacy не смотреть.

G>Новые приложения в маркете это наглядно показывают, там нет груза legacy кода.

Маркет — это слишком узкая ниша, по ней нельзя судить о мировых тенденциях. Вон даже Шаттлворт закрыл баг с доминацией Windows в мире, а мир с WinRT вообще мизер.

G>Кстати посмотри на маки, там большая часть приложений — objective c, вполне себе управляемый язык, причем довольно давно. Просто исторически так сложилось что на С++ было непопулярно писать для маков, там C++ и был нишевым всегда.


Ага, ага. С++ настолько нишевый язык, что существует во всех нишах сразу.
Re[9]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 18.06.13 22:41
Оценка: +2 -3
Здравствуйте, gandjustas, Вы писали:

G>Средний ноут, в том числе ультрабук, имеет 2-4 гб памяти, которые толком занять нечем. Какой смысл для пользователя от экономии 100мб?


N>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>Память? А причем тут зарядка?

Performance bottleneck большинства программ это взаимодействие с иерархией памяти.
Плохой memory layout структур данных, лишние индерекции, лишние аллокации, плохая работа с кэшем — это всё яд для производительности — этим всем грешат "управляемые среды", поэтому и производительность намного хуже.
Требуется в 10 раз больше памяти? — косвенный признак тормозов.

Чтобы делать быстрый код в "управляемых средах" — нужно работать против языка, отказываться от многих средств выражения идей, спускаясь на крайне низкий уровень (даже ниже чем C).
В C++ же производительность и выразительность это не враги — можно делать много слоёв удобных абстракций, которые при компиляции практически исчезнут в пучине inline'ов — Light-weight abstraction programming language.

Andrei Alexandrescu: "The going word at Facebook is that 'reasonably written C++ code just runs fast,' which underscores the enormous effort spent at optimizing PHP and Java code. Paradoxically, C++ code is more difficult to write than in other languages, but efficient code is a lot easier."

Re[21]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 23:46
Оценка: -3 :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Mazay, Вы писали:



EP>Stackless coroutine менее мощные чем stackful — если бы это было не так, то как минимум никто бы не реализовывал Boost.Coroutine.

Совсем наоборот, но в C++ таки требуются минимум 100 строк и еще какие-то пляски чтобы не хранить стек, поэтому и делают stackful.
Хранение стека по определению менее масштабируемо, ибо надо хранить весь стек, который по дефолту — 1мб и примерно на 200 потоках\файберах кончается. Хз как внутри устроен Boost.Coroutine, но мне кажется что именно так.
Но самое главное что хрен ты это дело запустишь на нескольких ядрах.
Re[20]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 16:32
Оценка: :))) :))
MTD>>>Откуда такая уверенность?

ОК>>Нормальные софтвере инженеры в тот форум редко, если вообще когда, заглядывают. Это больше место для школоты до которой не доходит и вряд ли дойдет что большинство фич из плюсов не нужны для нормального кода.


M>А подробнее? Что именно, "нормальный софтверный инженер", исключил бы из нововведений с++11?


В С++ 98-го более чем достаточно фич чтобы писать нормальный код. Лично я еще С++11 даже и не открывал но скоро открою и лишь только по одной причине; на интервью может попасться какой-нибудь очередной идиот который знает все новомодные фишки и считает что раз он пихает их все куда ни попадя, так и все остальные должны их также пихать. Вообще перечитай еще раз мой ответ выше, может дойдет.
Re[22]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 22.06.13 23:31
Оценка: +1 -2 :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Ikemefula, Вы писали:


I>>Покажи мне аналог в asio для вот для такого псевдокода

I>>
EP>private async void handler(object sender, TaskArgs args)
EP>{
EP>    string result = await new Task(() => Download(args.Url), args.Cancellation);
EP>    textBox.Text += result;
EP>}
EP>

I>>Итого — функция которая асинхронно скачивает файлик, показывает его и дает возможность отменить скачивание.

EP>C++1998:

EP>
EP>void handler(Object &sender, TaskArgs &args)
EP>{
EP>    background(bind(download, args.url), args.cancellation),
EP>    textBox.Text += _1;
EP>}
EP>

EP>

Пример для C# неточен.

Вот так надо:

private async void handler(object sender, TaskArgs args)
{
    var client = new HttpClient();
    var response = await client.GetAsync(args.Url, args.Cancellation);
    response.EnsureSuccessStatusCode();
    textBox.Text +=  await response.Content.ReadAsStringAsync();
}


Чтобы ты лучше понимал что происходит, распишу по-русски как оно работает. Предположим что это десктопное приложение.

1) вызывается handler
2) делается запрос на сервер, метод сразу же завершается и уходит а ожидание сообщений или делает полезную работу
3) Когда приходит заголовок ответа вызов хендлера маршалится в UI поток через цикл обработки сообщений
4) Когда в UI потоке находится время обработать, он проверяет успешность вызова и запускает асинхронное чтение данных ответа и завершает вызов.
5) когда весь ответ прочитан вызов хендлера снова маршалится в UI поток
6) Кода в UI потоке находится время, он добавляет текст ответа в TextBox

Такая архитектура позволяет делать очень много подобной "работы", вообще без создания потоков, при этом ни на долю секунды не потеряв отзывчивость интерфейса.

Давай, детка, сделай это на C++.


Более того, на сервере еще интереснее ситуация. Сделав правильно обработку входящих запросов можно обработанные данные писать на диск\в базу во время того как клиент данные еще отправляет. Причем для этого не надо плодить потоки.
Это позволяет таких показателей латентности добиться, что ни одному серверу на C++ не снилось.
Re[33]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.07.13 10:50
Оценка: :))) :))
Здравствуйте, vdimas, Вы писали:


V>Тю, блин, теперь понятно, что ты там всё время спросить пытаешься. )))

V>Жесть!

V>Давай лучше я тебя спрошу:


До свидания.
Re[8]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.06.13 07:23
Оценка: +1 :)))
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, gandjustas, Вы писали:


G>>На десктопе ситуация для C++ не лучше, так как ресурсов дофига, даже на планшетах, никто за лишние 30-50 мегабайт не будет беспокоиться и почти везде уже больше одного ядра.


N>Если десктопы — это ноутбуки, то память и процессор — это ресурс. Это было и раньше, а сейчас тем более, особенно в свете развития ультрабуков.

Средний ноут, в том числе ультрабук, имеет 2-4 гб памяти, которые толком занять нечем. Какой смысл для пользователя от экономии 100мб?

N>На планшетах тем более ресурс, никто не хочет жить на зарядке.

Память? А причем тут зарядка?

Если же говорить о потреблении процессора, то тут еще печальнее для C++, так как 95% времени работы приложения — ожидание внешнего события: действий пользователя, пакетов из сети, данных с диска. Организовать такую работу с минимальным потреблением ресурсов на C++ на порядок сложнее, чем на .NET. Язык слабоват. Даже на JS проще.

Остаются только приложения, которые много считают — игры и фотошоп.


N>Именно поэтому все мало-мальски популярные приложения оптимизируются по самое нехочу, стараются использовать аппаратные возможности для ускорения вывода графики и других уже неграфических вычислений, встраивают типизированный JavaScript в браузеры (см. Asm.js), используют JIT, кешируют часто используемую память и т.д. и т.п.

N>P.S. И не только приложения оптимизируются, кстати. Из железа тоже сейчас выжимают все соки ради экономии нескольких Ватт. Неужели ты живёшь в какой-то другой реальности?

Оптимизируют-то конечно оптимизируют, но с целью меньшего энергопотребления и увеличения perceived performance, а не потребления памяти и процессорного времени. А вот для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто.
Re[10]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.06.13 09:36
Оценка: -4
Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>Performance bottleneck большинства программ это взаимодействие с иерархией памяти.

EP>Плохой memory layout структур данных, лишние индерекции, лишние аллокации, плохая работа с кэшем — это всё яд для производительности — этим всем грешат "управляемые среды", поэтому и производительность намного хуже.
EP>Требуется в 10 раз больше памяти? — косвенный признак тормозов.

Это общие слова. Такие вещи имеют вес в основном в числодробилках. "лишние аллокации" в менеджед не проблема. Проблемой являются долгоживущие объекты, объекты большого размера и большое количество тех и других. Зато гораздо проще сделать качественное кеширвание IO операций, уменьшить количество таких, легче сделать многопоточный процессинг, асинхронное ожидание и тд и тд и тд.

EP>Чтобы делать быстрый код в "управляемых средах" — нужно работать против языка, отказываться от многих средств выражения идей, спускаясь на крайне низкий уровень (даже ниже чем C).

EP>В C++ же производительность и выразительность это не враги — можно делать много слоёв удобных абстракций, которые при компиляции практически исчезнут в пучине inline'ов — Light-weight abstraction programming language.

Что характерно, быстрый код на С++ это точно так же работа против языка. Почему то самые критичные куски кода пишутся практически на С или подобным образом.

EP>

EP>Andrei Alexandrescu: "The going word at Facebook is that 'reasonably written C++ code just runs fast,' which underscores the enormous effort spent at optimizing PHP and Java code. Paradoxically, C++ code is more difficult to write than in other languages, but efficient code is a lot easier."


Это все басни. В менеджет не оптимизируют потому что "память не русурс, не хватит мощности, добавим кластер, памяти и тд", а в С++ не оптимизируют потому что "всё и так быстро".
Re[15]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 09:11
Оценка: +4
Здравствуйте, Ikemefula, Вы писали:

I>Ну да, это ж я рассказываю как кругом всё шоколадно.


Нет, ты рассказываешь, что у тебя в проекте гонокод, и смело экстраполируешь это наблюдение на вообще все проекты на С++.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[20]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 14:36
Оценка: :))) :)
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, Ikemefula, Вы писали:


J>>>1С, вестимо


I>>1С началась в 2005м ? Выдыхай что ли


N>Практически да. Как тебе хорошо известно, 1С с восьмой версиии была практически полностью переписана,


Это уже никому не интересно, какой процесс разработки, революционное переписывание или эволюционный реинжиниринг.
Re[21]: Что посоветуете как аналог С++
От: michae1  
Дата: 21.06.13 19:52
Оценка: +4
Здравствуйте, Олег К., Вы писали:

MTD>>>>Откуда такая уверенность?


ОК>В С++ 98-го более чем достаточно фич чтобы писать нормальный код. Лично я еще С++11 даже и не открывал но скоро открою и лишь только по одной причине; на интервью может попасться какой-нибудь очередной идиот который знает все новомодные фишки и считает что раз он пихает их все куда ни попадя, так и все остальные должны их также пихать. Вообще перечитай еще раз мой ответ выше, может дойдет.


Ну вот ты бы почитал сначала хотя бы обзор нового стандарта, а потом брызгал слюной

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

Ну, а на счет "идиотов на собеседовании", тебе не приходила мысль, что в проекте может активно использоваться возможности с++11 и команде не нужен "идиот", которому лень учиться, зато нравиться всех поучать?

З.Ы. на msdn chanel9 есть немало видео обзоров: GoingNative2012 и блог STL посмотри что ли, это интересно.
Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 14:27
Оценка: :))) :)
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Ikemefula, Вы писали:


I>>Вот когда такой код появится в прошивке, драйвере файловой системы или движде базы данных или веб сервере, вот тогда и можно будет производительность сравнивать.

C>А он там есть. Большое managed-приложение съест кучу памяти, оставив меньше места под кэш.

Гипотетический случай. Утечки и ошибки с указателями в С++ дают куда больше реальных проблем.
Re[23]: Что посоветуете как аналог С++
От: michae1  
Дата: 27.06.13 09:25
Оценка: +3 :)
Здравствуйте, Олег К., Вы писали:


ОК>Благодарю покорно. Я лучше схожу на стартаперские тусовки а вас,


Только мне прочиталось "старперские" ?
Re[39]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 10:24
Оценка: -2 :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Понятно, аргументы закончились


EP>алле, какой пример?


Да все тот же, где Sleep используется.

I>>Ну это просто вранье. alex_public показал, как event-loop "не меняется" — путем встраивания RunAll в event loop или прикручивая таймер


EP>Так я же выше показывал пример с полностью локальной трансформацией, без модификации event-loop


Тот где торчит asynchronous или тот где getline ? Если getline сам по себе, то он блокирует message pump и что бы это пофиксить, нужно научить буст запускать message pump.

I>>UI поток заблокируется, потому что буст не знает про message pump.


EP>Так он и не должен ничего знать про message pump. Я же выше показывал пример


Да, я в курсе, asynchronous.

EP>У асинхронных операций есть callback'и принимающие продолжения, вот в этот callback и нырнёт наша корутина — event loop это никак не трогает — всё полностью локально


То есть, вместо линейного кода на ровном месте получаются continuations

EP>То есть по твоему "асинхронщина" — это только выполнение в отдельном потоке?


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

EP>Ничто не мешает закинуть post_event с unyield'ом корутины в конец нового потока Уже надоело объяснять банальные вещи


Ну да, лучше делать руками то, что может легко сделать компилятор
Re[8]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 17.06.13 17:44
Оценка: 7 (1) +1 -1
Здравствуйте, kaa.python, Вы писали:

IT>>Это стандартные домыслы, с ними нет смысла спорить.

KP>Это не стандартные домыслы. Это утверждение, которое очень часто приводится в дискуссиях как довод в пользу управляемых языков.

Скорее не как довод в пользу, а как показатель низкой значимости.

IT>>ЗЫ. А ты сам с "Дураков, пишущих на плюсах не меньше, а может быть даже больше..." тоже получается согласен?

KP>Распределение дураков везде приблизительно одинаковое, сложно с этим спорить, да и зачем... Но вот дурак и разработчик не думающий об алгоритмах и ресурсах это совсем разные вещи.

Какая разница? Плюсовики вынуждены постоянно думать о ресурсах и не столько об их экономии, сколько об утечках. Это всего лишь умение ходить по граблям. Ничего общего с оптимизациями и алгоритмами.
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re: Что посоветуете как аналог С++
От: NeoCode  
Дата: 17.06.13 12:49
Оценка: :)))
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Три языка, которые стоило бы объединить в один, чтобы сделать убийцу С++: ObjectiveC, D, Go.
И добавить к этому макросы из Nemerle.
Re[15]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 06:32
Оценка: +3
Здравствуйте, gandjustas, Вы писали:

I>>>В общем случае надо организовать корректную схему многопоточного взаимодействия, асинхронщину всякую. Вот это на с++ крайне сложно.

MTD>>Не сложней, чем на Java, например.
G>Неправда твоя. Покажи как сделать продолжения и при этом не устраивать аццкие пляски с деаллокацией памяти.

1. Передавать объекты по значению — вопроса деаллокации вообще не возникнет.
2. Передавать shared_ptr — все сдохнет автоматизированно.

хз что из этого ты называешь "аццкими плясками"
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[19]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 10:01
Оценка: +3
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, jazzer, Вы писали:


J>>>>Нет, ты рассказываешь, что у тебя в проекте гонокод, и смело экстраполируешь это наблюдение на вообще все проекты на С++.

I>>>У меня в проекте нет С++ наверное с 2007го, иногда залажу посмотреть в сторонние проекты, так что ты промахнулся мимо унитаза

J>>ну ок, в соседнем проекте. Смелости твоих экстраполяций это не меняет.


I>Сторонние это не соседние, а именно сторонние. Это значит, если непонятно, что ни я, ни команда, ни контора где я работал к ним не имели никакого отношения.


Да пофиг. Беда в том, что ты по этим проектам делаешь космического масштаба выводы обо всех плюсовых проектах и плюсовых программерах.

Хотя, имхо, аргументация в стиле "С++ ущербен, я даже знаю несколько проектов с гонокодом внутри" несколько неубедительна, не находишь?
Потому что, ты не поверишь, наверное, но я тоже знаю несколько таких проектов, и в некоторых я даже имел сомнительное удовольствие работать.
И причина гонокодности была чисто административной.
Причем они не все были на С++, некоторые на Java. И почему же это я не делаю таких экстраполяций в отношении программеров на других языках...
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 16:05
Оценка: -2 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это передёргивание — та задача о которой ты говоришь будет решением другой задачи, та в свою очередь и т.п. В итоге выйдем на задачу "прибыльный бизнес".

EP>Группировка разнотипных данных вездесуща в императивных языках — зачем это отрицать что это задача? На определённом уровне это вполне себе задача

Группировки они разные бывают. Внятно дай задачу в терминах пользователя. Ты пока что привел решение этой задачи непойми в каких терминах.

I>>Для полноценных замыканий нужен GC, ибо не совсем ясно, где и когда ты будешь память освобождать.


EP>Зависит от. Где-то будет подсчёт ссылок, где-то копирование, где-то move, а где-то вообще полностью pre-allocated с выделением целого блока на задачу и очистка всего блока по завершению.


То есть, стратегия использования памяти зависит от того кода,который пишешь. Об чем и речь, это и есть кастрированые замыкания.

EP>Ты написал:

EP>

EP>Почему то самые критичные куски кода пишутся практически на С или подобным образом.

EP>Я привел пример number-crunch проекта где это далеко не так, и при этом он составляет конкуренцию коммерческим решениям.

И ты утверждаешь, что именно это и есть типичный с++ код ? Как бы не так. Прямо в этом форуме, в КСВ, в С++ полно людей которые считают использование не то что буста, а темплейтов преступлением.

I>>Большинство людей работает именно с некачественным кодом, это очевидно как божий день — чем ниже качество кода, тем больше нужно девелоперов что бы укладываться в сроки, требования и ограничения.

EP>Это ты к чему вообще? Да, плохой код есть, причём на разных языках.

Я к тому, какой типичный код на С++ и какая доля разрабов его майнтейнит.

I>>Вот пример — на старом проекте я довольно долго занимался одной частью проекта и старательно все вылизывал, что бы легче было майнтейнить код. В какой то момент оказалось, что только я и понимаю, что там происходит унутре, потому что другим вообще незачем было туда лазить, а если и случалось чего, фиксы занимали минуты. Зато буквально в соседнем модуле, над которым потрудился индус, копались буквально все, потому что каждому надо было чего то фиксить.


EP>Молодец Чего сказать-то хотел?


Уже все сказано. На одном проекте 40 индусов майнтейнят либу для линейного программирования, а на другом один человек майнтейнит такую же либу да же пачку из других областей. Вопрос — какой код считать типичным для этого примера ?
Re[22]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 09:53
Оценка: -1 :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>C++1998:

EP>
EP>void handler(Object &sender, TaskArgs &args)
EP>{
EP>    background(bind(download, args.url), args.cancellation),
EP>    textBox.Text += _1;
EP>}
EP>

EP>

И где здесь высокоуровневый подход ? Ручное связывание через bind или _1 — это оно что ли ? Я надеюсь, это не глобальная переменная ?
А как быть в случае, если в коде несколько await ? Я ведь и такой пример приводил.
Re[29]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 09:20
Оценка: :)))
Здравствуйте, Ikemefula, Вы писали:

_>>Да, но несмотря на все эти красивости я бы всё равно не стал писать так — мне не нравится подобный стиль реализации многопоточности.

I>Правильно, потому что отстой, о чем я и говорю.

Да, да, согласен, весь этот await/async стиль — это отстой. )))

I>Ну тогда тебе не составит труда показать, чего же нельзя подстроить в C# и желательно что бы это было привязано к актуальной задача, а не выглядело навроде "а в конце метода я хочу что бы был код, который реально вызовется в начале"


А легко. Например мы можем сделать в одном обработчике несколько отдельных асинхронных вызовов. Или вообще в цикле погонять этот блок... Типа такого:

void handler(object& sender, TaskArgs& args)
{
    for(int i=0; i<5; i++){
        BEGIN_ASYNC
        HttpClient client;
        auto response=await_async(client.Get(args.Url+sufix[i], args.Cancellation));
        response.EnsureSuccessStatusCode();
        textBox[i].Text+=await_async(response.Content.ReadAsString());
        END_ASYNC
    }
}


Понятно что похожий код можно и в C# намутить, но это надо уже вставлять асинхронные лямбды и вызывать их... В общем код будет уже заметно пострашнее чем C++ выглядеть.

P.S. Но вообще мне нравится куда уже ушла наша дискуссия. Я вижу попытки доказать мне что реализация await/asynx в C# не хуже чем в C++. Это правильный подход... А то начали то с диких лозунгов что в C++ это вообще невозможно.
Re[31]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 13:57
Оценка: +2 :)
Здравствуйте, Ikemefula, Вы писали:

I>>>И что ? Чем это лучше

I>>>Тем, что на С++ ?
EP>>А где я говорил, что это чем-то лучше, круче? Ты спрашивал про аналог
I>Договорились — ничем не лучше Не ясно, с чем же ты раньше спорил

Дискуссия действительна приняла интересный оборот
Автор: alex_public
Дата: 25.06.13
, "покажи мне аналог await'а" плавно перетекает в "И что ? Чем это лучше"
Re[44]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 02.07.13 09:08
Оценка: -1 :))
Здравствуйте, vdimas, Вы писали:

V>Это ты не читатель:

V>

V>Это ты не туда смотришь. Которутины — лишь кубики Лего, из которых можно собрать произвольную модель.


Спасибо, капитан ! Я то думал, что короутины дотнета для которых прикручено N апи комбинаторов это кубики лего из которых можно собрать произвольную модель, а на самом деле это апи комбинаторов, из которых можно собрать произвольную модель.

I>>Дальше скипнул — смысла нет. Хочешь показать чего интересного — давай свой код.


V>Дык, самое интересное, — прикладной код, тебе уже показали. Схематичную реализацию такого фреймворка тебе тоже уже показали. Показали с целью продемонстрировать, откуда вызываются короутины. Там должно было уже давно быть понятно даже тому, что первый раз про асинхрнность слышит...


Мне нужен пример не любых короутин, а stackfull. E.P. сделал много заявлений, но кроме синхронного кода ничего и не показал. Если бы alex_public не прикрыл его с фланга, был бы провал.

V>А теперь ты пытаешься требовать подробную реализацию фреймворка, который будет работать, так же, как дотнете. Посмотри как это сделано в дотнете, делов-то. Там вовсе не 200к кода нужного кода, ес-но.


Разумеется, а то первый же пример stackfull замораживал UI

V>В виндах существует минимум 3 модели асинхронности, каждая из которых имеет право на жизнь в своих сценариях. Для GUI-потока наиболее естественно — это completion routines. Для серверного приложения — completion ports. Каждая из моделей специфична, но (!!!) практически не влияет на прикладной код. И в этом прелесть.


Правильно и все три работают без короутин.
Re[2]: offtopic (а может, и нет)
От: Pavel Dvorkin Россия  
Дата: 17.06.13 16:53
Оценка: 24 (2)
Здравствуйте, NeoCode, Вы писали:


NC>Три языка, которые стоило бы объединить в один, чтобы сделать убийцу С++: ObjectiveC, D, Go.


Трех королей разгневал он
И было решено,
Что навсегда погибнет Джон
Ячменное Зерно.

Велели выкопать сохой
Могилу короли,
Чтоб славный Джон, боец лихой,
Не вышел из земли.

Травой покрылся горный склон,
В ручьях воды полно...
А из земли выходит Джон
Ячменное Зерно

Все так же буен и упрям
С пригорка в летний зной
Грозит он копьями врагам,
Качая головой.

Но осень трезвая идет.
И, тяжко нагружен,
Поник под бременем забот,
Согнулся старый Джон.

Настало время помирать —
Зима недалека.
И тут-то недруги опять
Взялись за старика.

Его свалил горбатый нож
Одним ударом с ног,
И как бродягу на правеж,
Везут его на ток.

Дубасить Джона принялись
Злодеи поутру.
Потом, подбрасывая ввысь,
Кружили на ветру.

Он был в колодец погружен,
На сумрачное дно.
Но и в воде не тонет Джон
Ячменное Зерно!

Не пощадив его костей,
Швырнули их в костер.
А сердце мельник меж камней
Безжалостно растер.

Бушует кровь в его котле,
Под обручем бурлит,
Вскипает в кружках на столе
И души веселит.

Недаром был покойный Джон
При жизни молодец, —
Отвагу подымает он
Со дна людских сердец.

Он гонит вон из головы
Докучный рой забот.
За кружкой сердце у вдовы
От радости поет...

Так пусть же до конца времен
Не высыхает дно
В бочонке, где клокочет Джон
Ячменное Зерно!


...

http://www.politika.su/lit/burns/jyachm.html
With best regards
Pavel Dvorkin
Re[22]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 24.06.13 10:13
Оценка: 20 (2)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Ikemefula, Вы писали:


I>>Покажи мне аналог в asio для вот для такого псевдокода

I>>
EP>private async void handler(object sender, TaskArgs args)
EP>{
EP>    string result = await new Task(() => Download(args.Url), args.Cancellation);
EP>    textBox.Text += result;
EP>}
EP>

I>>Итого — функция которая асинхронно скачивает файлик, показывает его и дает возможность отменить скачивание.

EP>C++1998:

EP>
EP>void handler(Object &sender, TaskArgs &args)
EP>{
EP>    background(bind(download, args.url), args.cancellation),
EP>    textBox.Text += _1;
EP>}
EP>

EP>

Я в своё время писал вот такую штуку:

void foo(... fd - parameters structure ... )
{


    boost::asio::ip::tcp::resolver::query q("222.111.222.111", "1080");
    boost::asio::ip::tcp::resolver::iterator it;
    boost::system::error_code ec = resolve_resume(*fd.io, q, it);


    boost::asio::ip::tcp::socket sock(*fd.io);
    ec = connect_resume(sock, it);

    size_t bytes_transfered;
    boost::asio::streambuf socks_request;

    /// ... build socks_request ...

    ec = write_resume(sock, socks_request, bytes_transfered);

    boost::asio::streambuf socks_response;
    ec = read_resume(sock, socks_response, boost::asio::transfer_at_least(1), bytes_transfered);


    boost::asio::streambuf request;

    /// ... build request ...

    ec = write_resume(sock, request, bytes_transfered);

    boost::asio::streambuf response;
    while (!ec)
    {
        ec = read_resume(sock, response, boost::asio::transfer_at_least(1), bytes_transfered);
    }

    co_exit();
}


Несетевая логика поскипана, остальной сетевой код коннектится к сокс-серверу и через него шлёт HTTP запрос на другой сервер.
Функции ***_resume выполняются асинхронно. То есть после их вызова корутина спит, а после получения результата возобновляется с того же места. Связь с остальными корутинами — через поля структуры fd. Прервать соединение тоже понятно как.
Функции ***_resume есть мною писанные обёртки над соответствующими функциями asio. Они все однотипные, покажу на примере connect_resume:

struct connect_handler_resume
{
private:
    coroutine_t owner_fiber;
    boost::system::error_code *ec;
public:
    connect_handler_resume(coroutine_t owner_fiber,
                            boost::system::error_code *ec)
                            : owner_fiber(owner_fiber), ec(ec)
    {

    }

    void operator()(const boost::system::error_code& ec);
};


// этот код вызовется по завершении операции
void connect_handler_resume::operator()(const boost::system::error_code& ec)
{
    *this->ec = ec;
    co_call(owner_fiber); // здесь возврат в корутину
}

boost::system::error_code connect_resume(boost::asio::ip::tcp::socket &sock,
                                        boost::asio::ip::tcp::resolver::iterator it)
{
    boost::system::error_code ec;

    connect_handler_resume handler(co_current(), &ec);
    sock.async_connect(*it, handler);

    /**----------*/
    co_resume(); //здесь уходим из корутины и сюда же нас вернёт вызов co_call(owner_fiber);
    /**----------*/

    return ec;
}


Заметьте, этот код писался летом-осенью 2011 года, когда в C# ещё не было await.
Главное гармония ...
Re[33]: Что посоветуете как аналог С++
От: artelk  
Дата: 05.07.13 15:57
Оценка: 12 (1) :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>То этот код будет работать с любыми потоками — что с синхронными, что с асинхронными, потому что код одинаковый для обоих случаев, так как можно yield спрятать внутри сокета.

EP>На await-те так не получится — в асинхронной версии будет await(+async в объявлении) + по всему call stack'у выше, вплоть до вызова handler'а, точно также будут добавляться await+await.

На всякий случай спрошу: а ты уверен, что понимаешь как работает async\await?

private static async Task<int> F1()
{
    return 42;//!!!
}

private static Task<int> F2()
{
    return Task.FromResult(13);
}

private static async Task<string> FF()
{
    Func<Task<int>> f = F1;//!!!
    var x = await f();//!!!
    var y = await F2();//!!!
    return (x + y).ToString();
}

private static void Main()
{
    var r = FF().Result;//вызываем без await

    Console.WriteLine(r);
    Console.WriteLine("Done...");
    Console.ReadKey();
}


"async" нужен для указания компилятору, что функцию нужно преобразовать в автомат и что в ее теле можно использовать await. Он не является частью сигнатуры и можно вызывать функцию как обычно и что-то делать с возвращаемым Task-ом.
На всякий случай: в примере выше вся работа ведется синхронно в том же потоке.

Вставим переключатель потоков:
private static async Task<int> F1()
{
    Console.WriteLine("F1_1: {0}", Thread.CurrentThread.ManagedThreadId);
    await Task.Yield();
    Console.WriteLine("F1_2: {0}", Thread.CurrentThread.ManagedThreadId);
    return 42;
}

private static Task<int> F2()
{
    Console.WriteLine("F2: {0}", Thread.CurrentThread.ManagedThreadId);
    return Task.FromResult(13);
}

private static async Task<string> FF()
{
    Func<Task<int>> f = F1;//!!!
    var x = await f();
    Console.WriteLine("FF_1: {0}", Thread.CurrentThread.ManagedThreadId);
    var y = await F2();//!!!
    Console.WriteLine("FF_2: {0}", Thread.CurrentThread.ManagedThreadId);

    return (x + y).ToString();
}

private static void Main()
{
    Console.WriteLine("Main: {0}", Thread.CurrentThread.ManagedThreadId);
    var r = FF().Result;//вызываем без await

    Console.WriteLine(r);
    Console.WriteLine("Done...");
    Console.ReadKey();
}

Вывод:

Main: 1
F1_1: 1
F1_2: 3
FF_1: 4
F2: 4
FF_2: 4
55
Done...

Re[23]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 01.07.13 05:05
Оценка: 6 (1) +1
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Mazay, Вы писали:


M>>В смысле "нужный интерфейс"? То есть код метода нарезается на несколько методов, которые потом дёргаются при наступлении соответствующих асинхронных событий? Так?

S>Примерно так. Метод превращается в state-machine, которую на более отсталых языках надо выписывать вручную.

Проблемы там начинаются при вложении этих async, а они обычно вложены друг в друга довольно глубоко. Каждый шаг внешнего автомата вызывает по цепочке кучу шагов внутренних "матрешек". Дешевле уже переключить фибер сразу в нужное место.
Re[20]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 20.06.13 22:18
Оценка: 5 (1) +1
Здравствуйте, Mazay, Вы писали:

I>>>>По моему это есть всяких сортов пляски. Хотя я не уверен, давно пора пляски с памятью и стеком сделать частью языка С++, как это было сделано со смартпоинтерами. Тогда уж точно нельзя будет придраться

FR>>>Как будто код с async который ты чуть выше привел не занимается за кулисами тем же самым.
I>>Очевидно — нет.
M>А что у него вместо "stack switching model"?

Boost.Coroutine это stackful coroutines.

C#-ый async/await это фактически stackless coroutine.
Компилятор автоматически генерирует класс-конечный автомат. Локальные переменные оригинальной функции переносятся в поля этого класса, а весь код в метод класса который в зависимости от текущего state прыгает по switch на нужный await.

В C++ stackless coroutine реализуется 100-ми строчками, например как в Boost.Asio. Локальные переменные(если таковые имеются) переместить в поля класса нужно вручную, а в остальном всё схоже по форме и содержанию — например конечный автомат (с таким же switch'ем внутри) генерируется автоматически.

Stackless coroutine менее мощные чем stackful — если бы это было не так, то как минимум никто бы не реализовывал Boost.Coroutine.
Одна из фишек stackful coroutine в том, что можно инкапсулировать всю асинхронную логику во внутрь компонентов — так, что клиентский код будет выглядеть как синхронный — без всяких keywords и дополнительных вызовов.
Например, в examples к Boost.Coroutine есть пример простого сервера, который асинхронно считывает сообщения из tcp порта и выводит их на экран — причём всё это происходит в одном потоке. Цикл считывания выглядит точно также как и обыкновенный синхронный код:
do
{
    getline(client_stream, msg);
    cout << msg << endl; 
} while(msg != "exit");

Вся асинхронная логика спрятана в клиентский поток: внутри, после async_read_some делается yield, а когда придут данные — сопроцедура будится соответствующим хэндлером.
На stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде, ибо такие сопроцедуры сразу возвращают управление в клиентский код — а это значит что либо данные ещё не получены, либо никакой асинхронности, так как только один поток.
Re[3]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.06.13 04:03
Оценка: 1 (1) +1
Здравствуйте, IT, Вы писали:

KP>>Т.е. да, приложения на JVM и .NET тормознутые, но не потому что JVM или .NET тормознутая, а потому, что основная масса разработчиков под эти платформы вообще не думает о том, что стоит память или на сколько дорого обходится то или иное решение. В итоге получается монстры-тормоза, а дело-то все в ручках...


IT>Т.е. ты умный, а JVM и .NET разработчики дураки?


Не совсем. Что на JVM, что на .NET типичный подход выглядит как-то так: "главное задача, памяти бесконечно много, не хватает мощности — поставим на кластер". Умный это подход или глупый, в общем случае, – мне судить сложно. С точки зрения системного C++ разработчика – подход глупый, но, бизнес, вроде как устраивает.
Ну и в целом, большинство JVM и .NET смутно представляют себе то, как работает их код на железе, что тоже не слабо сказывается на его качестве. Этот нюанс прослеживается что на форуме, что в личной беседе.
Re[14]: Что посоветуете как аналог С++
От: alex_public  
Дата: 18.06.13 18:03
Оценка: 1 (1) +1
Здравствуйте, Nuzhny, Вы писали:

N>Ага, ага. С++ настолько нишевый язык, что существует во всех нишах сразу.


Эту фразу надо записать.
Re[16]: Что посоветуете как аналог С++
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 20.06.13 11:34
Оценка: 1 (1) +1
Здравствуйте, MTD, Вы писали:

DM>>Кстати, да, сколько? Сколько новых популярных десктопных приложений появилось на плюсах за последние годы?


MTD>Много. Только из того, что у меня сейчас открыто: Google Chrome, Skype, Virtual Box, Qt Creator.


Google Chrome — обертка над WebKit, который тянется с прошлого века (Initial release November 4, 1998).
Skype вообще на Delphi написан.
Остальные два ок. Но на каждый Qt Creator найдется свой Eclipse (Java) и MonoDevelop (C#).
Re[45]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 02.07.13 12:30
Оценка: 1 (1) +1
Здравствуйте, Ikemefula, Вы писали:


I>Спасибо, капитан ! Я то думал, что короутины дотнета для которых прикручено N апи комбинаторов это кубики лего из которых можно собрать произвольную модель,


Увы, нельзя произвольную.

I>а на самом деле это апи комбинаторов, из которых можно собрать произвольную модель.


Только stackless, со всеми торчащими наружу кишками/модификаторами/ограничениями в сценариях и складыванием такого кода в глубокие "матрешки" дергающих друг друга конечных автоматов.


I>Мне нужен пример не любых короутин, а stackfull. E.P. сделал много заявлений, но кроме синхронного кода ничего и не показал. Если бы alex_public не прикрыл его с фланга, был бы провал.


Нет там никакого синхронного кода. Ты неоднократно прямо спросил кто и откуда вызывает короутины — тебе схематично показали, без лишней воды. А подробности — это подробности механики шедуллера. Например, в дотнете GUI-циклы крутятся обязательно так, чтобы обрабатывать события alertable IO. Впрочем, я на это уже обращал твоё внимание, когда ты пытался спекулировать на приведенном сниппете. Но, опять же, и это необязательно. Можно ведь построить модель с дополнительным потоком, где будет вся асинхронность, отвязанная от цикла GUI, в который передавать события банально чеез PostThreadMessage. Но и это не важно. Потому что это уже те подробности, которые ты на тот момент не спрашивал, а которые спрашивал — сделал вид, что не заметил. В общем, моделей диспетчеризации событий может быть куча. А у асинхронности должен быть только один признак — неблокируемость операций.


V>>А теперь ты пытаешься требовать подробную реализацию фреймворка, который будет работать, так же, как дотнете. Посмотри как это сделано в дотнете, делов-то. Там вовсе не 200к кода нужного кода, ес-но.


I>Разумеется, а то первый же пример stackfull замораживал UI


Если ввод-вывод неблокирующий, то он никак не замораживает UI. Именно так реализуют асинхронность без вообще каких-либо дополнительных потоков.


V>>В виндах существует минимум 3 модели асинхронности, каждая из которых имеет право на жизнь в своих сценариях. Для GUI-потока наиболее естественно — это completion routines. Для серверного приложения — completion ports. Каждая из моделей специфична, но (!!!) практически не влияет на прикладной код. И в этом прелесть.


I>Правильно и все три работают без короутин.


Не надо валить всё в кучу. ))
Это модели диспетчеризации событий/задач, отличающиеся используемым низлежащим АПИ ОС. А то, что некая задача является "короутиной", диспетчеру должно быть вообще до фени. Пусть выгребает из очереди некий абстрактный Task и запускает его. Короутина — это уже нечто более высокоуровневое, это трюк для выпрямления прикладного автоматного/событийного кода в якобы линейный.
Re: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 16.06.13 10:26
Оценка: +2
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Еще момент. На сколько тебе критично компилирование в нативный код? К чему я это. Я когда-то задавался таким-же вопросом, но пришел к выводу, что ограничение "нативностью" в большинстве случаев не целесообразно. В большинстве случаев, желание "нативности" вызвано ограничениями по памяти и/или по скорости работы. Тут сразу же вспоминается легенда о тормознутости не нативных приложений написанных на JVM, .NET, которая как бы и не легенда, но с ограничениями. Т.е. да, приложения на JVM и .NET тормознутые, но не потому что JVM или .NET тормознутая, а потому, что основная масса разработчиков под эти платформы вообще не думает о том, что стоит память или на сколько дорого обходится то или иное решение. В итоге получается монстры-тормоза, а дело-то все в ручках...
Поэтому, очень стоит поглядеть на языки программирования базирующиеся на JVM, такие как Scala, Closure и Kotlin. У этих языков есть отличное коммьюнити, им доступна куча JVM библиотек и у них однозначно есть будущее.
Вот как-то так...
Re[2]: Что посоветуете как аналог С++
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 16.06.13 16:13
Оценка: :))
Здравствуйте, kaa.python, Вы писали:

KP>Самое первое — C++11 и идущий следом C++14. На фоне C++03 это совсем новый язык.


Жизнь слишком коротка, чтобы учить С++.

KP>Rust — самый что ни на есть малоизвестный и экзотический язык. Правда, надеюсь, со светлым будущим, да и выглядит очень перспективно.


Слишком пока колбасит его, еще сто раз поменяется. Вон, делали-делали его со сборкой мусора, а надысь задумали от нее отказаться в языке. Будущее у него пока слишком отдаленное, пусть даже и светлое.

KP>D — вроде хороший, но не менее экзотический и уже, похоже что, без перспектив, в отличие от...


Он последнее время (~год) набирает обороты, после недавнего переезда на гитхаб прибавилось разработчиков/контрибюторов, баги правят пачками, а сам язык все стабильнее, все меньше в нем вредных изменений. Недавно вон конференция по нему прошла на базе Facebook'a, много интересного рассказали и вопросов порешали. (см. dconf.org) Есть пока некоторые больные места в его реализациях (вроде GC), но если на них сильно не наступать, то очень годный язык уже сегодня, а по сочетанию понятности-выразительности-скорости, пожалуй, круче всех.
Re: Что посоветуете как аналог С++
От: vsb Казахстан  
Дата: 17.06.13 10:23
Оценка: +1 :)
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Objective C
Re[5]: Что посоветуете как аналог С++
От: Grundik2 Земля  
Дата: 17.06.13 12:00
Оценка: :))
Здравствуйте, D. Mon, Вы писали:


DM>Уже появилось. Это Rust пока в состоянии "нерожденный" , а на D некоторые компании уже активно пишут. 100+ человек в компании, и весь код на D, на упомянутой конференции были представители.


Это хорошо. Это значит, что C++ стал слабее.
Re[2]: Что посоветуете как аналог С++
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 17.06.13 15:58
Оценка: +2
Здравствуйте, NeoCode, Вы писали:

NC>Три языка, которые стоило бы объединить в один, чтобы сделать убийцу С++: ObjectiveC, D, Go.

NC>И добавить к этому макросы из Nemerle.

А что такого вкусного есть в ObjectiveC и Go, чего нет в D?
Re[7]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 18.06.13 04:46
Оценка: +2
Здравствуйте, gandjustas, Вы писали:

G>На десктопе ситуация для C++ не лучше, так как ресурсов дофига, даже на планшетах, никто за лишние 30-50 мегабайт не будет беспокоиться и почти везде уже больше одного ядра.


И именно поэтому, управляему приложения уже лет как 10, вот уже завтра захавают весь десктоп, но сегодня их, почему-то, практически нет. И так все 10 лет. Но ты главное верь и ни в коем случае ничего не оптимизируй, а то не дай бог приложения быстро работать начнут
Re[10]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.06.13 09:34
Оценка: +1 :)
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, gandjustas, Вы писали:


N>>>Если десктопы — это ноутбуки, то память и процессор — это ресурс. Это было и раньше, а сейчас тем более, особенно в свете развития ультрабуков.

G>>Средний ноут, в том числе ультрабук, имеет 2-4 гб памяти, которые толком занять нечем. Какой смысл для пользователя от экономии 100мб?

N>Потому что программ стоит много: всякие мессенджеры, плейеры, утилиты от производителя, оптимизаторы и т.д. и т.п. С десятка программ снять по 100 Мб — получишь гигабайт. Всё ещё мало?

"Стоит" и "работает" — разные вещи, не находишь?


N>>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>>Память? А причем тут зарядка?

N>Меньше перекачивать через кеш (промахи тоже считаем), меньше скидывать в своп. Сейчас аппаратура становится очень умной, начинает подстраиваться под ситуацию: некоторые устройства вообще умеют отключать неиспользуемые модули (и вычислительные, и кеш), сбрасывают не только частоту процессорных элементов, но и памяти.

Какой своп? Для среднего ноута с 2-4 гб обычно и половина не забивается.
На планшетах вообще своп почти не используется, приложение просто грохается если для него памяти не осталось.

N>Поэтому потребление памяти не так явно явно, но всё таки сильно влияет на энергопотребление. Добро пожаловать в реальный мир.


G>>Если же говорить о потреблении процессора, то тут еще печальнее для C++, так как 95% времени работы приложения — ожидание внешнего события: действий пользователя, пакетов из сети, данных с диска. Организовать такую работу с минимальным потреблением ресурсов на C++ на порядок сложнее, чем на .NET. Язык слабоват. Даже на JS проще.


N>Примеры в студию!

Сходи на MSDN глянь как в WinRT делать асинхронные вызовы в C++, а потом сравни с .NET и JS.

G>>Остаются только приложения, которые много считают — игры и фотошоп.


N>Практика показывает, что на С++ пишется бОльшая часть практически всех приложений, а остальное отдаётся скриптам. Игры и Фотошоп — хорошие примеры.

Парктически всех это каких? Я же приводил статистику — из 30 метрошиных приложений 20-25 не нативные. Фотошопы и офисы — древние, поэтому на C++ их никто не перепишет и не зачем.
Игры — отдельная ниша, об этом и говорю. Язык C++ превратился из mainstream в нишевый.


G>>Оптимизируют-то конечно оптимизируют, но с целью меньшего энергопотребления и увеличения perceived performance, а не потребления памяти и процессорного времени. А вот для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто.


N>Практика показывает, что оптимизируют как раз память и процессор. Посмотри хотя бы логи изменений браузеров от версии к версии.

Браузеры — отдельный пример, это фактически ОС для JS\HTML. Требования сильно отличаются от приложений. А вот приложения на этих самы JS\HTML оптимизируют для perceived performance, что достигается другими средствами.
Re[12]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.06.13 20:33
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В числодробилках такие вещи это не основное, а так — минимально необходимые требования чтобы конкурентоспособным.

EP>В большинстве же приложений — это то, во что упирается производительность. А это не только скорость, но и энергоэффективность, и цена железа.

Большинство оно сильно разное. И если уж совсем про большинство говорить, то проблемы точно не с производительность.

EP>Как пример — эти аллокации вылезают по всему коду, при простейших абстракциях — просадка 16x на ровном месте.


Такой код в своём уме никто не пишет, кроме вчерашних плюсовиков, которые не знают как устроена память.

EP>Также аллокации ухудшают локальность, что является дополнительной проблемой.

EP>Чтобы бороться с ними, нужно от многого отказываться и работать против языка — этим редко кто занимается, ибо проще взять более подходящий инструмент.

С такими проблемами как ты показал, не надо бороться против языка, наоборот, его надо интенсивно использовать.

EP>

EP>Alexander Stepanov:
EP>For many years, I tried to achieve relative efficiency in more advanced languages (e.g., Ada and Scheme) but failed. My generic versions of even simple algorithms were not able to compete with built-in primitives. But in C++ I was finally able to not only accomplish relative efficiency but come very close to the more ambitious goal of absolute efficiency. To verify this, I spent countless hours looking at the assembly code generated by different compilers on different architectures.

EP>

Это ни о чем. Если производительность понимать исключительно как такты процессора, то еще можно чего то выдумывать. А если скажем сюда внести работу с диском, базой или сетью, все поворачивается ровно наоборот — С++ не в состоянии обеспечить перформанс, например потому что тяжело контролировать асинхронные операции. Всё, до свидания.

I>>Почему то самые критичные куски кода пишутся практически на С или подобным образом.


EP>Это распространённый миф


Это факты.

I>>Это все басни.


EP>Это реальный опыт крупного проекта


Это частный случай. Почему то плюсовики имеют обыкновение яростно отрицать опыт других проектов
Re[6]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.06.13 20:34
Оценка: +1 :)
Здравствуйте, Mna, Вы писали:

Mna>Что это за порочные техники такие?


Mna>Особенно интересно узнать что сотворит переименование метода? там, что, часть метода в #define написана?


Разумеется. Есть целая куча библиотек, которые используют такой подход.
Re[13]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 03:40
Оценка: +2
Здравствуйте, IT, Вы писали:

IT>С каких пор обёртки для указателей стали частью языка?


С тех самых, как их в стандарте описали.
Re[17]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 20.06.13 03:48
Оценка: +2
Здравствуйте, IT, Вы писали:

IT>>>Это хорошо. А второй, который shared?

M>>shared медленнее голых указателей при копировании, ибо счётчик ссылок по указателю плюс сам указатель на счётчик ссылок. Но необходимое число копирований обычное не велико.

IT>Это не тот ли самый случай из-за чего старый VB тормозил на операциях с памяться раз так в 200?


Я на VB почти не писал. Может в VB просто других указателей не было? В теории shared_ptr должен использоваться только тогда, когда у объекта больше одного владельца. Надо сильно постараться, чтобы копирований таких указателе было много, и это сколь-нибудь значимо влияло на производительность.

Я лично, каюсь, частенько использую shared_ptr там где они не нужны. При быстром написании кода, когда нужно по-быстрому сваять прототип, проверить идею, shared_ptr позволяет не задумываться о владении объектом больше чем на полсекунды: есть сомнения — используем shared_ptr. Иногда это приводит к утечкам памяти на циклических ссылках, но для прототипа это не критично. Если прототип работает — начинаю убирать shared_ptr, приводить архитектуру в порядок и т.д. Так чему это я? А к тому, что у меня ни разу не было существенного прироста производительности при замене shared_ptr на ссылки или unique_ptr. Можно, конечно, сваять пример, где это будет существенно, но это надо постараться.
Главное гармония ...
Re[20]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 05:02
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Опаньки, что же выходит, сурьёзные сиплюсники оказывается не умеют указатели использовать ?


EP>Неправильно, нормальные C++ программисты умеют их не использовать.


Шота из кода это никак не следует

I>>Помнится это именно ты год назад доказывал мне, что все ровно наоборот — сиплюсники чуть не поголовно используют указатели самым правильным образом.


EP>Ты что-то путаешь — таких заявлений я не делал.


Может и не ты, но тем не менее эта тема поднимается в КСВ достаточно регулярно и со слов сиплюсников все шоколадно — и с указателями, и с исключениями и тд и тд. А на деле как то все тухловато.
Re[16]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 10:17
Оценка: -1 :)
Здравствуйте, jazzer, Вы писали:

I>>>>В общем случае надо организовать корректную схему многопоточного взаимодействия, асинхронщину всякую. Вот это на с++ крайне сложно.

MTD>>>Не сложней, чем на Java, например.
G>>Неправда твоя. Покажи как сделать продолжения и при этом не устраивать аццкие пляски с деаллокацией памяти.

J>1. Передавать объекты по значению — вопроса деаллокации вообще не возникнет.

J>2. Передавать shared_ptr — все сдохнет автоматизированно.

J>хз что из этого ты называешь "аццкими плясками"


Хорош гнать пургу. Открой короутины буста

Boost.Coroutine is implemented around a stack switching model; that is, every time a coroutine is entered, the following actions are carried:

The caller instruction pointer and callee clobbered registers are saved on the caller stack (this is done automatically as part of the call to the context switching routine respectively by the compiler and by the CPU).
the set of callee save registers are saved by the context switching routine on the caller stack.
The caller stack pointer is saved inside the caller context structure. This structure is stored on the coroutine context if a yield_to or yield is being performed, else it is also on the caller stack.
The callee stack pointer is retrieved from the callee context structure and set as current stack pointer.
Callee save registers are popped from the callee stack.
The context switching routine returns, restoring automatically from the new stack the called coroutine instruction pointer and clobbered registers.


Про другому асинхронщину, многопоточность и тд в с++ не сделать.
Re[19]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 12:08
Оценка: +2
Здравствуйте, gandjustas, Вы писали:

J>>Чем тебя не устроил мой пример с продолжениями?


G>Так он не асинхронный, в чем смысл тогда? Основная суть продолжений что они позволяют не ожидать завершения IO в потоке. Или, напрмиер, ожидать действий пользователя. И очень важно уметь комбинировать продолжения, в том числе асинхронные, с передачей данных между ними.


G>А что ты показал? Передача указателя на функцию?

Да, это и есть продолжение, вообще-то. Его можно использовать в том числе и для IO, но оно этим не ограничивается, естественно.
Но если тебе нужно именно IO:
void cont( const error_code& error, std::size_t bytes_transferred );

boost::asio::async_read(async_stream, boost::asio::buffer(data, size), cont);

cont асинхронно позовется, когда асинхронно же считается все, что нужно.
Это заодно и ответ для Ikemefula про его качалку файлов.

G>Даже без замыканий.

Детский сад. Замыкания — это либо Boost.Bind для C++03, либо встроенные лямбды для C++11. Так что, я надеюсь, ты больше замыкания не будешь упоминать в приличном обществе.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[14]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 14:34
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Я имел ввиду performance "активной" работы процессора. Плохая работа с памятью -> процессор будет дольше находится в "активном" режиме.

G>>Угу, то есть ты имеешь ввиду 1% времени работы программы. Ты же понимаешь что изменение даже в несколько раз на этом 1% никто не заметить.

EP>Если активный режим процессора это один из главных потребителей зарядки, то уменьшение такого времени — будет уменьшать потребление


Правильно и это делается за счет написания корректного кода. Внимание — корректного. Теперь фокус — вкладываешь диск в лоток, закрываешь и пока он не открылся, проверяешь отзывчивость UI. Вопрос — куда делась корректность ? И это типично для C++.

EP>>>Речь шла об одинаковых алгоритмах и структурах в разных языках.

EP>>>Сравнивать производительность сред/языков по разным алгоритмам и структурам как-то совсем неправильно.

G>>Вот я и говорю бросай книжки читать. Подавляющее большинство десктопных приложений не требует ресурсоемких алгоритмов.


Наоборот, они ресурсоемкие, только это больше не ограничивается тактами процессора.

G>>Например ты делаешь приложение, которое делает graph layout — довольно сложные алгоритмы. Как ты думаешь что больше приглянется пользователям: молчаливый расчет всего за 10 сек потом отображение результата, или рисование узлов графа по мере вычисления позиций в течение 15 секунд?

G>>100% пользователей предпочтут второе, хотя реально оно в 1,5 раз медленнее.

EP>Пользователи предпочтут рисование по мере вычисления за пол-секунды


Если ты на алгоритмах для графа добьешься такой разницы, навроде 15 сек на дотнете и полсекунды на С++, смело требуй нобелевку.

EP>Структуры в C# далеко не дефолт, и имеют ограничения.

EP>Суть в том, что tight memory layout существенно влияет на производительность, пример с массивом структур это лишь одна часть проблемы, а ведь есть ещё композиция объектов, объекты на стеке.

Для каких приложений это критично ?
Re[16]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 16:16
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это ты все эти CD-ejector'ы разрабатывал? С отзывчивым UI и корректностью, ага


Это все писалось на С и С++, потому что люди просто не могут нормально реализовать асинхронщину.

EP>А теперь внимание, фокус: вставляешь 5.25 в дисковод, закрываешь, издаётся характерное жужжание, и вдруг КЛАЦ! Казалось бы, при чём здесь Лужков? И это всё типично для C#


Когда были такие дисководы, шансов на асинхронщину было еще меньше.

EP>>>Структуры в C# далеко не дефолт, и имеют ограничения.

EP>>>Суть в том, что tight memory layout существенно влияет на производительность, пример с массивом структур это лишь одна часть проблемы, а ведь есть ещё композиция объектов, объекты на стеке.
I>>Для каких приложений это критично ?

EP>Критично там где нужна производительность


Назови такие приложения.
Re[16]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 21.06.13 03:48
Оценка: +1 :)
Здравствуйте, FR, Вы писали:

FR>auto_ptr теперь отправили на пенсию, а чтоб было не скучно, добавили пару новых шибко умных указателей


А их отправят в следующем стандарте?

FR>Ага есть такое, если кратко, не любят это:


FR>
FR>auto f = [](){};
FR>


FR>Так и шарпщики же далеко не все одобряют var и linq.


Не любят в основном те, кто в этом не смог разобраться. За это и не любят.
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[20]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 21.06.13 17:42
Оценка: +2
Здравствуйте, Олег К., Вы писали:

ОК>Вот нафига вар в таком коде?


Так я не понял что в этом плохого? То, что тебе это может не нравится — это вопрос не более чем твоих предпочтений. А что в этом объективно плохого?
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: Что посоветуете как аналог С++
От: michae1  
Дата: 21.06.13 19:13
Оценка: +2
Здравствуйте, Олег К., Вы писали:

ОК>Я не отрицаю что развиваться всегда надо. У меня посыл в другом. Большинство программистов программируют ради программирования как такового а не для решения бизнес задач и я не считаю правильным когда программисты тащат в проект понравившиеся им технологии или фишки языка только для того чтобы их попробовать и/или поставить их на резюме.


ОК>Многие С++ программисты считают что пока они не прочтут всего Страуструпа, Саттера, Мейерса, Александреску, стандарт и что там еще — они не могут называть себя С++ программистами. Этого не нужно на самом деле и эти товарищи просто immature (о чем говорит тот же базис1) или то что нужно "вырастать из этой влюбленности в С++" и переходить на другой уровень, другие языки которые позволяют сконцентрироваться на насущих задачах а не бороться с самим языком, тратя годы на прочтение этой макулатуры (и ИТ и я говорим об этом). Ну и плюс заучить стандарт несложно, хотя затратно по времени. Гораздо сложнее создать работающий проект (да еще так, чтобы его потом покупали).


Ты смешиваешь интересы бизнеса, о которых мы вобщем-то сейчас не спорим, с вопросом, что должен знать и уметь квалифицированый разработчик. Я смотрю на проблему с точки зрения программиста — рабочей лошадки, в обязанности которого входит проектирование пусть и небольших, но независимых кусков проекта. Я убежден, что грамотное решение проблемы требует от человека хороших знаний инчтрумента, в нашем случае языка и стандартной библиотеки. Те нововведения, которые предлагает новый стандарт, исключают создание многих ненужных велосипедов, а значит экономит время и дает более надежное решение. Если человек не в курсе, он начнет "изобретать колесо". Нужно это? Конечно, нет.

ОК>Сколько им лет? Может быть люди просто выросли и пришло понимание что не все нужно для разработки? А кому-то это понимание может никогда и не прийти, что плохо конечно же. Я, вот, честно сказал что буду знакомиться с новым стандартом только по одной причине: потому что никак непозврослевшие "сеньйоры" будут спрашивать последние фишки на интервью.


Как я написал, выше, эти знания важны если человек позиционирует себя как квалифицированного разработчика, иначе как он может принимать правильные решения.
Re[22]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 20:10
Оценка: -2
ОК>>В С++ 98-го более чем достаточно фич чтобы писать нормальный код. Лично я еще С++11 даже и не открывал но скоро открою и лишь только по одной причине; на интервью может попасться какой-нибудь очередной идиот который знает все новомодные фишки и считает что раз он пихает их все куда ни попадя, так и все остальные должны их также пихать. Вообще перечитай еще раз мой ответ выше, может дойдет.

M>Ну вот ты бы почитал сначала хотя бы обзор нового стандарта, а потом брызгал слюной


Где я брызгаю? Мой экспириенс говорит в С++ 98 было бы лучше заменить std::auto_ptr<> и регулярных выражений еще не хватало. Больше ничего на ум не приходит, по крайней мере сейчас.

M>В языке появились новые концепции и сущности, которые радикально меняют подход к программированию, стандартная библиотека серьезно подросла — теперь не надо чуть что лезть в буст, куча "синтаксического сахара", который делает код читабельней и компактней.


Какие новшества! Если раньше надо было написать пять строчек кода, то сейчас три!

M>Ну, а на счет "идиотов на собеседовании", тебе не приходила мысль, что в проекте может активно использоваться возможности с++11 и команде не нужен "идиот", которому лень учиться, зато нравиться всех поучать?


А тебе не приходит в голову что все эти фичи могут быть и ненужны? То о чем я уже который раз и говорю. В общем подрастешь — поймешь.

M>З.Ы. на msdn chanel9 есть немало видео обзоров: GoingNative2012 и блог STL посмотри что ли, это интересно.


Благодарю покорно. Я лучше схожу на стартаперские тусовки а вас, любителей всех паттернов, новшеств и Александреску, надо заставлять поддерживать код написанный другими такими же любителями. Чтоб неповадно было! А то кругом одни профессионалы но все почему-то кричат "говнокод-говнокод!"
Re[22]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.06.13 06:51
Оценка: -1 :)
Здравствуйте, alex_public, Вы писали:


_>Вообще не вижу в этом коде никаких завязок на язык. Такое можно сделать наверное в любом, с буквально таким же синтаксисом. Если говорить про C++, то для многопоточного варианта подобное вставили уже вообще в сам стандарт языка (async/future), если же хотим в одном потоке, то берём одну из множества библиотек реализующих сопроцедуры. Хотя слово "библиотека" тут даже слишком громкое — сопроцедуры можно реализовать в несколько сотен строк на большинстве языков программирования.


Ты не рассуждай, а покажи код. Ну что за беда с сиплюсниками, чуть что, сразу в кусты. Ни кода, ни денег.
Re[16]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 22.06.13 23:53
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, gandjustas, Вы писали:


G>>>>А если требует то важна не сама скорость работы, а perceived performance.

EP>>>Если вычисление идёт 30 минут, вместо возможных десяти секунд, то ты хоть как украшай progress bar рюшечками — это не поможет.
G>>30 минут надо считать на сервере, клиент может столько и не прожить.

EP>Что за плоское представление о мире? Кто говорил что в этом случае вообще есть сервера?


Здравый смысл. Десктопное приложение, считающее что-то 30 минут, без возможности остановить и продолжить "потом", в реальном мире (у не программистов) существовать не будет.
Ускорить его в 600 раз переписыванием даже на ассемблере в реальном мире тоже не выйдет.

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

Но самый реальный вариант, это наличие сервера для вычислений на 30 минут. Причем такого, который можно масштабировать. Чтобы считалось 10 минут вместо 30 и могло такие расчеты делать 100 человек, а не один.

Но в этом случае надежность и масштабируемость гораздо важнее скорости.

G>>>>Например ты делаешь приложение, которое делает graph layout — довольно сложные алгоритмы. Как ты думаешь что больше приглянется пользователям: молчаливый расчет всего за 10 сек потом отображение результата, или рисование узлов графа по мере вычисления позиций в течение 15 секунд?

G>>>>100% пользователей предпочтут второе, хотя реально оно в 1,5 раз медленнее.
EP>>>Пользователи предпочтут рисование по мере вычисления за пол-секунды
G>>Увы, 10 сек это максимум что можно выжать, даже при экстремальной оптимизации.
EP>Это разговор о конях в вакууме. Я так полагаю ты что-то там пытался оптимизировать, и где-то получилось 10 сек — и из этого ты делаешь вывод что это максимум?
Я уже приводил пример про VC и C++Builder. Быстрее было там где циферки бежали, а не там где быстрее по секундомеру.
Быстродействие с точки зрения пользователя совсем не то, о чем думают программисты C++.


EP>>>Ты вроде как толком не ответил, что не так с продолжениями в C++

G>>то что их просто нет, а если сделать, то бестолку. Ибо комбинировать продолжения с передачей данных будет сложно, придется париться с освобождением памяти. Да и тупо может продолжение не прийти.
EP>Почему сложно? Почему парится с освобождением памяти? Куда продолжение может не прийти?
Давай так: http://rsdn.ru/forum/philosophy/5208679?tree=tree
Автор: gandjustas
Дата: 23.06.13

тут пример кода, повтори его на C++, даже считая что есть годная библиотека для асинхронных HTTP вызовов и кто-нибудь смаршалит вызов в UI.

G>>Еще раз: продолжения+детерминированная финализация. Вместе, а не по-отдельности. В общем случае нельзя придумать способ гарантированной очистки памяти. Продолжение может просто не вызваться и будет держать ссылку на замыкание.

EP>Давай конкретный пример.

class A
{
    int x;
}
Func<int> GetFunc()
{
    var closure = new A { x = 0 };
    return () => closure.x++;
}

Перепиши его на C++, не изменяя семантики.
1) Чтобы closure не был виден вне GetFunc
2) Чтобы closure был освобожден когда станет недостижимым.

G>>>>Самое важное тут: как ты будешь получать этот массив и как обрабатывать. Если у тебя обработка ограниченного количества элементов за раз, то может вообще нет смысла держать в памяти все 32М, а читать с диска, на лету обрабатывать и выводить.

EP>>>Нет, каждый элемент нужно обрабатывать много раз. Причём такие элементы будут хранится не только в массиве — это общий пример на простой абстракции в виде группировки элементов
G>>Ниче не понял, приведи пример.
EP>Есть группа логически связанных данных Element. Приложению нужны массивы/деки/мэпы Element'ов.
Пользователю не нужны они все. Что пользователю нужно?

G>>>>А зачем? Цель не оптимизация сама по себе, цель — чтобы программа работала достаточно быстро.

EP>>>А я и не говорил что оптимизация это самоцель — действительно, если тебе нужно обрабатывать 90 байтиков в секунду, то можешь хоть visual basic взять
G>>Среднее десктопное приложение обрабатывает и того меньше.
G>>Ты сам доказываешь что C++ не нужен и это совсем не мейнстрим.
EP>Где я это доказывал?
Да почти везде

EP>Там где нужна производительность — у C++ пока практически нет конкурентов, там где не нужна — можно использовать либо C++, либо что-то другое — зависит от конкретной задачи

Неуловимого джо тоже поймать никто не может, потому что нафиг никому не нужно.

А там где C++ сидит плотно, то скорее всего по историческим причинам.
Re[18]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.06.13 05:22
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, gandjustas, Вы писали:


G>>>>>>А если требует то важна не сама скорость работы, а perceived performance.

EP>>>>>Если вычисление идёт 30 минут, вместо возможных десяти секунд, то ты хоть как украшай progress bar рюшечками — это не поможет.
G>>>>30 минут надо считать на сервере, клиент может столько и не прожить.
EP>>>Что за плоское представление о мире? Кто говорил что в этом случае вообще есть сервера?
G>>Здравый смысл. Десктопное приложение, считающее что-то 30 минут, без возможности остановить и продолжить "потом", в реальном мире (у не программистов) существовать не будет.

EP>Есть десктопные приложения, которые не то что часами, а то и целыми днями, и даже неделями "что-то вычисляют".

Давай, назови штук 5 таких.

EP>Да и кто сказал, что нет возможности остановить и продолжить потом?

Потому что время работы такого приложения начинает зависеть от скорости диска Это делает неверным большинство твоих рассуждений.


G>>Ускорить его в 600 раз переписыванием даже на ассемблере в реальном мире тоже не выйдет.

EP>Откуда 600?
Разница между 30 минутами и 5 секундами.

G>>Быстродействие с точки зрения пользователя совсем не то, о чем думают программисты C++.

EP>Давай, расскажи нам
Чувак, уже рассказывал, ты читал?

G>>>>Еще раз: продолжения+детерминированная финализация. Вместе, а не по-отдельности. В общем случае нельзя придумать способ гарантированной очистки памяти. Продолжение может просто не вызваться и будет держать ссылку на замыкание.

EP>>>Давай конкретный пример.
G>>
G>>class A
G>>{
G>>    int x;
G>>}
G>>Func<int> GetFunc()
G>>{
G>>    var closure = new A { x = 0 };
G>>    return () => closure.x++;
G>>}
G>>

G>>Перепиши его на C++, не изменяя семантики.
G>>1) Чтобы closure не был виден вне GetFunc
G>>2) Чтобы closure был освобожден когда станет недостижимым.

EP>Слушай, ну сказал бы что совсем не знаешь C++ — мы бы тут флейм не разводили:

EP>
EP>#include <functional>
EP>using namespace std;

EP>struct A
EP>{
EP>    int x;
EP>};

EP>function<int()> GetFunc()
EP>{
EP>    A c = {0};
EP>    return [=]() mutable { return c.x++; };
EP>}

EP>int main()
EP>{
EP>    auto x = GetFunc();
EP>    return x()+x()+x()-3;
EP>}
EP>

Семантика не сохранена, A не в куче.
Я думал ты хоть до этого сам догадаешься.

G>>>>>>Самое важное тут: как ты будешь получать этот массив и как обрабатывать. Если у тебя обработка ограниченного количества элементов за раз, то может вообще нет смысла держать в памяти все 32М, а читать с диска, на лету обрабатывать и выводить.

EP>>>>>Нет, каждый элемент нужно обрабатывать много раз. Причём такие элементы будут хранится не только в массиве — это общий пример на простой абстракции в виде группировки элементов
G>>>>Ниче не понял, приведи пример.
EP>>>Есть группа логически связанных данных Element. Приложению нужны массивы/деки/мэпы Element'ов.
G>>Пользователю не нужны они все. Что пользователю нужно?

EP>Я правильно понимаю, что группировка данных в виде простой структуры, которая существует с незапамятных времён — это что-то за гранью понимания без полного проектного ТЗ?

В ТЗ такого не бывает, в принципе. Расскажи что на выходе получить надо.



EP>>>Там где нужна производительность — у C++ пока практически нет конкурентов, там где не нужна — можно использовать либо C++, либо что-то другое — зависит от конкретной задачи

G>>Неуловимого джо тоже поймать никто не может, потому что нафиг никому не нужно.
G>>А там где C++ сидит плотно, то скорее всего по историческим причинам.
EP>This is so ridiculous.
Ты случайно выделил два фрагмента и стала мыль правильнее? Сейчас есть тонны кода на C++, которые никто и никогда на другие языки не перепишет. Как на коболе в свое время.
Более того, говорят и сейчас на коболе работает больше всего кода.
Re[24]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 09:50
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Это задача — извне приходит массив элементов и индексы. Если бы извне приходили уже готовые координаты векторов, без индексов, то это была бы другая задача.

EP>Точно также как если бы для FFT входная функция задавалась таблично, либо как callback — код не был бы идентичным.
EP>Хватит разводить демагогию — talk is cheap show me the code.

Ля-ля-ля. Сначала выдай задачу так как это сделал я. Массивы, индексы, элементы- это ты решение конкретное предлагаешь. Не можешь — ничего не пиши в ответ.

EP>ага, как попало:

EP>
EP>

EP>А что это такое белое и пушистое прилетело в виде System.ObjectDisposedException?

Ты не видишь разницы между замыканием и внешним ресурсом ?

EP>И как то что где-то когда-то использовалось C, подтверждает твой тезис "быстрый код на С++ это точно так же работа против языка"?


Да все очевидно — хочешь быстродействия, надо реализовывать приседания с со стеком, вызывать низкоуровневые функции, писаные на ассемблере, и вообще писать код который не использует вообще ничего из С++.
Ты в курсе, что С это не С++ ?

EP>Есть аутсорсная контора, в ней два независимых проекта один на foo другой на bar — какой код считать типичным? foobar? Нет, так ведь foo в 2 раза больше — значит foofoobar?


Я уже и ответ сам сказал, а до тебя не доходит и ты просишь что бы я еще раз подсказал тебе Еще раз и внятно — типичный == мода(статистика, а не одежда). Где работает бОльше людей — это и есть типичный код.
Если ты 16 часов работаешь, а 8 часов спишь, то типичное времяпровождение это работа. А если наоборот — то сон. Все предельно понятно.
Потому не надо удивляться, что большинство работает с некачественным кодом. Это вообще везде так. Только в С++ разница гораздо больше чем в других языках.
Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 14:22
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Сумма векторов такая же задача как и FFT


FFT вполне конкретная. А свои массивы ты просто подогнал под желаемый результат.

EP>Сферического "интенсивного заиспользования" java'ы за десяток сообщений ты так не показал — всё, уже не интересно.


Джавый я как то не мог обещать показать, ибо на ней сроду не писал.

I>>Ты не видишь разницы между замыканием и внешним ресурсом ?


EP>

I>>>>Отсюда ясно, что __обязательность__ какого то выбора это совсем не то же самое, что и свобода выбора. Вот если бы можно было передавать лямбды как попало, а вот тюнить надо было только для перформанса-расхода памяти, тогда другое дело.

EP>

Представь себе, лямбда и файловый ресурс это не одно и то же. Если ты файловый ресурс поместил в лямбду, он не станет от этого лямбдой. Вроде очевидно, но не для сиплюсника


I>>Да все очевидно — хочешь быстродействия, надо реализовывать приседания с со стеком, вызывать низкоуровневые функции, писаные на ассемблере,


EP>Как раз таки C++ позволяет сделать легковесные и удобные абстракции над машиной, даже на самых низких уровнях, поднимаясь потом всё выше и выше, например


Я уже понял, что по твоему удобство — всё контролировать руками.


EP>А где я этому удивлялся? Твоя позиция какая:


EP>2. На C++ писать быстрый код нельзя вообще, нужно отказываться от всех возможностей и оставлять C.


Не хочется учить тебя читать, но моя позиция такая — на С++ типичный случй быстрого кода это сишный стиль или "кодирование против языка". За примерами в Сфинкс и короутины буста.
Re[27]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 23.06.13 16:53
Оценка: +2
Здравствуйте, Ikemefula, Вы писали:

I>>>Вот когда такой код появится в прошивке, драйвере файловой системы или движде базы данных или веб сервере, вот тогда и можно будет производительность сравнивать.

C>>А он там есть. Большое managed-приложение съест кучу памяти, оставив меньше места под кэш.
I>Гипотетический случай. Утечки и ошибки с указателями в С++ дают куда больше реальных проблем.
На практике (которая есть критерий истины) утечки не являются серьёзной проблемой для С++ и легко обнаруживаются (valgrind со товарищи).
Sapienti sat!
Re[29]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 23.06.13 17:39
Оценка: +1 :)
Здравствуйте, Ikemefula, Вы писали:

C>>>>А он там есть. Большое managed-приложение съест кучу памяти, оставив меньше места под кэш.

I>>>Гипотетический случай. Утечки и ошибки с указателями в С++ дают куда больше реальных проблем.
C>>На практике (которая есть критерий истины) утечки не являются серьёзной проблемой для С++ и легко обнаруживаются (valgrind со товарищи).
I>Надо полагать косяки и утечки оставляют специально для меня.
Ну не знаю, если пишешь код на С++ сам — то смотреть радиус кривизны своих рук. Если пишет команда, то применять ипатьевский метод.
Sapienti sat!
Re[30]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 13:19
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>А где я говорил, что это чем-то лучше, круче? Ты спрашивал про аналог


Договорились — ничем не лучше Не ясно, с чем же ты раньше спорил
Re[26]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 25.06.13 15:41
Оценка: +2
Здравствуйте, Олег К., Вы писали:

IT>>Вообще-то я ещё никак не выразил своё отношение к var. Я лишь спросил у тебя что плохого в var, но внятного ответа пока так и не услышал.

ОК>Ну начинаются эти виляния! Хорошо, поделись своим отношением к вар явно.

Зачем? Я не пытаюсь никого не убедить, не разубедить, что var это хорошо или плохо. Этим тут ты у нас занимаешься. Вот и объясни, почему ты так считаешь. Пока же ты плавно скатываешь в демагогию.

IT>>Да пофиг что там было. Там был счётчик цикла, остальное не важно, в том числе и тип этого счётчика.

ОК>Все важно. Если тип слишком маленький, то может возникнуть переполнение, к примеру.

Если тип слишком маленький, то ты получишь предупреждение от компилятора или решарпера.

IT>>Зачем тебе видеть её тип? Вот знаешь ты теперь, что тип этой переменной int и что это тебе даёт? Только объективно, а не "мне хочется знать".


ОК>Нету такой вещи как "variable in isolation." Ты работаешь с переменной, тебе нужно знать какие значения она может принимать, ты можешь ее послать в метод или вернуть из метода (а в объявлении метода тебе нужно будет все-таки указать типы!), тебе нужно знать какие методы на ней можно вызвать и наконец ты можешь написать так:


Зачем мне это всё знать?

ОК>
ОК>var myVariable = 10;

ОК>if (myVariable is long)
ОК>    DoSomething();
ОК>


ОК>То есть (ошибочно) будешь думать что компилятор выведет один тип а на деле выведет другой.


Здесь ты получишь предупреждение.

IT>>Это самый натуральный мусор. Для понимания сути алгоритма типы не важны. Важны возможные действия на данными, например, возможность инкрементирования и использования в качестве индекса в примере с for. Это хорошо подтверждается функциональнами языками, которые по своей выразительности кода внутри метода далеко опережают традиционные языки, в том числе за счёт развитой системы вывода типов.


ОК>Что бы ты не говорил, человек все равно мысленно работает как компилятор.


Это заблуждение.

ОК>Глядя на код, человек держит в уме типы переменных т.к. типы и определяют алгоритм. Что происходит здесь? Медленный линейный поиск по массиву или быстрый look-up в HashSet-e?


И зачем мне здесь типы? Большинство подобных алгоритмов вообще generics.

IT>>тип параметра x и тип возвращаемого значения выводятся автоматически.

ОК>Я не уверен что ты понял меня. Ты вырезал часть диалога. Речь шла об ограничениях контекстно-ключевого слова вар.

Если ты имел ввиду что-то другое, то либо ты невнятно сформулировал, либо у тебя каша в голове

ОК>Ну вывод типов и вывод типов! Что, только потому что "вар это вывод типов" его следует пихать направо и налево? Несколько странный аргумент. Ты еще начни закатывать глаза и простирать руки к небу: "о, вывод типов!"


Похоже ты скатываешься не только в демагогия, но и в хамство. Не советую.

ОК>Напомню что речь шла о том что если можешь объявить тип явно, объяви его.


Так докажи правильность своего утверждения с помощью логики, а не с помощью демагогии и хамства. Пока же ты пытаешь выдать за логику свои предпочтения.

IT>>Пока я не видел ни одного объяснения.

ОК>Отказался увидеть.

Пока кроме предпочтений ничего не увидел. Если я тебя попрощу вот прямо сейчас повторить свои аргументы, ты в соостоянии это будешь сделать?

IT>>Кури вывод типов как концепцию. А ещё лучше возьми, например, Немерле и поработай на нём хотя бы пару месяцев. Такие вопросы по for как ты задаёшь отпадут сами собой.

ОК>Не считай других глупее себя! Ты вбил себе в голову две вещи.

Всё же ты явно нарываешься. Завязывай с хамством. Тем более, что это не делает тебя умнее.

ОК>Первая. Вывод типов это круто и поэтому надо везде его использовать.


Где я это утверждал?

ОК>Вторая. Ты решил что я не знаю что такое вывод типов и что такое вар в Шарпе и соответственно приплел в разговор хотя речь была совсем не о выводе типов а о том где и как использовать контекстно-ключевое слово вар. То что это вывод типов к изначальному "вопросу" никакого отношения не имеет.


var к выводу типов имеет самое непосредственное отношение. Жаль, что ты этого не понимаешь.

ОК>И да, кроме этого твоего вывода типов, я так и не услышал чем же хороши вар в контексте объявления того же счетчика (вместо явного написания инта).


Вообще-то это ты нам собирался рассказать, что плохого в var. Объективно и чётко, без предпочтений, демагогии и хамства.

ОК>Вопросов по поводу вара у меня нет. Перефразируя тот "вопрос," я скажу что вар в тех двух объявлениях нифига не нужны.


Ещё раз повторяю — это твои личные предпочтения. Логики в этом твоём утверждении ровно ноль.
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[27]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 25.06.13 16:34
Оценка: -2
IT>>>Вообще-то я ещё никак не выразил своё отношение к var. Я лишь спросил у тебя что плохого в var, но внятного ответа пока так и не услышал.
ОК>>Ну начинаются эти виляния! Хорошо, поделись своим отношением к вар явно.

IT>Зачем? Я не пытаюсь никого не убедить, не разубедить, что var это хорошо или плохо. Этим тут ты у нас занимаешься. Вот и объясни, почему ты так считаешь. Пока же ты плавно скатываешь в демагогию.


Ты обвиняешь меня в демагогии! Однако сам разводишь тут воду. Почему ты не можешь ответить на конкретно поставленный вопрос? И чего же ты тогда ввязался в эту дискуссию?

IT>>>Да пофиг что там было. Там был счётчик цикла, остальное не важно, в том числе и тип этого счётчика.

ОК>>Все важно. Если тип слишком маленький, то может возникнуть переполнение, к примеру.

IT>Если тип слишком маленький, то ты получишь предупреждение от компилятора или решарпера.


Возможно.

IT>>>Зачем тебе видеть её тип? Вот знаешь ты теперь, что тип этой переменной int и что это тебе даёт? Только объективно, а не "мне хочется знать".


ОК>>Нету такой вещи как "variable in isolation." Ты работаешь с переменной, тебе нужно знать какие значения она может принимать, ты можешь ее послать в метод или вернуть из метода (а в объявлении метода тебе нужно будет все-таки указать типы!), тебе нужно знать какие методы на ней можно вызвать и наконец ты можешь написать так:


IT>Зачем мне это всё знать?


Пойду твоим путем. Зачем тебе это не знать?

ОК>>
ОК>>var myVariable = 10;

ОК>>if (myVariable is long)
ОК>>    DoSomething();
ОК>>


ОК>>То есть (ошибочно) будешь думать что компилятор выведет один тип а на деле выведет другой.


IT>Здесь ты получишь предупреждение.


Возможно но ты смотри в контексте большей задачи.

IT>>>Это самый натуральный мусор. Для понимания сути алгоритма типы не важны. Важны возможные действия на данными, например, возможность инкрементирования и использования в качестве индекса в примере с for. Это хорошо подтверждается функциональнами языками, которые по своей выразительности кода внутри метода далеко опережают традиционные языки, в том числе за счёт развитой системы вывода типов.


ОК>>Что бы ты не говорил, человек все равно мысленно работает как компилятор.


IT>Это заблуждение.


С твоей стороны?

ОК>>Глядя на код, человек держит в уме типы переменных т.к. типы и определяют алгоритм. Что происходит здесь? Медленный линейный поиск по массиву или быстрый look-up в HashSet-e?


IT>И зачем мне здесь типы? Большинство подобных алгоритмов вообще generics.


Дженерик это когда ты можешь поменять тип в контейнере но не когда ты меняешь сами контейнеры. Конечно, ты можешь это скрыть за каким-нибудь методом, но в самом низу все равно будет-то проход по массиву или лукап в сете.

IT>>>тип параметра x и тип возвращаемого значения выводятся автоматически.

ОК>>Я не уверен что ты понял меня. Ты вырезал часть диалога. Речь шла об ограничениях контекстно-ключевого слова вар.

IT>Если ты имел ввиду что-то другое, то либо ты невнятно сформулировал, либо у тебя каша в голове


Я все нормально сформулировал.

ОК>>Ну вывод типов и вывод типов! Что, только потому что "вар это вывод типов" его следует пихать направо и налево? Несколько странный аргумент. Ты еще начни закатывать глаза и простирать руки к небу: "о, вывод типов!"


IT>Похоже ты скатываешься не только в демагогия, но и в хамство. Не советую.


А по делу есть что сказать? Пока что я от тебя только слышу вывод типов да вывод типов!

ОК>>Напомню что речь шла о том что если можешь объявить тип явно, объяви его.


IT>Так докажи правильность своего утверждения с помощью логики, а не с помощью демагогии и хамства. Пока же ты пытаешь выдать за логику свои предпочтения.


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

IT>>>Пока я не видел ни одного объяснения.

ОК>>Отказался увидеть.

IT>Пока кроме предпочтений ничего не увидел. Если я тебя попрощу вот прямо сейчас повторить свои аргументы, ты в соостоянии это будешь сделать?


Боюсь мы впадем в бесконечный цикл. И ты, будь добр, приведи аргументы почему вар везде в коде это хорошо.

IT>>>Кури вывод типов как концепцию. А ещё лучше возьми, например, Немерле и поработай на нём хотя бы пару месяцев. Такие вопросы по for как ты задаёшь отпадут сами собой.

ОК>>Не считай других глупее себя! Ты вбил себе в голову две вещи.

IT>Всё же ты явно нарываешься. Завязывай с хамством. Тем более, что это не делает тебя умнее.


Тебе не кажется что хамство исходит от тебя? Нет, вижу, что не кажется.

ОК>>Первая. Вывод типов это круто и поэтому надо везде его использовать.


IT>Где я это утверждал?


А зачем ты сюда приплел вывод типов? Ясно ведь что такое вар в Шарпе и речь совсем не о концепциях была.

ОК>>Вторая. Ты решил что я не знаю что такое вывод типов и что такое вар в Шарпе и соответственно приплел в разговор хотя речь была совсем не о выводе типов а о том где и как использовать контекстно-ключевое слово вар. То что это вывод типов к изначальному "вопросу" никакого отношения не имеет.


IT>var к выводу типов имеет самое непосредственное отношение. Жаль, что ты этого не понимаешь.


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

ОК>>И да, кроме этого твоего вывода типов, я так и не услышал чем же хороши вар в контексте объявления того же счетчика (вместо явного написания инта).


IT>Вообще-то это ты нам собирался рассказать, что плохого в var. Объективно и чётко, без предпочтений, демагогии и хамства.


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

ОК>>Вопросов по поводу вара у меня нет. Перефразируя тот "вопрос," я скажу что вар в тех двух объявлениях нифига не нужны.


IT>Ещё раз повторяю — это твои личные предпочтения. Логики в этом твоём утверждении ровно ноль.


Логика-логика. Мне математически что ли доказать почему чрезмерное злоупотребление вар это плохо? И это, повторюсь, официальная позиция Майкрософта с которой я согласен.
Re[29]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 17:01
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Ты хочешь показать асинхронщину "где то то там", а я прошу "где то здесь"


EP>Я показываю, то как можно полностью инкапсулировть "асинхронщину", вообще без вмешательств в клиентский код.



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
   ::AttachConsole(); // появляется консолька
   MSG msg;
   while(GetMessage(&msg, NULL, 0, 0) > 0)
   {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
   }
   return msg.wParam;
 }

some_window_handler(...) 
{
  getline() // упростил, консолька есть, значит можно читать из неё
 // здесь мы выяснили, будет ожидание, хандлер вызывается прямо из DispatchMessage, стало быть ...
}


Итого если этот метод висит до получаения результат, то очевидно, что и UI loop висит, а соответсвенно и UI висит. Может короутина догадается что надо сделать луп ? Или догадается вызвать WinMain ?




I>>>>Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.

EP>>>Не будет зависания — до прихода данных из стрима управление передаться в другое место. Если там UI — то в UI loop

I>>В какое другое?


EP>В любое. Если надо — в event loop, если надо в asio, или ещё куда-нибудь.


Ты ждешь от короутины чудес. Все что она делает это передает управление двумя способами — по методу send и по методу yield. send активирует короутину, yield активирует вызывающий код. Больше ничего не делается.

I>>Или короутина такая умная, что пороется в адресном пространстве процесса и скажет "О, пока я буду спать, пусть повыполняется вот этот кусочек кода" и некоторым чудом окажетс так, что этот некоторый кусочек кода и будет тем который мне нужен ?


EP>Нигде она не будет рыться, она просто сделает yield.



EP>Давай ты сначала покажешь аналог, ок?


Аналог чего ? Я не вижу асинхронного кода, ты даже не можешь показать, каким образом короутина узнает про UI loop.

I>>Если UI loop и короутина работают асинхронно, покажи именно эту асинхронщину. Ну и до кучи покажи как руками написать метод навроде getline.


EP>getline тут самый стандартный, который std::getline.


Нет, так не пойдет. Я хочу простейший пример асинхронщины Пока что у тебя ничего нет.
Re[43]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 18:37
Оценка: +1 :)
Здравствуйте, Ikemefula, Вы писали:

I>Цель этой максимальной быстрости ? Если быстро парсить регэкспы в компайлтайм, то не ясно, как часто это становится узким местом, ибо регэкспы в рантайме это совсем другая вещь. Да и ДСЛ для этого корявый.


Ну вот например я недавно некоторые тесты для разных языков писал и они использовали начальные данные в виде больших (многомегабайтных) текстовых файлов. Так вот я там ради развлечения замерил и время считывания (с парсингом в массивы чисел) этих данных, хотя к делу это не относилось. И вариант на C++ выделялся среди других просто дико — более чем на порядок! Это как раз было результатом использования Boost.Spirit для считывания этих данных. Хотя взял я его не из-за этой скорости, а просто потому что на нём было быстрее всего записать считывание. Т.е. и быстро записывается код и огромная скорость его работы потом.

I>Ты лучше помоги EP, а то он не может асинхрощину найти в синхронном коде. Если нужно решать конкретные задачи — их легко порешать через async/await, безо всяких либов.

I>Собтсвенно это короутины, к которым прикручен шедулер. В бусте точно так же и сделано и это одна из причин по которой EP не может объяснить, как короутина вызовт UI Loop — нужно руками добиться этого, например вынести UI loop в такую же короутину. Только здесь получается не асинхронщина, а кооперативная многозадачность, что собтсвенно и делает короутина. Больше ничего она не делает. Вообще. Никогда. Нигде.

Ну да. Просто чистую асинхронщину же и нечего обсуждать. Там всё достаточно тривиально. Оно даже уже в сам стандарт C++11 входит.

I>см выше про кооперативную многозадачность. Если интересно, есть статья про короутины в питоне, там пример такой же мульки. Короутины в C# кастрированые, но они есть — yield. Можно добиься аналогичного, но более многословного варианта по сравнению с питоном.


Ну да. А boost.coroutine ещё покруче питоновских. ))) Но основной принципе безусловно тот же самый.

I>Теперь никаких претензий нет или ты все еще хочешь что бы я добавил еще одну строчку в свой пример навроде result = await result.Content.GetBytes() ?


Ой, да мы вроде уже давно выяснили что мой вариант реализации await/async для C++ выглядит немного страшнее чем C# вариант, но при этом даёт чуть-чуть больше гибкости. Утомили уже эти примеры. Кстати, изначально это был пример от gandjustas. Только вот он написал "Давай, детка, сделай это на C++.", а потом резко пропал куда-то...
Re[31]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 19:34
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>getline там стандартный, не перегруженный

EP>А stream да — специальный, я этого и не скрывал — в том коде даже тип для стрима специальный, хотя можно было показать только std::istream

Ну значит UI Loop из моего примера вызовется чудом, например сканированием адресного пространства на предмет наличия ::GetMessage и ::TranslateMessage или, как вариант, короутина догадается WinMain вызвать.
Re[31]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.06.13 03:09
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В функцию foo, я добавил вывод уникальной части — в остальном всё идентично коду показанному выше.

EP>Сопроцедуры работают асинхронно, а getline стандартный, ага.

Ты бы еще привел пример операциооной системы. Все что от тебя требовалось — минимально возможный код который показывает как работает собтсвенно переключение задач для асинхронной задачи.

Странно, но ты снова привел __синхронный__ код Если короутина прыгает между стеками, еще не значит, что код автоматически становится асинхронным. Ну и так же ты показал, что в предыдущем примере у тебя, мягко говоря, отсутствовало 99% решения

P.S. если нужны примеры попроще, вот http://www.crystalclearsoftware.com/soc/coroutine/, это гораздо полезнее.
Re[25]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 26.06.13 11:45
Оценка: +1 -1
Здравствуйте, koodeer, Вы писали:

K>Начинающие программисты много внимания уделяют типу переменной; разбирая чужой код, они в первую очередь смотрят на тип, и таким образом пытаются понять, что можно сделать с этой переменной (этим объектом). И эти джуниоры мало уделяют внимания наименованию переменных.


K>Более опытные разработчики типу уделяют гораздо меньше внимания. Для них важнее сама семантика кода. Гораздо важнее название переменной, а не её тип. Дав описательное название переменной, можно по сути пренебречь её типом: и так всё ясно.


Бред сивой кобылы, сорри.

Точный тип относится к подробностям кода. Поэтому, надобность в точном типе при чтении кода зависит от степени вникания в эти подробности. Кароч, у тебя верные наблюдения, но ты сделал из них неверные выводы. Более опытные разработчики ворочают намного большими объемами кода, чем новички, отсюда разные навыки чтения кода при беглом его разборе. Но когда они вникают в подробности конкретного участка, поверь, их точно так же интересуют точные типы.
Re[38]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.06.13 18:22
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Как видишь, никаких вмешательств в event-loop тут не было — трансформация полностью локализована


Здесь никакого эвентлупа не было. Если все так просто — покажи на моем примере. Не можешь — стало быть все сказки на счет простоты.
Re[2]: Что посоветуете как аналог С++
От: Grundik2 Земля  
Дата: 03.07.13 01:26
Оценка: :))
Здравствуйте, Lazin, Вы писали:

L>Здравствуйте, Grundik2, Вы писали:


G>>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


L>Аналогов С++ не существует. И слава богу! :D


:D -- в смысле D?
Re[69]: Что посоветуете как аналог С++
От: alex_public  
Дата: 05.07.13 13:02
Оценка: +1 :)
Здравствуйте, Ikemefula, Вы писали:

I>Эта тончайшая скриптовая прослойка составляет 99% логики тех задач за которые и платят деньги.


Причём тут логика, деньги и нагрузка? Ну что за детский сад?

Давай рассмотрим уже последовательность действий происходящих про работе какого-нибудь "веб-приложения". Возьмём что-нибудь самое самое распространённое по статистике. Ну например форум на php. И так:

1. На сервер приходит http запрос GET /viewforum.php?f=10
2. http-сервер (скорее всего Apache, по статистике) проделывает дохрена всякой работы (всякие виртуальные хосты, mod_rewrite, разрешения и т.п.) соотнося url и реальные данные на диске.
3. http-сервер видит что затребован скриптовой ресурс и переадресует запрос php демону, передавая ему имя скрипта, "?f=10" и ещё набор заботливо подготовленных данных.
4. И вот пошло исполнение нашего крутого управляемого кода, отвечающего за всю логику. Он берёт значение 10 (кстати, парсить самому не надо — это всё нативный код php уже подготовил) из строки запроса и подставляет его в нужное место строки sql запроса. После чего отсылает (через нативную функцию php) этот slq запрос в базу данных.
5. Сервер базы данных (скорее всего mysql, по статистике) исполняет запрос типа "найти последние 20 тем в разделе с id 10" делая кучу сложной работы включая не только сам поиск, но и например кэширование запроса. И возвращает результат в php в виде удобной таблички.
6. И вот снова пошёл крутой управляемый код. Он проходит в цикле по полученной табличке и указывает встроенному шаблонизатору в каких местах шаблона какие строки из таблички вставлять. Подчеркну, что собственно с самой страничкой (как со строкой) php код вообще не работает — он только указывает нативному коду php демона в каких местах идёт шаблон, а в каких данные из таблички.
7. php демон отрабатывает подстановку шаблона (нативный код php демона), формирует массив байт и передаёт его http-сервер.
8. http-сервер записывает данные в логи и отправляет поток байт клиенту по http.

О, кстати... А ещё Там по размеру кодов всё очень забавно видно. Значит у нас каждый запрос пользователя отрабатывают 3 монстроидальных нативных бинарника (apache, php, mysql) и сотня строк скрипта. Но естественно скрипт делает всю основную работу, ведь там же лоооогика....

Ну так что скажешь? ))) Хотя конечно все твои утверждения по прежнему остаются верны в какой-то степени... Действительно вся логика этого веб-приложения полностью реализована в управляемом (php) коде. И это совсем не исключение — действительно большая часть всего веба реализована (точно в таком же смысле как в примере выше) на управляемом коде (а именно на php). Но тебе самому то не смешно делать из этого какие-то выводы о производительности, потребление ресурсов и т.п.? )))

Вот напиши целиком такое же веб-приложение на php, не используя сторонний http-сервер и базу данных и ещё желательно не используя библиотеку php (которая целиком нативная). А потом сравни по быстродействию с классической реализацией... А после мы и поговорим насчёт "расхода ресурсов в управляемом коде". Только ведь ты же не идиот и не станешь такое писать, правильно? Тогда к чему прикидываться непонимающим насчёт реальных затрат ресурсов в веб'е?
Re[38]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.07.13 22:13
Оценка: -1 :)
Здравствуйте, artelk, Вы писали:

A>Т.е. вызывающий поток блокируется до тех пор, пока Result не будет вычислен?


Именно так и он это называет асинхронщиной, потому что де в этом потоке будет выполняться какая нибудь другая короутина, которая делает хрен знает что.
Re[41]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 07:43
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Вызывающий поток(thread) не блокируется, а возвращается к другим задачам, например по event loop.

I>>Для этого надо псать специальный код.

EP>Этот код пишется один раз, и едет библиотеку, при этом ни каркас приложения, ни event loop — не меняются.


Ну это просто вранье. alex_public показал, как event-loop "не меняется" — путем встраивания RunAll в event loop или прикручивая таймер


I>>При этом await позволаяет включать ожидание там где тебе надо.


EP>Так и тут при необходимости можно явно указать где не нужно ожидание


Продемонстрируй свой getline один раз с ожиданием, другой раз без ожидания. Надеюсь, ты не станешь эмулировать await путем параметризации gitline специальным потоком ?
Re[40]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 07:57
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

A>>>Т.е. вызывающий поток блокируется до тех пор, пока Result не будет вычислен?

I>>Именно так и он это называет асинхронщиной, потому что де в этом потоке будет выполняться какая нибудь другая короутина,

EP>Так ты определись — либо блокируется, либо "в этом потоке"


UI поток заблокируется, потому что буст не знает про message pump. В этом потоке будет чтото выполняться, при чем не ясно, как указать что именно должно выполняться.


Все твои примеры "асинхронщины" это просто синхронный код с нелокальными переходами. Все, больше ничего в твоих примерах нет и быть не может. Асинхронщину показал alex_publiс, у тебя же общие слова "все шоколадно, все само и тд"

Представь себе либу, которая ничего про твои короутины не знает. У ней ровно один метод, как водится, блокирующий, это именно то ради чего нужна асинхронщина:

http://rsdn.ru/forum/philosophy/5215721.1
Автор: Ikemefula
Дата: 30.06.13
Re[41]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 10:17
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Остался один открытый вопрос — сделать так, что бы буст, наконец, узнал про message pump.


EP>ты действительно не понял, что трансформация полностью локальная?


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

I>>>UI поток заблокируется, потому что буст не знает про message pump. В этом потоке будет чтото выполняться, при чем не ясно, как указать что именно должно выполняться.


EP>Тебе что-то неясно != "UI поток заблокируется"


Покажи каким образом буст узнает про message pump.

EP>Почему завис на корутинах? Ты о чём?


Очень просто. твой пример с getline именно это и демонстрирует. Если ты делаешь вызов с ожиданием, то надо РУКАМИ пнуть message pump. В С# это делает компилятор.

Если ты не согласен, напиши внятно, почему это не надо делать.

EP>То и на stackful coroutines никто не заставляет всё пилить в одном потоке:

EP>
EP>async([]{ DoAction(); }).then([=]
EP>{
EP>    synchronization_context_post( [=]{ coro.un_yield(); } );
EP>}); // without syntax sugar
EP>coro.yield();
EP>


И снова торчит та самая асинхронщина, которая, как ты утверждал, нигде не торчит ?

EP>Неважно где будет выполнятся асинхронная операция — в отдельном потоке или позже в этом, главное чтобы была возможность присоединить продолжение в виде:

EP>
EP>synchronization_context_post( [=]{ coro.un_yield(); } );
EP>


То есть, делать все что может сделать компилятор, но руками.

Итого — одним сообщением ты взял все свои слова назад

В сухом остатке, так сказать, все по прежнему — все что надо, в С++ пилится и контролируется руками, в сигнатуре и коде торчит ровно то же, что торчит в C#.
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 16:12
Оценка: :))
Здравствуйте, alex_public, Вы писали:

_>Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования. Это случаи когда у нас есть некий callback, вызываемый откуда-то снаружи (например из ОС). Это на самом деле вполне часто встречающаяся задача и как раз асинхронная. Соответственно Evgeny.Panasyuk показал что можно красиво и удобно записывать такой код с помощью сопроцедур (из Boost'a), превращая их в линейный, без выделения спец. функции для callback'a.


function getSin(param, end)
{
  end(Math.sin(param));
}

getSin(45, function(result){ ля ля ля})

вот этот вызов выглядит как асинхронный, при этом в данном примере нет ничего асинхронного, обычный event driven подоход, а вы с EP почему то называете такой хлам асинхронщиной
Re[51]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 20:18
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>yield на 37 строчке, который находится внутри TcpStream, который дёргается getline'ом


Интересно, как ты вызываешь message pump который отсутствует ? Надо понимать это буст такой умный, проанализирует память и решит, что надо вызвать MessagePump, сходит на RSDN, сделает поиск по моим сообщениям, найдет цикл, скомпилирует его и выполнит.

I>>Представь себе такое — getline получит значения через полчаса. Каким образом будет работать UI ? С await все понятно — UI будет работать, потому что message pump никто не останавливал. А вот с getline все непросто — ты его просто вызвал в хандлере, который вызвался из message pump.


EP>И внутри он yield'нулся обратно в message pump


Там нет message pump, там просто какой то цикл.

EP>Я уже показал пример асинхронной операции с win32 message pump. Делать ещё примеры нет никакого желания, по двум причинам: с твоей стороны не было запрошенных примеров (кроме неработающих огрызков), на каждый мой пример ты придумываешь нелепые отмазки


Ты в начало треда посмотри и заметишь, что я повторяю один и тот же вопрос и так и не получил на него ответа.

EP>>>также выполняется синхронно?

I>>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?

EP>Я уже показывал примеры где message pump не блокируется. Тебе они не понятны? Нужен очередной ликбез?


Нет, ты ничего подобного не показывал. мой message pump и твой getline — валяй.

EP>Ты до сих пор не понял, что yield у stackful coroutine превращает весь последующий код в "неявное" продолжение и возвращает управление в message pump?


Мы говорим не о том, что во что превращает, а как твой getline вернет управление в мой message pump.

EP>Я понял, что ты совершенно не понял как здесь используются stackful coroutine, да нужен очередной ликбез..


Я уже лет наверное 7-8 в курсе как и для чего они используются, еще с тех времен, как писал такую логику на файберах, а потом писал на питоне, а потом писал логику под Q3 движок, а потом писал yield-expression для C#, а потом приспосабливал yield return под обработку эвентов и тд и тд и тд.
Re[53]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 21:29
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Вызов getline, с точки зрения метода foo, очевидно блокирующий

I>>Правильно, и с чем ты спорил ?

EP>Где?

EP>Я сразу сказал
Автор: Evgeny.Panasyuk
Дата: 21.06.13
:

EP>

EP>На stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде, ибо такие сопроцедуры (без асинхронных кишок в клиентском коде) сразу возвращают управление в клиентский код — а это значит что либо данные ещё не получены, либо никакой асинхронности, так как только один поток.


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

I>>Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?


EP>стрим async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
заснул на пол-часа, нет данных minimize'а. Что будет с UI ? UI — не висит.


Висит, потому что getline — блокирующий.
Re[55]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 21:36
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Разумеется, пока ты не дашь ответа на мой вопрос, я его задал ажно две недели назад, я ничего не собираюсь показывать.


EP>Какой именно вопрос? который ты задал после запрошенного примера на C#?


Тот самый, про getline и message pump.

I>>Вот еще пример — я показал код со Sleep и все на этом закончилось.


EP>Тех примеров что я показал — достаточно. Ты не показал ни одного запрошенного примера


Разумеется и не собираюсь до тех пор, пока не получу внятные ответы на свои вопросы которым уже две недели.

EP>>>и если после этого тебе мерещатся заблокированные ui-loop-ы — то как-то совсем печально

I>>Ты сам сказал, что getline блокирующий

EP>вызов getline из foo — блокирующий, вызов корутины, которая его содержит — нет


Ну так покажи наконец такую инкапсуляцию, что бы ничего не торчало наружу, то asynchronous торчит, то какая то короутина, то yield после вызова метода.
Вроде ж все просто был — "можно инкапсулировать", однако, шота все время чтото торчит — то одно, то другое, то третье.
Беда какая то — getline Блокирующий, значит нужна короутина что бы сделать неблокирующий вызов. getline неблокирующий — снова нужно чего то написать, что бы сделать блокирующий код.
Когда же ты наконец покажешь именно то что обещал ("код будет одинаковым в обоих случаях") ?
Re[63]: Что посоветуете как аналог С++
От: alex_public  
Дата: 09.07.13 18:15
Оценка: +2
Здравствуйте, Ikemefula, Вы писали:

I>10 лет C# этого разве недостаточно ?


Что-то по отсутствию знания базовых примитивов многопоточности эти 10 лет совсем не чувствуются... )

I>Наверное им было скучно по сто раз одно и то же объяснять.


Если бы. На деле там были громкие крики в стиле "а вот фиг вы сделаете такое на C++". И соответственно после того, как бы представлен код делающий именно это самое, мгновенный тихий слив из темки...
Re[62]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 09.07.13 21:10
Оценка: :))
Здравствуйте, alex_public, Вы писали:


_>А всякие официальные пользователи C# типа gandjustas и прочих IT резко слились из темы, как только дело дошло до обсуждения конкретики. )))


не, я просто в отпуск уехал, а когда вернулся стало лениво все читать. Но я так понял что до сих пор никто не показал пример GUI Фреймворка с интегрированными stickful coroutines, так что все примеры ни о чем.

Поправьте, если я ошибаюсь.

_>P.S. А Ikemefula хотя и дико упёртый, но в любом случае достоин уважения. )

ИМХО он может до бесконечности спорить на любую тему.
Re[54]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 08.07.13 08:32
Оценка: 8 (1)
Здравствуйте, Ikemefula, Вы писали:

I>>>Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?

EP>>стрим async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
заснул на пол-часа, нет данных minimize'а. Что будет с UI ? UI — не висит.

I>Висит, потому что getline — блокирующий.

Надеюсь такого bullshit'а про подвисший UI больше не будет после очередного ликбеза:

#include <boost/iostreams/categories.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/coroutine/all.hpp>

#include <functional>
#include <istream>
#include <memory>
#include <cwchar>

using namespace boost;
using namespace std;

#include <windows.h>

typedef function<void(wchar_t)> CharHandler;
CharHandler on_char;
HWND main_hwnd;

template<typename F>
void async_read(F f)
{
    on_char = f;
}

typedef coroutines::coroutine<void()> Coro;
typedef std::shared_ptr<Coro> shared_coro;

struct DataSource
{
    typedef wchar_t char_type;
    typedef iostreams::source_tag category;

    Coro::caller_type &ca;
    const shared_coro *coro;

    std::streamsize read(wchar_t* s, streamsize n) 
    {
        if(n==0) return 0;
        auto &&sc = *coro;
        async_read([s, sc, this](wchar_t ch)
        {
            s[0] = ch;
            coro = &sc;
            (*sc)();
        });
        ca();
        return 1;
    }
};
typedef iostreams::stream<DataSource> InputStream;

void foo(wistream &client_stream)
{
    wstring msg;
    do
    {
        getline(client_stream, msg);
        SendMessage(main_hwnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(msg.c_str()));
    } while(msg != L"exit");
}

void task()
{
    auto &&coro = make_shared<Coro>();
    *coro = Coro([&coro](Coro::caller_type &ca)
    {
        DataSource source = {ca, &coro};
        InputStream client_stream(source);
        foo(client_stream);
    });
}

LRESULT CALLBACK window_procedure(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
{
    switch (msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
       case WM_SIZE:
            if(w_param == SIZE_MAXIMIZED)
            {
                static auto once = []{ return task(), 1; }();
            } break;
        case WM_CHAR:
            if(on_char)
            {
                wchar_t ch = w_param;
                auto handler = on_char;
                on_char = CharHandler();
                handler(ch == L'\x0D'? L'\n' : ch);
            } break;
    }
    return DefWindowProc(hwnd, msg, w_param, l_param);
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
    WNDCLASS wincl = {};
    wincl.hInstance = hInstance;
    wincl.lpszClassName = TEXT("SFC");
    wincl.lpfnWndProc = window_procedure;
    RegisterClass(&wincl);

    main_hwnd = CreateWindow(wincl.lpszClassName, TEXT(""), WS_OVERLAPPEDWINDOW, 0, 0, 400, 100, 0, 0, hInstance, 0);
    ShowWindow(main_hwnd, nCmdShow);

    MSG msg;
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

По первому maximazed запускается foo, которая считывает пользовательский ввод в цикле. После нажатия Enter, строка выводится в окно.
И никакого подвисшего UI
Re[13]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 06:59
Оценка: 7 (1)
Здравствуйте, gandjustas, Вы писали:

MTD>>Для дотнетчиков оказывается обработать 100 пакетов в секунду достижение Снимаю шляпу

G>Нет, это максимум что по COM порту пролетало. А вот 10% загрузки одного процессора при этом и workset в 50 мб очень даже достижение.

G>При этом на 100 пакетов 30 раз надо было сходить в базу и записать логи и отдать состояние десятку подключенных клиентов.


О, моя любимая тема! Я как раз 4 года писал похожий софт, так вот СОМ-порт — это очень-очень низкая скорость, в основном процесс будет спать в ожидании данных, 30 запросов к базе с мизерным количеством данных (ну пусть килобайта 4 чистых данных) — вообще ни о чем. У меня это крутилось на железке 300 МГц и 128 ОЗУ. Загрузка процессора там была гораздо меньше 10 процентов и памяти кушало мегабайт 10, это при том, что там еще и сложная математика которая эти данные обрабатывала, а так аналогично — база, логи, верхний уровень, опрос десятка устройств по Modbus.
Re[6]: Что посоветуете как аналог С++
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 17.06.13 10:21
Оценка: 6 (1)
Здравствуйте, kaa.python, Вы писали:

DM>>Были указатели на "управляемые" объекты, а теперь хотят их выбрость, если я все правильно путаю.


KP>Не подкинешь линки? Я, видимо, что-то упустил...


http://pcwalton.github.io/blog/2013/06/02/removing-garbage-collection-from-the-rust-language/
Re[16]: Что посоветуете как аналог С++
От: fddima  
Дата: 18.06.13 20:31
Оценка: 6 (1)
Здравствуйте, alex_public, Вы писали:

IT>>Это хорошо. А второй, который shared?

_>shared_ptr/weak_ptr естественно добавляет по мелочи относительно голых указателей, но их соответственно и употребляют взамен не голых указателей, а тоже нетривиальных велосипедов не попадающих под RAII. Так что никакого провала в производительности при переходе с древнего велосипедного C++ на современный нет. А безопасность при этом становится гарантированной компилятором, как и в управляемых языках. Только эффективнее. )))
Тут явно наглая ложь. Никакой безопасности относительно указателей (ссылок) не даёт ни C++ ни C#/.NET. Утечки одинаково эффективно можно реализовать и там и там — у всех свои особенности. Плюс в C++ в том — что там где не нужно — ненужные велосипеды можно не использовать, а использовать например голые указатели, чего не скажешь об "управляемых" средах.
Что на практике? Под флагом секурности исключительно все браузеры переходят на многопроцессную модель, хотя в 90% случаев — это эффективный способ прикрыть свою несостоятельность своего кода и своих убогих GC (как в V8 например). Rust? Servo? они пошли той же дорожкой. Нафиг. Но и .net тут противопоставить нечего — с этими задачами он не способен справиться на уровне C++. Это так, на примерах из жизни.
Re[18]: Что посоветуете как аналог С++
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 20.06.13 12:16
Оценка: 5 (1)
Здравствуйте, MTD, Вы писали:

DM>>Google Chrome — обертка над WebKit, который тянется с прошлого века (Initial release November 4, 1998).

MTD>Отчего его в .Net не обернули?

Не было смысла, полагаю.

DM>>Skype вообще на Delphi написан.

MTD>Что? Разве что самая первая версия.

Да нет, виндовая версия 4.2 (спустя 7 лет после первой) все еще на Дельфи. Надо будет на более свежие взглянуть.

MTD>Ну да, на Java есть ровно три десктопных приложений — NetBeans, Eclipse, Idea


Вроде того.
Если смотреть у кого что установлено, то у меня еще:
vReveal — обработка видео, гуй на дотнете, алгоритмы на CUDA и чем-то нативном.
SourceTree — git клиент, .NET + WPF. Супер аппаратно ускоренный, запускается полчаса.
Mercurial — и вовсе на питоне.
компиляторы всякие (Haxe, GHC, Idris) — на окамле и хаскеле.

Плюс самописный десктопный софт на D (обработка графики, визуализация дисков с поиском дублей).
Re[6]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 19.06.13 17:10
Оценка: 3 (1)
Здравствуйте, Mazay, Вы писали:

KP>>>Да, а вот теперь реально интересующий меня вопрос. Ты что используешь в качестве сетевого уровня? Текущая версия из Rust, мягко говоря, не завершена.

C>>Прикрутил libcurl. Заодно разобрался с ARC и разделяемыми ресурсами
M>А что такое ARC?
http://dl.rust-lang.org/doc/std/arc.html

M>И в чём состояло прикручивание libcurl?

Аккуратно сделать кэш соединений и диспетчер.
Sapienti sat!
Re[4]: Что посоветуете как аналог С++
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 19.06.13 06:52
Оценка: 1 (1)
Здравствуйте, roro, Вы писали:

R>Здравствуйте, Mystic, Вы писали:


M>>Здравствуйте, roro, Вы писали:


R>>>Здравствуйте, Grundik2, Вы писали:


G>>>>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


R>>>Аналогов С++ имхо нет.


M>>Чем Ada не вариант? Если брать стандарт 2012 года? Или ее диалект SPARK?


R>С++ золотой молоток под все виды задач, бешеная производительность и лихая езда по памяти.


R>Ада, насколько знаю, полная противоположность — медленная безопасная езда в космосе.


Ada компилируется в машинный код. Производительность вполне сопоставимая с С++. Если брать стандарт 2012, то за счет предусловий и постусловий может быть доказана exception free для выхода индекса за пределы диапазона, выхода за пределы типа, деления на нуль, численного переполнения. В целом строгость языка дает компилятору куда больше возможностей понять, что происходит к коде, где можно оптимизировать, а где нет.

Получить лихую езду по памяти в Ada вполне возможно, только это более многословно. Во-первых, при использовании указателя надо использовать атрибут Unchecked_Access. И еще надо при помощи pragma Convention попросить компилятор сделать указатель C-совместимым. Так же можно использовать System.Address + System.Address_To_Access_Conversions(Node). Получается куча "мамой клянусь" в тексте.
Re[15]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 20.06.13 16:08
Оценка: 1 (1)
Здравствуйте, Ikemefula, Вы писали:

I>Правильно и это делается за счет написания корректного кода. Внимание — корректного. Теперь фокус — вкладываешь диск в лоток, закрываешь и пока он не открылся, проверяешь отзывчивость UI. Вопрос — куда делась корректность ? И это типично для C++.


Это ты все эти CD-ejector'ы разрабатывал? С отзывчивым UI и корректностью, ага
А теперь внимание, фокус: вставляешь 5.25 в дисковод, закрываешь, издаётся характерное жужжание, и вдруг КЛАЦ! Казалось бы, при чём здесь Лужков? И это всё типично для C#

EP>>Структуры в C# далеко не дефолт, и имеют ограничения.

EP>>Суть в том, что tight memory layout существенно влияет на производительность, пример с массивом структур это лишь одна часть проблемы, а ведь есть ещё композиция объектов, объекты на стеке.
I>Для каких приложений это критично ?

Критично там где нужна производительность
Re[15]: Что посоветуете как аналог С++
От: FR  
Дата: 21.06.13 03:27
Оценка: 1 (1)
Здравствуйте, gandjustas, Вы писали:


G>Еще раз: продолжения+детерминированная финализация. Вместе, а не по-отдельности. В общем случае нельзя придумать способ гарантированной очистки памяти. Продолжение может просто не вызваться и будет держать ссылку на замыкание.


GC же тоже будет держать в таких случаях.

G>В некоторых условиях можно, но условия будут постоянно меняться от структуры кода. замучаешься следить.


Как показывает практика использования тех же замыканий в C++ следить не сложно.
Re: Что посоветуете как аналог С++
От: Wolverrum Ниоткуда  
Дата: 16.06.13 14:18
Оценка: +1
Здравствуйте, Grundik2, Вы писали:

G>На ум приходит только D и Rust. Что порекомендуете?

FreePascal же!
Re[3]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 16.06.13 16:42
Оценка: +1
Здравствуйте, D. Mon, Вы писали:

DM>Жизнь слишком коротка, чтобы учить С++.


Не такой уж он и сложный

DM>Слишком пока колбасит его, еще сто раз поменяется. Вон, делали-делали его со сборкой мусора, а надысь задумали от нее отказаться в языке. Будущее у него пока слишком отдаленное, пусть даже и светлое.


Колбасит сильно. GC в составе языка никогда не было, есть отдельный эксперимент с GC живущий в отдельном проекте. Если его и дальше не будет, то никто и не заметит.

DM>Он последнее время (~год) набирает обороты, после недавнего переезда на гитхаб прибавилось разработчиков/контрибюторов, баги правят пачками, а сам язык все стабильнее, все меньше в нем вредных изменений. Недавно вон конференция по нему прошла на базе Facebook'a, много интересного рассказали и вопросов порешали. (см. dconf.org) Есть пока некоторые больные места в его реализациях (вроде GC), но если на них сильно не наступать, то очень годный язык уже сегодня, а по сочетанию понятности-выразительности-скорости, пожалуй, круче всех.


Это все хорошо, но то что за 15 лет не разродилось, уже вряд ли когда-то появится на свет
Re[2]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 17.06.13 03:20
Оценка: +1
Здравствуйте, kaa.python, Вы писали:

KP>Т.е. да, приложения на JVM и .NET тормознутые, но не потому что JVM или .NET тормознутая, а потому, что основная масса разработчиков под эти платформы вообще не думает о том, что стоит память или на сколько дорого обходится то или иное решение. В итоге получается монстры-тормоза, а дело-то все в ручках...


Т.е. ты умный, а JVM и .NET разработчики дураки?
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 17.06.13 17:02
Оценка: +1
Здравствуйте, kaa.python, Вы писали:

IT>>Тоже самое можно сказать и о большинстве C++. В своё время доводилось интервьюировать и работать с людьми, которые не воспринимали воообще никак битовую арифметику, не знали как объявить класс (после 3-х лет работы на C++ Builder) и вообще сильно путались в основах ООП, про память могли говорить исключительно в рамках стандартных вопросов/ответов, шаг влево/вправо — попытка к бегству. Так что всё это разговоры в пользу бедных. Дураков, пишущих на плюсах не меньше, а может быть даже больше, потому как писать сегодня на плюсах в подавляющем большинстве случаев — нонсенс.


KP>Т.е. с утверждением: "главное задача, памяти бесконечно много, не хватает мощности — поставим на кластер" ты согласен?


Это стандартные домыслы, с ними нет смысла спорить.

ЗЫ. А ты сам с "Дураков, пишущих на плюсах не меньше, а может быть даже больше..." тоже получается согласен?
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Что посоветуете как аналог С++
От: _NN_ www.nemerleweb.com
Дата: 17.06.13 17:59
Оценка: +1
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, IT, Вы писали:


IT>>Какая разница? Плюсовики вынуждены постоянно думать о ресурсах и не столько об их экономии, сколько об утечках. Это всего лишь умение ходить по граблям. Ничего общего с оптимизациями и алгоритмами.


KP>Ну разве что только те, кто так и не открыл для себя shared_ptr и unique_ptr

И принципы RAII.
Вы не поверите но даже в 21-м веке такого кода бывает много
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.06.13 05:51
Оценка: +1
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, gandjustas, Вы писали:


G>>На десктопе ситуация для C++ не лучше, так как ресурсов дофига, даже на планшетах, никто за лишние 30-50 мегабайт не будет беспокоиться и почти везде уже больше одного ядра.


KP>И именно поэтому, управляему приложения уже лет как 10, вот уже завтра захавают весь десктоп, но сегодня их, почему-то, практически нет. И так все 10 лет. Но ты главное верь и ни в коем случае ничего не оптимизируй, а то не дай бог приложения быстро работать начнут

Их просто не пишут. Почти все десктопные приложения довольно древние, разработаны в году 2005 и ранее.
А вот приложения для w8 по большей части .NET (WinRT) и JavaScript.
Re[11]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 18.06.13 06:37
Оценка: +1
Здравствуйте, IT, Вы писали:

KP>>Ну разве что только те, кто так и не открыл для себя shared_ptr и unique_ptr


IT>И сколько ещё всяких разных подпорок и затычек нужно для себя открыть?


Сегодня это уже не подпорки, а части стройного фреймворка для связи данных в памяти. Раньше были глобальные переменные, агрегация, ссылки и голые указатели. Сейчас добавились умные указатели (shared, unique, weak и intrusive) и rvalue-ссылки. Все они решают вполне конкретные проблемы и сценарии их использования очевидны. Тот факт, что потенциальные убийцы С++ тупо игнорируют существование таких проблем, говорит о том, что HPC-шники ещё долго будут жрать кактус.
Главное гармония ...
Re[7]: Что посоветуете как аналог С++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 18.06.13 06:49
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>На десктопе ситуация для C++ не лучше, так как ресурсов дофига, даже на планшетах, никто за лишние 30-50 мегабайт не будет беспокоиться и почти везде уже больше одного ядра.


Если десктопы — это ноутбуки, то память и процессор — это ресурс. Это было и раньше, а сейчас тем более, особенно в свете развития ультрабуков.
На планшетах тем более ресурс, никто не хочет жить на зарядке.
Именно поэтому все мало-мальски популярные приложения оптимизируются по самое нехочу, стараются использовать аппаратные возможности для ускорения вывода графики и других уже неграфических вычислений, встраивают типизированный JavaScript в браузеры (см. Asm.js), используют JIT, кешируют часто используемую память и т.д. и т.п.
P.S. И не только приложения оптимизируются, кстати. Из железа тоже сейчас выжимают все соки ради экономии нескольких Ватт. Неужели ты живёшь в какой-то другой реальности?
Re[13]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 18.06.13 10:34
Оценка: +1
Здравствуйте, gandjustas, Вы писали:


G>>>Сходи на MSDN глянь как в WinRT делать асинхронные вызовы в C++, а потом сравни с .NET и JS.

KP>>Т.е. в том, что Майкрософт криво реализовал работу с асинхронными вызовами в WinRT виновато C++?
G>Ни разу не криво, просто C++ по-другому не может. Детерминированная финализация и продолжения, увы, плохо совместимы.

ХЗ. Мне нравится, как asio с coroutines работает.
Главное гармония ...
Re[13]: Что посоветуете как аналог С++
От: alex_public  
Дата: 18.06.13 18:04
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>А умные указатели просто так умные или всё же за счёт определённой потери производительности?


Скорее за счёт времени компиляции. В быстродействие unique_ptr не уступает голым указателям. )
Re[12]: Что посоветуете как аналог С++
От: Nikе Россия  
Дата: 18.06.13 18:15
Оценка: +1
Здравствуйте, Mazay, Вы писали:

KP>>>Ну разве что только те, кто так и не открыл для себя shared_ptr и unique_ptr


IT>>И сколько ещё всяких разных подпорок и затычек нужно для себя открыть?


M>Сейчас добавились умные указатели (shared, unique, weak и intrusive) и rvalue-ссылки.

Мне нравится слово "сейчас"
Нужно разобрать угил.
Re[8]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 18.06.13 20:20
Оценка: :)
IT>>Это стандартные домыслы, с ними нет смысла спорить.

KP>Это не стандартные домыслы. Это утверждение, которое очень часто приводится в дискуссиях как довод в пользу управляемых языков.


IT>>ЗЫ. А ты сам с "Дураков, пишущих на плюсах не меньше, а может быть даже больше..." тоже получается согласен?


KP>Распределение дураков везде приблизительно одинаковое, сложно с этим спорить, да и зачем... Но вот дурак и разработчик не думающий об алгоритмах и ресурсах это совсем разные вещи.


То есть ты хочешь сказать что ты как С++ программист будешь использовать std::set<> чтобы, например, сделать проверку уже какой-то обработанной "штуки" в то время как тупые дотнетчики будут использовать обычный массив и линейный поиск? Внизу там кто-то выразил подобную мысль. Если же твой ответ "нет," то можно узнать что такого ужасного делают в своем коде джависты и дотнетчики чего бы С++ программисты никогда бы не сделали? Конкретные примеры а не голословность одну, плиз.

Имхо ты загнул тут. Чтобы писать на Джаве или Шарпе неэффективный код, это надо постораться. А вот в плюсах пожалуйста! Верни к примеру тяжелый контейнер из функции или создай неявно какой-нибудь временной объект. Такого уродского кода как на плюсах мне не приходилось поддерживать. Впрочем я не виню язык — сам язык мне нравится. Я виню конкретные руки которые, не исключенно, могут вот так разглогольствовать на форумах.
Re[8]: Что посоветуете как аналог С++
От: Ops Россия  
Дата: 18.06.13 21:08
Оценка: :)
Здравствуйте, Grundik2, Вы писали:

KP>>А почему ты считаешь что это хорошо?


G>Не прийдется его учить.


А вместо русского какой учил?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[13]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 19.06.13 04:05
Оценка: -1
Здравствуйте, Nikе, Вы писали:

M>>Сейчас добавились умные указатели (shared, unique, weak и intrusive) и rvalue-ссылки.

N>Мне нравится слово "сейчас"

Ну в Стандарте — действительно "сейчас". Соответственно, для бустофобов тоже только "сейчас".
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Что посоветуете как аналог С++
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 19.06.13 06:14
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>В D проблема с конкурентностью — о ней никто не думал, потому получилась yet another native Java с общим хипом. Отсюда и проблемы с GC, которые неустранимы по дизайну.


Да, куча общая, и это плохо. Но зато есть изолированные системой типов процессы (потоки), обменивающиеся сообщениями а-ля Эрланг, плюс файберы для уделывания всяких нодежсов в асинхронности. Плюс все глобальные переменные по умолчанию thread local. Плюс можно более аккуратно работать с памятью (в том числе переопределить new), чтобы устроить локальные мини-кучи в потоках и не нагружать без нужды общий GC. Короче, не эрланг и не раст, но все ж неплохо.

C>Если на это пофиг, то стоит посмотреть на Go.


Сколько раз смотрел, так и не смог понять, ради чего на него стоит смотреть. Там же все отвратительно. И все хорошее легко воспроизводится в том же D.
Re[10]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.06.13 06:29
Оценка: +1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, gandjustas, Вы писали:


G>>Средний ноут, в том числе ультрабук, имеет 2-4 гб памяти, которые толком занять нечем. Какой смысл для пользователя от экономии 100мб?


N>>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>>Память? А причем тут зарядка?

EP>Performance bottleneck большинства программ это взаимодействие с иерархией памяти.

Это ты про какие программы?
Среднее дсктопное приложение более 90% времени проводит в ожидании пользователя. Еще 9% в ожидании завершения IO.

EP>Плохой memory layout структур данных, лишние индерекции, лишние аллокации, плохая работа с кэшем — это всё яд для производительности — этим всем грешат "управляемые среды", поэтому и производительность намного хуже.

Бросай читать книжки 80-х годов.

EP>Требуется в 10 раз больше памяти? — косвенный признак тормозов.

Спорный вопрос. Если в памяти кешируется результат чтения с диска, то я предпочту в 10 раз больше памяти.


EP>Чтобы делать быстрый код в "управляемых средах" — нужно работать против языка, отказываться от многих средств выражения идей, спускаясь на крайне низкий уровень (даже ниже чем C).

Покажи пример чтоли?
Я вот оптимизировал C# код, который получал данные от железки постоянно, проводил небольшие расчеты и складывал в базу.
Оптимизации по памяти довольно банальные — убрать лишние аллокации, которые возникают, например, из-за замыканий.
Оптимизация производительности — использование правильных структур данных, особенно с учетом многопоточности.
Но самая главная оптимизация, которая позволила приложению нагружать процессор на 10% при 100 пакетах в секунду — все общение в внешним миром было сделано асинхронным.
Где тут низкий уровень?
И это кстати пример программы, которая работает все время.


Кстати выше я уже писал что для десктопного приложения важен perceived performance, а не объем памяти или скорость вычислений.
Во времена C++Builder люди жаловались на Visual Studio, что она компилирует медленно, а кот C++Builder быстро. Так вот МС это услышал, взял программу и замерил время компиляции с секундомером. Оказалось что VS быстрее.
Но люди жаловались, потому что VS компиляцию проводила молчав фоне, без visual feedback, а у С++Builder бежали циферки количества скомпилированных строк.
Re[16]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.06.13 09:10
Оценка: :)
Здравствуйте, Nikе, Вы писали:

IT>>Это хорошо. А второй, который shared?


N>Тот который шаред — ИМХО антипаттерн.


А стоит сказать это в форуме С++, минусов будет на три страницы.
Re[5]: Что посоветуете как аналог С++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 19.06.13 12:30
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

KP>>Не совсем. Что на JVM, что на .NET типичный подход выглядит как-то так: "главное задача, памяти бесконечно много, не хватает мощности — поставим на кластер". Умный это подход или глупый, в общем случае, – мне судить сложно. С точки зрения системного C++ разработчика – подход глупый, но, бизнес, вроде как устраивает.


I>Это не на JVM или .Net, а во вполне определенных областях. Как правило тормозные монстры до того как их сделали на джаве или нете, были еще более тормозными и глючными в своем плюсовом детстве.


Как правило после любого переписывания системы она становится лучше и быстрее. И это достоинство не столько инструмента, сколько лучшего понимания проблем и предметной области.
Re[17]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 19.06.13 15:42
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

IT>>>Это хорошо. А второй, который shared?

N>>Тот который шаред — ИМХО антипаттерн.
I>А стоит сказать это в форуме С++, минусов будет на три страницы.

shared_ptr хоть и полезен, но сильно overused.
Многие его используют абсолютно ни к месту — где достаточно unique_ptr, а где-то вообще никакой smart pointer не нужен.
Re[6]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.06.13 15:42
Оценка: :)
Здравствуйте, Nuzhny, Вы писали:

KP>>>Не совсем. Что на JVM, что на .NET типичный подход выглядит как-то так: "главное задача, памяти бесконечно много, не хватает мощности — поставим на кластер". Умный это подход или глупый, в общем случае, – мне судить сложно. С точки зрения системного C++ разработчика – подход глупый, но, бизнес, вроде как устраивает.


I>>Это не на JVM или .Net, а во вполне определенных областях. Как правило тормозные монстры до того как их сделали на джаве или нете, были еще более тормозными и глючными в своем плюсовом детстве.


N>Как правило после любого переписывания системы она становится лучше и быстрее. И это достоинство не столько инструмента, сколько лучшего понимания проблем и предметной области.


Как правило, после любого переписывания системы, она становится переписаной. А вот что бы стало быстрее и лучше в каких то аспектах, надо очень четко понимать достоинства и недостатки имеющихся решений. И тут нет никакой разницы между нативной разработкой или менеджед. Скажем, полно приложений на С++ которые переписываются чуть не раз в сезон, но почему то никак дорастут до нормального качетсва-быстродействия.
Re[11]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 19.06.13 19:21
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Я вот оптимизировал C# код, который получал данные от железки постоянно, проводил небольшие расчеты и складывал в базу.

G>Оптимизации по памяти довольно банальные — убрать лишние аллокации, которые возникают, например, из-за замыканий.
G>Оптимизация производительности — использование правильных структур данных, особенно с учетом многопоточности.
G>Но самая главная оптимизация, которая позволила приложению нагружать процессор на 10% при 100 пакетах в секунду — все общение в внешним миром было сделано асинхронным.

Для дотнетчиков оказывается обработать 100 пакетов в секунду достижение Снимаю шляпу
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.06.13 20:36
Оценка: +1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>shared_ptr хоть и полезен, но сильно overused.

EP>Многие его используют абсолютно ни к месту — где достаточно unique_ptr, а где-то вообще никакой smart pointer не нужен.

Опаньки, что же выходит, сурьёзные сиплюсники оказывается не умеют указатели использовать ?

Помнится это именно ты год назад доказывал мне, что все ровно наоборот — сиплюсники чуть не поголовно используют указатели самым правильным образом.
Re[13]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 19.06.13 21:21
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

EP>>В большинстве же приложений — это то, во что упирается производительность. А это не только скорость, но и энергоэффективность, и цена железа.

I>Большинство оно сильно разное. И если уж совсем про большинство говорить, то проблемы точно не с производительность.

А я не спорю что высокая производительность не везде нужна.

EP>>Как пример — эти аллокации вылезают по всему коду, при простейших абстракциях — просадка 16x на ровном месте.

I>Такой код в своём уме никто не пишет, кроме вчерашних плюсовиков, которые не знают как устроена память.

Talk is cheap, show me the code.

EP>>Также аллокации ухудшают локальность, что является дополнительной проблемой.

EP>>Чтобы бороться с ними, нужно от многого отказываться и работать против языка — этим редко кто занимается, ибо проще взять более подходящий инструмент.
I>С такими проблемами как ты показал, не надо бороться против языка, наоборот, его надо интенсивно использовать.

Ну так вперёд, модифицируй код выше

EP>>

EP>>Alexander Stepanov:
EP>>For many years, I tried to achieve relative efficiency in more advanced languages (e.g., Ada and Scheme) but failed. My generic versions of even simple algorithms were not able to compete with built-in primitives. But in C++ I was finally able to not only accomplish relative efficiency but come very close to the more ambitious goal of absolute efficiency. To verify this, I spent countless hours looking at the assembly code generated by different compilers on different architectures.

EP>>

I>Это ни о чем.


Это мнение человека который разрабатывал алгоритмические библиотеки для Scheme, Ada, Java, C++

I>Если производительность понимать исключительно как такты процессора, то еще можно чего то выдумывать.

I>А если скажем сюда внести работу с диском, базой или сетью, все поворачивается ровно наоборот — С++ не в состоянии обеспечить перформанс, например потому что тяжело контролировать асинхронные операции. Всё, до свидания.

stackless coroutines, stackfull coroutines, state machine, лямбды в конце концов

I>>>Почему то самые критичные куски кода пишутся практически на С или подобным образом.

EP>>Это распространённый миф
I>Это факты.

Покажи где например здесь "практически на С или подобным образом"?

I>>>Это все басни.

EP>>Это реальный опыт крупного проекта
I>Это частный случай. Почему то плюсовики имеют обыкновение яростно отрицать опыт других проектов

В этой ветке я вижу только твоё отрицание опыта FaceBook, другие проекты тут не упоминались
Re[12]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 06:59
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, gandjustas, Вы писали:


N>>>>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>>>>Память? А причем тут зарядка?
EP>>>Performance bottleneck большинства программ это взаимодействие с иерархией памяти.
G>>Это ты про какие программы?
G>>Среднее дсктопное приложение более 90% времени проводит в ожидании пользователя. Еще 9% в ожидании завершения IO.

EP>Я имел ввиду performance "активной" работы процессора. Плохая работа с памятью -> процессор будет дольше находится в "активном" режиме.

Угу, то есть ты имеешь ввиду 1% времени работы программы. Ты же понимаешь что изменение даже в несколько раз на этом 1% никто не заметить.

EP>>>Плохой memory layout структур данных, лишние индерекции, лишние аллокации, плохая работа с кэшем — это всё яд для производительности — этим всем грешат "управляемые среды", поэтому и производительность намного хуже.

G>>Бросай читать книжки 80-х годов.

EP>Поясни


EP>>>Требуется в 10 раз больше памяти? — косвенный признак тормозов.

G>>Спорный вопрос. Если в памяти кешируется результат чтения с диска, то я предпочту в 10 раз больше памяти.

EP>Речь шла об одинаковых алгоритмах и структурах в разных языках.

EP>Сравнивать производительность сред/языков по разным алгоритмам и структурам как-то совсем неправильно.

Вот я и говорю бросай книжки читать. Подавляющее большинство десктопных приложений не требует ресурсоемких алгоритмов. А если требует то важна не сама скорость работы, а perceived performance.

Например ты делаешь приложение, которое делает graph layout — довольно сложные алгоритмы. Как ты думаешь что больше приглянется пользователям: молчаливый расчет всего за 10 сек потом отображение результата, или рисование узлов графа по мере вычисления позиций в течение 15 секунд?
100% пользователей предпочтут второе, хотя реально оно в 1,5 раз медленнее.

Или недавний пример: MS пилит typescript — типизированное надмножество JS. До версии 0.8 пасер был синхронный и от этого дико тормозил на больших проектах. В 0.9 сделали его асинхронным, что по сути сделало его более медленным при сборке всего проекта, но позволило парсить фалы по частям в студии.
При замедлении алгоритма perceived performance растет.
В C++ увы такими оптимизациями сложно заниматься, потому что требуется совмещать продолжения и детерминированную финализацию.

EP>>>Чтобы делать быстрый код в "управляемых средах" — нужно работать против языка, отказываться от многих средств выражения идей, спускаясь на крайне низкий уровень (даже ниже чем C).

G>>Покажи пример чтоли?

EP>Например возьми java, и сравни скорость создания массива int, допустим 32M элементов, и создание массива (размером 16M) объектов в каждом из которых содержатся два int, т.е.:

EP>
EP>class Point2D
EP>{
EP>    public int x,y;
EP>}
EP>

EP>Это простейшая абстракция, на которую в java будет сильное penalty как по памяти, по скорости создания (на 1-3 порядка), так и по скорости доступа.
Ну Java вообще беден как язык, а в C# можно и массив структур сделать. Но это не самое важное.
Самое важное тут: как ты будешь получать этот массив и как обрабатывать. Если у тебя обработка ограниченного количества элементов за раз, то может вообще нет смысла держать в памяти все 32М, а читать с диска, на лету обрабатывать и выводить.

G>>Я вот оптимизировал C# код, который получал данные от железки постоянно, проводил небольшие расчеты и складывал в базу.

G>>Оптимизации по памяти довольно банальные — убрать лишние аллокации, которые возникают, например, из-за замыканий.
G>>Оптимизация производительности — использование правильных структур данных, особенно с учетом многопоточности.
G>>Но самая главная оптимизация, которая позволила приложению нагружать процессор на 10% при 100 пакетах в секунду — все общение в внешним миром было сделано асинхронным.
G>>Где тут низкий уровень?
G>>И это кстати пример программы, которая работает все время.

EP>То что ты достиг скорости приемлемой для твоей задачи, вовсе не означает что программа использует ресурсы эффективно (что естественно не является самоцелью), и что её производительность нельзя улучшить на пару порядков.

А зачем? Цель не оптимизация сама по себе, цель — чтобы программа работала достаточно быстро.

EP>Да, использование алгоритмических оптимизаций, уменьшение сложности — это всё важно, и особо не зависит от языка.

Во-во

EP>Но я имею в виду то, что сравнивая одинаковые алгоритмы на разных языках — на C++ гораздо легче написать код который выжимает максимум из железа, в то время как в "управляемых средах" это будет работа против языка, отказ от абстракций (см пример выше) и т.п.

А зачем максимум из железа?
Я же говорю — у тебя понятия на уровне 80-х годов. Кода в одно время работала одна программа и железо было очень слабое.
Сейчас средний ноут работает на 5% мощности, больше ему не надо. Только игрушки, конвертация видео или майнинг биткоинов могут нагрузить.
Re[14]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 10:07
Оценка: +1
Здравствуйте, MTD, Вы писали:

I>>Ты получил внятный ответ — популярные десктоп приложения были написаны еще задолго до 2005го года. Дотнет на тот момент, если не понятно,еще пешком под стол ходил.


MTD>Стало быть их нет?


Кого нет ? Популярных приложений вообще раз два и обчелся, на десктопе такие приложения живут и развиваются по десятку лет и больше. А вот специализированых приложений вполне себе хватает. Софт навроде CAD сгодится ?

> C 2002 года, за 11 лет, всего одно приложение — Paint.NET? В тоже время сколько новых популярных приложений на умирающих плюсах появилось?


Ничего нового 'популярного' даже на плюсах не появилось.
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 10:30
Оценка: -1
Здравствуйте, jazzer, Вы писали:

I>>Хорош гнать пургу. Открой короутины буста

I>>Про другому асинхронщину, многопоточность и тд в с++ не сделать.

J>Да что ты говоришь! Открой для себя Boost.Asio.


Это низкоуровневый отстой.
Re[17]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 11:23
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Корутины и продолжения не одно и тоже, но стоит глянуть как оно реализовано.

G>Я об этом и говорю, вся стройность RAII рассыпается из-за продолжений.

Чем тебя не устроил мой пример с продолжениями?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[18]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 11:28
Оценка: :)
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, gandjustas, Вы писали:


G>>Корутины и продолжения не одно и тоже, но стоит глянуть как оно реализовано.

G>>Я об этом и говорю, вся стройность RAII рассыпается из-за продолжений.

J>Чем тебя не устроил мой пример с продолжениями?


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

А что ты показал? Передача указателя на функцию? Даже без замыканий.
Re[17]: Что посоветуете как аналог С++
От: fddima  
Дата: 20.06.13 14:14
Оценка: +1
Здравствуйте, D. Mon, Вы писали:

MTD>>Много. Только из того, что у меня сейчас открыто: Google Chrome, Skype, Virtual Box, Qt Creator.

DM>Google Chrome — обертка над WebKit, который тянется с прошлого века (Initial release November 4, 1998).
Справедливости ради, Хром — это обёртка на WebCore (часть WebKit), и хромой WebCore ныне принял новое имя — Blink. Что бы было понятно, что это — это такая хрень которая в принципе выполняет львиную часть работы, но в тоже самое время абсолютно бесполезна, без тонны другого кода. Среди этой тонны другого кода ярко выделяются, например V8 и Skia, — обоих без зазрения совести можно назвать вполне новыми проектами, написанными на C++.
Re[22]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 21.06.13 00:56
Оценка: +1
Здравствуйте, gandjustas, Вы писали:


EP>>Stackless coroutine менее мощные чем stackful — если бы это было не так, то как минимум никто бы не реализовывал Boost.Coroutine.

G>Совсем наоборот, но в C++ таки требуются минимум 100 строк и еще какие-то пляски чтобы не хранить стек, поэтому и делают stackful.
G>Хранение стека по определению менее масштабируемо, ибо надо хранить весь стек, который по дефолту — 1мб и примерно на 200 потоках\файберах кончается. Хз как внутри устроен Boost.Coroutine, но мне кажется что именно так.
Однако не согласен. Стэка используется не больше чем необходимо по логике алгоритма. В контексте сопроцедур хранятся только регистры, в том числе стэковые (SP, BP). Копий всего стэка никто не делает. Так что переключение конекста между не может быть сильно дороже простого вызова функции, там ведь тоже регистры в стэк сбрасываются/извлекаются. Другое дело, что это концептуально не так симпатично может быть. Но кого это волнует?

G>Но самое главное что хрен ты это дело запустишь на нескольких ядрах.

Неправда. Я делал, в моём случае работало. И не могу вообще здесь проблему представить .
Главное гармония ...
Re[17]: Что посоветуете как аналог С++
От: FR  
Дата: 21.06.13 04:07
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>А их отправят в следующем стандарте?


Это вряд-ли, стандарты сейчас обещают часто выпекать, уже в следующем
году будет еще один.

FR>>Так и шарпщики же далеко не все одобряют var и linq.


IT>Не любят в основном те, кто в этом не смог разобраться. За это и не любят.


Так аналогично.
Re[10]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 16:20
Оценка: :)
M>Ты отстал от жизни. Почитай о rvalue references и move-семантике, прежде чем брызгнать слюной и показывать свою некомпетентность.

Ну я же так и говорю! Кто-то читает книжки, а кто-то создает реальные проекты! Спрашивается, кто из них больший профессионал?
Re[10]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 16:39
Оценка: :)
M>Ты отстал от жизни. Почитай о rvalue references и move-семантике, прежде чем брызгнать слюной и показывать свою некомпетентность.

Да, кстати... Отстал, не отстал. Как это отменяет мною сказанное?
Re[21]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 16:53
Оценка: :)
M>>А подробнее? Что именно, "нормальный софтверный инженер", исключил бы из нововведений с++11?

MTD>Коллега, нашли кого спрашивать


Вот смотрите, коллега. Есть D. Mon, есть bazis1 со своими проектами и компаниями которые приносят им деньги. Еще есть ИТ со своим проектом (не знаю как там с монетизацией). Я понимаю как они мыслят (и с чем-то согласен, с чем-то нет) и для меня эти люди — профессионалы. А Вы чем можете похвастаться? Знанием стандарта С++ и никому ненужных фич? Ну что — поздравляю!
Re[11]: Что посоветуете как аналог С++
От: alex_public  
Дата: 21.06.13 17:04
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>На C++ вообще-то да. Покажи как на C++ будет выглядеть программа, которая: по нажатию кнопки получает данные из сети, потом их обрабатывает, пишет в базу и отправляет в сеть.

G>При этом обработка минимальная, а все остальное время программа должна спать. При этом надо отправку в сеть и запись в базу сделать параллельно.
G>Ну и надо не забывать что пока эти пляски происходят пользователь может еще раз нажать кнопку отправки.
G>Кстати желательно при всем этом не плодить сотни потоков.

Я заметил с этой недавней модой на асинхронность у многих программистов какую-то узость мышления. Почему-то всегда предполагается что возможны только две модели:

1. По потоку на запрос. И это вроде как не тянет серьёзные нагрузки.
2. Работаем в одном потоке асинхронно. Ну т.е. на практике то там на самом деле всё равно несколько потоков, просто оставшиеся не в нашем коде живут (или вообще системные).

А модель с несколькими своими потоками (с разным кодом каждый) почему-то все забыли. А ну да, при этом же потребуется продумать правильную стратегию доступа к памяти и прочие страаааашные вещи. ))) Так что лучше мы воспользуемся простеньким асинхронным способом, который худо-бедно даст средненькую производительность без напряга для мозгов. )))
Re[11]: Что посоветуете как аналог С++
От: michae1  
Дата: 21.06.13 17:12
Оценка: +1
Здравствуйте, Олег К., Вы писали:

M>>Ты отстал от жизни. Почитай о rvalue references и move-семантике, прежде чем брызгнать слюной и показывать свою некомпетентность.

ОК>Ну я же так и говорю! Кто-то читает книжки, а кто-то создает реальные проекты! Спрашивается, кто из них больший профессионал?

Ну о чем тут спорить что ты мне хочешь доказать, что на старом багаже можно далеко уехать? Увы, это миф. IT сфера развивается чрезвычайно интенсивно, хочешь быть востребованным разработчиком — учись, устал и нет запала — иди в менеджеры, управляй людьми.

офтопик:
Интересная статистика: из последних 10 с++ разработчиков, которых мне пришлось собеседовать, только 2 имели какие-то представления о новшествах с++11. С одной стороны Харьков все-таки переферия, с другой были среди них люди очень компетентные, с большим опытом и серьезными проектами за плечами. Вот мне непонятно откуда такая неосведомленность, что это: усталость от кодинга и нежелание делать что-то выходящее за рамки проектных задач или просто самоуверенность и убежденность, что лучшее решение уже найдено и ничего лучшего быть не может
Re[21]: Что посоветуете как аналог С++
От: alex_public  
Дата: 21.06.13 17:18
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, MTD, Вы писали:


MTD>>Здравствуйте, gandjustas, Вы писали:


G>>>Я думаю что без потоков не как, а это жопа для масштабируемости.


MTD>>Во-первых, вариантов масса, например есть неблокируемый ввод-вывод, во-вторых потоки — жопа только для очень нагруженных приложений, уж чтение из COM-порта — эталон высокопроизводительных приложений на .Net (шучу, извини), в такие задачи точно не входит.


G>Так ты (или не только ты) же сам утверждаешь что C++ быстрее всего, а сам предлагаешь априори неэффективный по масштабируемости способ.


Почему потоки — это жопа для масштабируемости? Под масштабированием подразумевается запустить 1000000 копий одной программы на компьютере? ) Или же это у нас просто очередной пример мышления "если с потоками, то по одному на запрос"? )
Re[21]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 17:52
Оценка: :)
ОК>>Вот нафига вар в таком коде?

IT>Так я не понял что в этом плохого? То, что тебе это может не нравится — это вопрос не более чем твоих предпочтений. А что в этом объективно плохого?


Оно там не нужно но я пойду твоим путем: что в этом [объективно] хорошего? Ясно ведь что там инт должен быть и, более того, ты знаешь что у вар есть свои ограничения. А теперь ты ответь еще на один вопрос. Для чего Майкрософт ввел вар в язык? И исходи из этого. Хотя я это уже и говорил тут. Итак, с тебя два ответа.
Re[23]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 22.06.13 23:50
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Чтобы ты лучше понимал что происходит, распишу по-русски как оно работает. Предположим что это десктопное приложение.

G>1) вызывается handler
G>2) делается запрос на сервер, метод сразу же завершается и уходит а ожидание сообщений или делает полезную работу
G>3) Когда приходит заголовок ответа вызов хендлера маршалится в UI поток через цикл обработки сообщений
G>4) Когда в UI потоке находится время обработать, он проверяет успешность вызова и запускает асинхронное чтение данных ответа и завершает вызов.
G>5) когда весь ответ прочитан вызов хендлера снова маршалится в UI поток
G>6) Кода в UI потоке находится время, он добавляет текст ответа в TextBox
G>Такая архитектура позволяет делать очень много подобной "работы", вообще без создания потоков, при этом ни на долю секунды не потеряв отзывчивость интерфейса.
G>Давай, детка, сделай это на C++.

Я смотрю в этом топике у радикальных C#-стов мода на годовалый await и хамство — это профессиональное?
"Чтобы ты лучше понял", C++ код приведённый выше именно это и делает, ну разве кроме EnsureSuccessStatusCode и второго await'а которых не было в исходном запросе
Re[24]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 22.06.13 23:58
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, gandjustas, Вы писали:


G>>Чтобы ты лучше понимал что происходит, распишу по-русски как оно работает. Предположим что это десктопное приложение.

G>>1) вызывается handler
G>>2) делается запрос на сервер, метод сразу же завершается и уходит а ожидание сообщений или делает полезную работу
G>>3) Когда приходит заголовок ответа вызов хендлера маршалится в UI поток через цикл обработки сообщений
G>>4) Когда в UI потоке находится время обработать, он проверяет успешность вызова и запускает асинхронное чтение данных ответа и завершает вызов.
G>>5) когда весь ответ прочитан вызов хендлера снова маршалится в UI поток
G>>6) Кода в UI потоке находится время, он добавляет текст ответа в TextBox
G>>Такая архитектура позволяет делать очень много подобной "работы", вообще без создания потоков, при этом ни на долю секунды не потеряв отзывчивость интерфейса.
G>>Давай, детка, сделай это на C++.

EP>Я смотрю в этом топике у радикальных C#-стов мода на годовалый await и хамство — это профессиональное?

Где ты хамство увидел? Тебе еще никто не хамил.
Мода на await как раз потому что он маленький и очень мощный. Можно написать пример в 3 строки, который другие языки не осилят в 100 строк.

EP>"Чтобы ты лучше понял", C++ код приведённый выше именно это и делает, ну разве кроме EnsureSuccessStatusCode и второго await'а которых не было в исходном запросе

"Именно это" это что? Как он маршалит в UI? Как он делает аснихронные вызовы?
Ну и код background в студию. В нем скрыто самое интересное.
Re[24]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.06.13 05:44
Оценка: -1
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, gandjustas, Вы писали:


G>>Чтобы ты лучше понимал что происходит, распишу по-русски как оно работает. Предположим что это десктопное приложение.


G>>1) вызывается handler

G>>2) делается запрос на сервер, метод сразу же завершается и уходит а ожидание сообщений или делает полезную работу
G>>3) Когда приходит заголовок ответа вызов хендлера маршалится в UI поток через цикл обработки сообщений
G>>4) Когда в UI потоке находится время обработать, он проверяет успешность вызова и запускает асинхронное чтение данных ответа и завершает вызов.
G>>5) когда весь ответ прочитан вызов хендлера снова маршалится в UI поток
G>>6) Кода в UI потоке находится время, он добавляет текст ответа в TextBox

_>Ну и зачем проверка успешности вызова делается в UI потоке? Какой смысл в этом? ) Это как раз классический пример кривой архитектуры.

А в случае ошибки выкинуть messagebox? Думаешь из non-ui thread это хорошая идея?
Да и откуда известно что ты там делать будешь? Просто status code сравнить или что-то сложное.

Как раз по умолчанию все маршалить UI поток для обработки — хорошая идея. Отключается одной функцией если ты пишешь либу.

G>>Такая архитектура позволяет делать очень много подобной "работы", вообще без создания потоков, при этом ни на долю секунды не потеряв отзывчивость интерфейса.

_>Не надо иллюзий. Потоки всё равно есть, просто они в чужом коде.
Там пул потоков, обрабатывающих IOcompletion. Но это детали реализации. В WinRT может что-то другое работает.

G>>Давай, детка, сделай это на C++.


_>Абсолютно без проблем этот код повторяется с помощью std::async и boost.coroutines. Будет где-то на пару строк длиннее чем C# вариант. Но лично я никогда не буду писать такой код, т.к. на мой взгляд это явно кривая архитектура. Я предпочитая использовать эрланговскую модель потоков, которая без проблем реализуется и на C++ и на c#.

Если без проблем повторяется, то повтори. Только не скрывай важные детали.
Интереснее всего увидеть как осуществляется прерывание метода и передача данных. и как это все работает в реальном окружении (обработка нажатий конопок в интерфейсе).
Ибо твои boost.coroutines скорее всего ни один UI-Фреймворк не поддерживает.

G>>Более того, на сервере еще интереснее ситуация. Сделав правильно обработку входящих запросов можно обработанные данные писать на диск\в базу во время того как клиент данные еще отправляет. Причем для этого не надо плодить потоки.

G>>Это позволяет таких показателей латентности добиться, что ни одному серверу на C++ не снилось.

_>Хаха. ))) А можно поинтересоваться, какой процент от рынка например http-серверов занимают серверы написанные на c#? )

Что ты имеешь ввиду под http-сервером? Штуку которая принимает http запрос и отдает ответ или штуку которая принимает http запрос и передает управление другому модулю?
Если второе, то таких нет по историческим причинам. Все промышленные серверы написаны давно, причем IIS например имеет часть в ядре, так что C# туда не пролезет.
Другое дело что это довольно малая часть всего конвеера обработки запросов, гораздо большая часть в том же IIS — asp.net, который 100% на .NET

Хотя вот в Singularity сделали веб-сервер на .NET, и, по тестам, он неплохо себя показал.
Re[24]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 10:06
Оценка: :)
Здравствуйте, alex_public, Вы писали:

_>P.S. Кстати, после того как мы выяснили что асинхронный код не просто можно записывать на C++, но он ещё и даже короче, было бы очень интересно ещё и сравнить быстродействие...


Похоже сиплюсплюс это уже признак деградации

Скажу страшное устройство, файловая система, база данных не умеют делать процессинг быстрее для какого то реквеста, сделаного на особенном языке программирования.
То есть, в коде прошивки HDD нет таких строчек
if(code_of_user_progra_that_made_request == C_PLUS_PLUS)
   FastestProcessing();
else
   SlowProcessing();


Вот когда такой код появится в прошивке, драйвере файловой системы или движде базы данных или веб сервере, вот тогда и можно будет производительность сравнивать.
Re[2]: Что посоветуете как аналог С++
От: _NN_ www.nemerleweb.com
Дата: 23.06.13 20:11
Оценка: :)
Здравствуйте, Grundik2, Вы писали:


G>Когда писал, так и знал, что сейчас начнется


Ничего, в итоге все придут к метапрограммированию, макросам, DSL и Nemerle
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[24]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 23.06.13 20:42
Оценка: +1
Здравствуйте, Олег К., Вы писали:

IT>>Это твои личные предпочтения.

ОК>Я точно также могу сказать: это твои личные предпочтения!

Вообще-то я ещё никак не выразил своё отношение к var. Я лишь спросил у тебя что плохого в var, но внятного ответа пока так и не услышал.

ОК>Конкретно там был инт потому что у лонговых литералов в конце суффик "Л."


Да пофиг что там было. Там был счётчик цикла, остальное не важно, в том числе и тип этого счётчика.

ОК>На счет шортов не помню но это очень даже хорошо что ты упомянул эти типы поскольку ты, человек, глядя на эту конструкцию не смог сказать истинный тип переменных. Мелочь? Возможно. Но я за то чтобы глядя на переменную сразу видеть ее тип.


Зачем тебе видеть её тип? Вот знаешь ты теперь, что тип этой переменной int и что это тебе даёт? Только объективно, а не "мне хочется знать".

ОК>Кстати, что там покажет Интеллисенс если навести мышку на переменную объявленную как вар?


Подведи и посмотри.

ОК>По мне, так это не мусор а получше чем писать вар. Возможное исключение: всякие "вложенные" дженерики. Ну и для линка, конечно же.


Это самый натуральный мусор. Для понимания сути алгоритма типы не важны. Важны возможные действия на данными, например, возможность инкрементирования и использования в качестве индекса в примере с for. Это хорошо подтверждается функциональнами языками, которые по своей выразительности кода внутри метода далеко опережают традиционные языки, в том числе за счёт развитой системы вывода типов.

IT>>Не знаю. Какие?

ОК>Да они только для локальных переменных. Например их нельзя использовать в качестве параметров и return type-а у методов и нельзя использовать в качестве членов класса. Если первое объяснимо, то я не могу предположить ничего на счет второго. По крайней мере на ум ничего не приходит в данный момент. То есть получаются какие-то "кастраты."

Вывод типов прекрасно работает на уровне параметров и возаращаемых значений. Вот пример:

...Select(x => x.ToString())


тип параметра x и тип возвращаемого значения выводятся автоматически.

Вывод типов на уровне методов широко обсуждался в форуме Nemerle. В результате пришли к выводу, что вывод типов на уровне методов может легко привести к ситуации, когда интерфейс классов и целых компонентов может зависеть от внутренней реализации методов, что неизбежно приведёт к непредсказуемым ломающим изменениям. В результате от вывода типов на уровне методов решили отказаться. Думаю, с C# ситуация обстоит аналогичным образом.

ОК>Я не говорил "придумали." Я сказал "ввели в язык" но да, это все для линка было сделанно было в конечном итоге. Как побочный результат, можно использовать вар для "вложенных дженериков" но уж точно не считаю что вар стоит использовать для интов или простых классов как в твоем примере.


Ещё раз. var может быть и сделан для Linq, но по сути это реализация простенького вывода типов, известного уже давным давно в функциональных языках. Только в ФП вывод типов гораздо мощней. В них типы могут выводится из использования, а var — это вывод типов из инициализации. Если тебе хочется понять преимущества и недостатки вывода типов, то тебе нужно его рассматривать не в узких рамках "for (var i=...", а попытаться осознать всю концепцию и уже потом делать выводы.

IT>>С тебя всё ещё один — что объективно плохого в var?

ОК>Объясняю это на протяжении нескольких постов.

Пока я не видел ни одного объяснения.

ОК>Плохого в них ничего нет но их не создавали чтобы девелоперы использовали их налево и направо. Теперь ты объясни мне что в них хорошего (кроме анонимных типов и вложенных дженериков). Я пока что не услышал ответа.


Кури вывод типов как концепцию. А ещё лучше возьми, например, Немерле и поработай на нём хотя бы пару месяцев. Такие вопросы по for как ты задаёшь отпадут сами собой.

ОК>Ну и немного не по теме. var — contextual keyword. Могли бы уж и зарезервировать его полностью. А то коряво как-то. Ровно также как и с value в пропертях.


Это к Хейльсбергу.
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[28]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 09:24
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>>>Сферического "интенсивного заиспользования" java'ы за десяток сообщений ты так не показал — всё, уже не интересно.

I>>Джавый я как то не мог обещать показать, ибо на ней сроду не писал.

EP>А это что
Автор: Ikemefula
Дата: 23.06.13
:

EP>

EP>>>Как пример — эти аллокации вылезают по всему коду, <b><u>при простейших абстракциях</u></b> — просадка 16x на ровном месте.
I>>Такой код в своём уме никто не пишет, кроме вчерашних плюсовиков, которые не знают как устроена память.
EP>[...]
I>>С такими проблемами как ты показал, не надо бороться против языка, наоборот, его надо интенсивно использовать.

EP>?
EP>Или в твоём понимании "интенсивно использовать язык" = "сменить его на C#"?

В моём понимании здесь нет ни слова про джаву Код который ты привел, пишут именно вчерашние сиплюсники, силу многолетней привычки "зачем думать и так всё быстро".
Покажи нормальную задачу, в терминах юзера, без использования слов "массив, элемент, индекс".
Я на прошлой работе занимался визуализацией, при чем практически все было самописным — рендеринг, векторная алгебра, трансформации и тд и тд и тд.
Выяснил, что дотнет может справляться с вычислениями быстрее, чем нативная либа с отрисовкой результатов. Тут появляешсья ты и высасываешь из пальца задачу "в цикле по массиву элементов..."

Итого, пока что у нас расклад такой — я привел примеры, где С++ используют без плюсов или даже пишут "против языка", а вот от тебя пока что ничего не было.

P.S. Если всё что ты хотел сказать, это разница во времени при проходе по массиву между C++ и С#, то мог бы и не напрягаться, я сам про это писал на этом форуме, при больше, чем всех твоих сообщений вместе взятых.
Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 10:19
Оценка: :)
Здравствуйте, alex_public, Вы писали:

_>Хорошо бы на примере nginx... Он как раз с относительно небольшими исходниками, а при этом занимает второе место после апача среди активных сайтов и применяется обычно на самых нагруженных...


Кстати, еще один хороший аргумент — nginx целиком и полностью на С. Казалось бы, раз С++ такой крутой, почему такой хардкор пишут на С ?
Re[27]: Что посоветуете как аналог С++
От: alex_public  
Дата: 24.06.13 20:34
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>


Что, страшненько? ) Можно подумать что под капотом у .net всё намного красивее. )))

А теперь делаем минимальную украшательную магию:

#define BEGIN_ASYNC coroutines_list.emplace_back([&](Coroutine::caller_type& __coroutines_parameter){
#define END_ASYNC });
#define make_async(e) _make_async<decltype(e)>([](){return e;}, __coroutines_parameter)
template<typename T>
T _make_async(function<T()> l, Coroutine::caller_type& c)
{
    auto r=async(launch::async, l);
    while(r.wait_for(chrono::seconds(0))!=future_status::ready) c();
    return r.get();
}


И тогда тот наш страшненький код можно переписать так:

void handler(object& sender, TaskArgs& args)
{
BEGIN_ASYNC
    HttpClient client;
    auto response=await_async(client.Get(args.Url, args.Cancellation));
    response.EnsureSuccessStatusCode();
    textBox.Text+=await_async(response.Content.ReadAsString());
END_ASYNC
}


Как говорится найдите 10 отличий от C# варианта... Хотя на самом деле 2 отличия есть и оба в пользу C++:
1. Нам не потребовалось заводить в классе HttpClient отдельную функцию для объявления асинхронного вызова — хватило вызова старого синхронного метода. Хотя естественно никто не мешает и отдельно объявить, если реализации различаются.
2. Мы можем здесь добавить код (после END_ASYNC), который выполнится после первого асинхронного вызова, но до его завершения.

Да, но несмотря на все эти красивости я бы всё равно не стал писать так — мне не нравится подобный стиль реализации многопоточности.


I>Красиво, это когда компилятор умеет связывание рахных сортов. В С# тоже можно все упаковать, притом используя именно поддержку компилятора.


Ну так мы и приходим к выводу что данная схема асинхронности одинаково легко реализуется и на C++ и на C#. Только в C# он жёстко зашит, а в C++ мы можем его подстроить под себя как хотим.
Re[28]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 07:18
Оценка: -1
Здравствуйте, alex_public, Вы писали:

_>Как говорится найдите 10 отличий от C# варианта... Хотя на самом деле 2 отличия есть и оба в пользу C++:

_>1. Нам не потребовалось заводить в классе HttpClient отдельную функцию для объявления асинхронного вызова — хватило вызова старого синхронного метода. Хотя естественно никто не мешает и отдельно объявить, если реализации различаются.

В C# не надо ничего объявлять отдельно. Не совсем ясно, зачем тебе "старый синхронный метод"

_>2. Мы можем здесь добавить код (после END_ASYNC), который выполнится после первого асинхронного вызова, но до его завершения.


Опаньки ! Как все очевидно — в конце метода находится код который выполнится в начале

_>Да, но несмотря на все эти красивости я бы всё равно не стал писать так — мне не нравится подобный стиль реализации многопоточности.


Правильно, потому что отстой, о чем я и говорю.

I>>Красиво, это когда компилятор умеет связывание рахных сортов. В С# тоже можно все упаковать, притом используя именно поддержку компилятора.


_>Ну так мы и приходим к выводу что данная схема асинхронности одинаково легко реализуется и на C++ и на C#. Только в C# он жёстко зашит, а в C++ мы можем его подстроить под себя как хотим.


Ну тогда тебе не составит труда показать, чего же нельзя подстроить в C# и желательно что бы это было привязано к актуальной задача, а не выглядело навроде "а в конце метода я хочу что бы был код, который реально вызовется в начале"
Re[29]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 09:24
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

I>У тебя всего лишь ручное разделение кода и данных. Проблемы с расширением возникают как раз из за ручного разделения, а не из за маршалинга. Странно что тебе пришла в голову мысль, что может быть необходимость маршалить чего то в рамках одного процесса


Забавно. ))) Похоже у нас тут у кое-кого раздвоение личности... Например здесь http://www.rsdn.ru/forum/philosophy/5208835
Автор: Ikemefula
Дата: 23.06.13
некий Ikemefula как раз рассказывает нам об ужасах маршалинга. )))
Re[33]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 11:57
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>В прошлый раз я все что нужно показал, в твоем новом примере только строчек больше.


Ты нигде ничего не показал, а только уворачиваешься от ответа всеми возможными способами. И меня это уже если честно утомило. Или ответь один раз точно на конкретные вопросы или будем считать что ты слил по всем пунктам.

1. Покажи чем принципиально этот http://www.rsdn.ru/forum/philosophy/5208679
Автор: gandjustas
Дата: 23.06.13
код отличается от этого http://www.rsdn.ru/forum/philosophy/5210481
Автор: alex_public
Дата: 25.06.13
. Это же ведь ты утверждал они чем-то принципиально отличаются (как там, эмуляция кажется?)...

2. Покажи точный аналог на C# этого http://www.rsdn.ru/forum/philosophy/5210899
Автор: alex_public
Дата: 25.06.13
кода. И поясни почему он на твой взгляд выглядит не хуже C++ варианта (ты же это утверждал, не так ли?).
Re[30]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 12:35
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Код который ты привел, пишут именно вчерашние сиплюсники, силу многолетней привычки "зачем думать и так всё быстро".


EP>Код показывает к чему приводят минимальные абстракции в java


Ровно к тому же, что и в Boost

EP>И если нужно писать быстрый код, от этих абстракций придётся отказаться.


Правильно, смотри сишный nginx или сфинкс.

I>>Покажи нормальную задачу, в терминах юзера, без использования слов "массив, элемент, индекс".

EP>Я уже показывал — найти сумму векторов

Никаких требований и ограничений стало быть нет ? Ну тогда идельный результат "нашел!"

I>>Выяснил, что дотнет может справляться с вычислениями быстрее, чем нативная либа с отрисовкой результатов.

EP>"Выяснил, что дотнет складывает два числа быстрее, чем нативная либа решает СЛАУ", что за бред?

Похоже, если в контексте дотнета ты слышишь вычисления, то тебе мерещится "складыват два числа". Это скорее к доктору, а не на форум.

I>>Итого, пока что у нас расклад такой — я привел примеры, где С++ используют без плюсов или даже пишут "против языка", а вот от тебя пока что ничего не было.

EP>То есть Eigen и Facebook ты за примеры не считаешь?

По моему мы остановились на том, что ты не понимаешь слово "типичный" и что это означает. А на счет фейсбука даже не знаю, php вместо С++ как пример классной нативной разработки ?

I>>P.S. Если всё что ты хотел сказать, это разница во времени при проходе по массиву между C++ и С#, то мог бы и не напрягаться, я сам про это писал на этом форуме, при больше, чем всех твоих сообщений вместе взятых.


EP>Мой поинт в том, что за многие абстракции в управляемых средах нужно платить производительностью. Массив структур на java — это простейший конкретный пример


Ровно тоже можно сказать и про С++. Более того — даже про С можно сказать тоже самое.

EP>Но почему-то за 20 страниц флейма до тебя это так и не дошло


А по моему с тем фактом, что низкоуровневы код быстрее на С++ относительно C# в этом топике никто нигде ни разу не спорил. Тебе просто померещилось чего то.
Re[36]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 12:53
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Макры использовать можно, а лямбды нельзя ? :faceplam:


Почему нельзя? ) Можно конечно что угодно. Собственно я и сказал что без лямбд не обойтись. А Sinix просто попытался попробовать как-нибудь без них...
Re[25]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 25.06.13 15:06
Оценка: -1
IT>>>Это твои личные предпочтения.
ОК>>Я точно также могу сказать: это твои личные предпочтения!

IT>Вообще-то я ещё никак не выразил своё отношение к var. Я лишь спросил у тебя что плохого в var, но внятного ответа пока так и не услышал.


Ну начинаются эти виляния! Хорошо, поделись своим отношением к вар явно.

Предпочел не услышать.

ОК>>Конкретно там был инт потому что у лонговых литералов в конце суффик "Л."


IT>Да пофиг что там было. Там был счётчик цикла, остальное не важно, в том числе и тип этого счётчика.


Все важно. Если тип слишком маленький, то может возникнуть переполнение, к примеру.

ОК>>На счет шортов не помню но это очень даже хорошо что ты упомянул эти типы поскольку ты, человек, глядя на эту конструкцию не смог сказать истинный тип переменных. Мелочь? Возможно. Но я за то чтобы глядя на переменную сразу видеть ее тип.


IT>Зачем тебе видеть её тип? Вот знаешь ты теперь, что тип этой переменной int и что это тебе даёт? Только объективно, а не "мне хочется знать".


Нету такой вещи как "variable in isolation." Ты работаешь с переменной, тебе нужно знать какие значения она может принимать, ты можешь ее послать в метод или вернуть из метода (а в объявлении метода тебе нужно будет все-таки указать типы!), тебе нужно знать какие методы на ней можно вызвать и наконец ты можешь написать так:

var myVariable = 10;

if (myVariable is long)
    DoSomething();


То есть (ошибочно) будешь думать что компилятор выведет один тип а на деле выведет другой.

ОК>>По мне, так это не мусор а получше чем писать вар. Возможное исключение: всякие "вложенные" дженерики. Ну и для линка, конечно же.


IT>Это самый натуральный мусор. Для понимания сути алгоритма типы не важны. Важны возможные действия на данными, например, возможность инкрементирования и использования в качестве индекса в примере с for. Это хорошо подтверждается функциональнами языками, которые по своей выразительности кода внутри метода далеко опережают традиционные языки, в том числе за счёт развитой системы вывода типов.


Что бы ты не говорил, человек все равно мысленно работает как компилятор. Глядя на код, человек держит в уме типы переменных т.к. типы и определяют алгоритм. Что происходит здесь? Медленный линейный поиск по массиву или быстрый look-up в HashSet-e? Даже в случае с счетчиком тебе нужно знать что у типа есть оператор ++. Да и сам счетчик, это уж слишком простое и явное название. Другие имена могут быть не настолько явными. Соседний ответ "подкупил" меня вначале своим спокойствием.

IT>>>Не знаю. Какие?

ОК>>Да они только для локальных переменных. Например их нельзя использовать в качестве параметров и return type-а у методов и нельзя использовать в качестве членов класса. Если первое объяснимо, то я не могу предположить ничего на счет второго. По крайней мере на ум ничего не приходит в данный момент. То есть получаются какие-то "кастраты."

IT>Вывод типов прекрасно работает на уровне параметров и возаращаемых значений. Вот пример:


IT>
IT>...Select(x => x.ToString())
IT>


IT>тип параметра x и тип возвращаемого значения выводятся автоматически.


Я не уверен что ты понял меня. Ты вырезал часть диалога. Речь шла об ограничениях контекстно-ключевого слова вар.

ОК>>Я не говорил "придумали." Я сказал "ввели в язык" но да, это все для линка было сделанно было в конечном итоге. Как побочный результат, можно использовать вар для "вложенных дженериков" но уж точно не считаю что вар стоит использовать для интов или простых классов как в твоем примере.


IT>Ещё раз. var может быть и сделан для Linq, но по сути это реализация простенького вывода типов, известного уже давным давно в функциональных языках. Только в ФП вывод типов гораздо мощней. В них типы могут выводится из использования, а var — это вывод типов из инициализации. Если тебе хочется понять преимущества и недостатки вывода типов, то тебе нужно его рассматривать не в узких рамках "for (var i=...", а попытаться осознать всю концепцию и уже потом делать выводы.


Ну вывод типов и вывод типов! Что, только потому что "вар это вывод типов" его следует пихать направо и налево? Несколько странный аргумент. Ты еще начни закатывать глаза и простирать руки к небу: "о, вывод типов!" Напомню что речь шла о том что если можешь объявить тип явно, объяви его. Ну и соответственно мисюз или абьюз этого контекстно-ключевого слова.

IT>>>С тебя всё ещё один — что объективно плохого в var?

ОК>>Объясняю это на протяжении нескольких постов.

IT>Пока я не видел ни одного объяснения.


Отказался увидеть.

ОК>>Плохого в них ничего нет но их не создавали чтобы девелоперы использовали их налево и направо. Теперь ты объясни мне что в них хорошего (кроме анонимных типов и вложенных дженериков). Я пока что не услышал ответа.


IT>Кури вывод типов как концепцию. А ещё лучше возьми, например, Немерле и поработай на нём хотя бы пару месяцев. Такие вопросы по for как ты задаёшь отпадут сами собой.


Не считай других глупее себя! Ты вбил себе в голову две вещи. Первая. Вывод типов это круто и поэтому надо везде его использовать. Вторая. Ты решил что я не знаю что такое вывод типов и что такое вар в Шарпе и соответственно приплел в разговор хотя речь была совсем не о выводе типов а о том где и как использовать контекстно-ключевое слово вар. То что это вывод типов к изначальному "вопросу" никакого отношения не имеет. И да, кроме этого твоего вывода типов, я так и не услышал чем же хороши вар в контексте объявления того же счетчика (вместо явного написания инта).

Вопросов по поводу вара у меня нет. Перефразируя тот "вопрос," я скажу что вар в тех двух объявлениях нифига не нужны.

ОК>>Ну и немного не по теме. var — contextual keyword. Могли бы уж и зарезервировать его полностью. А то коряво как-то. Ровно также как и с value в пропертях.


IT>Это к Хейльсбергу.


Так можно сразу отсылать к этому чуваку по любому вопросу. Это я тебе сказал про корявость этих двух фич. Надеюсь ты не отрицаешь этого?
Re[40]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 16:19
Оценка: :)
Здравствуйте, alex_public, Вы писали:

_>В том то и дело что не всё что угодно можно реализовать в либе, а только то, что позволяют конструкции языка. Например написать Boost.Spirit на C# просто не реально. Причём как по скорости, так и по синтаксису.


Написать просто что бы написать а требования к производительности взяты от балды ? Цель какая у этой задач ?

_>Ну или в нашем конкретном случае, ты не сможешь написать код полностью подобный моему в C#, т.к. там реализация асинхронности обязательно резко возвращает управление из функции после вызова await. В то время как с нормальными coroutines это совсем не обязательно.


Нормальных короутин в С++ нет и быть не может, они поддерживаются либой. Это понятно ?

Если таки речь про либу и патчить стек это нормально, то в дотнете, как и в джаве, никто не мешает сделать вот так https://code.google.com/p/coroutines/
Это собственно аналог boost.coroutines.

"там реализация асинхронности обязательно резко возвращает управление из функции после вызова await"

Это и есть асинхронность. Если управление не возвращать, асинхронности не получится. Как то так.


I>>еще раз у тебя 5 паралельных тасков, каждый из которых асинхронный, из двух цепочек. Сколько цепочек, вообще не важно. Одна, две три — нет разницы. Это понятно ?


_>Ну так если разницы нет, то в чём проблема была показать код? ) У меня уже был КОНКРЕТНЫЙ пример на C++ и я хотел в точности соответствующий ему аналог на C#.


У меня нет никакого желания изыскивать задачу под цель. Не можешь выдать эту задачу — так и пишь.

I>>Я показал тебе другой фокус — как ожидать таски, которые ты запускаешь. В твоем коде этого нет.


_>Как раз именно это он и делает. )))


У тебя запускается 5 паралельных тасков. Покажи цитатой из кода ожидание именно этих пяти тасков, а не тех, что внутри этих пяти.
Re[28]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 25.06.13 16:47
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:


I>Покажи весь код, для полноты картины. Если UI loop и короутина работают асинхронно, покажи именно эту асинхронщину. Ну и до кучи покажи как руками написать метод навроде getline.


Я же тебе показал здесь: http://rsdn.ru/forum/philosophy/5209707.1
Автор: Mazay
Дата: 24.06.13

Смотри реализацию connect_resume.
Главное гармония ...
Re[26]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 25.06.13 16:52
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>>>когда получит управление код после getline ? Ну, например, если сделать вот так

I>>>
I>>>getline(client_stream, msg);
I>>>SendMessage(hwnd,WM_SET_TEXT,msg, NULL); // когда сюда придет управление
I>>>


EP>>Управление придёт после того как msg прочитается из stream'а.


I>А где же асинхронщина ? Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.


Так а после await когда придёт управление? Это же полный аналог твоего кода:
private async void handler(object sender, TaskArgs args)
{
    string result = await new Task(() => Download(args.Url), args.Cancellation);

    textBox.Text += result;   // когда сюда придет управление
}
Главное гармония ...
Re[27]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 17:28
Оценка: :)
Здравствуйте, Mazay, Вы писали:

I>>А где же асинхронщина ? Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.


M>Так а после await когда придёт управление? Это же полный аналог твоего кода:

M>
M>private async void handler(object sender, TaskArgs args)
M>{
M>    string result = await new Task(() => Download(args.Url), args.Cancellation);

M>    textBox.Text += result;   // когда сюда придет управление
M>}
M>


Нет, это не аналог. Этот хандлер вернет управление сразу, без блокирования, то есть, отпустит UI Loop. А вот внутренности хандлера будут работать иначе — сколько раз эти внутренности пнет шедулер — зависит от кода хандлера.
Re[30]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 17:29
Оценка: -1
Здравствуйте, Mazay, Вы писали:

EP>>getline тут самый стандартный, который std::getline.

M>Ну ты не перебарщивай. К этому getline нужна таки обёртка, которая будет откидывать управление из корутины и получать его назад, по типу той что я писал выше.

Качественно ты его слил
Re[42]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 17:52
Оценка: -1
Здравствуйте, alex_public, Вы писали:

I>>Написать просто что бы написать а требования к производительности взяты от балды ? Цель какая у этой задач ?


_>Там много для чего можно использовать. Например те же самые Boost.Xpressive (регэкспы кодирующиеся прямо в C++ и компилирующиеся там же) релизованы через Spirit. Но лично я чаще всего вижу его как максимально быстрый и удобный парсер (хотя там есть и генератор и лексер).


Цель этой максимальной быстрости ? Если быстро парсить регэкспы в компайлтайм, то не ясно, как часто это становится узким местом, ибо регэкспы в рантайме это совсем другая вещь. Да и ДСЛ для этого корявый.

I>>Если таки речь про либу и патчить стек это нормально, то в дотнете, как и в джаве, никто не мешает сделать вот так https://code.google.com/p/coroutines/

I>>Это собственно аналог boost.coroutines.

_>Между "никто не мешает сделать" и "продукт выпущен" большая разница. Так то я не спорю что в теории это возможно везде. А вот где можно прямо сейчас взять и использовать — это совсем другой вопрос.


Ты лучше помоги EP, а то он не может асинхрощину найти в синхронном коде. Если нужно решать конкретные задачи — их легко порешать через async/await, безо всяких либов.
Собтсвенно это короутины, к которым прикручен шедулер. В бусте точно так же и сделано и это одна из причин по которой EP не может объяснить, как короутина вызовт UI Loop — нужно руками добиться этого, например вынести UI loop в такую же короутину. Только здесь получается не асинхронщина, а кооперативная многозадачность, что собтсвенно и делает короутина. Больше ничего она не делает. Вообще. Никогда. Нигде.

I>>"там реализация асинхронности обязательно резко возвращает управление из функции после вызова await"

I>>Это и есть асинхронность. Если управление не возвращать, асинхронности не получится. Как то так.

_>Не возвращать управление — это не значит заблокироваться на задаче, а значит ещё немного поисполнять некий наш код. Но вообще это всё вопрос терминологии. В том смысле какой уровень вложенности функций мы рассматриваем.


см выше про кооперативную многозадачность. Если интересно, есть статья про короутины в питоне, там пример такой же мульки. Короутины в C# кастрированые, но они есть — yield. Можно добиься аналогичного, но более многословного варианта по сравнению с питоном.

I>>У тебя запускается 5 паралельных тасков. Покажи цитатой из кода ожидание именно этих пяти тасков, а не тех, что внутри этих пяти.


_>Аааа в этом смысле ожидать. Ну так в той задаче это просто не требовалось, но думаю что очевидно что прямо нужный код у нас имеется, т.к, он запускается для внутренних функций.


Теперь никаких претензий нет или ты все еще хочешь что бы я добавил еще одну строчку в свой пример навроде result = await result.Content.GetBytes() ?
Re[29]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 17:58
Оценка: -1
Здравствуйте, alex_public, Вы писали:

I>>Покажи весь код, для полноты картины. Если UI loop и короутина работают асинхронно, покажи именно эту асинхронщину. Ну и до кучи покажи как руками написать метод навроде getline.


_>Асинхронность то кодируется совсем не с помощью coroutine, а например (как в моём коде) через std::async. A coroutine нужна что бы вернуть управление после выполнения асинхронной части в код расположенный после кода запуска асинхронной задачи.


Правильно, об чем и речь. Потому никаких фокусов нет и быть не может, о чем я и говорю. Короутина нужна для того, что бы сделать энергичный код ленивым, как результат, легко делается кооперативная многозадачность. В винде есть файберы, как раз это же и делают. В бусте сэмулировали эти файберы. В дотнет есть проблема — файберы не поддерживаются рантаймом, и по моему хорошо что так сделано
При этом повторяю — нет в короутинах асинхронщины, асинхронщину берет на себя шедулер, который надо еще правильно приготовить, скормить ему набор короутин между которыми он и будет переключаться.
Re[29]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 18:10
Оценка: -1
Здравствуйте, alex_public, Вы писали:

I>>Судя по описанию boost.coroutine это аналог yield в сишарп или питоне, потому никакой асинхронщины тут нет, когда работает один — другой спит и наоборот.


_>Всё правильно. Только данный yield работает не просто как возврат из функции, а связывает два произвольных (!) куска кода в программе. Соответственно мы ставим одну метку на требуемый код, а вторую в обработчик ui потока и получаем нужный результат.


Покажи этот код, а то вот EP не может

> И да, он при этом полностью синхронный. Но в самой асинхронности то вообще ни у кого никогда проблем не было.


Сомневаюсь, на счет асинхронности.

>Вызываем любой вариант (например std::async) и добавляем асинхронность. Но фишка await/async же не в тупо асинхронности, а в продолжение исполнения кода внутри вызывающего потока после завершения вызванного, причём с точки запуска асинхронного вызова. Вот как раз это boot.coroutine и реализует.


короутина всего лишь передает управление. Больше ничего она не делает. await/async это сахар для шедулера, а не для короутины, этот сахар вызывает короутину, которую генерит компилер.
Re[30]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 25.06.13 18:10
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:


I>>>Покажи весь код, для полноты картины. Если UI loop и короутина работают асинхронно, покажи именно эту асинхронщину. Ну и до кучи покажи как руками написать метод навроде getline.


_>>Асинхронность то кодируется совсем не с помощью coroutine, а например (как в моём коде) через std::async. A coroutine нужна что бы вернуть управление после выполнения асинхронной части в код расположенный после кода запуска асинхронной задачи.


I>Правильно, об чем и речь. Потому никаких фокусов нет и быть не может, о чем я и говорю. Короутина нужна для того, что бы сделать энергичный код ленивым, как результат, легко делается кооперативная многозадачность. В винде есть файберы, как раз это же и делают. В бусте сэмулировали эти файберы. В дотнет есть проблема — файберы не поддерживаются рантаймом, и по моему хорошо что так сделано


Ты так говоришь, будет файберы это какие процессорные инструкции. Это те же самые стэковые корутины, просто под виндой их так назвали. А в бусте назвали корутинами.

I>При этом повторяю — нет в короутинах асинхронщины, асинхронщину берет на себя шедулер, который надо еще правильно приготовить, скормить ему набор короутин между которыми он и будет переключаться.


Ну да. В asio этим занимается io_service, который ждёт на каком-нибудь WaitForMultipleObjects, а потом дёргает сработавшие хэндлы.
Главное гармония ...
Re[44]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 18:41
Оценка: :)
Здравствуйте, alex_public, Вы писали:

I>>Цель этой максимальной быстрости ? Если быстро парсить регэкспы в компайлтайм, то не ясно, как часто это становится узким местом, ибо регэкспы в рантайме это совсем другая вещь. Да и ДСЛ для этого корявый.


_> Так вот я там ради развлечения замерил




I>>Теперь никаких претензий нет или ты все еще хочешь что бы я добавил еще одну строчку в свой пример навроде result = await result.Content.GetBytes() ?


_>Ой, да мы вроде уже давно выяснили что мой вариант реализации await/async для C++ выглядит немного страшнее чем C# вариант, но при этом даёт чуть-чуть больше гибкости. Утомили уже эти примеры. Кстати, изначально это был пример от gandjustas. Только вот он написал "Давай, детка, сделай это на C++.", а потом резко пропал куда-то...


Я скажу страшное — буст очень часто не используют по политическим причинам.
Re[34]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 26.06.13 08:18
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Собтсвенно асинхронщина это не то, для чего нужны короутины.


Согласен. Но с корутинами можно писать асинхронный код, который будет выглядеть как синхронный. И await это и есть корутина.
Главное гармония ...
Re[35]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.06.13 18:26
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Так вот, если асинхронный код идентичен синхронному аналогу — то это же самый лучший вариант, вроде же очевидно


Ты пока что кроме синхронного ничего так и не показал.

I>>ca(); — вот так что ли ? Там где ты явно, руками вызываешь короутину, будет стоять await.


EP>Фишка в том, что эти ca() можно инкапсуировать в библиотеки, асинхронные вызовы — а await'ы будут засорять все уровни кода.

EP>Более того, синтаксис await'ов можно полностью реализовать на stackfull coroutines (async в объявлении будет не нужен, но будет нужен call_async в месте вызова + такие await могут стоят на "любой глубине").

Это просто чушь и незнание истории операционных системы и их возможностей. В винде и лялихе файберы/короутины есть с незапамятных времен. И вот что странно — на фоне этих самых короутин, которые работают искаропки, внезапно распространяется APM — это всякие BeginAsync, EndAsync и IAsyncCallback и тд и тд и тд и тд и тд и тд.
Потом появляется async/await, хотя казалось бы, stackfull coroutines работают искаропки.

EP>Корутины позволяют делать асинхронный код похожим на синхронный, и ещё много чего.


Скажи пожалуйста, а кто будет контролировать все эти нелокальные переходы ? В async/await все понятно — компилятор. Максимум контроля над одной единсвенной небольшой задачей. А что stackfull даёт ? Переходы непойми где ? Вместо однозадачного кода получить кооперативную многозадачность со всеми её проблемами — starvation, гонки, инверсия приоретитов и тд.

Ну вот пример — исключения. Кто их будет обрабатывать ? Вызывающих сторон становится как бы больше одной. Предлагаешь исключения кидать всем подряд ? Или для одной из сторон исключения будут глотаться ?

Ну и вопрос с message pump — http://rsdn.ru/forum/philosophy/5211489.1
Автор: Ikemefula
Дата: 25.06.13

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

Для примера выше — покажи приблизительный код, который нужно добавить, что бы работала и твоя модная асинхронщина и этот цикл выборки сообщений.
Re[36]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.06.13 10:23
Оценка: -1
Здравствуйте, alex_public, Вы писали:

_>Вот, отличная формулировка. А я всё не мог подобрать точных слов, когда говорил что лично мне совершенно не нравится этот await/async стиль. Вот как раз тем, что реально асинхронный код притворяется синхронным, оно мне и не нравится. Зачем лишние запутывания на пустом месте и без всякой выгоды?


_>Я ещё понимаю, когда речь идёт о разработке библиотеки, которая может работать и в синхронном и в асинхронном режиме. Тогда это действительно полезно и удобно — мы можем писать один код, а потом менять режим работы каким-то одним параметром в совершенно другом месте кода.


_>А в приведённом пример с фоновым скачиванием файла по запросу пользователя я не вижу разумных причин для применения подобной техники.


На stackfull короутинах здесь не было ни одного примера асинхронщины. Ни одного, зато есть вопли, как всё просто и шоколадно. Есть мой пример с message pump — допили его и продемонстрируй асинхронщину

Пока что очевидно, что вызов любого метода из message pump приведет замораживанию приложения. Что бы это забороть, надо явно делать короутинами вообще всё, в т.ч. и message pump. То есть на ровном месте педалить и приседать с кооперативной многозадачностью.

Смешно — короутины есть в современных OS с незапамятных времен и как то это никак не сказалось на асинхронщине
Re[37]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.06.13 18:28
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В то время как stackful coroutines требуют поддержки на уровне среды, вроде же очевидно?


Мне — да. Тебе — нет. Потому ты так и не привел простейшего асинхронного кода с моим message pump.

EP>Да нет никаких starvation, то что в моём примере есть цикл распределения пакетов, не означает что он должен быть всегда при использовании сопроцедур.


Опаньки ! А кто по твоему message pump будет дергать ?

EP>Сопрецедуры не требуют изменения event loop, пример из Boost.Coroutine приведённый выше — тому подтверждение. Там не было никаких изменений в Boost.Asio


Ну раз не требуют, стало быть ты легко накидаешь примерчик с моим message pump. Какие проблемы ?

I>>Ну и вопрос с message pump — http://rsdn.ru/forum/philosophy/5211489.1
Автор: Ikemefula
Дата: 25.06.13

I>>Тебе понятно, что короутины нужно встроить вообще везде, что бы работал такой код ? В твоем случае он работать не будет, что очевидно, винда не знает про то, что ты используешь короутины.

EP>Да и не должна она знать


Код покажи.

I>>То есть, для того что бы нормально использовать короутины, надо применить их тотально, то есть вообще везде где угодно.


EP>нет, ты просто не понял как их можно использовать, и разводишь истерику


Я всего то код прошу показать.

I>>Для примера выше — покажи приблизительный код, который нужно добавить, что бы работала и твоя модная асинхронщина и этот цикл выборки сообщений.


EP>Я уже много всякого кода здесь приводил. А ты даже не осилил
Автор: Evgeny.Panasyuk
Дата: 25.06.13
показать простой пример на C#.


Это пример ___________синхронного___________ кода___________с___________кооперативной___________многозадачностью___________.

EP>Давай ты приведёшь полностью рабочий пример с асинхронностью в "традиционном стиле", на callback'ах — а я переделаю его на stackful coroutine, ок?


Возьми любой мой пример, я ажно пять вариантов привел. Только должно быть явно обозначено, как будет вызываться message pump. И message pump именно мой, а не просто какой то эвентлуп для короутин.
Re[26]: Что посоветуете как аналог С++
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.06.13 21:02
Оценка: :)
Здравствуйте, vdimas, Вы писали:

V>Но когда они вникают в подробности конкретного участка, поверь, их точно так же интересуют точные типы.


Отучайся говорить за всех. Лично я первое, что делаю при ковырянии чужого кода — Full Cleanup, который, в числе прочего, заменяет все типы в декларациях на var.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[48]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.06.13 05:21
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Как не работает? То есть по твоему до await'а асинхронного кода вообще не было?


Очень просто, удали async/await и попробуй хотя бы скомпилировать, потом приходи сюда.

I>>Вот и покажи эту асинхронщину на короутинах. Забудь про MesageBox, TcpStream и тд. Сделай что нибудь внятное, ну хоть Thread.Sleep() если ничего в голову не приходит.


EP>Покажи версию без корутин на C++ — я её переделаю на корутины. А то ты опять будешь кричать что это не "асинхронщина".


Примерно так:
int handler(n)
{
   ::Sleep(n);
   int i = rnd();
   ::Sleep(n);
   return i;
}

thread([]{PostMessage(handler(5000));});


I>>Он работает и без короутин, потому ничего не демонстрирует, вообще.


EP>Асинхронный код на C# можно писать без await/async


Переписать — можно. Можно даже на ассемблере все переписать.
Re[32]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 30.06.13 23:45
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Ну значит UI Loop из моего примера вызовется чудом, например сканированием адресного пространства на предмет наличия ::GetMessage и ::TranslateMessage или, как вариант, короутина догадается WinMain вызвать.


Тю, блин, теперь понятно, что ты там всё время спросить пытаешься. )))
Жесть!

Давай лучше я тебя спрошу:
— что такое короутина?
— надо ли её вызывать "откуда-то" или она работает "сама по себе"?

Ответы на этот вопрос отвечают на твой.
Re[57]: Что посоветуете как аналог С++
От: alex_public  
Дата: 03.07.13 11:58
Оценка: :)
Здравствуйте, Ikemefula, Вы писали:

I>Где именно потери эффективности ? Где больше удобства ?


Так писали же уже...
По эффективности: у C# реализации будет O(N) по стеку, вместо O(1)
По удобству: в C# реализации надо модифицировать код (как минимум расставлять async) на всех уровнях стека.

I>И вот что бы не городить такой мусор, придумали async/await.


Нуу а на мой взгляд это async/await мусор, т.к. ведёт к кривой архитектуре.

I>Правильно — stackfull короутины нужны именно для кооперативной многозадачности. А ты и EP рассказывали басни что де все шоколадно с асинхронщиной, стоит только насовать короутин куда попало.


Так верно и то и другое. Главное предназначение сопроцедур как раз в реализации "многозадачности без потоков" (кстати, а с этим в C# вообще тухло, да?). Но как мы видим по тому же async/await из C# их можно приспособить и для всяких извращений. Соответственно если программист на C++ всё же захочет использовать сомнительную архитектуру типа async/await, то с учётом наличия Boost.Coroutines он сможет это сделать в десяток строчек кода.

Кстати, я же ещё не показывал тут вариант нормальной многопоточной асинхронности с короутинами. Тогда уж покажу один из вариантов (набросал за пару минут), что бы не быть голословным. Значит такой код:
void TestAsync(int n)
{
    BEGIN_ASYNC
    wcout<<L"Запускаем асинхронное из потока "<<this_thread::get_id()<<endl;
    auto r=await_async([&]{
        this_thread::sleep_for(chrono::milliseconds(500));
        wostringstream res;
        res<<L"Завершена работа в потоке "<<this_thread::get_id()<<L" над данными "<<n;
        return res.str();
    });
    wcout<<L"Показываем результат в потоке "<<this_thread::get_id()<<L": "<<r<<endl;
    END_ASYNC    
}
TestAsync(12345);
TestAsync(67890);
wcout<<L"Показываем MessageBox из потока "<<this_thread::get_id()<<endl;
MessageBox(L"Тест!");
wcout<<L"MessageBox закрыт в потоке "<<this_thread::get_id()<<endl;

Выводит следующее:

Запускаем асинхронное из потока 1
Запускаем асинхронное из потока 1
Показываем MessageBox из потока 1
Показываем результат в потоке 1: Завершена работа в потоке 2 над данными 12345
Показываем результат в потоке 1: Завершена работа в потоке 3 над данными 67890
MessageBox закрыт в потоке 1


Ну и реализация:
using __Coro=boost::coroutines::coroutine<void()>;
template<typename L> auto __await_async(const __Coro* coro, __Coro::caller_type& yield, L lambda)->decltype(lambda())
{
    auto f=async(launch::async, [=](){
        auto r=lambda();
        App.PostMessage(coro);
        return r;
    });
    yield();
    return f.get();
}
void RunAsync(Event& event)
{
    __Coro* c=event.Get<__Coro*>();
    (*c)();
    if(!*c) delete c;
}
#define BEGIN_ASYNC { __Coro* __coro=new __Coro; *__coro=__Coro([=](__Coro::caller_type& __yield){
#define END_ASYNC });}
#define await_async(l) __await_async(__coro, __yield, l)
...
void App::OnAsyncMessage(Event& event) {RunAsync(event);}//<-один обработчик на всё приложение


Причём эта реализация в десяток строк ещё и заметно эффективнее (фирменный знак C++) C#'ой по накладным расходам. Вот такие дела.


I>await это не короутины, это поддержка асинхронных вычислений. Короутины просто используются для этого.

I>Ты путаешь два разных инструмента.

Ну да, правильно. Так просто асинхронные вычисления (без сахара от сопроцедур) есть давным давно и наверное во всех языках. ))) Так что здесь мы обсуждаем именно C#'ий сахар, а он как раз основан на сопроцедурах.

I>Предлагаешь обсудить твои фантазии ? Где ты видел высказыавния про великий прорыв, не имеющий аналогов и тд и тд ?


Это была ирония, но она не особо отличалась от настроя некоторых товарищей в этой темке. Ну и вообще для агрессивных евангелистов C# это обычно дело. Помнится до async/await у нас был прорыв с LINQ, а перед этим ещё что-то (а ну да, DLL hell же)...
Re[47]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 03.07.13 17:29
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

I>>>Спасибо, капитан ! Я то думал, что короутины дотнета для которых прикручено N апи комбинаторов это кубики лего из которых можно собрать произвольную модель,

V>>Увы, нельзя произвольную.
I>Берешь свои слова обратно что ли или сомневаешься в полноте по тьюрингу того же linq ?

Конечно не беру, если мы все еще об встроенном async. Ручками я тебе что хошь накручу, ес-но, благо интероп и ансейф дотнета в "шаговой доступности".

I>>>а на самом деле это апи комбинаторов, из которых можно собрать произвольную модель.


V>>Только stackless, со всеми торчащими наружу кишками/модификаторами/ограничениями в сценариях и складыванием такого кода в глубокие "матрешки" дергающих друг друга конечных автоматов.


I>Я пока не увидел внятного примера, что бы кишки никуда не торчали в С++, то async понадобится, то await, то yield.


В сигнатуре ниче не торчит. Нет ограничений на уровне контрактов.

I>Что касается упаковывания внутрь фремворка, вот смотри, асинхронный код:


I>
I>source.pipe(destination)
I>


В том-то и дело, что под дотнетный async надо было разработать еще один фреймворк, помимо имеющегося под обычные коллекции, Rx или Linq + связку с этими имеющимися


I>Никаких кишок не торчит, а код асинхронный.


Любая неблокирующая операция укладывается в любую асинхронную модель. Асинхронаня — значит отложенная. Адекватная асинхронная модель пытается что-то делать в неблокирующем режиме, в случае неудачи — "откладывает" операцию. (Даже если в публичном АПИ это выглядит не так, "унутре" это именно так)

Вот эта строчка "отложения" операции, которую ты показал, она вообще ни о чем в данном споре.


I>Надо полагать раз кишки не торчат, то такой результат и есть самая что ни есть круть на С++ ? А если я скажу, что это C# или джаваскрипт, что будешь делать ?


Чтобы кишки торчали, нужен контракт с торчащими кишками. Я не увидел там контракта.


I>Там все синхронное. Вообще все. Если короутины вызывают друг друга по кругу, вовсе не значит, что там чтото асинхронное появилось.


Значит ты не понимаешь, что такое асинхронность.


>>Ты неоднократно прямо спросил кто и откуда вызывает короутины — тебе схематично показали,

I>Глаза раскрой — убираешь короутины и код продолжает работать. Это значит, что код тупо синхронный.

Блин, опять ты все в кучу!!! Короутины НЕ НУЖНЫ для асинхронности. Вообще. Они нужны для выпрямления событийного кода в якобы линейный. Причем, эта фишка может использоваться не обязательно в асинхронном коде, она может быть использована для кооперативной многозадачности. Так же, как пойдет для этого await или enumerator-yield в дотнете (одинаковая хрень, по сути, но требующая независимых языковых конструкций из-за прибитости гвоздями).


V>>Если ввод-вывод неблокирующий, то он никак не замораживает UI

I>Ты лучше возьми первый этот пример и покажи, как это он UI незамораживает.

Тут было много примеров, я ворвался посреди спора, кинь точной ссылкой плиз.


I>>>Правильно и все три работают без короутин.


V>>Не надо валить всё в кучу. ))


I>Разговор начался с того, как все шоколадно в С++ благодаря особым короутинам.


Конечно, ведь начали хвалить async в C#, поэтому речь зашла о короутинах в C++. В дотнете отродясь была асинхронность и без всякого async. Ты просто пытаешься путать синт. сахар с принципом работы.


V>>Это модели диспетчеризации событий/задач, отличающиеся используемым низлежащим АПИ ОС. А то, что некая задача является "короутиной", диспетчеру должно быть вообще до фени. Пусть выгребает из очереди некий абстрактный Task и запускает его. Короутина — это уже нечто более высокоуровневое, это трюк для выпрямления прикладного автоматного/событийного кода в якобы линейный.


I>Правильно — якобы. Кишки будут торчать и там и там, вопрос только в наличии поддержки компилятора.


Да вот, увы, сигнатура await торчит так уж торчит. Да и вообще. Весь спор можно было сворачивать сразу после поста о stackless/stackfull, всё и так понятно. Две модели, два подхода.
Re[39]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.07.13 22:16
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>По смыслу, это примерно тоже самое, что и:

EP>
EP>async Task<Result> bar(istream client1, istream client2)
EP>{
EP>    var result = await foo(client1) + await foo(client2);
EP>    return result;
EP>}
EP>

EP>Вызывающий поток(thread) не блокируется, а возвращается к другим задачам, например по event loop.

Для этого надо псать специальный код. А как сделать версию того кода, что не вызвает await ?

EP>Причём у него интерфейс как у обычного блокирующего потока, без намёков на асинхронность, поэтому он и совместим с std::istream.


То есть, его можно использовать ровно одним способом или синхронно или асинхронно. При этом await позволаяет включать ожидание там где тебе надо.
Re[37]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 07:40
Оценка: -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Ты лучше сделай наконец тот пример что я тебя просил.


EP>какой? тут уже было достаточно ликбез-примеров


Понятно, аргументы закончились

I>>Ну или покажи как один раз вызвать getline с ожиданием а другой раз без ожидания.


EP>см выше.


Ты не показал имеенно тот случай, где асинхронщины просто не избежать, то есть, вообще.
Re[39]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 08:05
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>второй раз вызвали и результата НЕ ожидаем а получаем когда нибудь потом.


EP>
EP>auto future = asynchronous([&]{ getline(client_stream, msg); });
EP>


А ведь кторо говорил что никакие уши асинхронщины нигде не торчат Похоже, у вас с vdimas стало модно брать свои слова назад.

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

string s = ::ReadFileAsUrl("someConfigPath")


То внезапно оказывается так, что асинхронщина пролезет даже в сигнатуру. Ну или как вариант, придется указывать наличие/отсутствие ожидания с помощью глобальных переменных

Остался один открытый вопрос — сделать так, что бы буст, наконец, узнал про message pump.
Re[41]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 08:20
Оценка: :)
Здравствуйте, Ikemefula, Вы писали:

EP>>Так ты определись — либо блокируется, либо "в этом потоке"


I>UI поток заблокируется, потому что буст не знает про message pump. В этом потоке будет чтото выполняться, при чем не ясно, как указать что именно должно выполняться.


Например пока UI поток блокирован, ни один из потоков не сможет внятно обратиться к этому потоку, потому что все синхронные вызовы замерзнут. То есть, снаружи потока не будет способа отличить блокированый UI поток от потока который надолго завис в короутинах.
Re[44]: Что посоветуете как аналог С++
От: alex_public  
Дата: 07.07.13 17:45
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>
I>function getSin(param, end)
I>{
I>  end(Math.sin(param));
I>}

I>getSin(45, function(result){ ля ля ля})

I>вот этот вызов выглядит как асинхронный, при этом в данном примере нет ничего асинхронного, обычный event driven подоход, а вы с EP почему то называете такой хлам асинхронщиной
I>


Нет, тут показывались совсем другие примеры. Ничего похожего на это.

Предположим что у нас есть функция Read(buf, callback), которая читает некие данные в буфер и после этого вызывает callback. Из какого потока реально вызывается callback тут не принципиально. Это довольно распространённый случай и думаю не надо объяснять как обычно используют такие функции.

Так вот, Evgeny.Panasyuk показывал что можно пользоваться не только традиционным способом, но и так:
Read(buf, coro);//передаём вместо обычного callback'a наш специальный на базе сопроцедуры
yield();//вызодим из функции
ProcessBuf(buf);//выполняется как callback функции read, но в контексте текущей функции


Это вполне удобный механизм сам по себе. И кстати я не очень представляю как можно записать подобное на C#.

Ну а если дополнить это механизмами инициации этого самого callback'a (как было в моих примерах), то получим как раз реализацию await/async. )))
Re[47]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 18:55
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>И где связь между твоим getSin, который сразу вызывает продолжение с результатом, и getline который внутри yield'ится в main loop?


твой getline в main loop ничего не yield'дит. Наверное ты забыл, но от тебя не было такого примера — мой message pump и твой getline.

EP>я говорил про код:

EP>
EP>async_download(address).then(sync_context, [=]{ on_completion(); } );
EP>

EP>который ты таки называл "асинхронщиной", в котором никакого await'а

Я назвал асинхронщиной и указал, что уши этой асинхронщины торчат дальше некуда.

EP>coroutine_start
Автор: Evgeny.Panasyuk
Дата: 26.06.13
вызванный из корутины, и имеющий внутри getline тоже неблокирующий


если getline неблокирующий, значит следующая за ним строчка выполнится ДО того как придут данные. Ты это хотел сказать ?
Если нет, то getline блокирующий, а стало быть, если его вызвать из message loop, он все повесит

EP>Я уже тебе это объяснял, но как-то туго идёт:

EP>[q]
EP>Вызываются "handler"'ы (в твоих терминах).

Это мусор. Пока мой messaqe pump и свой getline.
Re[57]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 07:57
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>

EP>>>>>строчка await async_download:
EP>>>>>

EP>>>>>await async_download(address);
EP>>>>>on_completion();
EP>>>>>

EP>>>>>также выполняется синхронно?
I>>>>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?

EP>>>getline — блокирующий, "толко не блокирует UI. Странно, да ?"
I>>Ну ка, выдели мне в этом коде getline , чтото я плохо видеть стал.

EP>getline в сообщении


Очень интересно, про getline приводить код в котором ничего про getline нет.
Re[31]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 09.07.13 13:02
Оценка: -1
Здравствуйте, AndrewVK, Вы писали:

AVK>>>Тогда поясни — либо "их" это все таки несколько более узкий круг, чем заявлено, либо я не принадлежу к "более опытным разработчикам".

V>>Угу, характерно, что упоминание конкретного примера, где точный тип обязателен, ты проигнорил...
AVK>А ты умудрился проигнорить явно заданный вопрос, при этом ответить на сообщение, целиком состоящее из этого вопроса.

Столь несложная демагогия даже оскорбительна для почти 10-тилетнего оппонирования. )))

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

Поэтому, вопрос про точный целочисленный тип в силе. Конкретный пример/сниппет можно взять отсюда: http://www.rsdn.ru/forum/philosophy/5221988.1
Автор: vdimas
Дата: 05.07.13
Re[42]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 09.07.13 15:34
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

EP>>Мой пример показывает то, чего на C# нельзя достичь.

I>А надо ? Твой пример похож на "я и так могу".

Я показал
Автор: Evgeny.Panasyuk
Дата: 21.06.13
одну из фишек stackful coroutine. artelk подумал что это едиственная фишка, на что я сделал пояснение.

A>>>Т.е. распараллелить все. Задачи taskR1, taskR2 выполняются параллельно, в то время как bar продолжает работать, выполняя M1() и M2().

EP>>Точно такой же синтаксис оператора await можно получить с помощью stackful coroutine, только он будет мощнее, так как может yield'ить через много уровней, а не один.
I>Это именно то чего делать ни в коем случае не нужно.

Можно без проблем ограничить одним уровнем, а можно и не ограничивать.

EP>>Ещё раз, это конкретный пример инкапсуляции асинхронной логики таким образом, что много уровней клиентского кода могут и не догадываться об этом — на C# так не получится, послушай своего коллегу
Автор: Ikemefula
Дата: 08.07.13
.

EP>>Очевидно, что так можно инкапсулировать что угодно, а не только стримы, в том числе реализовать более мощный аналог await
I>аналог await это хорошо, а если "через много уровней", то хуже некуда, хаос в коде гарантирован.

При использовании await'а, часто вырастают "вынужденные" цепочки await'ов/async'ов вверх по call stack'у — об этом говорится во многих туториалах по await.
Имея возможность "через много уровней", можно по необходимости ввести ограничение на "один уровень".

Будет ли хаос при использовании "через много уровней" — сходу сказать не могу, ибо не использовал. Рассказы про "хаос" вообще окружают каждую фишку которая даёт что-то в обмен на потерю контроля.
function pointer, virtual function, overloading — "хаос, неизвестно что вызывается"
type inference, auto, template argument deduction — "хаос, неизвестно какие типы, и вообще duck typing" (даже в этой теме успели это пережевать)
Как показывает история, зачастую все эти страхи от банального blub-парадокса и инерции
Re[75]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 10.07.13 06:53
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, vdimas, Вы писали:


I>>>Твои идейки распространяются на случай из двух трех короутин, где все и так само работает. Общий случай такой — высокоприоритетный поток вдруг начинает ожидать результат низкоприоритетного потока, а тот спит, потому что выполняются другие потоки. Что бы такое не возникало, нужен хороший шедулер и возможность сообщать шедулеру, где какой приоритет и кто чего ожидает.

I>>>Кроме как расставить все руками у тебя ничего нет, правильно ?

V>>Я же тебе сказал, если ты сам в состоянии управлять очередью исполнения кода в кооперативной многозадачности, то тебе не нужен никакой "приоритет".


I>Нужен, в том то и дело. Одна короутина должна отработать пораньше, а другая может хоть пол-часа ждать.


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


V>>Еще раз сформулируй, гарантии чего именно. Пример кода я привел. Гарантий никогда нет. С async/await тоже, ес-но.

I>Ты сам вспомни, чего ты вещал про гарантии

Гарантии в обоих языках даются системой типов. Ты же попросил меня отличить синхронный вызов от асинхронного. Сорри, но в C# они отличаются лишь синтаксическим сахаром. Я вполне могу в действующей системе типов расписать происходящее без await.
Re[9]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.07.13 13:25
Оценка: :)
Здравствуйте, artelk, Вы писали:

A>Представилось: команда из 20 разработчиков, помешанных на микрооптимизациях, совместно разрабатывают на Ассемблере какое-нибудь типичное энтерпрайз приложение с изменяющимися требованиями.

A>И что-то эта картина меня напугала.

Это парадокс Блаба
Что посоветуете как аналог С++
От: Grundik2 Земля  
Дата: 16.06.13 09:31
Оценка:
Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?

10.07.13 05:15: Перенесено из 'Философия программирования'
Re: Что посоветуете как аналог С++
От: Sni4ok  
Дата: 16.06.13 10:01
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код.


а зачем?
Re: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 16.06.13 10:10
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Самое первое — C++11 и идущий следом C++14. На фоне C++03 это совсем новый язык.
Rust — самый что ни на есть малоизвестный и экзотический язык. Правда, надеюсь, со светлым будущим, да и выглядит очень перспективно.
D — вроде хороший, но не менее экзотический и уже, похоже что, без перспектив, в отличие от...

Так что, если на перспективу, то можно на Rust посмотреть, а если хочется то, что однозначно используется и будет активно использоваться, то C++11.
Re[2]: Что посоветуете как аналог С++
От: Grundik2 Земля  
Дата: 16.06.13 10:20
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, Grundik2, Вы писали:


G>>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


KP>Самое первое — C++11 и идущий следом C++14. На фоне C++03 это совсем новый язык.

KP>Rust — самый что ни на есть малоизвестный и экзотический язык. Правда, надеюсь, со светлым будущим, да и выглядит очень перспективно.
KP>D — вроде хороший, но не менее экзотический и уже, похоже что, без перспектив, в отличие от...

KP>Так что, если на перспективу, то можно на Rust посмотреть, а если хочется то, что однозначно используется и будет активно использоваться, то C++11.


Я тоже думаю, что Rust. Не хочу лезть в дебри C++, в 11ой версии они еще более дремучие.
Re[3]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 16.06.13 10:28
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Я тоже думаю, что Rust. Не хочу лезть в дебри C++, в 11ой версии они еще более дремучие.


Rust для системного/сетевого разработчика самое то
Re[2]: Что посоветуете как аналог С++
От: Grundik2 Земля  
Дата: 16.06.13 10:43
Оценка:
Здравствуйте, kaa.python, Вы писали:


KP>Поэтому, очень стоит поглядеть на языки программирования базирующиеся на JVM, такие как Scala, Closure и Kotlin. У этих языков есть отличное коммьюнити, им доступна куча JVM библиотек и у них однозначно есть будущее.

KP>Вот как-то так...

Пишу на Скала тоже.
Re: Что посоветуете как аналог С++
От: Lloyd Россия  
Дата: 16.06.13 14:29
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Go?
Re: Что посоветуете как аналог С++
От: _NN_ www.nemerleweb.com
Дата: 16.06.13 17:22
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Вы лучше скажите для чего, а там уже видно будет.

У С++ есть очень сильное преимущество в большом числе утилит , то бишь дебаггеров, IDE и прочих вещей.
Кажется мелочь, однако удаленная отладка очень полезная штука.
Да С++ очень сложен в обучении, но ваш любимый IDE переписывать никто не будет
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Что посоветуете как аналог С++
От: os24ever
Дата: 16.06.13 19:10
Оценка:
_NN>Да С++ очень сложен в обучении, но ваш любимый IDE переписывать никто не будет

Открой для себя Scala + IntelliJ IDEA.
Re[3]: Что посоветуете как аналог С++
От: _NN_ www.nemerleweb.com
Дата: 16.06.13 19:58
Оценка:
Здравствуйте, os24ever, Вы писали:

_NN>>Да С++ очень сложен в обучении, но ваш любимый IDE переписывать никто не будет


O>Открой для себя Scala + IntelliJ IDEA.


Я уже давно открыл для себя Nemerle и больше ничего не надо , но ведь речь не об этом .
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Что посоветуете как аналог С++
От: Grundik2 Земля  
Дата: 16.06.13 22:32
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, Grundik2, Вы писали:


G>>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


_NN>Вы лучше скажите для чего, а там уже видно будет.


я уже сказал.
Re[4]: Что посоветуете как аналог С++
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 17.06.13 06:51
Оценка:
Здравствуйте, kaa.python, Вы писали:

DM>>Слишком пока колбасит его, еще сто раз поменяется. Вон, делали-делали его со сборкой мусора, а надысь задумали от нее отказаться в языке. Будущее у него пока слишком отдаленное, пусть даже и светлое.


KP>Колбасит сильно. GC в составе языка никогда не было, есть отдельный эксперимент с GC живущий в отдельном проекте. Если его и дальше не будет, то никто и не заметит.


Были указатели на "управляемые" объекты, а теперь хотят их выбрость, если я все правильно путаю.

DM>>Он последнее время (~год) набирает обороты, после недавнего переезда на гитхаб прибавилось разработчиков/контрибюторов, баги правят пачками, а сам язык все стабильнее, все меньше в нем вредных изменений. Недавно вон конференция по нему прошла на базе Facebook'a, много интересного рассказали и вопросов порешали. (см. dconf.org) Есть пока некоторые больные места в его реализациях (вроде GC), но если на них сильно не наступать, то очень годный язык уже сегодня, а по сочетанию понятности-выразительности-скорости, пожалуй, круче всех.


KP>Это все хорошо, но то что за 15 лет не разродилось, уже вряд ли когда-то появится на свет


Уже появилось. Это Rust пока в состоянии "нерожденный" , а на D некоторые компании уже активно пишут. 100+ человек в компании, и весь код на D, на упомянутой конференции были представители.
Re[5]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.06.13 06:54
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Были указатели на "управляемые" объекты, а теперь хотят их выбрость, если я все правильно путаю.


Не подкинешь линки? Я, видимо, что-то упустил...

DM>Уже появилось. Это Rust пока в состоянии "нерожденный" , а на D некоторые компании уже активно пишут. 100+ человек в компании, и весь код на D, на упомянутой конференции были представители.


Ну, тогда, может быть, он и начнет более-менее активно использоваться. В принципе, я был бы только рад
Re[4]: Что посоветуете как аналог С++
От: MxMsk Португалия  
Дата: 17.06.13 07:06
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Если отбросить эмоции, то Java/.Net разработчики не задумываются о ресурсах/алгоритмах. Мне прямо говорили: "В бизнес-приложениях алгоритмы не нужны, у нас все в базу упирается".

По мне, так всех под одну гребенку еще хуже, чем с эмоциями. Работал в трех компаниях, где много .Net. За 7 с лишним лет ни разу такой пурги не слышал.
Re: Что посоветуете как аналог С++
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 17.06.13 09:04
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Ada
Re[5]: Что посоветуете как аналог С++
От: Aikin Беларусь kavaleu.ru
Дата: 17.06.13 09:12
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, MTD, Вы писали:


MTD>>Если отбросить эмоции, то Java/.Net разработчики не задумываются о ресурсах/алгоритмах. Мне прямо говорили: "В бизнес-приложениях алгоритмы не нужны, у нас все в базу упирается".

MM>По мне, так всех под одну гребенку еще хуже, чем с эмоциями. Работал в трех компаниях, где много .Net. За 7 с лишним лет ни разу такой пурги не слышал.
Мне тоже никто не говорил. И я не говорил. Но реально ведь так оно и есть. В бизнесс приложениях все упирается в БД.

СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Кстати, я сам .net/Java разработчик
От: Aikin Беларусь kavaleu.ru
Дата: 17.06.13 09:13
Оценка:
none
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[6]: Что посоветуете как аналог С++
От: MxMsk Португалия  
Дата: 17.06.13 09:18
Оценка:
Здравствуйте, Aikin, Вы писали:

MTD>>>Если отбросить эмоции, то Java/.Net разработчики не задумываются о ресурсах/алгоритмах. Мне прямо говорили: "В бизнес-приложениях алгоритмы не нужны, у нас все в базу упирается".

MM>>По мне, так всех под одну гребенку еще хуже, чем с эмоциями. Работал в трех компаниях, где много .Net. За 7 с лишним лет ни разу такой пурги не слышал.
A>Мне тоже никто не говорил. И я не говорил. Но реально ведь так оно и есть. В бизнесс приложениях все упирается в БД.
Опрос пользователей интернета показал, что 100% опрошенных пользуются интернетом. Если вся бизнес-логика в БД, может и так. А если не вся? А если UI непростой?
Re[7]: Что посоветуете как аналог С++
От: Aikin Беларусь kavaleu.ru
Дата: 17.06.13 09:27
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>>>По мне, так всех под одну гребенку еще хуже, чем с эмоциями. Работал в трех компаниях, где много .Net. За 7 с лишним лет ни разу такой пурги не слышал.

A>>Мне тоже никто не говорил. И я не говорил. Но реально ведь так оно и есть. В бизнесс приложениях все упирается в БД.

MM>Если вся бизнес-логика в БД, может и так. А если не вся? А если UI непростой?

Какой ответ вы хотите получить на свой вопрос? "Ну если не вся, тогда да -- красно-белые деревья наше все!". А вот не будет его.

Я дотнетчик, в основном. 99% логики у меня не в базе. UI бывает разные, я хз простой он или нет.
За последние 10 лет, я не помню случая когда мне понадобилось использовать хитрый алгоритм или структуру данных.
Большинство оптимизации и хитрых вычислений у меня идут в sql на стороне БД.


За пример когда в корпоративном приложении нужны (реально нужны) алгоритмические "изыски" буду очень благодарен.

СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[8]: Что посоветуете как аналог С++
От: MxMsk Португалия  
Дата: 17.06.13 09:41
Оценка:
Здравствуйте, Aikin, Вы писали:

A>За пример когда в корпоративном приложении нужны (реально нужны) алгоритмические "изыски" буду очень благодарен.

То, что нет "изысков" — не означает, что алгоритмы не используются. Ты же делаешь выбор между Dictionary, List, HashSet. Планируешь во что развернется твой Linq запрос к коллекции. Если нужно часто делать поиск, смотришь, как лучше хранить данные для ускорения. Что это, как не алгоритмы? Элементарщина, да. Ну, а что, в адресной книге в iPhone, например, супер-хардкор что-ли Из недавнего, мы оптимизировали рендеринг и потребление памяти. Причем второе получилось снизить раза так в 3. Там и структуры данных и отсечение. В итоге код достаточно элементарный вышел, но его же нужно было получить. А могли бы бросить все как есть, если следовать заявлениями о пофигизме .Net-чиков к результатам своей работы.
Re[7]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.06.13 11:09
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>http://pcwalton.github.io/blog/2013/06/02/removing-garbage-collection-from-the-rust-language/


Ааа, понятно, почему я это упустил. Главный идеолог и разработчик вещей относящихся к модели памяти пишет тут.
Re[2]: Что посоветуете как аналог С++
От: _NN_ www.nemerleweb.com
Дата: 17.06.13 13:16
Оценка:
Здравствуйте, NeoCode, Вы писали:

Тогда уж проще генерировать C++ из Nemerle.
Сделать это не сложнее чем генерировать JavaScript
Автор:
Дата: 31.03.13
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.06.13 16:04
Оценка:
Здравствуйте, IT, Вы писали:

IT>Тоже самое можно сказать и о большинстве C++. В своё время доводилось интервьюировать и работать с людьми, которые не воспринимали воообще никак битовую арифметику, не знали как объявить класс (после 3-х лет работы на C++ Builder) и вообще сильно путались в основах ООП, про память могли говорить исключительно в рамках стандартных вопросов/ответов, шаг влево/вправо — попытка к бегству. Так что всё это разговоры в пользу бедных. Дураков, пишущих на плюсах не меньше, а может быть даже больше, потому как писать сегодня на плюсах в подавляющем большинстве случаев — нонсенс.


Т.е. с утверждением: "главное задача, памяти бесконечно много, не хватает мощности — поставим на кластер" ты согласен?
Re[6]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.06.13 16:44
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Это хорошо. Это значит, что C++ стал слабее.


А почему ты считаешь что это хорошо?
Re[7]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.06.13 17:08
Оценка:
Здравствуйте, IT, Вы писали:

IT>Это стандартные домыслы, с ними нет смысла спорить.


Это не стандартные домыслы. Это утверждение, которое очень часто приводится в дискуссиях как довод в пользу управляемых языков.

IT>ЗЫ. А ты сам с "Дураков, пишущих на плюсах не меньше, а может быть даже больше..." тоже получается согласен?


Распределение дураков везде приблизительно одинаковое, сложно с этим спорить, да и зачем... Но вот дурак и разработчик не думающий об алгоритмах и ресурсах это совсем разные вещи.
Re[3]: Что посоветуете как аналог С++
От: NeoCode  
Дата: 17.06.13 17:26
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>А что такого вкусного есть в ObjectiveC и Go, чего нет в D?


Отправка сообшений вместо вызовов методов.
Re[3]: Что посоветуете как аналог С++
От: NeoCode  
Дата: 17.06.13 17:27
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Тогда уж проще генерировать C++ из Nemerle.

_NN>Сделать это не сложнее чем генерировать JavaScript
Автор:
Дата: 31.03.13


Вы еще предложите генерировать С++ из JavaScript
Re[9]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.06.13 17:46
Оценка:
Здравствуйте, IT, Вы писали:

IT>Какая разница? Плюсовики вынуждены постоянно думать о ресурсах и не столько об их экономии, сколько об утечках. Это всего лишь умение ходить по граблям. Ничего общего с оптимизациями и алгоритмами.


Ну разве что только те, кто так и не открыл для себя shared_ptr и unique_ptr
Re[10]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 17.06.13 17:59
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Ну разве что только те, кто так и не открыл для себя shared_ptr и unique_ptr


И сколько ещё всяких разных подпорок и затычек нужно для себя открыть?
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 17.06.13 18:03
Оценка:
Здравствуйте, IT, Вы писали:

IT>И сколько ещё всяких разных подпорок и затычек нужно для себя открыть?


Если очень хочется писать тормозные и прожорливые корпоративные приложения, в которых главное решить задачу, а "память и алгоритм имеют низкую значимость" (С), то лучше открыть для себя .NET или JVM. Именно это я и утверждал изначально
Re[12]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 17.06.13 18:08
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Именно это я и утверждал изначально


Я на это уже тоже ответил — стандартные домыслы.
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re: Что посоветуете как аналог С++
От: roro  
Дата: 17.06.13 19:59
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Аналогов С++ имхо нет.
Тут либо переходить на более высокоуровневый, но менее производительный язык, либо использовать гибридные решения с/с++ and js,ocaml,lisp,scheme,lua,python,etc...

Для "поиграться" наоборот стоит посмотреть на экзотические языки с другой парадигмой или нестандартным подходом к решению проблем.
Re[7]: Что посоветуете как аналог С++
От: Grundik2 Земля  
Дата: 17.06.13 21:58
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, Grundik2, Вы писали:


G>>Это хорошо. Это значит, что C++ стал слабее.


KP>А почему ты считаешь что это хорошо?


Не прийдется его учить.
Re[2]: Что посоветуете как аналог С++
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 18.06.13 05:12
Оценка:
Здравствуйте, roro, Вы писали:

R>Здравствуйте, Grundik2, Вы писали:


G>>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


R>Аналогов С++ имхо нет.


Чем Ada не вариант? Если брать стандарт 2012 года? Или ее диалект SPARK?
Re[2]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 18.06.13 06:05
Оценка:
Здравствуйте, NeoCode, Вы писали:

G>>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


NC>Три языка, которые стоило бы объединить в один, чтобы сделать убийцу С++: ObjectiveC, D, Go.

NC>И добавить к этому макросы из Nemerle.

ИМХО достаточно Nemerle на LLVM надеть.
Главное гармония ...
Re[12]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 18.06.13 06:40
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Тот факт, что потенциальные убийцы С++ тупо игнорируют существование таких проблем, говорит о том, что HPC-шники ещё долго будут жрать кактус.


Нет-нет-нет, ведь Rust грядет! Он ничего не игнорирует, на редкость адекватный язык разработки
Re[9]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 18.06.13 06:50
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>А вот приложения для w8 по большей части .NET (WinRT) и JavaScript.


Это все те 2 приложения, по причине отсутствия вменяемого количества которых на Win8 Маркете, Windows Phone никак не поработит мир? Чет у вас там, в управляемой платформе, не срастется никак... С учетом того, что на синтетических тестах скорости работы и потребление ресурсов в находятся более-менее адекватных рамках, я склоняюсь в сторону кривых рук или кривой идеологии разработки.
Re[10]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.06.13 07:11
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, gandjustas, Вы писали:


G>>А вот приложения для w8 по большей части .NET (WinRT) и JavaScript.


KP>Это все те 2 приложения, по причине отсутствия вменяемого количества которых на Win8 Маркете, Windows Phone никак не поработит мир? Чет у вас там, в управляемой платформе, не срастется никак... С учетом того, что на синтетических тестах скорости работы и потребление ресурсов в находятся более-менее адекватных рамках, я склоняюсь в сторону кривых рук или кривой идеологии разработки.


У меня метрошных приложений сильно больше, чем десктопных. Из десктопных только офис, браузеры и студия с live writer. Последние два кстати на .NET.
Метрошных около 30, из них 20-25 не нативные.
Даже скайп метрошный имеет интерфейс на JS.
Re[11]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 18.06.13 07:17
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>У меня метрошных приложений сильно больше, чем десктопных. Из десктопных только офис, браузеры и студия с live writer. Последние два кстати на .NET.

G>Метрошных около 30, из них 20-25 не нативные.
G>Даже скайп метрошный имеет интерфейс на JS.

Ага, наверное, поэтому он даже контакт не может принять
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[9]: Что посоветуете как аналог С++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 18.06.13 08:41
Оценка:
Здравствуйте, gandjustas, Вы писали:

N>>Если десктопы — это ноутбуки, то память и процессор — это ресурс. Это было и раньше, а сейчас тем более, особенно в свете развития ультрабуков.

G>Средний ноут, в том числе ультрабук, имеет 2-4 гб памяти, которые толком занять нечем. Какой смысл для пользователя от экономии 100мб?

Потому что программ стоит много: всякие мессенджеры, плейеры, утилиты от производителя, оптимизаторы и т.д. и т.п. С десятка программ снять по 100 Мб — получишь гигабайт. Всё ещё мало?

N>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>Память? А причем тут зарядка?

Меньше перекачивать через кеш (промахи тоже считаем), меньше скидывать в своп. Сейчас аппаратура становится очень умной, начинает подстраиваться под ситуацию: некоторые устройства вообще умеют отключать неиспользуемые модули (и вычислительные, и кеш), сбрасывают не только частоту процессорных элементов, но и памяти.
Поэтому потребление памяти не так явно явно, но всё таки сильно влияет на энергопотребление. Добро пожаловать в реальный мир.

G>Если же говорить о потреблении процессора, то тут еще печальнее для C++, так как 95% времени работы приложения — ожидание внешнего события: действий пользователя, пакетов из сети, данных с диска. Организовать такую работу с минимальным потреблением ресурсов на C++ на порядок сложнее, чем на .NET. Язык слабоват. Даже на JS проще.


Примеры в студию!

G>Остаются только приложения, которые много считают — игры и фотошоп.


Практика показывает, что на С++ пишется бОльшая часть практически всех приложений, а остальное отдаётся скриптам. Игры и Фотошоп — хорошие примеры.


G>Оптимизируют-то конечно оптимизируют, но с целью меньшего энергопотребления и увеличения perceived performance, а не потребления памяти и процессорного времени. А вот для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто.


Практика показывает, что оптимизируют как раз память и процессор. Посмотри хотя бы логи изменений браузеров от версии к версии.
Re[11]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 18.06.13 09:39
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>"Стоит" и "работает" — разные вещи, не находишь?


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

G>Какой своп? Для среднего ноута с 2-4 гб обычно и половина не забивается.


А как начинаешь использовать приложения на управляемых языках, так и 8 становится мало

G>Сходи на MSDN глянь как в WinRT делать асинхронные вызовы в C++, а потом сравни с .NET и JS.


Т.е. в том, что Майкрософт криво реализовал работу с асинхронными вызовами в WinRT виновато C++?

Но, в одном я согласен — писать GUI на C++ это то еще извращение.
Re[12]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.06.13 09:51
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, gandjustas, Вы писали:


G>>"Стоит" и "работает" — разные вещи, не находишь?


KP>Так много что запущено одновременно. Или ты предлагаешь закрывать все не нужное прямо сейчас для того, что бы оставшееся могло всю память безболезненно выжрать?!

"Много что" это что? На w8 ноуте у меня запущено десктопных приложений обычно два — lync и onenote (офис). И они не делают ничего, ждут пока я ченить введу.
В фоне еще 3-4 приложения, которые тоже ждут.
Метрошные приложения вообще спят в фоне, не делают ровным счетом ничего и сразу же умирают как память кончается.

Иногда запускается студия, вот она обычно работает и потребляет аж 400 мб, поднимая общее потребление до 2,5 гб из 8 доступных.
Ну и зачем мне своп?

Те, кто пользуются фотошопом или автокадом имеют еще более мощные компы. Им вообще 100мб ни о чем.


G>>Какой своп? Для среднего ноута с 2-4 гб обычно и половина не забивается.

KP>А как начинаешь использовать приложения на управляемых языках, так и 8 становится мало
У меня больше половины приложений на управляемых языках. 8 хватает за глаза и 4-х бы хватило на самом деле.

G>>Сходи на MSDN глянь как в WinRT делать асинхронные вызовы в C++, а потом сравни с .NET и JS.

KP>Т.е. в том, что Майкрософт криво реализовал работу с асинхронными вызовами в WinRT виновато C++?
Ни разу не криво, просто C++ по-другому не может. Детерминированная финализация и продолжения, увы, плохо совместимы.

KP>Но, в одном я согласен — писать GUI на C++ это то еще извращение.

А GUI по статистике — от 40% до 70% кода приложения. Для десктопа больше в сторону 70%.

ЗЫ. Опять не касаемся нишевых вещей, типа игр.
Re[11]: Что посоветуете как аналог С++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 18.06.13 11:05
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>"Стоит" и "работает" — разные вещи, не находишь?


Они запущены и работают, у многих не закрываются сутками, неделями, месяцами.


N>>>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>>>Память? А причем тут зарядка?

G>Какой своп? Для среднего ноута с 2-4 гб обычно и половина не забивается.


Если мы говорим о Винде, то своп всё равно используется. Мало кто сам его отключает. Помониторь систему, посмотри сам.

G>На планшетах вообще своп почти не используется, приложение просто грохается если для него памяти не осталось.

Своп на ноутах, а не на планшетах.

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

G>Сходи на MSDN глянь как в WinRT делать асинхронные вызовы в C++, а потом сравни с .NET и JS.

Примеры программ.

N>>Практика показывает, что на С++ пишется бОльшая часть практически всех приложений, а остальное отдаётся скриптам. Игры и Фотошоп — хорошие примеры.

G>Парктически всех это каких? Я же приводил статистику — из 30 метрошиных приложений 20-25 не нативные. Фотошопы и офисы — древние, поэтому на C++ их никто не перепишет и не зачем.
G>Игры — отдельная ниша, об этом и говорю. Язык C++ превратился из mainstream в нишевый.

Практически во всех — это практически во всех.
Метрошные приложения — это просто супер узкая ниша. Может быть их вообще 30 штук в мире и есть.


N>>Практика показывает, что оптимизируют как раз память и процессор. Посмотри хотя бы логи изменений браузеров от версии к версии.

G>Браузеры — отдельный пример, это фактически ОС для JS\HTML. Требования сильно отличаются от приложений. А вот приложения на этих самы JS\HTML оптимизируют для perceived performance, что достигается другими средствами.

Всё-то у тебя отдельная ниша! ОС — отдельная ниша, драйвера — отдельная, браузеры — отдельная, фоторедакторы — отдельная, видеоредакторы — отдельная, текстовые и табличные процессоры — отдельная, браузеры — отдельная, игры — отдельная, музыкальные и видео плейеры — отдельная. И С++ , который есть во всех этих нишах — это так, не считается.
Что, скажи мне, что есть твой большой и реальный мир, в котором нет места С++ (и другим старым, добрым системным языкам)? Метрошные виджеты на рабочем столе?
Re[12]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.06.13 11:51
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, gandjustas, Вы писали:


G>>"Стоит" и "работает" — разные вещи, не находишь?


N>Они запущены и работают, у многих не закрываются сутками, неделями, месяцами.

Ну приведи пример чтоли, а то как-то абстрактно. У меня месяцами не закрывается onenote и lync. Но вместе они хавают сильно меньше 2 гб. Остальное запускается эпизодически.


N>>>>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>>>>Память? А причем тут зарядка?

N>А понижение железом частоты шины памяти и отключение неиспользуемых блоков встречается и на десктопах, и на ноутах, и на планшетах, и на телефонах. Там память — это реальный ресурс.

Угу, поэтому приложения вытесняются без действий со стороны пользователя.

G>>Сходи на MSDN глянь как в WinRT делать асинхронные вызовы в C++, а потом сравни с .NET и JS.

N>Примеры программ.
Там есть примеры.

N>>>Практика показывает, что на С++ пишется бОльшая часть практически всех приложений, а остальное отдаётся скриптам. Игры и Фотошоп — хорошие примеры.

G>>Парктически всех это каких? Я же приводил статистику — из 30 метрошиных приложений 20-25 не нативные. Фотошопы и офисы — древние, поэтому на C++ их никто не перепишет и не зачем.
G>>Игры — отдельная ниша, об этом и говорю. Язык C++ превратился из mainstream в нишевый.

N>Практически во всех — это практически во всех.

N>Метрошные приложения — это просто супер узкая ниша. Может быть их вообще 30 штук в мире и есть.
Ты в маркет давно заходил? Или судишь о вкусе устриц не попробовав?


N>>>Практика показывает, что оптимизируют как раз память и процессор. Посмотри хотя бы логи изменений браузеров от версии к версии.

G>>Браузеры — отдельный пример, это фактически ОС для JS\HTML. Требования сильно отличаются от приложений. А вот приложения на этих самы JS\HTML оптимизируют для perceived performance, что достигается другими средствами.

N>Всё-то у тебя отдельная ниша! ОС — отдельная ниша, драйвера — отдельная, браузеры — отдельная, фоторедакторы — отдельная, видеоредакторы — отдельная, текстовые и табличные процессоры — отдельная, браузеры — отдельная, игры — отдельная, музыкальные и видео плейеры — отдельная. И С++ , который есть во всех этих нишах — это так, не считается.

Конечно нет. ОС и дрова отдельная ниша и там совсем не рулит C++, скорее C. Фоторедакторы нормально работают на .NET. "Текстовые процессоры" уже давно и в JS есть. В видеоплеерах кодеки низкоуровневые, причем уже готовые, а обвязка на высокоуровневых языках.
Мало, на проверку, оказывается потребности в C++, если legacy не смотреть.
Новые приложения в маркете это наглядно показывают, там нет груза legacy кода.

Кстати посмотри на маки, там большая часть приложений — objective c, вполне себе управляемый язык, причем довольно давно. Просто исторически так сложилось что на С++ было непопулярно писать для маков, там C++ и был нишевым всегда.
Re[13]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 18.06.13 11:55
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Кстати посмотри на маки, там большая часть приложений — objective c, вполне себе управляемый язык, причем довольно давно. Просто исторически так сложилось что на С++ было непопулярно писать для маков, там C++ и был нишевым всегда.


Objective-C управляемый приблизительно на столько, на сколько и C++. Или язык с поддержкой подсчета ссылок в составе основной библиотеки стал считаться управляемым? Тогда записывай в управляемые и C++ Несколько автоматизировали это дело в Objective-C всего пару лет как, и то, вся эта автоматизация для iOS к использованию не рекомендуется по соображениям производительности, насколько я помню.
Re[14]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.06.13 12:01
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Здравствуйте, gandjustas, Вы писали:


G>>Кстати посмотри на маки, там большая часть приложений — objective c, вполне себе управляемый язык, причем довольно давно. Просто исторически так сложилось что на С++ было непопулярно писать для маков, там C++ и был нишевым всегда.


KP>Objective-C управляемый приблизительно на столько, на сколько и C++. Или язык с поддержкой подсчета ссылок в составе основной библиотеки стал считаться управляемым? Тогда записывай в управляемые и C++ Несколько автоматизировали это дело в Objective-C всего пару лет как, и то, вся эта автоматизация для iOS к использованию не рекомендуется по соображениям производительности, насколько я помню.


Тем не менее — автоматическое (недетерминированное в общем случае) освобождение памяти есть, это как-бы основное различие управляемых и неуправляемых языков. При этом большая часть приложений на Objective-c.

Вообще вы зря недооцениваете исторический фактор при выборе технологий. Большая часть аргументов, которые приводятся сейчас, были актуальны 5-10 лет назад, сейчас их актуальнность малозаметно отличается от нуля.
Re[12]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 18.06.13 14:16
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Сегодня это уже не подпорки, а части стройного фреймворка для связи данных в памяти. Раньше были глобальные переменные, агрегация, ссылки и голые указатели. Сейчас добавились умные указатели (shared, unique, weak и intrusive) и rvalue-ссылки.


А умные указатели просто так умные или всё же за счёт определённой потери производительности?
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: Что посоветуете как аналог С++
От: alex_public  
Дата: 18.06.13 18:09
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>У меня метрошных приложений сильно больше, чем десктопных. Из десктопных только офис, браузеры и студия с live writer. Последние два кстати на .NET.

G>Метрошных около 30, из них 20-25 не нативные.
G>Даже скайп метрошный имеет интерфейс на JS.

Ух, наконец то я встретил человека полноценно перешедшего на стиль вин8. А то мне казалось что их существование — это фантастика. ))) Правда некая картинка в подписи наводит на мысли что это всё же не до конца объективный факт... )))
Re[2]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 18.06.13 18:10
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Самое первое — C++11 и идущий следом C++14. На фоне C++03 это совсем новый язык.

KP>Rust — самый что ни на есть малоизвестный и экзотический язык. Правда, надеюсь, со светлым будущим, да и выглядит очень перспективно.
Я тут пишу клиент для Amazon S3 на Rust, причём у меня задача сделать его офигительно параллельным. Пока получается очень неплохо, по сравнению с предыдущей версией на С++.

С++1x тоже очень неплох, но сейчас слишком не хватает нормальной параллельности. Если на неё пофиг, то всё вполне ОК.

KP>D — вроде хороший, но не менее экзотический и уже, похоже что, без перспектив, в отличие от...

Его сразу в морг.
Sapienti sat!
Re[14]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 18.06.13 18:12
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Скорее за счёт времени компиляции. В быстродействие unique_ptr не уступает голым указателям. )


Это хорошо. А второй, который shared?
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: Что посоветуете как аналог С++
От: Nikе Россия  
Дата: 18.06.13 18:13
Оценка:
Здравствуйте, IT, Вы писали:

_>>Скорее за счёт времени компиляции. В быстродействие unique_ptr не уступает голым указателям. )


IT>Это хорошо. А второй, который shared?


Тот который шаред — ИМХО антипаттерн.
Нужно разобрать угил.
Re[3]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 18.06.13 18:22
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Есть пока некоторые больные места в его реализациях (вроде GC), но если на них сильно не наступать, то очень годный язык уже сегодня, а по сочетанию понятности-выразительности-скорости, пожалуй, круче всех.

В D проблема с конкурентностью — о ней никто не думал, потому получилась yet another native Java с общим хипом. Отсюда и проблемы с GC, которые неустранимы по дизайну.

Если на это пофиг, то стоит посмотреть на Go.

Пока из языков, которые избежали этого, есть только Rust.
Sapienti sat!
Re[3]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 18.06.13 18:33
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я тут пишу клиент для Amazon S3 на Rust, причём у меня задача сделать его офигительно параллельным. Пока получается очень неплохо, по сравнению с предыдущей версией на С++.


А тебя не утомляет каждый раз переписывать код, после того как в очередной версии все внезапно поменяли? Или ты сидишь на ветке из Git?

Да, а вот теперь реально интересующий меня вопрос. Ты что используешь в качестве сетевого уровня? Текущая версия из Rust, мягко говоря, не завершена.
Re[3]: Что посоветуете как аналог С++
От: alex_public  
Дата: 18.06.13 18:50
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я тут пишу клиент для Amazon S3 на Rust, причём у меня задача сделать его офигительно параллельным. Пока получается очень неплохо, по сравнению с предыдущей версией на С++.


Попытался я его попробовать. Скачал инсталлятор с их сайта, запустил, поставил... А бинарник их не запускается, т.к. нет какой-то там библиотеки от mingw. Т.е. они и не осилили опцию "-static" mingw и не сподобились положить нужную библиотеку в инсталлятор. Теперь даже и не охота качать исходники их и компилировать самому при таком отношение к пользователям...

C>С++1x тоже очень неплох, но сейчас слишком не хватает нормальной параллельности. Если на неё пофиг, то всё вполне ОК.


А что подразумевается под нормальной параллельностью? Мне правда интересно. )

KP>>D — вроде хороший, но не менее экзотический и уже, похоже что, без перспектив, в отличие от...

C>Его сразу в морг.

Это почему? )))
Re[15]: Что посоветуете как аналог С++
От: alex_public  
Дата: 18.06.13 19:01
Оценка:
Здравствуйте, IT, Вы писали:

IT>Это хорошо. А второй, который shared?


shared_ptr/weak_ptr естественно добавляет по мелочи относительно голых указателей, но их соответственно и употребляют взамен не голых указателей, а тоже нетривиальных велосипедов не попадающих под RAII. Так что никакого провала в производительности при переходе с древнего велосипедного C++ на современный нет. А безопасность при этом становится гарантированной компилятором, как и в управляемых языках. Только эффективнее. )))
Re[4]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.06.13 19:36
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Не совсем. Что на JVM, что на .NET типичный подход выглядит как-то так: "главное задача, памяти бесконечно много, не хватает мощности — поставим на кластер". Умный это подход или глупый, в общем случае, – мне судить сложно. С точки зрения системного C++ разработчика – подход глупый, но, бизнес, вроде как устраивает.


Это не на JVM или .Net, а во вполне определенных областях. Как правило тормозные монстры до того как их сделали на джаве или нете, были еще более тормозными и глючными в своем плюсовом детстве.

KP>Ну и в целом, большинство JVM и .NET смутно представляют себе то, как работает их код на железе, что тоже не слабо сказывается на его качестве. Этот нюанс прослеживается что на форуме, что в личной беседе.


Проблема опять же не в джаве и дотнете, а именно в том, что большинство не понимает как код ложится на железо. Если человек в дотнете сравнивает все значения через .ToString(), то как правило в С/С++ он делал в сто раз больше строчек кода что бы в итоге вызвать чтото навроде strcmp или memcmp. До смешного доходит — bool конвертируется в строку и сравнивается с "True". Имел возможность сравнивать С++ код таких разрабов — там вообще туши свет, десятки килобайт кода просто что бы сравнить два объекта

Собтсвенно это большинство, которое не понимает, как код ложится на железо, примерно одинаковое по квалификации везде, и доля этого большинства везде в мейнстриме примерно одинаковая. Вот скажем в обработке звука или геймдеве таких героев очень мало, а в мейнстриме — пожалуйста.
Re[4]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.06.13 19:43
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Если отбросить эмоции, то Java/.Net разработчики не задумываются о ресурсах/алгоритмах. Мне прямо говорили: "В бизнес-приложениях алгоритмы не нужны, у нас все в базу упирается".


Эти бизнес-приложения в до-менеджед период писались точно так же — "В бизнес-приложениях алгоритмы не нужны, у нас все в базу упирается", при чем на самом что ни есть православном С++.
Лично я уходил на дотнет из за наличия инструментов, с помощью которых можно навести порядок в коде. Для С++ их и по сей день нет. Потому древний код, который никто не знает, как должен работать, привести в порядок крайне тяжело. В дотнете, джаве — очень просто, т.к. средства автоматического рефакторинга, тесты всяких сортов, анализаторы кода и тд и тд берут на себя примерно 90% той работы, которую на С++ надо делать руками.
Теоретически, на С++ чтото даже есть, но это сильно условно, т.к. благодаря тем техникам, что уже по факту укоренились в С++, ни один тул не может ничего гарантировать, даже простое переименование метода местами даёт проблемы.
Re[6]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.06.13 19:45
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Т.е. с утверждением: "главное задача, памяти бесконечно много, не хватает мощности — поставим на кластер" ты согласен?


Не совсем ясно, при чем здесь менеджед среды
Re[4]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 18.06.13 20:06
Оценка:
DM>>Жизнь слишком коротка, чтобы учить С++.

KP>Не такой уж он и сложный


Не сложный но занимает время. Для промышленной разработки много С++-а как такового не надо. Совсем несложно посидеть с компилятором чтобы заучить разные фишки. Гараздо сложнее делать свой проект который кому-то будет приносить пользу (и возможно тебе деньги). Поэтому те кто делают свои проекты и те же люди с Шаровары вызывают у меня намного больше симпатии. Для меня они — профессионалы а не любители стандарта С++ и Александреску.
Re[8]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 18.06.13 20:26
Оценка:
A>За последние 10 лет, я не помню случая когда мне понадобилось использовать хитрый алгоритм или структуру данных.

А какие сложные алгоритмы и структуры данных ты хочешь использовать? Все стандартные структуры данных уже написаны, есть и в СТЛ и в дот нете. Бери и пользуйся. А большего и не надо для большинства задач. Так что я не понимаю некоторых заявлений что дотнетчики пишут неэффективный код. Программирование-то от языка не зависит.
Re[12]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 18.06.13 20:32
Оценка:
IT>>И сколько ещё всяких разных подпорок и затычек нужно для себя открыть?

KP>Если очень хочется писать тормозные и прожорливые корпоративные приложения, в которых главное решить задачу, а "память и алгоритм имеют низкую значимость" (С), то лучше открыть для себя .NET или JVM. Именно это я и утверждал изначально


Сударь, это голословность! Потрудитесь привести конкретные примеры.
Re[17]: Что посоветуете как аналог С++
От: fddima  
Дата: 18.06.13 20:34
Оценка:
Здравствуйте, fddima, Вы писали:

Корчое не тем вы меряетесь.
Равных .NET или Java на серверах... ммм... приложений — нет. Понятно, что всегда можно найти узконаправленные задачи, где бы C++ себя показал. Но в целом, важны не только критерии теоретического перфоманса, но и потребности практического саппорта.
Я вот сегодня случайно помогал восстанавливать работоспособность сайта на PHP — одна умелая строчка с error_reporting(0) и @xxx конструкции сделали из пяти минутной задачи — часовую.
Хотя конечно настройка IIS в этом смысле тоже доставляет, но .NET и ASP.NET тут совсем не причём.
Re[3]: Что посоветуете как аналог С++
От: roro  
Дата: 18.06.13 21:24
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, roro, Вы писали:


R>>Здравствуйте, Grundik2, Вы писали:


G>>>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


R>>Аналогов С++ имхо нет.


M>Чем Ada не вариант? Если брать стандарт 2012 года? Или ее диалект SPARK?


С++ золотой молоток под все виды задач, бешеная производительность и лихая езда по памяти.

Ада, насколько знаю, полная противоположность — медленная безопасная езда в космосе.
Re[4]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 18.06.13 21:31
Оценка:
Здравствуйте, kaa.python, Вы писали:

C>>Я тут пишу клиент для Amazon S3 на Rust, причём у меня задача сделать его офигительно параллельным. Пока получается очень неплохо, по сравнению с предыдущей версией на С++.

KP>А тебя не утомляет каждый раз переписывать код, после того как в очередной версии все внезапно поменяли? Или ты сидишь на ветке из Git?
Я пока на 0.6 сижу, который в MacPorts лежал.

KP>Да, а вот теперь реально интересующий меня вопрос. Ты что используешь в качестве сетевого уровня? Текущая версия из Rust, мягко говоря, не завершена.

Прикрутил libcurl. Заодно разобрался с ARC и разделяемыми ресурсами
Sapienti sat!
Re[4]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 18.06.13 21:33
Оценка:
Здравствуйте, alex_public, Вы писали:

C>>С++1x тоже очень неплох, но сейчас слишком не хватает нормальной параллельности. Если на неё пофиг, то всё вполне ОК.

_>А что подразумевается под нормальной параллельностью? Мне правда интересно. )
Максимальный контроль компилятора над используемыми данными и изоляция данных между потоками.
Sapienti sat!
Re[5]: Что посоветуете как аналог С++
От: alex_public  
Дата: 19.06.13 01:04
Оценка:
Здравствуйте, Cyberax, Вы писали:

_>>А что подразумевается под нормальной параллельностью? Мне правда интересно. )

C>Максимальный контроль компилятора над используемыми данными и изоляция данных между потоками.

Ну изоляция то на уровне компилятора это не так что бы особо круто (это можно и административными мерами решать). Гораздо интереснее как реализован обмен данными между потоками. Лично мне больше всего нравится эрланговская модель и я прямо её и использую в C++.
Re[15]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 19.06.13 03:17
Оценка:
Здравствуйте, IT, Вы писали:

_>>Скорее за счёт времени компиляции. В быстродействие unique_ptr не уступает голым указателям. )


IT>Это хорошо. А второй, который shared?


shared медленнее голых указателей при копировании, ибо счётчик ссылок по указателю плюс сам указатель на счётчик ссылок. Но необходимое число копирований обычное не велико. Реально копирование shared_ptr-а необходимо только один раз на каждый акт появления/исчезновения нового владельца объекта. В остальных случаях его нужно передавать по ссылке или через move-semantic.
Главное гармония ...
Re[5]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 19.06.13 07:02
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Прикрутил libcurl. Заодно разобрался с ARC и разделяемыми ресурсами


Ясно, тогда не очень интересно. Я, почему-то, подумал ты не только параллельное, но и асинхронное приложение запилил
Re[3]: Что посоветуете как аналог С++
От: Visor2004  
Дата: 19.06.13 07:29
Оценка:
Здравствуйте, Mazay, Вы писали:

M>ИМХО достаточно Nemerle на LLVM надеть.

уже. Mono же есть на llvm
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[5]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 19.06.13 07:31
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Да, куча общая, и это плохо. Но зато есть изолированные системой типов процессы (потоки), обменивающиеся сообщениями а-ля Эрланг, плюс файберы для уделывания всяких нодежсов в асинхронности. Плюс все глобальные переменные по умолчанию thread local. Плюс можно более аккуратно работать с памятью (в том числе переопределить new), чтобы устроить локальные мини-кучи в потоках и не нагружать без нужды общий GC. Короче, не эрланг и не раст, но все ж неплохо.


Для "не плохо" есть C++. Для хорошо, хочется надеятся, будет Rust
Re[14]: Что посоветуете как аналог С++
От: Nikе Россия  
Дата: 19.06.13 08:36
Оценка:
Здравствуйте, jazzer, Вы писали:

M>>>Сейчас добавились умные указатели (shared, unique, weak и intrusive) и rvalue-ссылки.

N>>Мне нравится слово "сейчас"

J>Ну в Стандарте — действительно "сейчас". Соответственно, для бустофобов тоже только "сейчас".


Я не скажу, что я бустофил, но shared, unique, weak и intrusive использовал ещё до того как узнал о бусте (>10 лет). В велосипедной реализации.
Нужно разобрать угил.
Re[15]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 19.06.13 10:41
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Здравствуйте, jazzer, Вы писали:


M>>>>Сейчас добавились умные указатели (shared, unique, weak и intrusive) и rvalue-ссылки.

N>>>Мне нравится слово "сейчас"

J>>Ну в Стандарте — действительно "сейчас". Соответственно, для бустофобов тоже только "сейчас".


N>Я не скажу, что я бустофил, но shared, unique, weak и intrusive использовал ещё до того как узнал о бусте (>10 лет). В велосипедной реализации.


Как и все мы. Но Boost.SmartPtr была в бусте с самого его начала в 1999 году (когда еще и релизов не было), а то и в 1998, 15 лет назад
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[9]: Что посоветуете как аналог С++
От: Grundik2 Земля  
Дата: 19.06.13 13:12
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Здравствуйте, Grundik2, Вы писали:


KP>>>А почему ты считаешь что это хорошо?


G>>Не прийдется его учить.


Ops>А вместо русского какой учил?


где логика?
Re[6]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 19.06.13 13:26
Оценка:
Здравствуйте, kaa.python, Вы писали:

C>>Прикрутил libcurl. Заодно разобрался с ARC и разделяемыми ресурсами

KP>Ясно, тогда не очень интересно. Я, почему-то, подумал ты не только параллельное, но и асинхронное приложение запилил
Оно асинхронное — libcurl умеет
Sapienti sat!
Re[6]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 19.06.13 13:28
Оценка:
Здравствуйте, alex_public, Вы писали:

C>>Максимальный контроль компилятора над используемыми данными и изоляция данных между потоками.

_>Ну изоляция то на уровне компилятора это не так что бы особо круто (это можно и административными мерами решать). Гораздо интереснее как реализован обмен данными между потоками. Лично мне больше всего нравится эрланговская модель и я прямо её и использую в C++.
Ты будешь удивляться, но в Rust как раз подобная модель. Только более продуманная.
Sapienti sat!
Re[7]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 19.06.13 13:39
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Оно асинхронное — libcurl умеет


Насколько я помню, она может работать в неблокируемом режиме, но никак не в асинхронном. Там же select внутри. Или я что-то путаю?
Re[8]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 19.06.13 14:07
Оценка:
Здравствуйте, kaa.python, Вы писали:

C>>Оно асинхронное — libcurl умеет

KP>Насколько я помню, она может работать в неблокируемом режиме, но никак не в асинхронном. Там же select внутри. Или я что-то путаю?
А в чём особая разница? Libcurl может делать select (или poll) на нескольких соединениях, события которых потом можно асинхронно обрабатывать.
Sapienti sat!
Re[9]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 19.06.13 14:14
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>А в чём особая разница? Libcurl может делать select (или poll) на нескольких соединениях, события которых потом можно асинхронно обрабатывать.


В реализации и подходе. Асинхронный режим, прием сообщения: создал буфер и сказал тебя позвать когда в нем будут данные; пришли данные, тебя позвали и ты имеешь буффер заполненный данными. Неблокирующий режим, прием сообщения: попросил тебя позвать когда данные будут; тебя позвали, ты вычитал данные и используешь их. Разница в том, что вычитка данных происходит за счет времени твоего приложения, а не за счет ядра. С отправкой аналогично.
Плюс имеются ограничения в функции select на количество одновременно обрабатываемых дескрипторов.
Re[11]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 19.06.13 15:33
Оценка:
Здравствуйте, gandjustas, Вы писали:

N>>>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>>>Память? А причем тут зарядка?
EP>>Performance bottleneck большинства программ это взаимодействие с иерархией памяти.
G>Это ты про какие программы?
G>Среднее дсктопное приложение более 90% времени проводит в ожидании пользователя. Еще 9% в ожидании завершения IO.

Я имел ввиду performance "активной" работы процессора. Плохая работа с памятью -> процессор будет дольше находится в "активном" режиме.

EP>>Плохой memory layout структур данных, лишние индерекции, лишние аллокации, плохая работа с кэшем — это всё яд для производительности — этим всем грешат "управляемые среды", поэтому и производительность намного хуже.

G>Бросай читать книжки 80-х годов.

Поясни

EP>>Требуется в 10 раз больше памяти? — косвенный признак тормозов.

G>Спорный вопрос. Если в памяти кешируется результат чтения с диска, то я предпочту в 10 раз больше памяти.

Речь шла об одинаковых алгоритмах и структурах в разных языках.
Сравнивать производительность сред/языков по разным алгоритмам и структурам как-то совсем неправильно.

EP>>Чтобы делать быстрый код в "управляемых средах" — нужно работать против языка, отказываться от многих средств выражения идей, спускаясь на крайне низкий уровень (даже ниже чем C).

G>Покажи пример чтоли?

Например возьми java, и сравни скорость создания массива int, допустим 32M элементов, и создание массива (размером 16M) объектов в каждом из которых содержатся два int, т.е.:
class Point2D
{
    public int x,y;
}

Это простейшая абстракция, на которую в java будет сильное penalty как по памяти, по скорости создания (на 1-3 порядка), так и по скорости доступа.

G>Я вот оптимизировал C# код, который получал данные от железки постоянно, проводил небольшие расчеты и складывал в базу.

G>Оптимизации по памяти довольно банальные — убрать лишние аллокации, которые возникают, например, из-за замыканий.
G>Оптимизация производительности — использование правильных структур данных, особенно с учетом многопоточности.
G>Но самая главная оптимизация, которая позволила приложению нагружать процессор на 10% при 100 пакетах в секунду — все общение в внешним миром было сделано асинхронным.
G>Где тут низкий уровень?
G>И это кстати пример программы, которая работает все время.

То что ты достиг скорости приемлемой для твоей задачи, вовсе не означает что программа использует ресурсы эффективно (что естественно не является самоцелью), и что её производительность нельзя улучшить на пару порядков.
Да, использование алгоритмических оптимизаций, уменьшение сложности — это всё важно, и особо не зависит от языка.
Но я имею в виду то, что сравнивая одинаковые алгоритмы на разных языках — на C++ гораздо легче написать код который выжимает максимум из железа, в то время как в "управляемых средах" это будет работа против языка, отказ от абстракций (см пример выше) и т.п.

G>Кстати выше я уже писал что для десктопного приложения важен perceived performance, а не объем памяти или скорость вычислений.


Так я с этим и не спорил
Да, есть приложения, будь они хоть замедленны в 1000 раз — не перестали бы решать поставленную задачу. Реально эффективный код нужен далеко не везде.
Re[10]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 19.06.13 16:16
Оценка:
Здравствуйте, kaa.python, Вы писали:

C>>А в чём особая разница? Libcurl может делать select (или poll) на нескольких соединениях, события которых потом можно асинхронно обрабатывать.

KP>В реализации и подходе. Асинхронный режим, прием сообщения: создал буфер и сказал тебя позвать когда в нем будут данные; пришли данные, тебя позвали и ты имеешь буффер заполненный данными. Неблокирующий режим, прием сообщения: попросил тебя позвать когда данные будут; тебя позвали, ты вычитал данные и используешь их. Разница в том, что вычитка данных происходит за счет времени твоего приложения, а не за счет ядра. С отправкой аналогично.
Я тебе скажу, что в Линуксе разницы между этими двумя подходами совсем нет. Это если не заниматься экзотикой типа AIO, который один фиг не работает.

KP>Плюс имеются ограничения в функции select на количество одновременно обрабатываемых дескрипторов.

Там используется poll(), который реально ограничений не имеет.
Sapienti sat!
Re[5]: Что посоветуете как аналог С++
От: Mna 404 and heavy formation
Дата: 19.06.13 16:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Лично я уходил на дотнет из за наличия инструментов, с помощью которых можно навести порядок в коде. Для С++ их и по сей день нет. Потому древний код, который никто не знает, как должен работать, привести в порядок крайне тяжело.

I>В дотнете, джаве — очень просто, т.к. средства автоматического рефакторинга, тесты всяких сортов, анализаторы кода и тд и тд берут на себя примерно 90% той работы, которую на С++ надо делать руками.
I>Теоретически, на С++ что-то даже есть, но это сильно условно, т.к.
I>благодаря тем техникам, что уже по факту укоренились в С++, ни один тул не может ничего гарантировать, даже простое переименование метода местами даёт проблемы.

Что это за порочные техники такие?

Особенно интересно узнать что сотворит переименование метода? там, что, часть метода в #define написана?
Re[11]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 19.06.13 16:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Performance bottleneck большинства программ это взаимодействие с иерархией памяти.

EP>>Плохой memory layout структур данных, лишние индерекции, лишние аллокации, плохая работа с кэшем — это всё яд для производительности — этим всем грешат "управляемые среды", поэтому и производительность намного хуже.
EP>>Требуется в 10 раз больше памяти? — косвенный признак тормозов.

I>Это общие слова. Такие вещи имеют вес в основном в числодробилках.


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

I>"лишние аллокации" в менеджед не проблема.


Ну да — именно поэтому разработчики оптимизаторов пыхтят например над escape analysis
Как пример — эти аллокации вылезают по всему коду, при простейших абстракциях — просадка 16x на ровном месте.
Также аллокации ухудшают локальность, что является дополнительной проблемой.
Чтобы бороться с ними, нужно от многого отказываться и работать против языка — этим редко кто занимается, ибо проще взять более подходящий инструмент.

I>Что характерно, быстрый код на С++ это точно так же работа против языка.


Alexander Stepanov:
What do I mean when I say that an algorithm does not "impose any performance penalty"? In other words, how do you know that a generic algorithm is efficient? An algorithm is called relatively efficient if it's as efficient as a nongeneric version written in the same language, and it's called absolutely efficient if it's as efficient as a nongeneric assembly language version.

For many years, I tried to achieve relative efficiency in more advanced languages (e.g., Ada and Scheme) but failed. My generic versions of even simple algorithms were not able to compete with built-in primitives. But in C++ I was finally able to not only accomplish relative efficiency but come very close to the more ambitious goal of absolute efficiency. To verify this, I spent countless hours looking at the assembly code generated by different compilers on different architectures.



I>Почему то самые критичные куски кода пишутся практически на С или подобным образом.


Это распространённый миф

EP>>

EP>>Andrei Alexandrescu: "The going word at Facebook is that 'reasonably written C++ code just runs fast,' which underscores the enormous effort spent at optimizing PHP and Java code. Paradoxically, C++ code is more difficult to write than in other languages, but efficient code is a lot easier."


I>Это все басни.


Это реальный опыт крупного проекта
Re[5]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 19.06.13 16:57
Оценка:
Здравствуйте, Cyberax, Вы писали:

KP>>Да, а вот теперь реально интересующий меня вопрос. Ты что используешь в качестве сетевого уровня? Текущая версия из Rust, мягко говоря, не завершена.

C>Прикрутил libcurl. Заодно разобрался с ARC и разделяемыми ресурсами

А что такое ARC? И в чём состояло прикручивание libcurl?
Главное гармония ...
Re[11]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 19.06.13 17:50
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я тебе скажу, что в Линуксе разницы между этими двумя подходами совсем нет. Это если не заниматься экзотикой типа AIO, который один фиг не работает.


Как же у вас там все печально
Эту проблему, в году так 2008 грозились вот-вот решить.
Re[12]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 19.06.13 18:19
Оценка:
Здравствуйте, kaa.python, Вы писали:

C>>Я тебе скажу, что в Линуксе разницы между этими двумя подходами совсем нет. Это если не заниматься экзотикой типа AIO, который один фиг не работает.

KP>Как же у вас там все печально
KP>Эту проблему, в году так 2008 грозились вот-вот решить.
Пробовали, для сетей это не имеет большого смысла. Сейчас основной пользователь AIO — это базы данных, которые хотят делать кучу операций с дисковыми массивами.
Sapienti sat!
Re[13]: Что посоветуете как аналог С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 19.06.13 19:16
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Пробовали, для сетей это не имеет большого смысла. Сейчас основной пользователь AIO — это базы данных, которые хотят делать кучу операций с дисковыми массивами.


Вообще-то, смысл есть, в случае написания сервера, как минимум. С учетом того, что ты писал клиента, особого смысла в использовании асинхронного IO нет, тут я согласен.
Re[17]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 19.06.13 19:17
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А стоит сказать это в форуме С++, минусов будет на три страницы.


Откуда такая уверенность?
Re[9]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 19.06.13 19:19
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Почти все десктопные приложения довольно древние, разработаны в году 2005 и ранее.

G>А вот приложения для w8 по большей части .NET (WinRT) и JavaScript.

Ну раз так, то уверен, будет не сложно назвать хотя бы десяток популярных десктопных приложений на .Net? Прошу.
Re[11]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 19.06.13 19:25
Оценка:
Здравствуйте, IT, Вы писали:

KP>>Ну разве что только те, кто так и не открыл для себя shared_ptr и unique_ptr


IT>И сколько ещё всяких разных подпорок и затычек нужно для себя открыть?


Почему ты называешь часть языка подпорками? А цикл for — подпорка, а if?
Re[9]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 19.06.13 19:27
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>А вот для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто.


Это ты о чем вообще? Сказать ОС, что не будить процесс до наступления некоего события одной функцией это сложность?
Re[5]: Что посоветуете как аналог С++
От: roro  
Дата: 19.06.13 20:19
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, roro, Вы писали:


R>>Здравствуйте, Mystic, Вы писали:


M>>>Здравствуйте, roro, Вы писали:


R>>>>Здравствуйте, Grundik2, Вы писали:


G>>>>>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


R>>>>Аналогов С++ имхо нет.


M>>>Чем Ada не вариант? Если брать стандарт 2012 года? Или ее диалект SPARK?


R>>С++ золотой молоток под все виды задач, бешеная производительность и лихая езда по памяти.


R>>Ада, насколько знаю, полная противоположность — медленная безопасная езда в космосе.


M>Ada компилируется в машинный код. Производительность вполне сопоставимая с С++. Если брать стандарт 2012, то за счет предусловий и постусловий может быть доказана exception free для выхода индекса за пределы диапазона, выхода за пределы типа, деления на нуль, численного переполнения. В целом строгость языка дает компилятору куда больше возможностей понять, что происходит к коде, где можно оптимизировать, а где нет.


M>Получить лихую езду по памяти в Ada вполне возможно, только это более многословно. Во-первых, при использовании указателя надо использовать атрибут Unchecked_Access. И еще надо при помощи pragma Convention попросить компилятор сделать указатель C-совместимым. Так же можно использовать System.Address + System.Address_To_Access_Conversions(Node). Получается куча "мамой клянусь" в тексте.


Вы меня заинтриговали.
Поставил себе GPS2013, примеры в нем какие-то странные. demo/matrix_handling строки матрицы выделяет на куче, причем каждую строку по отдельности через calloc, и все это происходит в файле matrix.c

Где бы посмотреть эталонные реализации matrix-vector, KD-tree, ray-intersection, желательно чистые без c/c++ ?
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.06.13 20:25
Оценка:
Здравствуйте, MTD, Вы писали:


MTD>Откуда такая уверенность?


Да как бы уже проходили
Re[10]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.06.13 20:40
Оценка:
Здравствуйте, MTD, Вы писали:

G>>Почти все десктопные приложения довольно древние, разработаны в году 2005 и ранее.

G>>А вот приложения для w8 по большей части .NET (WinRT) и JavaScript.

MTD>Ну раз так, то уверен, будет не сложно назвать хотя бы десяток популярных десктопных приложений на .Net? Прошу.


Открой магазин W8 да посмотри сам
Re[10]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.06.13 20:48
Оценка:
Здравствуйте, MTD, Вы писали:

G>>А вот для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто.


MTD>Это ты о чем вообще? Сказать ОС, что не будить процесс до наступления некоего события одной функцией это сложность?


Как винда тормозит, так виноваты руки, а как менеджед приложение тормозит, так виноват дотнет.

Похоже какие то слишком двойные стандарты.
Re[11]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 19.06.13 21:08
Оценка:
Здравствуйте, Ikemefula, Вы писали:

MTD>>Ну раз так, то уверен, будет не сложно назвать хотя бы десяток популярных десктопных приложений на .Net? Прошу.


I>Открой магазин W8 да посмотри сам


Я не знаю, что это. Так будут оглашены названия хотя бы десятка популярных десктопных приложений на .Net? Прошу.
Re[11]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 19.06.13 21:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, MTD, Вы писали:


G>>>А вот для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто.


MTD>>Это ты о чем вообще? Сказать ОС, что не будить процесс до наступления некоего события одной функцией это сложность?


I>Как винда тормозит, так виноваты руки, а как менеджед приложение тормозит, так виноват дотнет.


I>Похоже какие то слишком двойные стандарты.


Это твое изречение оно вообще к чему?
Re[19]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 19.06.13 21:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>shared_ptr хоть и полезен, но сильно overused.

EP>>Многие его используют абсолютно ни к месту — где достаточно unique_ptr, а где-то вообще никакой smart pointer не нужен.
I>Опаньки, что же выходит, сурьёзные сиплюсники оказывается не умеют указатели использовать ?

Неправильно, нормальные C++ программисты умеют их не использовать.

I>Помнится это именно ты год назад доказывал мне, что все ровно наоборот — сиплюсники чуть не поголовно используют указатели самым правильным образом.


Ты что-то путаешь — таких заявлений я не делал.
Re[14]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 19.06.13 21:42
Оценка:
Здравствуйте, kaa.python, Вы писали:

C>>Пробовали, для сетей это не имеет большого смысла. Сейчас основной пользователь AIO — это базы данных, которые хотят делать кучу операций с дисковыми массивами.

KP>Вообще-то, смысл есть, в случае написания сервера, как минимум. С учетом того, что ты писал клиента, особого смысла в использовании асинхронного IO нет, тут я согласен.
По факту — не особо. Сетевой стек достаточно сложен, так что простое копирование в результирующий буфер не составляет заметной задержки. По количеству системных вызовов, возможно, есть небольшая разница, но они в Линуксе дешёвые.

Сейчас высокоскоростные трейдеры пилят в Линуксе прямую доставку пакетов от карты через DMA-BUF инфраструктуру, но там всё получается слишком хардкорно. Для обычных серверов это не имеет смысла совершенно.
Sapienti sat!
Re[12]: Что посоветуете как аналог С++
От: fddima  
Дата: 19.06.13 21:54
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ну да — именно поэтому разработчики оптимизаторов пыхтят например над escape analysis

EP>Как пример — эти аллокации вылезают по всему коду, при простейших абстракциях — просадка 16x на ровном месте.
Я не знаю, что там насчет escape analysis, но с явой — это явный косяк JVM (а точнее говоря её ущербность).
В Java нет нормальных value-типов, как в дотнете и других управляемых средах ещё ничего не говорит. Point2/3 делать классом... ну — такого я ещё нигде не видел. Делаем Point2 "структурой" — и разницы никакой нет.
А с объектами и C++ будет всё тоже самое (куча аллокаций на куче это всегда дорого в той или иной степени).

1 plain_array elapsed = 0,067025        // C# int
0 structured_array elapsed = 1,683958   // C# class
1 struct_array  elapsed = 0,0636559     // C# struct


  Скрытый текст
namespace ConsoleApplication1
{
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;

    class Point2D
    {
        public int x, y;
    }

    struct Point2
    {
        public Point2(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public int x, y;
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            {
                var sw = Stopwatch.StartNew();
                int[] v = new int[1 << 24];
                for (int i = 0; i != v.Length; ++i)
                    v[i] = 1;
                sw.Stop();
                Console.WriteLine(v[200] + " plain_array elapsed = " + sw.Elapsed.TotalSeconds);
            }
            {
                var sw = Stopwatch.StartNew();
                Point2D[] v = new Point2D[1 << 23];
                for (int i = 0; i != v.Length; ++i)
                    v[i] = new Point2D();
                sw.Stop();
                Console.WriteLine(v[100].x + " structured_array elapsed = " + sw.Elapsed.TotalSeconds);
            }
            {
                var sw = Stopwatch.StartNew();
                Point2[] v = new Point2[1 << 23];
                for (int i = 0; i != v.Length; ++i)
                    v[i] = new Point2(1, 2);
                sw.Stop();
                Console.WriteLine(v[100].x + " struct_array  elapsed = " + sw.Elapsed.TotalSeconds);
            }
        }
    }
}
Re[13]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 19.06.13 22:13
Оценка:
Здравствуйте, fddima, Вы писали:

EP>>Ну да — именно поэтому разработчики оптимизаторов пыхтят например над escape analysis

EP>>Как пример — эти аллокации вылезают по всему коду, при простейших абстракциях — просадка 16x на ровном месте.
F> Я не знаю, что там насчет escape analysis, но с явой — это явный косяк JVM (а точнее говоря её ущербность).
F> В Java нет нормальных value-типов,

Ну Ikemefula грозится "интенсивно заиспользовать язык"

F>как в дотнете и других управляемых средах ещё ничего не говорит.


Java один из самых ярких представителей.

F>Point2/3 делать классом... ну — такого я ещё нигде не видел.


В Java только классы — это пример применения маленькой абстракции в одной из самых распространённых управляемых сред

F>Делаем Point2 "структурой" — и разницы никакой нет.


C#-вые структуры — это всё равно определённые ограничения, и уж точно не дефолт в управляемых средах.

F>А с объектами и C++ будет всё тоже самое (куча аллокаций на куче это всегда дорого в той или иной степени).


Не будет, в C++ и классы и структуры это одно и тоже (за исключением дефолтного доступа членов и родителей) — причём default это value-semantics. Чтобы появились аллокации там нужно делать дополнительные движения.
Re[16]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 20.06.13 02:25
Оценка:
Здравствуйте, Mazay, Вы писали:

IT>>Это хорошо. А второй, который shared?

M>shared медленнее голых указателей при копировании, ибо счётчик ссылок по указателю плюс сам указатель на счётчик ссылок. Но необходимое число копирований обычное не велико.

Это не тот ли самый случай из-за чего старый VB тормозил на операциях с памяться раз так в 200?
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[12]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 20.06.13 02:25
Оценка:
Здравствуйте, MTD, Вы писали:

KP>>>Ну разве что только те, кто так и не открыл для себя shared_ptr и unique_ptr

IT>>И сколько ещё всяких разных подпорок и затычек нужно для себя открыть?
MTD>Почему ты называешь часть языка подпорками? А цикл for — подпорка, а if?

С каких пор обёртки для указателей стали частью языка?
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 05:21
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>В большинстве же приложений — это то, во что упирается производительность. А это не только скорость, но и энергоэффективность, и цена железа.

I>>Большинство оно сильно разное. И если уж совсем про большинство говорить, то проблемы точно не с производительность.

EP>А я не спорю что высокая производительность не везде нужна.


Ну вот видишь.

EP>>>Как пример — эти аллокации вылезают по всему коду, при простейших абстракциях — просадка 16x на ровном месте.

I>>Такой код в своём уме никто не пишет, кроме вчерашних плюсовиков, которые не знают как устроена память.

EP>Talk is cheap, show me the code.


А задача какая, выделить массив в сто тыщ мульёнов и пройтись по ём в цикле ?

EP>>>Чтобы бороться с ними, нужно от многого отказываться и работать против языка — этим редко кто занимается, ибо проще взять более подходящий инструмент.

I>>С такими проблемами как ты показал, не надо бороться против языка, наоборот, его надо интенсивно использовать.

EP>Ну так вперёд, модифицируй код выше


Я не умею оптимизировать код, задача и цель которого не ясна.

I>>Это ни о чем.


EP>Это мнение человека который разрабатывал алгоритмические библиотеки для Scheme, Ada, Java, C++


Это уже устаревший подход.

I>>Если производительность понимать исключительно как такты процессора, то еще можно чего то выдумывать.

I>>А если скажем сюда внести работу с диском, базой или сетью, все поворачивается ровно наоборот — С++ не в состоянии обеспечить перформанс, например потому что тяжело контролировать асинхронные операции. Всё, до свидания.

EP>stackless coroutines, stackfull coroutines, state machine, лямбды в конце концов


И ничего из этого в сиплюсплюсе нет, а лямбды сильно кастрированые что бы их называть таким словом.

EP>Покажи где например здесь "практически на С или подобным образом"?


Вот сюда смотри
https://code.google.com/p/sphinxsearch/source/browse/

Как думаешь, нужен ли здесь перформанс ?


I>>Это частный случай. Почему то плюсовики имеют обыкновение яростно отрицать опыт других проектов


EP>В этой ветке я вижу только твоё отрицание опыта FaceBook, другие проекты тут не упоминались


Ну да, это ж я рассказываю как кругом всё шоколадно.
Re[12]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 05:27
Оценка:
Здравствуйте, MTD, Вы писали:

G>>>>А вот для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто.


MTD>>>Это ты о чем вообще? Сказать ОС, что не будить процесс до наступления некоего события одной функцией это сложность?


I>>Как винда тормозит, так виноваты руки, а как менеджед приложение тормозит, так виноват дотнет.


I>>Похоже какие то слишком двойные стандарты.


MTD>Это твое изречение оно вообще к чему?


"для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто"

Сюда можно добавить работу с диском, устройствами, сетью, базой данных и тд.

Вопросы перформанса уже давно стали большим, чем подсчет тактов процессора.

И как то глядя на винду с лялихом, совершенно не очевидно, что "не будить процесс" это легко. В общем случае надо организовать корректную схему многопоточного взаимодействия, асинхронщину всякую. Вот это на с++ крайне сложно.
Re[12]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 05:33
Оценка:
Здравствуйте, MTD, Вы писали:

I>>Открой магазин W8 да посмотри сам


MTD>Я не знаю, что это. Так будут оглашены названия хотя бы десятка популярных десктопных приложений на .Net? Прошу.


Ты получил внятный ответ — популярные десктоп приложения были написаны еще задолго до 2005го года. Дотнет на тот момент, если не понятно,еще пешком под стол ходил.
Re[13]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 06:09
Оценка:
Здравствуйте, Ikemefula, Вы писали:

MTD>>Я не знаю, что это. Так будут оглашены названия хотя бы десятка популярных десктопных приложений на .Net? Прошу.


I>Ты получил внятный ответ — популярные десктоп приложения были написаны еще задолго до 2005го года. Дотнет на тот момент, если не понятно,еще пешком под стол ходил.


Стало быть их нет? C 2002 года, за 11 лет, всего одно приложение — Paint.NET? В тоже время сколько новых популярных приложений на умирающих плюсах появилось?
Re[13]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 06:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>"для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто"


I>Сюда можно добавить работу с диском, устройствами, сетью, базой данных и тд.


I>Вопросы перформанса уже давно стали большим, чем подсчет тактов процессора.


Опять бла-бла-бла. Ну и в чем конкретно в данных случаях преимущество перед плюсами? Или .Net чтобы данные прочитать диск не раскручивает, а из астрала их берет?

I>И как то глядя на винду с лялихом, совершенно не очевидно, что "не будить процесс" это легко.


Нет, это очень легко. Сам можешь посмотреть.

I>В общем случае надо организовать корректную схему многопоточного взаимодействия, асинхронщину всякую. Вот это на с++ крайне сложно.


Не сложней, чем на Java, например.
Re[6]: Что посоветуете как аналог С++
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 20.06.13 06:22
Оценка:
Здравствуйте, roro, Вы писали:

R>Вы меня заинтриговали.

R>Поставил себе GPS2013, примеры в нем какие-то странные. demo/matrix_handling строки матрицы выделяет на куче, причем каждую строку по отдельности через calloc, и все это происходит в файле matrix.c

R>Где бы посмотреть эталонные реализации matrix-vector, KD-tree, ray-intersection, желательно чистые без c/c++ ?


Тут можно глянуть: RTS. В частности, с кучей работают System.Pool_Local, GNAT.Dynamic_Tables.
Re[14]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 06:28
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, Ikemefula, Вы писали:


I>>"для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто"


I>>Сюда можно добавить работу с диском, устройствами, сетью, базой данных и тд.


I>>Вопросы перформанса уже давно стали большим, чем подсчет тактов процессора.


MTD>Опять бла-бла-бла. Ну и в чем конкретно в данных случаях преимущество перед плюсами? Или .Net чтобы данные прочитать диск не раскручивает, а из астрала их берет?

Конечного пользователя не интересует скорость вычислений. Вообще не интересует. Пользователя интересует отсутствие прерываний в работе когда программа что-то делает. Причем "что-то делает" в последнее время чаще всего обращение в интернет.
И тут становится важно: чтобы не зависал интерфейс, чтобы пользователь получал фидбек от происходящего, чтобы приложение было юзабельно при слабом соединении. При этом всем нужна плавная анимация и стабильная работа.
А еще важно чтобы при этом батарейка не кушалась если все это работает на планшете\телефоне.
На С++ это все делается сложнее чем на .NET и JS+HTML.


I>>В общем случае надо организовать корректную схему многопоточного взаимодействия, асинхронщину всякую. Вот это на с++ крайне сложно.

MTD>Не сложней, чем на Java, например.
Неправда твоя. Покажи как сделать продолжения и при этом не устраивать аццкие пляски с деаллокацией памяти.
Re[12]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 06:43
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, gandjustas, Вы писали:


G>>Я вот оптимизировал C# код, который получал данные от железки постоянно, проводил небольшие расчеты и складывал в базу.

G>>Оптимизации по памяти довольно банальные — убрать лишние аллокации, которые возникают, например, из-за замыканий.
G>>Оптимизация производительности — использование правильных структур данных, особенно с учетом многопоточности.
G>>Но самая главная оптимизация, которая позволила приложению нагружать процессор на 10% при 100 пакетах в секунду — все общение в внешним миром было сделано асинхронным.

MTD>Для дотнетчиков оказывается обработать 100 пакетов в секунду достижение Снимаю шляпу

Нет, это максимум что по COM порту пролетало. А вот 10% загрузки одного процессора при этом и workset в 50 мб очень даже достижение.

При этом на 100 пакетов 30 раз надо было сходить в базу и записать логи и отдать состояние десятку подключенных клиентов.
Re[10]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 07:03
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, gandjustas, Вы писали:


G>>Почти все десктопные приложения довольно древние, разработаны в году 2005 и ранее.

G>>А вот приложения для w8 по большей части .NET (WinRT) и JavaScript.

MTD>Ну раз так, то уверен, будет не сложно назвать хотя бы десяток популярных десктопных приложений на .Net? Прошу.


Открой Windows Market и смотри, там половина как минимум на .NET и JS. Можешь зайти в раздел "поплуярное".
Re[10]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 07:06
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, gandjustas, Вы писали:


G>>А вот для энергопотребления и perceived performance нужно правильно делать ожидания, а не быстрые вычисления, что на C++ непросто.


MTD>Это ты о чем вообще? Сказать ОС, что не будить процесс до наступления некоего события одной функцией это сложность?

На C++ вообще-то да. Покажи как на C++ будет выглядеть программа, которая: по нажатию кнопки получает данные из сети, потом их обрабатывает, пишет в базу и отправляет в сеть.
При этом обработка минимальная, а все остальное время программа должна спать. При этом надо отправку в сеть и запись в базу сделать параллельно.
Ну и надо не забывать что пока эти пляски происходят пользователь может еще раз нажать кнопку отправки.
Кстати желательно при всем этом не плодить сотни потоков.
Re[16]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 07:09
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, gandjustas, Вы писали:


I>>>>В общем случае надо организовать корректную схему многопоточного взаимодействия, асинхронщину всякую. Вот это на с++ крайне сложно.

MTD>>>Не сложней, чем на Java, например.
G>>Неправда твоя. Покажи как сделать продолжения и при этом не устраивать аццкие пляски с деаллокацией памяти.

J>1. Передавать объекты по значению — вопроса деаллокации вообще не возникнет.

J>2. Передавать shared_ptr — все сдохнет автоматизированно.
Я понимаю что в принципе это все можно сделать, но...

J>хз что из этого ты называешь "аццкими плясками"

Просто покажи пример кода.
Re[14]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 07:15
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, gandjustas, Вы писали:


MTD>>>Для дотнетчиков оказывается обработать 100 пакетов в секунду достижение Снимаю шляпу

G>>Нет, это максимум что по COM порту пролетало. А вот 10% загрузки одного процессора при этом и workset в 50 мб очень даже достижение.

G>>При этом на 100 пакетов 30 раз надо было сходить в базу и записать логи и отдать состояние десятку подключенных клиентов.


MTD>О, моя любимая тема! Я как раз 4 года писал похожий софт, так вот СОМ-порт — это очень-очень низкая скорость, в основном процесс будет спать в ожидании данных.


тут самое интересное что надо максимально часто опрашивать железку, поэтому паузы между пакетами не допустимы.
Если бы просто был опрос железки по запросу извне, то было бы все в разы проще.
Re[11]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 07:20
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Открой Windows Market и смотри, там половина как минимум на .NET и JS. Можешь зайти в раздел "поплуярное".


Ну ты же говорил, что пользуешься, вот я и интересуюсь — назови несколько, пожалуйста.
Re[15]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 07:26
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>тут самое интересное что надо максимально часто опрашивать железку, поэтому паузы между пакетами не допустимы.

G>Если бы просто был опрос железки по запросу извне, то было бы все в разы проще.

Вообще никакой разницы. Хоть такой код пиши:


while (true)
{
   Send(packet);
   if (TimedRead(packet, timeout) == SUCCESS)
   {
      DoSomething(packet);
   }
}


В случаее СОМ-порта, львиную долю времени процесс будет спать на ожидании событий ввода-вывода, что для тебя выражается в загрузке процессора аж процента на 1-2.
Re[3]: Что посоветуете как аналог С++
От: NeoCode  
Дата: 20.06.13 07:30
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Чем Ada не вариант? Если брать стандарт 2012 года? Или ее диалект SPARK?


Ada — совершенно стандартный язык с унылым паскалеподобным синтаксисом. Обычное процедурное программирование, обычное ООП, ничего такого там нет. Те же D, Go, Rust куда интереснее.
Единственное что может заинтересовать в Аде — это встроенное параллельное программирование, "tasks". Хотя и там ничего особенного.
Re[11]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 07:41
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Покажи как на C++ будет выглядеть программа, которая: по нажатию кнопки получает данные из сети, потом их обрабатывает, пишет в базу и отправляет в сеть.

G>При этом обработка минимальная, а все остальное время программа должна спать. При этом надо отправку в сеть и запись в базу сделать параллельно.
G>Ну и надо не забывать что пока эти пляски происходят пользователь может еще раз нажать кнопку отправки.
G>Кстати желательно при всем этом не плодить сотни потоков.

while (!Shutdown())
{
  WaitUntilKeypressed();
  ProcessorQueue.AddTask();
}

void ProcessorQueue::AddTask()
{
  DataPtr data(new Data());
  Queue.Push(data);
}

void ProcessorQueue::ProcessTask()
{
  DataPtr data = Queue.Pop(data);
  Network.Read(data);
  Process(data);
  DatabaseQueue.Push(data);
  NetworkRespondQueue.Push(data);
}
Re[14]: Что посоветуете как аналог С++
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 20.06.13 08:26
Оценка:
Здравствуйте, MTD, Вы писали:

I>>Ты получил внятный ответ — популярные десктоп приложения были написаны еще задолго до 2005го года. Дотнет на тот момент, если не понятно,еще пешком под стол ходил.


MTD>Стало быть их нет? C 2002 года, за 11 лет, всего одно приложение — Paint.NET? В тоже время сколько новых популярных приложений на умирающих плюсах появилось?


Кстати, да, сколько? Сколько новых популярных десктопных приложений появилось на плюсах за последние годы? Кажется, большинство популярных — все сиквелы к старинным продуктам, появившимся еще в прошлом веке. Игры разве что новые выходят, и то там внутри отнюдь не новые движки обычно, очередные обновления старых.
Re[12]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 08:35
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, gandjustas, Вы писали:


G>>Покажи как на C++ будет выглядеть программа, которая: по нажатию кнопки получает данные из сети, потом их обрабатывает, пишет в базу и отправляет в сеть.

G>>При этом обработка минимальная, а все остальное время программа должна спать. При этом надо отправку в сеть и запись в базу сделать параллельно.
G>>Ну и надо не забывать что пока эти пляски происходят пользователь может еще раз нажать кнопку отправки.
G>>Кстати желательно при всем этом не плодить сотни потоков.

MTD>
MTD>while (!Shutdown())
MTD>{
MTD>  WaitUntilKeypressed();
MTD>  ProcessorQueue.AddTask();
MTD>}

MTD>void ProcessorQueue::AddTask()
MTD>{
MTD>  DataPtr data(new Data());
MTD>  Queue.Push(data);
MTD>}

MTD>void ProcessorQueue::ProcessTask()
MTD>{
MTD>  DataPtr data = Queue.Pop(data);
MTD>  Network.Read(data);
MTD>  Process(data);
MTD>  DatabaseQueue.Push(data);
MTD>  NetworkRespondQueue.Push(data);
MTD>}
MTD>


Отлично
1) Если пользователь часто нажимает, то время ожидания растет.
2) race condition в очереди.
3) запись в базу и в сеть идет последовательно, а не параллельно.
4) нету кода, который вызывает ProcessTask, он у тебя довольно нетривальный будет.
Re[16]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 08:38
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, gandjustas, Вы писали:


G>>тут самое интересное что надо максимально часто опрашивать железку, поэтому паузы между пакетами не допустимы.

G>>Если бы просто был опрос железки по запросу извне, то было бы все в разы проще.

MTD>Вообще никакой разницы. Хоть такой код пиши:



MTD>
MTD>while (true)
MTD>{
MTD>   Send(packet);
MTD>   if (TimedRead(packet, timeout) == SUCCESS)
MTD>   {
MTD>      DoSomething(packet);
MTD>   }
MTD>}
MTD>


MTD>В случаее СОМ-порта, львиную долю времени процесс будет спать на ожидании событий ввода-вывода, что для тебя выражается в загрузке процессора аж процента на 1-2.


Так вот и вопрос в том как во время ожидания делать полезную работу, не плодя потоки. У твоем коде поток большую часть времени будет ждать в методах Send и TimedRead. Как ты будешь делать полезную работу в этот момент?
Re[4]: Что посоветуете как аналог С++
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 20.06.13 08:47
Оценка:
Здравствуйте, NeoCode, Вы писали:

NC>Здравствуйте, Mystic, Вы писали:


NC>Ada — совершенно стандартный язык с унылым паскалеподобным синтаксисом.


Паскалеподобный синтаксис делает работу с компилятором куда более дружественной. Если ты допускаешь опечатку в коде, то сообщение об ошибке в 99% случаев говорит о том, какую ты опечатку допустил. Например, пропущена точка с запятой, или еще что. В C++ очень часто опечатка дает возможность построения новой языковой конструкции, компитятор идет дальше, останавливается когда уже дрова полные, и выдает в качестве сообщение нечто несуразное. А если заюзаны шаблоны, то и многоэтаэжное.

NC>обычное ООП


Имхо, приятное. Не надо думать об перегрузке оператора копирования и оператора присваивания и прочих низкоуровневых тонкостях. Шаблоны надо прописывать явно, компилятор ничего за тебя на додумывает, что избавляет от нечитабельных сообщений об ошибках.

Еще есть контракты, и, в случае SPARK, возможность верификации.

Как по мне, там есть все нужное, и нет ничего лишнего.
Re[17]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 08:57
Оценка:
Здравствуйте, gandjustas, Вы писали:

J>>1. Передавать объекты по значению — вопроса деаллокации вообще не возникнет.

J>>2. Передавать shared_ptr — все сдохнет автоматизированно.
G>Я понимаю что в принципе это все можно сделать, но...
Но... что?

J>>хз что из этого ты называешь "аццкими плясками"

G>Просто покажи пример кода.

Такой пойдет?
typedef shared_ptr<MyClass> MyClassP;

void f1(int arg1, MyClassP&& arg2, function<void(int,MyClassP&&)> cont)
{
  if ( arg2->something(arg1) ) // whatever
    cont( arg1, arg2 );
}
void f2(int arg1, MyClassP&& arg2) {/*...*/} 

int main()
{
  f1( 5, make_shared<MyClass>(), f2);
}

arg1 по значению, arg2 по расшаренной ссылке. Можно и не по расшаренной, кстати, если нет необходимости ее шарить, а нужно просто передавать от одной функции к другой — тогда достаточно простого unique_ptr, у которого вообще никаких накладных расходов.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[13]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 09:07
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Отлично

G>1) Если пользователь часто нажимает, то время ожидания растет.

Как повезет. Чисто физически у тебя кабель один, так что если пакеты данных большие, а кликают часто, то как ни крутись, а очередь возникнет.

G>2) race condition в очереди.


Откуда?

G>3) запись в базу и в сеть идет последовательно, а не параллельно.


С чего вдруг? Очередь может иметь пул и по ним раскидывать данные.

G>4) нету кода, который вызывает ProcessTask, он у тебя довольно нетривальный будет.


Он будет тривиальный — wait/notify, просто писать лень.
Re[11]: Что посоветуете как аналог С++
От: FR  
Дата: 20.06.13 09:18
Оценка:
Здравствуйте, gandjustas, Вы писали:

N>>Примеры в студию!

G>Сходи на MSDN глянь как в WinRT делать асинхронные вызовы в C++, а потом сравни с .NET и JS.

Тут http://msdn.microsoft.com/ru-ru/magazine/hh781020.aspx не так страшно как ты описываешь
Понятно что сахара с неявными продолжениями как в C# нет, но и на лямбдах, хоть и корявые они
в C++, вполне нормально.
Re[15]: Что посоветуете как аналог С++
От: FR  
Дата: 20.06.13 09:32
Оценка:
Здравствуйте, gandjustas, Вы писали:

MTD>>Не сложней, чем на Java, например.

G>Неправда твоя. Покажи как сделать продолжения и при этом не устраивать аццкие пляски с деаллокацией памяти.

В boost есть Coroutine

Микрософт в PPL поддерживает и асинхронность:
http://msdn.microsoft.com/en-us/library/dd492427.aspx
http://msdn.microsoft.com/en-us/library/dd492627.aspx
Re[16]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 09:33
Оценка:
Здравствуйте, jazzer, Вы писали:

I>>Ну да, это ж я рассказываю как кругом всё шоколадно.


J>Нет, ты рассказываешь, что у тебя в проекте гонокод, и смело экстраполируешь это наблюдение на вообще все проекты на С++.


У меня в проекте нет С++ наверное с 2007го, иногда залажу посмотреть в сторонние проекты, так что ты промахнулся мимо унитаза
Re[14]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 09:35
Оценка:
Здравствуйте, MTD, Вы писали:

I>>Вопросы перформанса уже давно стали большим, чем подсчет тактов процессора.


MTD>Опять бла-бла-бла. Ну и в чем конкретно в данных случаях преимущество перед плюсами? Или .Net чтобы данные прочитать диск не раскручивает, а из астрала их берет?


Например внятная асинхронщина.

I>>И как то глядя на винду с лялихом, совершенно не очевидно, что "не будить процесс" это легко.


MTD>Нет, это очень легко. Сам можешь посмотреть.


Результатов как то не наблюдаю
Re[17]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 09:37
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, jazzer, Вы писали:


I>>>Ну да, это ж я рассказываю как кругом всё шоколадно.


J>>Нет, ты рассказываешь, что у тебя в проекте гонокод, и смело экстраполируешь это наблюдение на вообще все проекты на С++.


I>У меня в проекте нет С++ наверное с 2007го, иногда залажу посмотреть в сторонние проекты, так что ты промахнулся мимо унитаза


ну ок, в соседнем проекте. Смелости твоих экстраполяций это не меняет.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 09:47
Оценка:
Здравствуйте, jazzer, Вы писали:

J>>>Нет, ты рассказываешь, что у тебя в проекте гонокод, и смело экстраполируешь это наблюдение на вообще все проекты на С++.

I>>У меня в проекте нет С++ наверное с 2007го, иногда залажу посмотреть в сторонние проекты, так что ты промахнулся мимо унитаза

J>ну ок, в соседнем проекте. Смелости твоих экстраполяций это не меняет.


Сторонние это не соседние, а именно сторонние. Это значит, если непонятно, что ни я, ни команда, ни контора где я работал к ним не имели никакого отношения.
Re[17]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 10:19
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, jazzer, Вы писали:


I>>>>>В общем случае надо организовать корректную схему многопоточного взаимодействия, асинхронщину всякую. Вот это на с++ крайне сложно.

MTD>>>>Не сложней, чем на Java, например.
G>>>Неправда твоя. Покажи как сделать продолжения и при этом не устраивать аццкие пляски с деаллокацией памяти.

J>>1. Передавать объекты по значению — вопроса деаллокации вообще не возникнет.

J>>2. Передавать shared_ptr — все сдохнет автоматизированно.

J>>хз что из этого ты называешь "аццкими плясками"


I>Хорош гнать пургу. Открой короутины буста

I>Про другому асинхронщину, многопоточность и тд в с++ не сделать.

Да что ты говоришь! Открой для себя Boost.Asio.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[19]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 10:32
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, jazzer, Вы писали:


I>>>Хорош гнать пургу. Открой короутины буста

I>>>Про другому асинхронщину, многопоточность и тд в с++ не сделать.

J>>Да что ты говоришь! Открой для себя Boost.Asio.


I>Это низкоуровневый отстой.


Убедительность аргументации повергла меня в трепет.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[20]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 10:32
Оценка:
Здравствуйте, jazzer, Вы писали:

J>>>ну ок, в соседнем проекте. Смелости твоих экстраполяций это не меняет.

I>>Сторонние это не соседние, а именно сторонние. Это значит, если непонятно, что ни я, ни команда, ни контора где я работал к ним не имели никакого отношения.

J>Да пофиг. Беда в том, что ты по этим проектам делаешь космического масштаба выводы обо всех плюсовых проектах и плюсовых программерах.

J>Хотя, имхо, аргументация в стиле "С++ ущербен, я даже знаю несколько проектов с гонокодом внутри" несколько неубедительна, не находишь?

Если бы проектов было несколько, всё было бы очень даже хорошо.
Re[20]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 10:46
Оценка:
Здравствуйте, jazzer, Вы писали:

I>>Это низкоуровневый отстой.


J>Убедительность аргументации повергла меня в трепет.


Покажи мне аналог в asio для вот для такого псевдокода

private async void handler(object sender, TaskArgs args)
{
    string result = await new Task(() => Download(args.Url), args.Cancellation);

    textBox.Text += result;
}



Итого — функция которая асинхронно скачивает файлик, показывает его и дает возможность отменить скачивание. Всех библиотек можешь использовать только asio и мульку для скачивания.
Re[16]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 10:56
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, gandjustas, Вы писали:


MTD>>>Не сложней, чем на Java, например.

G>>Неправда твоя. Покажи как сделать продолжения и при этом не устраивать аццкие пляски с деаллокацией памяти.

FR>В boost есть Coroutine


Boost.Coroutine is implemented around a stack switching model; that is, every time a coroutine is entered, the following actions are carried:

The caller instruction pointer and callee clobbered registers are saved on the caller stack (this is done automatically as part of the call to the context switching routine respectively by the compiler and by the CPU).
the set of callee save registers are saved by the context switching routine on the caller stack.
The caller stack pointer is saved inside the caller context structure. This structure is stored on the coroutine context if a yield_to or yield is being performed, else it is also on the caller stack.
The callee stack pointer is retrieved from the callee context structure and set as current stack pointer.
Callee save registers are popped from the callee stack.
The context switching routine returns, restoring automatically from the new stack the called coroutine instruction pointer and clobbered registers.


По моему это есть всяких сортов пляски. Хотя я не уверен, давно пора пляски с памятью и стеком сделать частью языка С++, как это было сделано со смартпоинтерами. Тогда уж точно нельзя будет придраться
Re[17]: Что посоветуете как аналог С++
От: FR  
Дата: 20.06.13 11:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>По моему это есть всяких сортов пляски. Хотя я не уверен, давно пора пляски с памятью и стеком сделать частью языка С++, как это было сделано со смартпоинтерами. Тогда уж точно нельзя будет придраться


Как будто код с async который ты чуть выше привел не занимается за кулисами тем же самым.
Re[16]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 11:04
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, gandjustas, Вы писали:


MTD>>>Не сложней, чем на Java, например.

G>>Неправда твоя. Покажи как сделать продолжения и при этом не устраивать аццкие пляски с деаллокацией памяти.

FR>В boost есть Coroutine

А пример использования есть?
Корутины и продолжения не одно и тоже, но стоит глянуть как оно реализовано.

FR>Микрософт в PPL поддерживает и асинхронность:

FR>http://msdn.microsoft.com/en-us/library/dd492427.aspx
FR>http://msdn.microsoft.com/en-us/library/dd492627.aspx
Угу, посмотри примеры. Как минимум 10 строк, там где C# укладывается в одну. И это еще нету передачи данных между асинхронными вызовами.

Я об этом и говорю, вся стройность RAII рассыпается из-за продолжений.
Re[12]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 11:08
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, gandjustas, Вы писали:


N>>>Примеры в студию!

G>>Сходи на MSDN глянь как в WinRT делать асинхронные вызовы в C++, а потом сравни с .NET и JS.

FR>Тут http://msdn.microsoft.com/ru-ru/magazine/hh781020.aspx не так страшно как ты описываешь

FR>Понятно что сахара с неявными продолжениями как в C# нет, но и на лямбдах, хоть и корявые они
FR>в C++, вполне нормально.

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

Сразу код станет нечитаем совершенно.

А без этого никак. Никто тебе в UI потоке не позволит ожидание завершения IO делать.
Re[21]: Что посоветуете как аналог С++
От: FR  
Дата: 20.06.13 11:08
Оценка:
Здравствуйте, Ikemefula, Вы писали:


I>Покажи мне аналог в asio для вот для такого псевдокода


Если взять микрософтовский WinRT/PPL будет точно также с учетом того
что нет C# сахара с неявными продолжениями, вместо них придется выписывать
явные лямбды, вот первый пример здесь примерно на эту же тему.
Re[15]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 11:10
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Кстати, да, сколько? Сколько новых популярных десктопных приложений появилось на плюсах за последние годы?


Много. Только из того, что у меня сейчас открыто: Google Chrome, Skype, Virtual Box, Qt Creator.
Re[14]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 11:12
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, gandjustas, Вы писали:


G>>Отлично

G>>1) Если пользователь часто нажимает, то время ожидания растет.

MTD>Как повезет. Чисто физически у тебя кабель один, так что если пакеты данных большие, а кликают часто, то как ни крутись, а очередь возникнет.


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


G>>2) race condition в очереди.


MTD>Откуда?


А Queue у тебя thread-safe?

G>>3) запись в базу и в сеть идет последовательно, а не параллельно.

MTD>С чего вдруг? Очередь может иметь пул и по ним раскидывать данные.
Код в студию.
Вот уже сложность растет.

G>>4) нету кода, который вызывает ProcessTask, он у тебя довольно нетривальный будет.


MTD>Он будет тривиальный — wait/notify, просто писать лень.

Угу.

Вот самое интересное ты и пропустил — как собственно скомбинировать асинхронные операции, а написал банальный линейный код, который должен внутри как-то эффективно работать.
Ты пот покажи как сделать эту самую эффективную работу, чтобы не ожидать завершения IO в потоке и параллелить операции.
Re[13]: Что посоветуете как аналог С++
От: FR  
Дата: 20.06.13 11:13
Оценка:
Здравствуйте, gandjustas, Вы писали:


G>Пока ты не начинаешь комбинировать асинхронные вызовы это еще нормально смотрится, а попробуй сделать так чтобы при запершении одной асинхронной операции вызывалась другая, а за ней третья и так далее.


G>Сразу код станет нечитаем совершенно.


Не спорю будет гораздо корявее чем в C#, но вполне читабельно.
Если уж смотреть где красиво это в F# с его async.

G>А без этого никак. Никто тебе в UI потоке не позволит ожидание завершения IO делать.


Да ладно как будто до асинхронной моды UI приложения не писали.
Re[17]: Что посоветуете как аналог С++
От: FR  
Дата: 20.06.13 11:20
Оценка:
Здравствуйте, gandjustas, Вы писали:

FR>>В boost есть Coroutine

G>А пример использования есть?

Я сам только приглядываюсь.

G>Корутины и продолжения не одно и тоже, но стоит глянуть как оно реализовано.


Ну полноценных то продолжений в мейнстриме нет, а то что есть вполне эквивалентно.

FR>>Микрософт в PPL поддерживает и асинхронность:

FR>>http://msdn.microsoft.com/en-us/library/dd492427.aspx
FR>>http://msdn.microsoft.com/en-us/library/dd492627.aspx
G>Угу, посмотри примеры. Как минимум 10 строк, там где C# укладывается в одну. И это еще нету передачи данных между асинхронными вызовами.

Тык сахар рулит.
В F# еще лучше.

G>Я об этом и говорю, вся стройность RAII рассыпается из-за продолжений.


Тут скорее согласен, нужны некоторые дополнения в язык чтобы было не так коряво.
Лучше всего взять пример с F# и сразу ввести Computation Expressions (монады)
Re[15]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 11:24
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Но у тебя следующий пакет обработается когда полный цикл отправить-получить-сохранить-отправить.


Это не так. Из кода очевидно, что в очередь добавляется задача выполняющаяся асинхронно и без всяких задержек начинается новая итерация.

G>>>2) race condition в очереди.


MTD>>Откуда?


G>А Queue у тебя thread-safe?


Она такая какая надо.

G>>>3) запись в базу и в сеть идет последовательно, а не параллельно.

MTD>>С чего вдруг? Очередь может иметь пул и по ним раскидывать данные.
G>Код в студию.
G>Вот уже сложность растет.

Код приведен.

G>>>4) нету кода, который вызывает ProcessTask, он у тебя довольно нетривальный будет.


MTD>>Он будет тривиальный — wait/notify, просто писать лень.

G>Угу.

G>Вот самое интересное ты и пропустил — как собственно скомбинировать асинхронные операции, а написал банальный линейный код, который должен внутри как-то эффективно работать.

G>Ты пот покажи как сделать эту самую эффективную работу, чтобы не ожидать завершения IO в потоке и параллелить операции.

Мне банально лень, нужен стимул. В самом коде ничего сложного нет.
Re[18]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 11:36
Оценка:
Здравствуйте, FR, Вы писали:

FR>>>Микрософт в PPL поддерживает и асинхронность:

FR>>>http://msdn.microsoft.com/en-us/library/dd492427.aspx
FR>>>http://msdn.microsoft.com/en-us/library/dd492627.aspx
G>>Угу, посмотри примеры. Как минимум 10 строк, там где C# укладывается в одну. И это еще нету передачи данных между асинхронными вызовами.

FR>Тык сахар рулит.

FR>В F# еще лучше.

Не только в сахаре дело, если ты попробуешь написать код на C++ как в F#, то он не только гораздо многословнее будет, но и возникнут сложности с передачей данных между продолжениями.
Re[17]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 20.06.13 11:39
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Google Chrome — обертка над WebKit, который тянется с прошлого века (Initial release November 4, 1998).


Отчего его в .Net не обернули?

DM>Skype вообще на Delphi написан.


Что? Разве что самая первая версия.

DM>Остальные два ок. Но на каждый Qt Creator найдется свой Eclipse (Java) и MonoDevelop (C#).


Ну да, на Java есть ровно три десктопных приложений — NetBeans, Eclipse, Idea
Re[18]: Что посоветуете как аналог С++
От: Jack128  
Дата: 20.06.13 11:49
Оценка:
Здравствуйте, MTD, Вы писали:

DM>>Skype вообще на Delphi написан.


MTD>Что? Разве что самая первая версия.


по крайней мере гуй — гарантированно. Недавно какой то специфический касяк в vcl нашли, и в скайпе он воспроизводился.
Re[19]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 12:15
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>возникнут сложности с передачей данных между продолжениями.


Продемонстрируй "сложности", пожалуйста.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 12:36
Оценка:
Здравствуйте, FR, Вы писали:

I>>По моему это есть всяких сортов пляски. Хотя я не уверен, давно пора пляски с памятью и стеком сделать частью языка С++, как это было сделано со смартпоинтерами. Тогда уж точно нельзя будет придраться


FR>Как будто код с async который ты чуть выше привел не занимается за кулисами тем же самым.


Очевидно — нет.
Re[16]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 13:05
Оценка:
Здравствуйте, MTD, Вы писали:

DM>>Кстати, да, сколько? Сколько новых популярных десктопных приложений появилось на плюсах за последние годы?


MTD>Много. Только из того, что у меня сейчас открыто: Google Chrome, Skype, Virtual Box, Qt Creator.


Здесь один только хром можно рассматривать и это именно та область, где менеджед особо некуда всунуть. Притом сам WebKit это древняя вещь — 1998.
Skype — 2003,
Virtual Box и Qt Creator сложно назвать популярным, эдак в качестве популярных сгодится SharpDevelop, ExpressionBlend и подобные вещи.

Можно зайти с другой стороны — какие известные бизнес приложения были написаны на С++ ? Ну скажем для бухгалтерии, инвентаризации, страхования, учет и тд и тд ?

Какие известные веб-приложения были написаны на С++ ?

Мобайл ?
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 13:07
Оценка:
Здравствуйте, MTD, Вы писали:

DM>>Google Chrome — обертка над WebKit, который тянется с прошлого века (Initial release November 4, 1998).

MTD>Отчего его в .Net не обернули?

А зачем ?

DM>>Skype вообще на Delphi написан.


MTD>Что? Разве что самая первая версия.


2003й год все таки, а мы смотрим после 2005го.

DM>>Остальные два ок. Но на каждый Qt Creator найдется свой Eclipse (Java) и MonoDevelop (C#).


MTD>Ну да, на Java есть ровно три десктопных приложений — NetBeans, Eclipse, Idea


На джаве полно софта для проектирования, CAD/CAM и тд.
Re[15]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 20.06.13 13:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>>>В большинстве же приложений — это то, во что упирается производительность. А это не только скорость, но и энергоэффективность, и цена железа.

I>>>Большинство оно сильно разное. И если уж совсем про большинство говорить, то проблемы точно не с производительность.
EP>>А я не спорю что высокая производительность не везде нужна.
I>Ну вот видишь.

Ты не поверишь, для некоторых задач я советую людям изучить/использовать C#, а сам частенько использую Python.
[sarcasm mode]только не рассказывай ребятам с форума C++, а то они меня побьют и заберут партбилет[/sarcasm mode]

EP>>>>Как пример — эти аллокации вылезают по всему коду, при простейших абстракциях — просадка 16x на ровном месте.

I>>>Такой код в своём уме никто не пишет, кроме вчерашних плюсовиков, которые не знают как устроена память.
EP>>Talk is cheap, show me the code.
I>А задача какая, выделить массив в сто тыщ мульёнов и пройтись по ём в цикле ?

Задача сделать простейшею абстракцию, которая существует с незапамятных времён и используется повсеместно, в виде группировки разнотипных данных(хотя бы однотипных) в одну сущность(структуру/запись/класс), так чтобы её можно было использовать с разными типами контейнеров, в том числе массивов, без просадки скорости на порядок.

I>>>Это ни о чем.

EP>>Это мнение человека который разрабатывал алгоритмические библиотеки для Scheme, Ada, Java, C++
I>Это уже устаревший подход.

Допустим эффективные алгоритмы и структуры данных это устаревший подход, тогда какой современный? "Петрович, подвози исчё кластера"

I>>>А если скажем сюда внести работу с диском, базой или сетью, все поворачивается ровно наоборот — С++ не в состоянии обеспечить перформанс, например потому что тяжело контролировать асинхронные операции. Всё, до свидания.

EP>>stackless coroutines, stackfull coroutines, state machine, лямбды в конце концов
I>И ничего из этого в сиплюсплюсе нет

stackful coroutines — реализованы с использованием system-specific вызовов
stackless coroutines — реализованы на чистом ISO C++, меньше чем 100 строками кода
state machine — бери хоть банальный switch, хоть готовые библиотеки

I>а лямбды сильно кастрированые что бы их называть таким словом.


конкретные аргументы?

EP>>Покажи где например здесь "практически на С или подобным образом"?

I>Вот сюда смотри
I>https://code.google.com/p/sphinxsearch/source/browse/
I>Как думаешь, нужен ли здесь перформанс ?

То что где-то используют C или "C-подобный подход" отнюдь не означает что по другому нельзя. А вот наличие библиотеки с другим подходом которая быстра и резва, как раз и является примером тому что таки можно.
Re[20]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 13:14
Оценка:
Здравствуйте, jazzer, Вы писали:

J>cont асинхронно позовется, когда асинхронно же считается все, что нужно.

J>Это заодно и ответ для Ikemefula про его качалку файлов.

Если это твой ответ, то ты слился, кода нет, только сигнатуры Собственно для сиплюсника это стандартный ответ — показать сигнатуры и рассказать что всё классно.

Мне скажем дописать пару строк и будет совершенно другая вещь, комбинация синхронного и асинхронного. А у тебя что получится ?

private async void handler(object sender, TaskArgs args)
{
    string result = await new Task(() => Download(args.Url, args.Cancellation));
    if(SomeCondition(rawResult))
    {
     result = await new Task(() => Preproces(result, args.Cancellation));
    }

    textBox.Text += result;
}


Вобщем отдыхай.
Re[17]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 13:20
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Можно зайти с другой стороны — какие известные бизнес приложения были написаны на С++ ? Ну скажем для бухгалтерии, инвентаризации, страхования, учет и тд и тд ?


1С, вестимо
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[21]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 13:25
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, jazzer, Вы писали:


J>>cont асинхронно позовется, когда асинхронно же считается все, что нужно.

J>>Это заодно и ответ для Ikemefula про его качалку файлов.

I>Если это твой ответ, то ты слился, кода нет, только сигнатуры Собственно для сиплюсника это стандартный ответ — показать сигнатуры и рассказать что всё классно.


А какой тебе код нужен? Код cont? Так он вот таким будет: "textBox.Text += result"

I>Мне скажем дописать пару строк и будет совершенно другая вещь, комбинация синхронного и асинхронного. А у тебя что получится ?


I>
I>private async void handler(object sender, TaskArgs args)
I>{
I>    string result = await new Task(() => Download(args.Url, args.Cancellation));
I>    if(SomeCondition(rawResult))
I>    {
I>     result = await new Task(() => Preproces(result, args.Cancellation));
I>    }

I>    textBox.Text += result;
I>}
I>


И где тут "совершенно другая вещь"?
Всё то же самое.

I>Вобщем отдыхай.

В общем, не хами.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[22]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 13:41
Оценка:
Здравствуйте, jazzer, Вы писали:

I>>Если это твой ответ, то ты слился, кода нет, только сигнатуры Собственно для сиплюсника это стандартный ответ — показать сигнатуры и рассказать что всё классно.


J>А какой тебе код нужен? Код cont? Так он вот таким будет: "textBox.Text += result"


Приведи аналог моего код.

I>>Мне скажем дописать пару строк и будет совершенно другая вещь, комбинация синхронного и асинхронного. А у тебя что получится ?


I>>
I>>private async void handler(object sender, TaskArgs args)
I>>{
I>>    string result = await new Task(() => Download(args.Url, args.Cancellation));
I>>    if(SomeCondition(rawResult))
I>>    {
I>>        result = await new Task(() => Preproces(result, args.Cancellation));
I>>    }

I>>    textBox.Text += result;
I>>}
I>>


J>И где тут "совершенно другая вещь"?

J>Всё то же самое.

Здесь комбинация синхронного и асинхронного кода, в прошлом примере был только асинхронный.
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 13:41
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Ikemefula, Вы писали:


I>>Можно зайти с другой стороны — какие известные бизнес приложения были написаны на С++ ? Ну скажем для бухгалтерии, инвентаризации, страхования, учет и тд и тд ?


J>1С, вестимо


1С началась в 2005м ? Выдыхай что ли
Re[19]: Что посоветуете как аналог С++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 20.06.13 13:58
Оценка:
Здравствуйте, Ikemefula, Вы писали:

J>>1С, вестимо


I>1С началась в 2005м ? Выдыхай что ли


Практически да. Как тебе хорошо известно, 1С с восьмой версиии была практически полностью переписана, в ней добавлена туева хуча функций и возможностей, это практически новая система по сравнению с последней 1С 7.7. Все части 1С (серверные, клиентская) стали мультиплатформенными (доступны также и под Линуксом).
Теперь ты выдыхай.
Re[14]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 20.06.13 14:00
Оценка:
Здравствуйте, MTD, Вы писали:

IT>>С каких пор обёртки для указателей стали частью языка?

MTD>С тех самых, как их в стандарте описали.

Т.е. больше в стандарте описывать нечего? А я и думаю, почему это последние стандарты языка вызывают у публики такую, мягко говоря, неоднозначную реакцию.
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 20.06.13 14:11
Оценка:
Здравствуйте, gandjustas, Вы писали:

N>>>>>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>>>>>Память? А причем тут зарядка?
EP>>>>Performance bottleneck большинства программ это взаимодействие с иерархией памяти.
G>>>Это ты про какие программы?
G>>>Среднее дсктопное приложение более 90% времени проводит в ожидании пользователя. Еще 9% в ожидании завершения IO.
EP>>Я имел ввиду performance "активной" работы процессора. Плохая работа с памятью -> процессор будет дольше находится в "активном" режиме.
G>Угу, то есть ты имеешь ввиду 1% времени работы программы. Ты же понимаешь что изменение даже в несколько раз на этом 1% никто не заметить.

Если активный режим процессора это один из главных потребителей зарядки, то уменьшение такого времени — будет уменьшать потребление

EP>>>>Плохой memory layout структур данных, лишние индерекции, лишние аллокации, плохая работа с кэшем — это всё яд для производительности — этим всем грешат "управляемые среды", поэтому и производительность намного хуже.

G>>>Бросай читать книжки 80-х годов.
EP>>Поясни
EP>>>>Требуется в 10 раз больше памяти? — косвенный признак тормозов.
G>>>Спорный вопрос. Если в памяти кешируется результат чтения с диска, то я предпочту в 10 раз больше памяти.
EP>>Речь шла об одинаковых алгоритмах и структурах в разных языках.
EP>>Сравнивать производительность сред/языков по разным алгоритмам и структурам как-то совсем неправильно.

G>Вот я и говорю бросай книжки читать. Подавляющее большинство десктопных приложений не требует ресурсоемких алгоритмов.


А я где-то утверждал обратное?
Есть много приложений, которые максимум что делают так это считывают три байтика с диска, показывают формочку, и складывают две цифирьки — и да, нужны люди которые будут писать такие приложения, много людей

G>А если требует то важна не сама скорость работы, а perceived performance.


Если вычисление идёт 30 минут, вместо возможных десяти секунд, то ты хоть как украшай progress bar рюшечками — это не поможет.

G>Например ты делаешь приложение, которое делает graph layout — довольно сложные алгоритмы. Как ты думаешь что больше приглянется пользователям: молчаливый расчет всего за 10 сек потом отображение результата, или рисование узлов графа по мере вычисления позиций в течение 15 секунд?

G>100% пользователей предпочтут второе, хотя реально оно в 1,5 раз медленнее.

Пользователи предпочтут рисование по мере вычисления за пол-секунды

G>При замедлении алгоритма perceived performance растет.

G>В C++ увы такими оптимизациями сложно заниматься, потому что требуется совмещать продолжения

Ты вроде как толком не ответил, что не так с продолжениями в C++

G>и детерминированную финализацию.


Это которая using? И типа в C++ с ней плохо?

EP>>>>Чтобы делать быстрый код в "управляемых средах" — нужно работать против языка, отказываться от многих средств выражения идей, спускаясь на крайне низкий уровень (даже ниже чем C).

[...]
G>Ну Java вообще беден как язык, а в C# можно и массив структур сделать.

Структуры в C# далеко не дефолт, и имеют ограничения.
Суть в том, что tight memory layout существенно влияет на производительность, пример с массивом структур это лишь одна часть проблемы, а ведь есть ещё композиция объектов, объекты на стеке.

G>Но это не самое важное.


скажи это разработчикам escape analysis.

G>Самое важное тут: как ты будешь получать этот массив и как обрабатывать. Если у тебя обработка ограниченного количества элементов за раз, то может вообще нет смысла держать в памяти все 32М, а читать с диска, на лету обрабатывать и выводить.


Нет, каждый элемент нужно обрабатывать много раз. Причём такие элементы будут хранится не только в массиве — это общий пример на простой абстракции в виде группировки элементов

EP>>То что ты достиг скорости приемлемой для твоей задачи, вовсе не означает что программа использует ресурсы эффективно (что естественно не является самоцелью), и что её производительность нельзя улучшить на пару порядков.

G>А зачем? Цель не оптимизация сама по себе, цель — чтобы программа работала достаточно быстро.

А я и не говорил что оптимизация это самоцель — действительно, если тебе нужно обрабатывать 90 байтиков в секунду, то можешь хоть visual basic взять
Re[16]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 14:24
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Задача сделать простейшею абстракцию, которая существует с незапамятных времён и используется повсеместно, в виде группировки разнотипных данных(хотя бы однотипных) в одну сущность(структуру/запись/класс), так чтобы её можно было использовать с разными типами контейнеров, в том числе массивов, без просадки скорости на порядок.


Это не задача, а уже конкретное решение какой то задачи. Разницу чувствуешь ?

I>>>>Это ни о чем.

EP>>>Это мнение человека который разрабатывал алгоритмические библиотеки для Scheme, Ada, Java, C++
I>>Это уже устаревший подход.

EP>Допустим эффективные алгоритмы и структуры данных это устаревший подход, тогда какой современный? "Петрович, подвози исчё кластера"


Современный подход это когда учитывается не только процессорное время, но и время IO и тд и тд и это тоже перформанс.

EP>stackful coroutines — реализованы с использованием system-specific вызовов

EP>stackless coroutines — реализованы на чистом ISO C++, меньше чем 100 строками кода
EP>state machine — бери хоть банальный switch, хоть готовые библиотеки

I>>а лямбды сильно кастрированые что бы их называть таким словом.

EP>конкретные аргументы?

Для полноценных замыканий нужен GC, ибо не совсем ясно, где и когда ты будешь память освобождать.

I>>https://code.google.com/p/sphinxsearch/source/browse/

I>>Как думаешь, нужен ли здесь перформанс ?

EP>То что где-то используют C или "C-подобный подход" отнюдь не означает что по другому нельзя. А вот наличие библиотеки с другим подходом которая быстра и резва, как раз и является примером тому что таки можно.


А я разве говорил что так нельзя писать ? Ты про чтото свое, наболевшее рассказываешь. Большинство людей работает именно с некачественным кодом, это очевидно как божий день — чем ниже качество кода, тем больше нужно девелоперов что бы укладываться в сроки, требования и ограничения.
Вот пример — на старом проекте я довольно долго занимался одной частью проекта и старательно все вылизывал, что бы легче было майнтейнить код. В какой то момент оказалось, что только я и понимаю, что там происходит унутре, потому что другим вообще незачем было туда лазить, а если и случалось чего, фиксы занимали минуты. Зато буквально в соседнем модуле, над которым потрудился индус, копались буквально все, потому что каждому надо было чего то фиксить.
Re[5]: Что посоветуете как аналог С++
От: Хон Гиль Дон Россия  
Дата: 20.06.13 14:59
Оценка:
Здравствуйте, Mystic, Вы писали:

NC>>Ada — совершенно стандартный язык с унылым паскалеподобным синтаксисом.


M>Паскалеподобный синтаксис делает работу с компилятором куда более дружественной. Если ты допускаешь опечатку в коде, то сообщение об ошибке в 99% случаев говорит о том, какую ты опечатку допустил. Например, пропущена точка с запятой, или еще что. В C++ очень часто опечатка дает возможность построения новой языковой конструкции, компитятор идет дальше, останавливается когда уже дрова полные, и выдает в качестве сообщение нечто несуразное. А если заюзаны шаблоны, то и многоэтаэжное.


Это далеко не всем надо Многие не готовы за платить за красивую понятную диагностику многословностью.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[14]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 20.06.13 15:39
Оценка:
IT>>С каких пор обёртки для указателей стали частью языка?

MTD>С тех самых, как их в стандарте описали.


Стандарт описывает сам язык и STL. Думаю имелось в виду первое но даже то что стандарт легализует не отменяет самого факта — подпорки остаются подпорками.

Справедливости ради следует отметить что и в C# и в .NET-е есть своя подпорка в виде IDisposable и using. Ну не вписываются неуправляемые ресурсы в языки с мусоросборщиком. Только все равно программировать на Шарпе проще.
Re[18]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 20.06.13 15:50
Оценка:
I>>А стоит сказать это в форуме С++, минусов будет на три страницы.

MTD>Откуда такая уверенность?


Нормальные софтвере инженеры в тот форум редко, если вообще когда, заглядывают. Это больше место для школоты до которой не доходит и вряд ли дойдет что большинство фич из плюсов не нужны для нормального кода.
Re[17]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 20.06.13 15:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Задача сделать простейшею абстракцию, которая существует с незапамятных времён и используется повсеместно, в виде группировки разнотипных данных(хотя бы однотипных) в одну сущность(структуру/запись/класс), так чтобы её можно было использовать с разными типами контейнеров, в том числе массивов, без просадки скорости на порядок.

I>Это не задача, а уже конкретное решение какой то задачи. Разницу чувствуешь ?

Это передёргивание — та задача о которой ты говоришь будет решением другой задачи, та в свою очередь и т.п. В итоге выйдем на задачу "прибыльный бизнес".
Группировка разнотипных данных вездесуща в императивных языках — зачем это отрицать что это задача? На определённом уровне это вполне себе задача

I>>>а лямбды сильно кастрированые что бы их называть таким словом.

EP>>конкретные аргументы?
I>Для полноценных замыканий нужен GC, ибо не совсем ясно, где и когда ты будешь память освобождать.

Зависит от. Где-то будет подсчёт ссылок, где-то копирование, где-то move, а где-то вообще полностью pre-allocated с выделением целого блока на задачу и очистка всего блока по завершению.

I>>>https://code.google.com/p/sphinxsearch/source/browse/

I>>>Как думаешь, нужен ли здесь перформанс ?
EP>>То что где-то используют C или "C-подобный подход" отнюдь не означает что по другому нельзя. А вот наличие библиотеки с другим подходом которая быстра и резва, как раз и является примером тому что таки можно.
I>А я разве говорил что так нельзя писать ? Ты про чтото свое, наболевшее рассказываешь.

Ты написал:

Почему то самые критичные куски кода пишутся практически на С или подобным образом.

Я привел пример number-crunch проекта где это далеко не так, и при этом он составляет конкуренцию коммерческим решениям.

I>Большинство людей работает именно с некачественным кодом, это очевидно как божий день — чем ниже качество кода, тем больше нужно девелоперов что бы укладываться в сроки, требования и ограничения.


Это ты к чему вообще? Да, плохой код есть, причём на разных языках.

I>Вот пример — на старом проекте я довольно долго занимался одной частью проекта и старательно все вылизывал, что бы легче было майнтейнить код. В какой то момент оказалось, что только я и понимаю, что там происходит унутре, потому что другим вообще незачем было туда лазить, а если и случалось чего, фиксы занимали минуты. Зато буквально в соседнем модуле, над которым потрудился индус, копались буквально все, потому что каждому надо было чего то фиксить.


Молодец Чего сказать-то хотел?
Re[19]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 20.06.13 18:36
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>По моему это есть всяких сортов пляски. Хотя я не уверен, давно пора пляски с памятью и стеком сделать частью языка С++, как это было сделано со смартпоинтерами. Тогда уж точно нельзя будет придраться


FR>>Как будто код с async который ты чуть выше привел не занимается за кулисами тем же самым.


I>Очевидно — нет.


А что у него вместо "stack switching model"?
Главное гармония ...
Re[14]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 19:07
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, gandjustas, Вы писали:


N>>>>>>>На планшетах тем более ресурс, никто не хочет жить на зарядке.

G>>>>>>Память? А причем тут зарядка?
EP>>>>>Performance bottleneck большинства программ это взаимодействие с иерархией памяти.
G>>>>Это ты про какие программы?
G>>>>Среднее дсктопное приложение более 90% времени проводит в ожидании пользователя. Еще 9% в ожидании завершения IO.
EP>>>Я имел ввиду performance "активной" работы процессора. Плохая работа с памятью -> процессор будет дольше находится в "активном" режиме.
G>>Угу, то есть ты имеешь ввиду 1% времени работы программы. Ты же понимаешь что изменение даже в несколько раз на этом 1% никто не заметить.

EP>Если активный режим процессора это один из главных потребителей зарядки, то уменьшение такого времени — будет уменьшать потребление

неверно. Смысл какой уменьшать этот один процент до 0.5%? Ну станет зарядка держать на 2-3 минуты дольше. А если ты эффективнее IO сделаешь в 2 раза, то сохранишь 4,5% зарядки, что будет уже 10-15 минут.

EP>Есть много приложений, которые максимум что делают так это считывают три байтика с диска, показывают формочку, и складывают две цифирьки — и да, нужны люди которые будут писать такие приложения, много людей

Угу, и зачем им C++?


G>>А если требует то важна не сама скорость работы, а perceived performance.

EP>Если вычисление идёт 30 минут, вместо возможных десяти секунд, то ты хоть как украшай progress bar рюшечками — это не поможет.
30 минут надо считать на сервере, клиент может столько и не прожить.

G>>Например ты делаешь приложение, которое делает graph layout — довольно сложные алгоритмы. Как ты думаешь что больше приглянется пользователям: молчаливый расчет всего за 10 сек потом отображение результата, или рисование узлов графа по мере вычисления позиций в течение 15 секунд?

G>>100% пользователей предпочтут второе, хотя реально оно в 1,5 раз медленнее.

EP>Пользователи предпочтут рисование по мере вычисления за пол-секунды

Увы, 10 сек это максимум что можно выжать, даже при экстремальной оптимизации.

G>>При замедлении алгоритма perceived performance растет.

G>>В C++ увы такими оптимизациями сложно заниматься, потому что требуется совмещать продолжения

EP>Ты вроде как толком не ответил, что не так с продолжениями в C++

то что их просто нет, а если сделать, то бестолку. Ибо комбинировать продолжения с передачей данных будет сложно, придется париться с освобождением памяти. Да и тупо может продолжение не прийти.

G>>и детерминированную финализацию.

EP>Это которая using? И типа в C++ с ней плохо?
Еще раз: продолжения+детерминированная финализация. Вместе, а не по-отдельности. В общем случае нельзя придумать способ гарантированной очистки памяти. Продолжение может просто не вызваться и будет держать ссылку на замыкание.
В некоторых условиях можно, но условия будут постоянно меняться от структуры кода. замучаешься следить.


G>>Самое важное тут: как ты будешь получать этот массив и как обрабатывать. Если у тебя обработка ограниченного количества элементов за раз, то может вообще нет смысла держать в памяти все 32М, а читать с диска, на лету обрабатывать и выводить.


EP>Нет, каждый элемент нужно обрабатывать много раз. Причём такие элементы будут хранится не только в массиве — это общий пример на простой абстракции в виде группировки элементов

Ниче не понял, приведи пример.

EP>>>То что ты достиг скорости приемлемой для твоей задачи, вовсе не означает что программа использует ресурсы эффективно (что естественно не является самоцелью), и что её производительность нельзя улучшить на пару порядков.

G>>А зачем? Цель не оптимизация сама по себе, цель — чтобы программа работала достаточно быстро.

EP>А я и не говорил что оптимизация это самоцель — действительно, если тебе нужно обрабатывать 90 байтиков в секунду, то можешь хоть visual basic взять

Среднее десктопное приложение обрабатывает и того меньше.
Ты сам доказываешь что C++ не нужен и это совсем не мейнстрим.
Re[20]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.06.13 19:10
Оценка:
Здравствуйте, Mazay, Вы писали:

I>>Очевидно — нет.


M>А что у него вместо "stack switching model"?


По коду метода генерируется класс который поддерживает нужный интерфейс. Соответсвенно не надо никаких фокусов со стеком.
Re[19]: Что посоветуете как аналог С++
От: jazzer Россия Skype: enerjazzer
Дата: 20.06.13 19:21
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>А что ты показал? Передача указателя на функцию? Даже без замыканий.


Я показал работу с ресурсами в коде с замыканиями. И по значению, и по ссылке с деаллокацией в конце.
Именно то, о чем ты меня просил.
Именно то, что, по твоему мнению, в С++ требует "аццких плясок".

Так что не надо тут рассказывать, что ты хотел на самом деле IO и/или многопоточность. Речь шла об управлении ресурсами. Тебя ответ устроил? Или что-то осталось непонятым?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[19]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 19:50
Оценка:
Здравствуйте, D. Mon, Вы писали:



DM>>>Skype вообще на Delphi написан.

MTD>>Что? Разве что самая первая версия.

DM>Да нет, виндовая версия 4.2 (спустя 7 лет после первой) все еще на Дельфи. Надо будет на более свежие взглянуть.


Метроскайп вообще UI на JS имеет. Внутри unmanaged com либа, видимо то самое ядро, которое пилится с бородатых времен.
Re[21]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 20.06.13 20:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Очевидно — нет.


M>>А что у него вместо "stack switching model"?


I>По коду метода генерируется класс который поддерживает нужный интерфейс. Соответсвенно не надо никаких фокусов со стеком.


В смысле "нужный интерфейс"? То есть код метода нарезается на несколько методов, которые потом дёргаются при наступлении соответствующих асинхронных событий? Так?
Главное гармония ...
Re[15]: Что посоветуете как аналог С++
От: fddima  
Дата: 20.06.13 23:06
Оценка:
Здравствуйте, gandjustas, Вы писали:

EP>>Если активный режим процессора это один из главных потребителей зарядки, то уменьшение такого времени — будет уменьшать потребление

G>неверно. Смысл какой уменьшать этот один процент до 0.5%? Ну станет зарядка держать на 2-3 минуты дольше. А если ты эффективнее IO сделаешь в 2 раза, то сохранишь 4,5% зарядки, что будет уже 10-15 минут.
Это ты сам себе придумал. Процы жрут и очень много, раз в 10-20 больше любого "IO" в виде HDD.
Re[16]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.06.13 23:35
Оценка:
Здравствуйте, fddima, Вы писали:

F>Здравствуйте, gandjustas, Вы писали:


EP>>>Если активный режим процессора это один из главных потребителей зарядки, то уменьшение такого времени — будет уменьшать потребление

G>>неверно. Смысл какой уменьшать этот один процент до 0.5%? Ну станет зарядка держать на 2-3 минуты дольше. А если ты эффективнее IO сделаешь в 2 раза, то сохранишь 4,5% зарядки, что будет уже 10-15 минут.
F> Это ты сам себе придумал. Процы жрут и очень много, раз в 10-20 больше любого "IO" в виде HDD.

Если поделить энергопортебление на среднее время работы, то процы не обгоняют SSD и вай-фай если что.
Только если видео на планшете смотришь в HD, то проц заметно напрягается и кушает батарейку.
Re[22]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 20.06.13 23:56
Оценка:
Здравствуйте, gandjustas, Вы писали:

EP>>Stackless coroutine менее мощные чем stackful — если бы это было не так, то как минимум никто бы не реализовывал Boost.Coroutine.

G>Совсем наоборот, но в C++ таки требуются минимум 100 строк и еще какие-то пляски чтобы не хранить стек, поэтому и делают stackful.

100 строк это библиотечный код, который пишется один раз
И да, синтаксического сахара в async/await больше.

G>Хранение стека по определению менее масштабируемо, ибо надо хранить весь стек, который по дефолту — 1мб и примерно на 200 потоках\файберах кончается. Хз как внутри устроен Boost.Coroutine, но мне кажется что именно так.


Размер стэка там задаётся — хоть 10KiB, хоть 100KiB, причём можно использовать свой аллокатор.

G>Но самое главное что хрен ты это дело запустишь на нескольких ядрах.


С чего это вдруг?
Re[21]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 21.06.13 00:50
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>C#-ый async/await это фактически stackless coroutine.

EP>Компилятор автоматически генерирует класс-конечный автомат. Локальные переменные оригинальной функции переносятся в поля этого класса, а весь код в метод класса который в зависимости от текущего state прыгает по switch на нужный await.
Понятно.

EP>В C++ stackless coroutine реализуется 100-ми строчками, например как в Boost.Asio. Локальные переменные(если таковые имеются) переместить в поля класса нужно вручную, а в остальном всё схоже по форме и содержанию — например конечный автомат (с таким же switch'ем внутри) генерируется автоматически.

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

EP>Например, в examples к Boost.Coroutine есть пример простого сервера, который асинхронно считывает сообщения из tcp порта и выводит их на экран — причём всё это происходит в одном потоке. Цикл считывания выглядит точно также как и обыкновенный синхронный код:

EP>
EP>do
EP>{
EP>    getline(client_stream, msg);
EP>    cout << msg << endl; 
EP>} while(msg != "exit");
EP>

EP>Вся асинхронная логика спрятана в клиентский поток: внутри, после async_read_some делается yield, а когда придут данные — сопроцедура будится соответствующим хэндлером.
Это да. Я такое делал ещё до бустовых сопроцедур. Вроде бы обычная процедура, но таких можно запустить аж 1000 на 4 потоках . Главное чтоб системных хендлеров хватало.

EP>На stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде, ибо такие сопроцедуры сразу возвращают управление в клиентский код — а это значит что либо данные ещё не получены, либо никакой асинхронности, так как только один поток.

Вроде бы в C# синтаксис и компилятор всё это аккуратно прячут.
Главное гармония ...
Re[22]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 21.06.13 01:47
Оценка:
Здравствуйте, Mazay, Вы писали:

EP>>В C++ stackless coroutine реализуется 100-ми строчками, например как в Boost.Asio. Локальные переменные(если таковые имеются) переместить в поля класса нужно вручную, а в остальном всё схоже по форме и содержанию — например конечный автомат (с таким же switch'ем внутри) генерируется автоматически.

M>Вообще-то выделенное весьма неприятно. Как и в лямбдах, по умолчанию всё это надо бы делать автоматически, хотя ручной контроль и может быть иногда полезен.

Не спорю, немного сахара не повредило бы. Но с основной задачей — автогенерацией конечного автомата — он справляется.

M>Это да. Я такое делал ещё до бустовых сопроцедур. Вроде бы обычная процедура, но таких можно запустить аж 1000 на 4 потоках . Главное чтоб системных хендлеров хватало.


Только что запустил 200000 boost'овых сопроцедур в одном потоке — полёт нормальный.
Пробег по всем — MSVC2010x64 около 0.06s (два переключения контекста на одну сопроцедуру — в неё и обратно в планировщик). Но я ничего не настраивал, судя по документации можно получить на порядок более быстрое переключение. Хотя и такой скорости с головой хватит во многих случаях.

EP>>На stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде, ибо такие сопроцедуры сразу возвращают управление в клиентский код — а это значит что либо данные ещё не получены, либо никакой асинхронности, так как только один поток.

M>Вроде бы в C# синтаксис и компилятор всё это аккуратно прячут.

Не всё: когда клиентскому коду нужен результат async метода — то он либо вызывает блокирующий Task.Wait() (в этом случае теряется либо асинхронность, либо однопоточность), либо await и при этом сам становится async методом (что в свою очередь влияет на весь код который его использует).
А в коде из примера Boost.Coroutine нет никаких признаков асинхронности.
Re[19]: Что посоветуете как аналог С++
От: FR  
Дата: 21.06.13 03:09
Оценка:
Здравствуйте, Ikemefula, Вы писали:

FR>>Как будто код с async который ты чуть выше привел не занимается за кулисами тем же самым.


I>Очевидно — нет.


Тут да не тем же самым. Тем же самым занимается PPL например.
Re[15]: Что посоветуете как аналог С++
От: FR  
Дата: 21.06.13 03:16
Оценка:
Здравствуйте, IT, Вы писали:

IT>Т.е. больше в стандарте описывать нечего?


Оно всегда там было в виде страшного и ужасного auto_ptr.
auto_ptr теперь отправили на пенсию, а чтоб было не скучно, добавили пару
новых шибко умных указателей

IT>А я и думаю, почему это последние стандарты языка вызывают у публики такую, мягко говоря, неоднозначную реакцию.


Ага есть такое, если кратко, не любят это:

auto f = [](){};


Так и шарпщики же далеко не все одобряют var и linq.
Re[21]: Что посоветуете как аналог С++
От: FR  
Дата: 21.06.13 03:38
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>Stackless coroutine менее мощные чем stackful — если бы это было не так, то как минимум никто бы не реализовывал Boost.Coroutine.

EP>Одна из фишек stackful coroutine в том, что можно инкапсулировать всю асинхронную логику во внутрь компонентов — так, что клиентский код будет выглядеть как синхронный — без всяких keywords и дополнительных вызовов.

Stackless тоже можно сделать выглядящим как синхронный, но нужен сахар или встроенный в компилятор
или с помощью монад.
Re[18]: Что посоветуете как аналог С++
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.06.13 04:42
Оценка:
Здравствуйте, jazzer, Вы писали:


J>arg1 по значению, arg2 по расшаренной ссылке. Можно и не по расшаренной, кстати, если нет необходимости ее шарить, а нужно просто передавать от одной функции к другой — тогда достаточно простого unique_ptr, у которого вообще никаких накладных расходов.

Это неинтересно. Ты мне покажи, как будет устроен код для, скажем, скачивания файла.
Или банальная штука, которая читает данные из базы и выплёвывает отформатированный HTML в соединение.
При этом спать в потоке нельзя: это просёр ценного адресного пространства, которое нужно другим. И буферить вообще всё — тоже нельзя, это просёр ценного адресного пространства. Всё — только через IOCP.

И, пожалуйста, без утечек соединений и памяти.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[22]: Что посоветуете как аналог С++
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.06.13 04:44
Оценка:
Здравствуйте, Mazay, Вы писали:

M>В смысле "нужный интерфейс"? То есть код метода нарезается на несколько методов, которые потом дёргаются при наступлении соответствующих асинхронных событий? Так?

Примерно так. Метод превращается в state-machine, которую на более отсталых языках надо выписывать вручную.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[19]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 21.06.13 06:04
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Здравствуйте, MTD, Вы писали:


DM>>>Google Chrome — обертка над WebKit, который тянется с прошлого века (Initial release November 4, 1998).

MTD>>Отчего его в .Net не обернули?

DM>Не было смысла, полагаю.


Как же так? Ведь плюсы умирают, писать на них ад, грабля на грабле и т.д.
Re[22]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.06.13 06:21
Оценка:
Здравствуйте, Mazay, Вы писали:

I>>По коду метода генерируется класс который поддерживает нужный интерфейс. Соответсвенно не надо никаких фокусов со стеком.


M>В смысле "нужный интерфейс"? То есть код метода нарезается на несколько методов, которые потом дёргаются при наступлении соответствующих асинхронных событий? Так?


Так.
Re[19]: Что посоветуете как аналог С++
От: michae1  
Дата: 21.06.13 06:40
Оценка:
Здравствуйте, Олег К., Вы писали:

I>>>А стоит сказать это в форуме С++, минусов будет на три страницы.


MTD>>Откуда такая уверенность?


ОК>Нормальные софтвере инженеры в тот форум редко, если вообще когда, заглядывают. Это больше место для школоты до которой не доходит и вряд ли дойдет что большинство фич из плюсов не нужны для нормального кода.


А подробнее? Что именно, "нормальный софтверный инженер", исключил бы из нововведений с++11?
Re[20]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 21.06.13 07:48
Оценка:
Здравствуйте, michae1, Вы писали:

M>А подробнее? Что именно, "нормальный софтверный инженер", исключил бы из нововведений с++11?


Коллега, нашли кого спрашивать
Re[15]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 21.06.13 07:51
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Ты сам доказываешь что C++ не нужен и это совсем не мейнстрим.


Мантры, мантры. Но если тебе полегчает — да, не нужен и не мейнсрим
Re[17]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 21.06.13 08:19
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Так вот и вопрос в том как во время ожидания делать полезную работу, не плодя потоки. У твоем коде поток большую часть времени будет ждать в методах Send и TimedRead. Как ты будешь делать полезную работу в этот момент?


Натурально детский сад. Сам как думаешь?
Re[9]: Что посоветуете как аналог С++
От: michae1  
Дата: 21.06.13 08:25
Оценка:
Здравствуйте, Олег К., Вы писали:

IT>>>Это стандартные домыслы, с ними нет смысла спорить.


KP>>Это не стандартные домыслы. Это утверждение, которое очень часто приводится в дискуссиях как довод в пользу управляемых языков.


IT>>>ЗЫ. А ты сам с "Дураков, пишущих на плюсах не меньше, а может быть даже больше..." тоже получается согласен?


ОК>Имхо ты загнул тут. Чтобы писать на Джаве или Шарпе неэффективный код, это надо постораться. А вот в плюсах пожалуйста! Верни к примеру тяжелый контейнер из функции или создай неявно какой-нибудь временной объект. Такого уродского кода как на плюсах мне не приходилось поддерживать. Впрочем я не виню язык — сам язык мне нравится. Я виню конкретные руки которые, не исключенно, могут вот так разглогольствовать на форумах.


Ты отстал от жизни. Почитай о rvalue references и move-семантике, прежде чем брызгнать слюной и показывать свою некомпетентность.
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.06.13 08:38
Оценка:
Здравствуйте, MTD, Вы писали:

G>>Так вот и вопрос в том как во время ожидания делать полезную работу, не плодя потоки. У твоем коде поток большую часть времени будет ждать в методах Send и TimedRead. Как ты будешь делать полезную работу в этот момент?


MTD>Натурально детский сад. Сам как думаешь?


Ты лучше код покажи.
Re[18]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.06.13 10:19
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, gandjustas, Вы писали:


G>>Так вот и вопрос в том как во время ожидания делать полезную работу, не плодя потоки. У твоем коде поток большую часть времени будет ждать в методах Send и TimedRead. Как ты будешь делать полезную работу в этот момент?


MTD>Натурально детский сад. Сам как думаешь?


Я думаю что без потоков не как, а это жопа для масштабируемости.
Re[16]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.06.13 10:24
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, gandjustas, Вы писали:



G>>Еще раз: продолжения+детерминированная финализация. Вместе, а не по-отдельности. В общем случае нельзя придумать способ гарантированной очистки памяти. Продолжение может просто не вызваться и будет держать ссылку на замыкание.


FR>GC же тоже будет держать в таких случаях.


Ссылок не найдет — освободит.



G>>В некоторых условиях можно, но условия будут постоянно меняться от структуры кода. замучаешься следить.

FR>Как показывает практика использования тех же замыканий в C++ следить не сложно.
Ага, только используются они крайне мало, именно по причине выше.

Или уже linq изобрели для C++?
Re[19]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 21.06.13 10:48
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Я думаю что без потоков не как, а это жопа для масштабируемости.


Во-первых, вариантов масса, например есть неблокируемый ввод-вывод, во-вторых потоки — жопа только для очень нагруженных приложений, уж чтение из COM-порта — эталон высокопроизводительных приложений на .Net (шучу, извини), в такие задачи точно не входит.
Re[20]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.06.13 10:53
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, gandjustas, Вы писали:


G>>Я думаю что без потоков не как, а это жопа для масштабируемости.


MTD>Во-первых, вариантов масса, например есть неблокируемый ввод-вывод, во-вторых потоки — жопа только для очень нагруженных приложений, уж чтение из COM-порта — эталон высокопроизводительных приложений на .Net (шучу, извини), в такие задачи точно не входит.


Так ты (или не только ты) же сам утверждаешь что C++ быстрее всего, а сам предлагаешь априори неэффективный по масштабируемости способ.
Re[21]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 21.06.13 11:14
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Так ты (или не только ты) же сам утверждаешь что C++ быстрее всего,


Может и ссылку покажешь, где я утверждаю?

G>а сам предлагаешь априори неэффективный по масштабируемости способ.


1. Ссылку покажешь, где я предлагаю?
2. Зачем оптимизировать когда в этом нет необходимости?
3. А еще, прикинь, я Питон использую, а сейчас за Java мне деньги платят. А почему? Да потому, что выбираю инструмент согласно задаче и религиозных предрассудков у меня нет.
Re[19]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 21.06.13 12:26
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Это передёргивание — та задача о которой ты говоришь будет решением другой задачи, та в свою очередь и т.п. В итоге выйдем на задачу "прибыльный бизнес".

EP>>Группировка разнотипных данных вездесуща в императивных языках — зачем это отрицать что это задача? На определённом уровне это вполне себе задача
I>Группировки они разные бывают. Внятно дай задачу в терминах пользователя. Ты пока что привел решение этой задачи непойми в каких терминах.

Например есть массив элементов, где каждый элемент это {float32,int16,int8}.
Этот массив нужно обходить как рандомно(например есть второй массив пар индексов задающих вектора, и нужно посчитать сумму векторов или ещё что-нибудь), так и последовательно (например найти min/max по каждой компоненте).
Самое естественное — реализовать обычный массив элементов Element[].

I>>>Для полноценных замыканий нужен GC, ибо не совсем ясно, где и когда ты будешь память освобождать.

EP>>Зависит от. Где-то будет подсчёт ссылок, где-то копирование, где-то move, а где-то вообще полностью pre-allocated с выделением целого блока на задачу и очистка всего блока по завершению.
I>То есть, стратегия использования памяти зависит от того кода,который пишешь. Об чем и речь, это и есть кастрированые замыкания.

Ну так я о чём и говорю — если нужна производительность, то в большинстве случаев необходима адекватная работа с памятью, должен использоваться правильный подход. C++ как раз и предоставляет возможность использовать много разных подходов.
Как ты из этого сделал вывод об "кастрированых замыканиях" — я не пойму

EP>>Ты написал:

EP>>

EP>>Почему то самые критичные куски кода пишутся практически на С или подобным образом.

EP>>Я привел пример number-crunch проекта где это далеко не так, и при этом он составляет конкуренцию коммерческим решениям.
I>И ты утверждаешь, что именно это и есть типичный с++ код ? Как бы не так. Прямо в этом форуме, в КСВ, в С++ полно людей которые считают использование не то что буста, а темплейтов преступлением.

А где я утверждал что это типичный C++ код? Ещё раз, ты написал подчёркнутое. Я же тебе показал конкретный пример показывающий обратное.
К чему эта демагогия про Boost, шаблоны, и типичный код?

I>Уже все сказано. На одном проекте 40 индусов майнтейнят либу для линейного программирования, а на другом один человек майнтейнит такую же либу да же пачку из других областей. Вопрос — какой код считать типичным для этого примера ?


Вопроса не понял. Какого примера?
Re[17]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 21.06.13 13:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Это ты все эти CD-ejector'ы разрабатывал? С отзывчивым UI и корректностью, ага

I>Это все писалось на С и С++, потому что люди просто не могут нормально реализовать асинхронщину.

Я не вижу связи между тем что до запятой и что после

EP>>>>Суть в том, что tight memory layout существенно влияет на производительность, пример с массивом структур это лишь одна часть проблемы, а ведь есть ещё композиция объектов, объекты на стеке.

I>>>Для каких приложений это критично ?
EP>>Критично там где нужна производительность
I>Назови такие приложения.

CAD/CAE/CAM, web-браузеры, компиляторы, JIT, СУБД, обработка массивов данных(например c лидаров и т.п.), числодробилки, игры, low-latency processing, сервера, embedded, обработка видео/изображений/3D, распознавание образов, etc, etc, etc
Re[15]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 21.06.13 13:25
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>>Есть много приложений, которые максимум что делают так это считывают три байтика с диска, показывают формочку, и складывают две цифирьки — и да, нужны люди которые будут писать такие приложения, много людей

G>Угу, и зачем им C++?

А где я говорил что им нужно обязательно использовать C++? Ты сектант-моноязычник?
Видимо придётся себя процитировать
Автор: Evgeny.Panasyuk
Дата: 20.06.13
:

Ты не поверишь, для некоторых задач я советую людям изучить/использовать C#, а сам частенько использую Python.
[sarcasm mode]только не рассказывай ребятам с форума C++, а то они меня побьют и заберут партбилет[/sarcasm mode]


G>>>А если требует то важна не сама скорость работы, а perceived performance.

EP>>Если вычисление идёт 30 минут, вместо возможных десяти секунд, то ты хоть как украшай progress bar рюшечками — это не поможет.
G>30 минут надо считать на сервере, клиент может столько и не прожить.

Что за плоское представление о мире? Кто говорил что в этом случае вообще есть сервера?

G>>>Например ты делаешь приложение, которое делает graph layout — довольно сложные алгоритмы. Как ты думаешь что больше приглянется пользователям: молчаливый расчет всего за 10 сек потом отображение результата, или рисование узлов графа по мере вычисления позиций в течение 15 секунд?

G>>>100% пользователей предпочтут второе, хотя реально оно в 1,5 раз медленнее.
EP>>Пользователи предпочтут рисование по мере вычисления за пол-секунды
G>Увы, 10 сек это максимум что можно выжать, даже при экстремальной оптимизации.

Это разговор о конях в вакууме. Я так полагаю ты что-то там пытался оптимизировать, и где-то получилось 10 сек — и из этого ты делаешь вывод что это максимум?

G>>>При замедлении алгоритма perceived performance растет.

G>>>В C++ увы такими оптимизациями сложно заниматься, потому что требуется совмещать продолжения
EP>>Ты вроде как толком не ответил, что не так с продолжениями в C++
G>то что их просто нет, а если сделать, то бестолку. Ибо комбинировать продолжения с передачей данных будет сложно, придется париться с освобождением памяти. Да и тупо может продолжение не прийти.

Почему сложно? Почему парится с освобождением памяти? Куда продолжение может не прийти?

G>Еще раз: продолжения+детерминированная финализация. Вместе, а не по-отдельности. В общем случае нельзя придумать способ гарантированной очистки памяти. Продолжение может просто не вызваться и будет держать ссылку на замыкание.


Давай конкретный пример.

G>>>Самое важное тут: как ты будешь получать этот массив и как обрабатывать. Если у тебя обработка ограниченного количества элементов за раз, то может вообще нет смысла держать в памяти все 32М, а читать с диска, на лету обрабатывать и выводить.

EP>>Нет, каждый элемент нужно обрабатывать много раз. Причём такие элементы будут хранится не только в массиве — это общий пример на простой абстракции в виде группировки элементов
G>Ниче не понял, приведи пример.

Есть группа логически связанных данных Element. Приложению нужны массивы/деки/мэпы Element'ов.

G>>>А зачем? Цель не оптимизация сама по себе, цель — чтобы программа работала достаточно быстро.

EP>>А я и не говорил что оптимизация это самоцель — действительно, если тебе нужно обрабатывать 90 байтиков в секунду, то можешь хоть visual basic взять
G>Среднее десктопное приложение обрабатывает и того меньше.
G>Ты сам доказываешь что C++ не нужен и это совсем не мейнстрим.

Где я это доказывал?
Там где нужна производительность — у C++ пока практически нет конкурентов, там где не нужна — можно использовать либо C++, либо что-то другое — зависит от конкретной задачи
Re: Что посоветуете как аналог С++
От: Grundik2 Земля  
Дата: 21.06.13 14:50
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Когда писал, так и знал, что сейчас начнется
Re[20]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.06.13 15:12
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Например есть массив элементов, где каждый элемент это {float32,int16,int8}.


ля-ля-ля, это не задача, это _решение_ задачи. Поскольку ты сам задачу поставить не можешь, сделаю это за тебя. Смотри, как все просто — реализовать оконное FFT. Чуть более чем весь код для этого в сишном стиле. А вот то что ты показываешь это отстой.

I>>То есть, стратегия использования памяти зависит от того кода,который пишешь. Об чем и речь, это и есть кастрированые замыкания.


EP>Ну так я о чём и говорю — если нужна производительность, то в большинстве случаев необходима адекватная работа с памятью, должен использоваться правильный подход. C++ как раз и предоставляет возможность использовать много разных подходов.

EP>Как ты из этого сделал вывод об "кастрированых замыканиях" — я не пойму

Очень просто — возможность ручного тюнинга "скомпенсирована" обязательностью такого тюнига, то есть, лямбды просто нельзя применять так, как они применяются в других языках. Это ж очевидно — GC отсутствует, стало быть передавать лямбды наверх нельзя, нужно обязательно обкладывать костылями, например счетчиком ссылок, а стало быть надо писать специальный код для управления этим счетчиком. Если хочешь, можешь порассуждать на тему "В С++ все разрабы настолько круты, что циклические ссылки это плевое дело".

EP>А где я утверждал что это типичный C++ код? Ещё раз, ты написал подчёркнутое. Я же тебе показал конкретный пример показывающий обратное.

EP>К чему эта демагогия про Boost, шаблоны, и типичный код?

Если твой пример не является типичным, то его незачем и рассматривать. Типичный код это такой, с которым имеет дело большинство. Не усредненный, по количеству строчек, а некоторая мода(статистика, а не одежда).

I>>Уже все сказано. На одном проекте 40 индусов майнтейнят либу для линейного программирования, а на другом один человек майнтейнит такую же либу да же пачку из других областей. Вопрос — какой код считать типичным для этого примера


EP>Вопроса не понял. Какого примера?


Выделил.
Re[18]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.06.13 15:21
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Это ты все эти CD-ejector'ы разрабатывал? С отзывчивым UI и корректностью, ага

I>>Это все писалось на С и С++, потому что люди просто не могут нормально реализовать асинхронщину.

EP>Я не вижу связи между тем что до запятой и что после


Асинхронщина в менеджед работает на раз, тому миллионы примеров. А вот на С++ куда ни ткни, то какое то бедствие — результатов нет.

EP>>>Критично там где нужна производительность

I>>Назови такие приложения.

EP>CAD/CAE/CAM, web-браузеры, компиляторы, JIT, СУБД, обработка массивов данных(например c лидаров и т.п.), числодробилки, игры, low-latency processing, сервера, embedded, обработка видео/изображений/3D, распознавание образов, etc, etc, etc


CAD/CAE/CAM это ты промахнулся, я таким больше 10 лет занимался, могу сам тебе рассказать чего к чему. С++ там в основном в силу исторических причин.
Игры — они разные, нынче все больше игр уходит в менеджед или подобные вещи. Скажем в ворлдофтанс вагоны питоновского кода в самом ядре.
low-latency для начала требует корректную обработку, смотри в Эрланг — самый что ни есть менеджед.
embedded — здесь уже давно джава, дотнет и даже джаваскрипт
Серверы — питон почему то используется в т.ч. Надо полагать просто так ?
Компиляторы — это мимо кассы, компилятор С# доказывает

Итого, остаётся — веб-браузеры, там кстати очень много на джаваскрипте сделано, все что надо для перформанса это рендеринг, парсинг и сама скриптовая машина, обработка видео, звука, изображений, 3Д, распознавание образов.
Re[21]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 21.06.13 16:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Например есть массив элементов, где каждый элемент это {float32,int16,int8}.

I>ля-ля-ля, это не задача, это _решение_ задачи. Поскольку ты сам задачу поставить не можешь, сделаю это за тебя. Смотри, как все просто — реализовать оконное FFT. Чуть более чем весь код для этого в сишном стиле. А вот то что ты показываешь это отстой.

Если сложение векторов это _решение_ задачи, то FFT — это точно такое же _решение_ задачи, а не задача

EP>>Как ты из этого сделал вывод об "кастрированых замыканиях" — я не пойму

I>Очень просто — возможность ручного тюнинга "скомпенсирована" обязательностью такого тюнига, то есть, лямбды просто нельзя применять так, как они применяются в других языках. Это ж очевидно — GC отсутствует, стало быть передавать лямбды наверх нельзя,

Кто тебе такую чушь сказал?

I>нужно обязательно обкладывать костылями, например счетчиком ссылок, а стало быть надо писать специальный код для управления этим счетчиком.


Так код-то уже есть в библиотеках. Помимо счётчика ссылок есть другие варианты — copy, move, move-on-copy, generalized capture.
Почему ты называешь наличие выбора, а не его отсутствие — "кастрацией"?

EP>>А где я утверждал что это типичный C++ код? Ещё раз, ты написал подчёркнутое. Я же тебе показал конкретный пример показывающий обратное.

EP>>К чему эта демагогия про Boost, шаблоны, и типичный код?
I>Если твой пример не является типичным, то его незачем и рассматривать. Типичный код это такой, с которым имеет дело большинство. Не усредненный, по количеству строчек, а некоторая мода(статистика, а не одежда).

Так, давай заново:

I>Что характерно, быстрый код на С++ это точно так же работа против языка. Почему то самые критичные куски кода пишутся практически на С или подобным образом.

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

I>>>Уже все сказано. На одном проекте 40 индусов майнтейнят либу для линейного программирования, а на другом один человек майнтейнит такую же либу да же пачку из других областей. Вопрос — какой код считать типичным для этого примера

EP>>Вопроса не понял. Какого примера?
I>Выделил.

Есть две одинаковых либы ("такую же либу") — одну поддерживает 1 человек, а другую 40, так?
Что ты подразумеваешь под "типичным кодом"? Две либы делают одно и тоже — почему? Эти команды никак не общаются?
Re[19]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 21.06.13 16:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>>>Критично там где нужна производительность

I>>>Назови такие приложения.
EP>>CAD/CAE/CAM, web-браузеры, компиляторы, JIT, СУБД, обработка массивов данных(например c лидаров и т.п.), числодробилки, игры, low-latency processing, сервера, embedded, обработка видео/изображений/3D, распознавание образов, etc, etc, etc
I>CAD/CAE/CAM это ты промахнулся, я таким больше 10 лет занимался, могу сам тебе рассказать чего к чему. С++ там в основном в силу исторических причин.

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

I>Игры — они разные, нынче все больше игр уходит в менеджед или подобные вещи. Скажем в ворлдофтанс вагоны питоновского кода в самом ядре.


Игры-то разные бывают, но там где зрелища производительность таки нужна, причём аппетит приходит во время еды.
Кстати, C++ для игр получается самым кроссплатформенным, ибо работает везде, даже в браузере, причём быстро: Unreal Engine 3 &mdash; Epic Citadel, using the full Unreal Engine 3 which was ported in 4 days..

I>embedded — здесь уже давно джава, дотнет и даже джаваскрипт

I>Серверы — питон почему то используется в т.ч. Надо полагать просто так ?

А я где-то сказал что все серверы или всё embedded это C++?

I>Компиляторы — это мимо кассы, компилятор С# доказывает


Есть бенчмарки?
Re[17]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 16:41
Оценка:
FR>>Так и шарпщики же далеко не все одобряют var и linq.

IT>Не любят в основном те, кто в этом не смог разобраться. За это и не любят.


Вар был введен для поддержки линка. Сейчас же вар лепят куда ни попадя что тоже не есть хорошо.
Re[18]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 21.06.13 17:00
Оценка:
Здравствуйте, Олег К., Вы писали:

IT>>Не любят в основном те, кто в этом не смог разобраться. За это и не любят.

ОК>Вар был введен для поддержки линка. Сейчас же вар лепят куда ни попадя что тоже не есть хорошо.

Что есть плохого в var?
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[21]: Что посоветуете как аналог С++
От: alex_public  
Дата: 21.06.13 17:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Покажи мне аналог в asio для вот для такого псевдокода


I>
I>private async void handler(object sender, TaskArgs args)
I>{
I>    string result = await new Task(() => Download(args.Url), args.Cancellation);

I>    textBox.Text += result;
I>}
I>



I>Итого — функция которая асинхронно скачивает файлик, показывает его и дает возможность отменить скачивание. Всех библиотек можешь использовать только asio и мульку для скачивания.


Вообще не вижу в этом коде никаких завязок на язык. Такое можно сделать наверное в любом, с буквально таким же синтаксисом. Если говорить про C++, то для многопоточного варианта подобное вставили уже вообще в сам стандарт языка (async/future), если же хотим в одном потоке, то берём одну из множества библиотек реализующих сопроцедуры. Хотя слово "библиотека" тут даже слишком громкое — сопроцедуры можно реализовать в несколько сотен строк на большинстве языков программирования.
Re[19]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 17:13
Оценка:
IT>>>Не любят в основном те, кто в этом не смог разобраться. За это и не любят.
ОК>>Вар был введен для поддержки линка. Сейчас же вар лепят куда ни попадя что тоже не есть хорошо.

IT>Что есть плохого в var?


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

Вот нафига вар в таком коде?

var counter = 0;

// or

for (var i = 0; i < maxValue; i++)
    Console.WriteLine(i);
Re[12]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 17:39
Оценка:
M>>>Ты отстал от жизни. Почитай о rvalue references и move-семантике, прежде чем брызгнать слюной и показывать свою некомпетентность.
ОК>>Ну я же так и говорю! Кто-то читает книжки, а кто-то создает реальные проекты! Спрашивается, кто из них больший профессионал?

А тебе сколько лет? Судя по технологиям в профиле ты должен понимать о чем я говорю.

M>Ну о чем тут спорить что ты мне хочешь доказать, что на старом багаже можно далеко уехать? Увы, это миф. IT сфера развивается чрезвычайно интенсивно, хочешь быть востребованным разработчиком — учись, устал и нет запала — иди в менеджеры, управляй людьми.


Я не отрицаю что развиваться всегда надо. У меня посыл в другом. Большинство программистов программируют ради программирования как такового а не для решения бизнес задач и я не считаю правильным когда программисты тащат в проект понравившиеся им технологии или фишки языка только для того чтобы их попробовать и/или поставить их на резюме.

Многие С++ программисты считают что пока они не прочтут всего Страуструпа, Саттера, Мейерса, Александреску, стандарт и что там еще — они не могут называть себя С++ программистами. Этого не нужно на самом деле и эти товарищи просто immature (о чем говорит тот же базис1) или то что нужно "вырастать из этой влюбленности в С++" и переходить на другой уровень, другие языки которые позволяют сконцентрироваться на насущих задачах а не бороться с самим языком, тратя годы на прочтение этой макулатуры (и ИТ и я говорим об этом). Ну и плюс заучить стандарт несложно, хотя затратно по времени. Гораздо сложнее создать работающий проект (да еще так, чтобы его потом покупали).

M>офтопик:

M>Интересная статистика: из последних 10 с++ разработчиков, которых мне пришлось собеседовать, только 2 имели какие-то представления о новшествах с++11. С одной стороны Харьков все-таки переферия, с другой были среди них люди очень компетентные, с большим опытом и серьезными проектами за плечами. Вот мне непонятно откуда такая неосведомленность, что это: усталость от кодинга и нежелание делать что-то выходящее за рамки проектных задач или просто самоуверенность и убежденность, что лучшее решение уже найдено и ничего лучшего быть не может

Сколько им лет? Может быть люди просто выросли и пришло понимание что не все нужно для разработки? А кому-то это понимание может никогда и не прийти, что плохо конечно же. Я, вот, честно сказал что буду знакомиться с новым стандартом только по одной причине: потому что никак непозврослевшие "сеньйоры" будут спрашивать последние фишки на интервью.
Re[22]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 21.06.13 18:18
Оценка:
Здравствуйте, Олег К., Вы писали:

IT>>Так я не понял что в этом плохого? То, что тебе это может не нравится — это вопрос не более чем твоих предпочтений. А что в этом объективно плохого?

ОК>Оно там не нужно

Это твои личные предпочтения.

ОК> но я пойду твоим путем: что в этом [объективно] хорошего? Ясно ведь что там инт должен быть


А может быть long или short, но это не важно. Объективно var это зачатки вывода типов со всеми вытекающими. Отсюда вытекает, например, повышение выразительности языка и устранение кучи мусора вроде:

MyObject obj = new MyObject();


ОК>и, более того, ты знаешь что у вар есть свои ограничения.


Не знаю. Какие?

ОК>А теперь ты ответь еще на один вопрос. Для чего Майкрософт ввел вар в язык? И исходи из этого. Хотя я это уже и говорил тут.


Я не знаю чем точно руководствовались в MS, но, во-первых, это придумали не они, во-вторых, без var нет возможности работать с анонимными типами.

ОК>Итак, с тебя два ответа.


С тебя всё ещё один — что объективно плохого в var?
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[19]: Что посоветуете как аналог С++
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 21.06.13 18:29
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Компиляторы — это мимо кассы, компилятор С# доказывает


Что именно доказывает? csc был на плюсах написан, насколько я знаю.
Re[23]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 21.06.13 18:39
Оценка:
IT>А может быть long или short, но это не важно. Объективно var это зачатки вывода типов со всеми вытекающими. Отсюда вытекает, например, повышение выразительности языка и устранение кучи мусора вроде:
IT>
IT>MyObject obj = new MyObject();
IT>


ОК>>А теперь ты ответь еще на один вопрос. Для чего Майкрософт ввел вар в язык? И исходи из этого. Хотя я это уже и говорил тут.

IT>Я не знаю чем точно руководствовались в MS, но, во-первых, это придумали не они, во-вторых, без var нет возможности работать с анонимными типами.

Всё так и есть:

There are two reasons, one which exists today, one which will crop up in 3.0.
The first reason is that this code is incredibly ugly because of all the redundancy:

Dictionary<string, List<int>> mylists = new Dictionary<string, List<int>>();

And that's a simple example – I've written worse. Any time you're forced to type exactly the same thing twice, that's a redundancy that we can remove. Much nicer to write
var mylists = new Dictionary<string, List<int>>();

and let the compiler figure out what the type is based on the assignment.

Second, C# 3.0 introduces anonymous types. Since anonymous types by definition have no names, you need to be able to infer the type of the variable from the initializing expression if its type is anonymous.


Type inference вообще полезная штука — чего тут спорить.
В C++ ещё с ISO 98 в виде type deduction у шаблонов функций, в C++11 в виде auto (аналог var).
Re[23]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 19:52
Оценка:
IT>>>Так я не понял что в этом плохого? То, что тебе это может не нравится — это вопрос не более чем твоих предпочтений. А что в этом объективно плохого?
ОК>>Оно там не нужно

IT>Это твои личные предпочтения.


Я точно также могу сказать: это твои личные предпочтения!

ОК>> но я пойду твоим путем: что в этом [объективно] хорошего? Ясно ведь что там инт должен быть


IT>А может быть long или short, но это не важно. Объективно var это зачатки вывода типов со всеми вытекающими.


Конкретно там был инт потому что у лонговых литералов в конце суффик "Л." На счет шортов не помню но это очень даже хорошо что ты упомянул эти типы поскольку ты, человек, глядя на эту конструкцию не смог сказать истинный тип переменных. Мелочь? Возможно. Но я за то чтобы глядя на переменную сразу видеть ее тип.

Кстати, что там покажет Интеллисенс если навести мышку на переменную объявленную как вар?

IT>Отсюда вытекает, например, повышение выразительности языка и устранение кучи мусора вроде:


IT>
IT>MyObject obj = new MyObject();
IT>


По мне, так это не мусор а получше чем писать вар. Возможное исключение: всякие "вложенные" дженерики. Ну и для линка, конечно же.

ОК>>и, более того, ты знаешь что у вар есть свои ограничения.


IT>Не знаю. Какие?


Да они только для локальных переменных. Например их нельзя использовать в качестве параметров и return type-а у методов и нельзя использовать в качестве членов класса. Если первое объяснимо, то я не могу предположить ничего на счет второго. По крайней мере на ум ничего не приходит в данный момент. То есть получаются какие-то "кастраты."

ОК>>А теперь ты ответь еще на один вопрос. Для чего Майкрософт ввел вар в язык? И исходи из этого. Хотя я это уже и говорил тут.


IT>Я не знаю чем точно руководствовались в MS, но, во-первых, это придумали не они, во-вторых, без var нет возможности работать с анонимными типами.


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

Отсюда:

You may find that var can also be useful with query expressions in which the exact constructed type of the query variable is difficult to determine. This can occur with grouping and ordering operations.

The var keyword can also be useful when the specific type of the variable is tedious to type on the keyboard, or is obvious, or does not add to the readability of the code. One example where var is helpful in this manner is with nested generic types such as those used with group operations. In the following query, the type of the query variable is IEnumerable<IGrouping<string, Student>>. As long as you and others who must maintain your code understand this, there is no problem with using implicit typing for convenience and brevity.


и

However, the use of var does have at least the potential to make your code more difficult to understand for other developers. For that reason, the C# documentation generally uses var only when it is required.


Я согласен с этими утверждениями.

ОК>>Итак, с тебя два ответа.


IT>С тебя всё ещё один — что объективно плохого в var?


Объясняю это на протяжении нескольких постов. Плохого в них ничего нет но их не создавали чтобы девелоперы использовали их налево и направо. Теперь ты объясни мне что в них хорошего (кроме анонимных типов и вложенных дженериков). Я пока что не услышал ответа.

Ну и немного не по теме. var — contextual keyword. Могли бы уж и зарезервировать его полностью. А то коряво как-то. Ровно также как и с value в пропертях.
Re[24]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 19:59
Оценка:
EP>Type inference вообще полезная штука — чего тут спорить.

Никто не спорит о полезности этой штуки как таковой. Речь шла о том в каких контекстах ее использовать а в каких нет.
Re[22]: Что посоветуете как аналог С++
От: michae1  
Дата: 21.06.13 19:59
Оценка:
Здравствуйте, Олег К., Вы писали:

M>>>А подробнее? Что именно, "нормальный софтверный инженер", исключил бы из нововведений с++11?


MTD>>Коллега, нашли кого спрашивать


ОК>Вот смотрите, коллега. Есть D. Mon, есть bazis1 со своими проектами и компаниями которые приносят им деньги. Еще есть ИТ со своим проектом (не знаю как там с монетизацией). Я понимаю как они мыслят (и с чем-то согласен, с чем-то нет) и для меня эти люди — профессионалы. А Вы чем можете похвастаться? Знанием стандарта С++ и никому ненужных фич? Ну что — поздравляю!


Как я тебе уже ответил в другой ветке, ты смешиваешь умение запустить свой бизнес и вопрос квалификации разработчика. Ну давай сравним нефтянника и геолога, судя по твоей логике нефтянник — профессионал, а геолог, который нашел месторождение — школота.
Re[23]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 20:15
Оценка:
M>Как я тебе уже ответил в другой ветке, ты смешиваешь умение запустить свой бизнес и вопрос квалификации разработчика. Ну давай сравним нефтянника и геолога, судя по твоей логике нефтянник — профессионал, а геолог, который нашел месторождение — школота.

Не смешиваю. Я рассуждаю как сеньйор и начальник. А ты, вот, знаешь географическую загадку русской души?
Re[14]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 20:27
Оценка:
Так сколько тебе лет? Хотя бы тридцать есть?

M>Ты смешиваешь интересы бизнеса, о которых мы вобщем-то сейчас не спорим, с вопросом, что должен знать и уметь квалифицированый разработчик. Я смотрю на проблему с точки зрения программиста — рабочей лошадки, в обязанности которого входит проектирование пусть и небольших, но независимых кусков проекта. Я убежден, что грамотное решение проблемы требует от человека хороших знаний инчтрумента, в нашем случае языка и стандартной библиотеки. Те нововведения, которые предлагает новый стандарт, исключают создание многих ненужных велосипедов, а значит экономит время и дает более надежное решение. Если человек не в курсе, он начнет "изобретать колесо". Нужно это? Конечно, нет.


Чувак, ты можешь сколько угодно читать книг и рассуждать о разработке, но для меня профессионал тот — который может начать и закончить проект.

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

ОК>>Сколько им лет? Может быть люди просто выросли и пришло понимание что не все нужно для разработки? А кому-то это понимание может никогда и не прийти, что плохо конечно же. Я, вот, честно сказал что буду знакомиться с новым стандартом только по одной причине: потому что никак непозврослевшие "сеньйоры" будут спрашивать последние фишки на интервью.


M>Как я написал, выше, эти знания важны если человек позиционирует себя как квалифицированного разработчика, иначе как он может принимать правильные решения.


Бла-бла-бла. Заучиватель стандарта не есть квалифицированный разработчик и я смотрю у тебя не та квалификация чтобы это понять. Советую зайти в форум по шароваре. Там люди создают проекты которые же сами и продают. Спрашивается, кто является большим профессионалом? Они или ты, любитель стандарта?
Re[22]: Что посоветуете как аналог С++
От: MTD https://github.com/mtrempoltsev
Дата: 21.06.13 20:44
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Вот смотрите, коллега.


А ты кто такой? Может и не коллега ты мне вовсе
Re[23]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 20:51
Оценка:
ОК>>Вот смотрите, коллега.

MTD>А ты кто такой? Может и не коллега ты мне вовсе


Я — программист. Ты — .
Re[15]: Что посоветуете как аналог С++
От: koodeer  
Дата: 21.06.13 21:21
Оценка:
Здравствуйте, Олег К., Вы писали:

ОК>Чувак, ты можешь сколько угодно читать книг и рассуждать о разработке, но для меня профессионал тот — который может начать и закончить проект.


ОК>Бла-бла-бла. Заучиватель стандарта не есть квалифицированный разработчик и я смотрю у тебя не та квалификация чтобы это понять. Советую зайти в форум по шароваре. Там люди создают проекты которые же сами и продают. Спрашивается, кто является большим профессионалом? Они или ты, любитель стандарта?


Приведу такое сравнение. В школьные годы я занимался в авиамодельном кружке. Я сам делал бойцовые модели, с начала и до конца. Выпиливал лобзиком из бальсы, резал раскалённой проволокой пенопласт, клеил плёнку, вырезал винты, перебирал двигатели, и многое-многое другое. Моделист — тот же шароварщик: делаёт самолёт с начала до конца.
Между тем настоящие самолёты не делаются одним человеком. Есть куча конструкторов, каждый из которых отвечает за проектирование "кусочка" самолёта: планер, двигатель, шасси, электроника и т. д.

А теперь задайся вопросом: кто настоящий профессионал? Тот кто делает целый самолёт (моделист) или тот кто делает часть самолёта (инженер-конструктор)?
Имхо, ответ: и те, и другие. Просто у каждого своя специализация.

Моделист умеет работать руками, не зная сопромата. Шароварщик может настругать тонны кода, от вида которого девелопер из большой конторы придёт в ужас (при этом готовая шаровара будет приятна на вид, быстра, удобно и хорошо продаваться). Думаю, понятно.
Re[25]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 21:36
Оценка:
ОК>>По мне, так это не мусор а получше чем писать вар. Возможное исключение: всякие "вложенные" дженерики. Ну и для линка, конечно же.

K>Когда-то я тоже был ярым сторонником полного описания типов. Я долго не принимал var (использовал его только в линковых выражениях). Время шло, я развивался (во всяком случае мне так кажется), и я осознал удобство краткости кода.


Интересная точка зрения и самое главное — спокойный ответ! Я наоборот пришел к тому что лучше использовать чуть большую словесность и всячески избегать экзотические и "крутые с точки зрения реальных пацанов" конструкции.

ОК>>Объясняю это на протяжении нескольких постов. Плохого в них ничего нет но их не создавали чтобы девелоперы использовали их налево и направо. Теперь ты объясни мне что в них хорошего (кроме анонимных типов и вложенных дженериков). Я пока что не услышал ответа.


K>Мне попадались такие высказывания на эту тему.


Да сама МСДН так и говорит и многие авторы также. Плюс я сам согласен.

K>Начинающие программисты много внимания уделяют типу переменной; разбирая чужой код, они в первую очередь смотрят на тип, и таким образом пытаются понять, что можно сделать с этой переменной (этим объектом). И эти джуниоры мало уделяют внимания наименованию переменных.


В каком году начал профессиональную карьеру?

K>Более опытные разработчики типу уделяют гораздо меньше внимания. Для них важнее сама семантика кода. Гораздо важнее название переменной, а не её тип. Дав описательное название переменной, можно по сути пренебречь её типом: и так всё ясно.


Я согласен но неужели ты никогда не наводишь мышку на переменную чтобы увидеть ее тип? Особенно если код чужой. По-моему ты лукавишь немного.

K>И я с таким мнением согласен.


Благодарю за спокойное изложение мнения!
Re[16]: Что посоветуете как аналог С++
От: Олег К.  
Дата: 21.06.13 21:48
Оценка:
ОК>>Чувак, ты можешь сколько угодно читать книг и рассуждать о разработке, но для меня профессионал тот — который может начать и закончить проект.

ОК>>Бла-бла-бла. Заучиватель стандарта не есть квалифицированный разработчик и я смотрю у тебя не та квалификация чтобы это понять. Советую зайти в форум по шароваре. Там люди создают проекты которые же сами и продают. Спрашивается, кто является большим профессионалом? Они или ты, любитель стандарта?


K>Приведу такое сравнение. В школьные годы я занимался в авиамодельном кружке. Я сам делал бойцовые модели, с начала и до конца. Выпиливал лобзиком из бальсы, резал раскалённой проволокой пенопласт, клеил плёнку, вырезал винты, перебирал двигатели, и многое-многое другое. Моделист — тот же шароварщик: делаёт самолёт с начала до конца.


Продолжая твое сравнение... А кто-то читал как делать эти модели но никогда не "марал" руки.

K>Между тем настоящие самолёты не делаются одним человеком. Есть куча конструкторов, каждый из которых отвечает за проектирование "кусочка" самолёта: планер, двигатель, шасси, электроника и т. д.


K>А теперь задайся вопросом: кто настоящий профессионал? Тот кто делает целый самолёт (моделист) или тот кто делает часть самолёта (инженер-конструктор)?

K>Имхо, ответ: и те, и другие. Просто у каждого своя специализация.

У тебя неверная аналогия. Разумеется настоящий самолет сам не построишь но если взять нас, обычных программистов, работающих на дядю, то кто-то приходит домой и читает стандарт а кто садиться программировать, пишет код, меняет код. В общем делает практическую работу а не только теоретизирует.

K>Моделист умеет работать руками, не зная сопромата. Шароварщик может настругать тонны кода, от вида которого девелопер из большой конторы придёт в ужас (при этом готовая шаровара будет приятна на вид, быстра, удобно и хорошо продаваться). Думаю, понятно.


Не исключенна и обратная ситуация. Шароварщик прийдет в ужас от того что "девелоперы в большой конторе" могу набангалорить дяде. Так что будем считать что здесь счет 1:1 но, повторюсь, шароварщики программируют ради чего-то нужного, полезного в то время как любители стандарта попробуют несколько строчек в компиляторе чтобы увидеть как работает та или иная фича и считают себя профи. И, согласись, что работать с большим количеством кода, большим количеством файлов сложнее чем пробовать разные фичи языка.
Re[20]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.06.13 06:25
Оценка:
Здравствуйте, D. Mon, Вы писали:

I>>Компиляторы — это мимо кассы, компилятор С# доказывает


DM>Что именно доказывает? csc был на плюсах написан, насколько я знаю.


Это было давно и неправда.
Re[22]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.06.13 06:49
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>ля-ля-ля, это не задача, это _решение_ задачи. Поскольку ты сам задачу поставить не можешь, сделаю это за тебя. Смотри, как все просто — реализовать оконное FFT. Чуть более чем весь код для этого в сишном стиле. А вот то что ты показываешь это отстой.


EP>Если сложение векторов это _решение_ задачи, то FFT — это точно такое же _решение_ задачи, а не задача


Ты говорил про массивы, индексы и структуру. Оконное FFT — здесь ничего нет ни про массивы, ни про индексы, ни про конкретную структуру.

EP>>>Как ты из этого сделал вывод об "кастрированых замыканиях" — я не пойму

I>>Очень просто — возможность ручного тюнинга "скомпенсирована" обязательностью такого тюнига, то есть, лямбды просто нельзя применять так, как они применяются в других языках. Это ж очевидно — GC отсутствует, стало быть передавать лямбды наверх нельзя,

EP>Кто тебе такую чушь сказал?


Ты сам же и сказал.

I>>нужно обязательно обкладывать костылями, например счетчиком ссылок, а стало быть надо писать специальный код для управления этим счетчиком.


EP>Так код-то уже есть в библиотеках. Помимо счётчика ссылок есть другие варианты — copy, move, move-on-copy, generalized capture.


Вот-вот.

EP>Почему ты называешь наличие выбора, а не его отсутствие — "кастрацией"?


Представь себе ситуацию — идешь по улице, появляется коробейник и предлагает тебе на выбор чего то купить. Ты отказываешься и идешь дальше.
Другой вариант — идешь по улице, появляется коробейник, выбор сумасшедший, от сигарет до феррари, но отказаться у тебя нет возможности.
Странно, но второй случай почему то описан в Уголовном Кодексе.

Отсюда ясно, что __обязательность__ какого то выбора это совсем не то же самое, что и свобода выбора. Вот если бы можно было передавать лямбды как попало, а вот тюнить надо было только для перформанса-расхода памяти, тогда другое дело. Скажем в дотнете худо бедно, но такая возможность есть, можно сделать так, что все лямбды-делегаты внезапно станут очень медленными, раз в 100, относительно вызова пустой лямбды, но при этом станут занимать памяти примерно вчетверо меньше.

I>>Если твой пример не является типичным, то его незачем и рассматривать. Типичный код это такой, с которым имеет дело большинство. Не усредненный, по количеству строчек, а некоторая мода(статистика, а не одежда).


EP>Так, давай заново:

EP>

I>>Что характерно, быстрый код на С++ это точно так же работа против языка. Почему то самые критичные куски кода пишутся практически на С или подобным образом.

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

Именно так. В обработке звука, видео код весь до дыр сишный, плюсов там обычно совсем немного, только верхний интерфейс и некритичные функции. Как то так. И это именно типичный случай.

I>>>>Уже все сказано. На одном проекте 40 индусов майнтейнят либу для линейного программирования, а на другом один человек майнтейнит такую же либу да же пачку из других областей. Вопрос — какой код считать типичным для этого примера

EP>>>Вопроса не понял. Какого примера?
I>>Выделил.

EP>Есть две одинаковых либы ("такую же либу") — одну поддерживает 1 человек, а другую 40, так?

EP>Что ты подразумеваешь под "типичным кодом"? Две либы делают одно и тоже — почему? Эти команды никак не общаются?

Я хочу выяснить, как ты понимаешь это слово. Две либы делают одно и то же — очень просто, в аутсорсной конторе два разных проекта, с разной историей и разным руководством и разными заказчиками. Прийти и сказать "а у нас есть другая либа, получше, подешевле написаная для вашего конкурента" — вот так сказать в аутсорсе никто не может и не имеет права.
Re[23]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 22.06.13 13:03
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Если сложение векторов это _решение_ задачи, то FFT — это точно такое же _решение_ задачи, а не задача

I>Ты говорил про массивы, индексы и структуру. Оконное FFT — здесь ничего нет ни про массивы, ни про индексы, ни про конкретную структуру.

Это задача — извне приходит массив элементов и индексы. Если бы извне приходили уже готовые координаты векторов, без индексов, то это была бы другая задача.
Точно также как если бы для FFT входная функция задавалась таблично, либо как callback — код не был бы идентичным.
Хватит разводить демагогию — talk is cheap show me the code.

I>Отсюда ясно, что __обязательность__ какого то выбора это совсем не то же самое, что и свобода выбора. Вот если бы можно было передавать лямбды как попало, а вот тюнить надо было только для перформанса-расхода памяти, тогда другое дело.


ага, как попало:
using System;
using System.IO;

public class Test
{
    public delegate void fireworks();
    public static fireworks make_closure(FileStream fs)
    {
        return () => fs.Read(new byte[10], 0, 10); // "передавать лямбды как попало, куда попало!!"
    }
    public static fireworks fire()
    {
        using (var fs = File.Open("file", FileMode.Open))
        {
            return make_closure(fs);
        }
    }
    public static void Main()
    {
        fire()();
    }
}

А что это такое белое и пушистое прилетело в виде System.ObjectDisposedException?

EP>>

I>>>Что характерно, быстрый код на С++ это точно так же работа против языка. Почему то самые критичные куски кода пишутся практически на С или подобным образом.

EP>>Я правильно понимаю, что ты имел ввиду что человек знающий и C и C++ предпочтёт писать быстрый код практически на C, ограничивая себя в выразительных средствах C++?
I>Именно так. В обработке звука, видео код весь до дыр сишный, плюсов там обычно совсем немного, только верхний интерфейс и некритичные функции. Как то так. И это именно типичный случай.

И как то что где-то когда-то использовалось C, подтверждает твой тезис "быстрый код на С++ это точно так же работа против языка"?

I>Я хочу выяснить, как ты понимаешь это слово. Две либы делают одно и то же — очень просто, в аутсорсной конторе два разных проекта, с разной историей и разным руководством и разными заказчиками. Прийти и сказать "а у нас есть другая либа, получше, подешевле написаная для вашего конкурента" — вот так сказать в аутсорсе никто не может и не имеет права.


Есть аутсорсная контора, в ней два независимых проекта один на foo другой на bar — какой код считать типичным? foobar? Нет, так ведь foo в 2 раза больше — значит foofoobar?
Re[2]: Что посоветуете как аналог С++
От: Dair Россия  
Дата: 22.06.13 19:12
Оценка:
G>>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?

vsb>Objective C


Согласен. Поддержка от Apple еще надолго останется.
Re[21]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 22.06.13 22:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Покажи мне аналог в asio для вот для такого псевдокода

I>
private async void handler(object sender, TaskArgs args)
{
    string result = await new Task(() => Download(args.Url), args.Cancellation);
    textBox.Text += result;
}

I>Итого — функция которая асинхронно скачивает файлик, показывает его и дает возможность отменить скачивание.

C++1998:
void handler(Object &sender, TaskArgs &args)
{
    background(bind(download, args.url), args.cancellation),
    textBox.Text += _1;
}

Re[17]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 00:51
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>>>А если требует то важна не сама скорость работы, а perceived performance.

EP>>>>Если вычисление идёт 30 минут, вместо возможных десяти секунд, то ты хоть как украшай progress bar рюшечками — это не поможет.
G>>>30 минут надо считать на сервере, клиент может столько и не прожить.
EP>>Что за плоское представление о мире? Кто говорил что в этом случае вообще есть сервера?
G>Здравый смысл. Десктопное приложение, считающее что-то 30 минут, без возможности остановить и продолжить "потом", в реальном мире (у не программистов) существовать не будет.

Есть десктопные приложения, которые не то что часами, а то и целыми днями, и даже неделями "что-то вычисляют". Я же говорю, какое-то плоское представление о мире.
Да и кто сказал, что нет возможности остановить и продолжить потом?

G>Ускорить его в 600 раз переписыванием даже на ассемблере в реальном мире тоже не выйдет.


Откуда 600?

G>Быстродействие с точки зрения пользователя совсем не то, о чем думают программисты C++.


Давай, расскажи нам

EP>>>>Ты вроде как толком не ответил, что не так с продолжениями в C++

G>>>то что их просто нет, а если сделать, то бестолку. Ибо комбинировать продолжения с передачей данных будет сложно, придется париться с освобождением памяти. Да и тупо может продолжение не прийти.
EP>>Почему сложно? Почему парится с освобождением памяти? Куда продолжение может не прийти?
G>Давай так: http://rsdn.ru/forum/philosophy/5208679?tree=tree
Автор: gandjustas
Дата: 23.06.13

G>тут пример кода, повтори его на C++, даже считая что есть годная библиотека для асинхронных HTTP вызовов и кто-нибудь смаршалит вызов в UI.

А я вроде как повторил, просто ты не понял

G>>>Еще раз: продолжения+детерминированная финализация. Вместе, а не по-отдельности. В общем случае нельзя придумать способ гарантированной очистки памяти. Продолжение может просто не вызваться и будет держать ссылку на замыкание.

EP>>Давай конкретный пример.
G>
G>class A
G>{
G>    int x;
G>}
G>Func<int> GetFunc()
G>{
G>    var closure = new A { x = 0 };
G>    return () => closure.x++;
G>}
G>

G>Перепиши его на C++, не изменяя семантики.
G>1) Чтобы closure не был виден вне GetFunc
G>2) Чтобы closure был освобожден когда станет недостижимым.

Слушай, ну сказал бы что совсем не знаешь C++ — мы бы тут флейм не разводили:
#include <functional>
using namespace std;

struct A
{
    int x;
};

function<int()> GetFunc()
{
    A c = {0};
    return [=]() mutable { return c.x++; };
}

int main()
{
    auto x = GetFunc();
    return x()+x()+x()-3;
}


G>>>>>Самое важное тут: как ты будешь получать этот массив и как обрабатывать. Если у тебя обработка ограниченного количества элементов за раз, то может вообще нет смысла держать в памяти все 32М, а читать с диска, на лету обрабатывать и выводить.

EP>>>>Нет, каждый элемент нужно обрабатывать много раз. Причём такие элементы будут хранится не только в массиве — это общий пример на простой абстракции в виде группировки элементов
G>>>Ниче не понял, приведи пример.
EP>>Есть группа логически связанных данных Element. Приложению нужны массивы/деки/мэпы Element'ов.
G>Пользователю не нужны они все. Что пользователю нужно?

Я правильно понимаю, что группировка данных в виде простой структуры, которая существует с незапамятных времён — это что-то за гранью понимания без полного проектного ТЗ?

G>>>>>А зачем? Цель не оптимизация сама по себе, цель — чтобы программа работала достаточно быстро.

EP>>>>А я и не говорил что оптимизация это самоцель — действительно, если тебе нужно обрабатывать 90 байтиков в секунду, то можешь хоть visual basic взять
G>>>Среднее десктопное приложение обрабатывает и того меньше.
G>>>Ты сам доказываешь что C++ не нужен и это совсем не мейнстрим.
EP>>Где я это доказывал?
G>Да почти везде

Really?

EP>>Там где нужна производительность — у C++ пока практически нет конкурентов, там где не нужна — можно использовать либо C++, либо что-то другое — зависит от конкретной задачи

G>Неуловимого джо тоже поймать никто не может, потому что нафиг никому не нужно.
G>А там где C++ сидит плотно, то скорее всего по историческим причинам.

This is so ridiculous.
Re[25]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 01:31
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Мода на await как раз потому что он маленький и очень мощный. Можно написать пример в 3 строки, который другие языки не осилят в 100 строк.


Ну так полезная фича для асинхронности, кто ж спорит. В Boost.Asio давно есть аналог — stackless coroutines, а Boost.Coroutine предоставляет ещё более мощное средство абстракции.
Вот только по поводу 100 vs 3 строк ты преувеличил эдак так на порядок — это маркетологи по ушам съездили? Или какие такие "другие языки" ты конкретно имеешь ввиду? А то ведь действительно, языки разные бывают.

EP>>"Чтобы ты лучше понял", C++ код приведённый выше именно это и делает, ну разве кроме EnsureSuccessStatusCode и второго await'а которых не было в исходном запросе

G>"Именно это" это что? Как он маршалит в UI?

А ты присмотрись, там есть замыкание/продолжение, которое и постится в ui'шный event-loop

G>Как он делает аснихронные вызовы?


Из GUI потока в thread pool летит замыкаие (так же как и в первоначальном запросе), когда готово — продолжение/замыкание обратно в GUI поток.

G>Ну и код background в студию. В нем скрыто самое интересное.


Конечно, там ведь драгоценный type deduction, куда уж без него:
template<typename F, typename T>
Task<result_of<F()>::type> background(F f, T t)
{
    return Task<result_of<F()>::type>(f, t);
}

Re[23]: Что посоветуете как аналог С++
От: alex_public  
Дата: 23.06.13 04:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты не рассуждай, а покажи код. Ну что за беда с сиплюсниками, чуть что, сразу в кусты. Ни кода, ни денег.


Ну вот Evgeny.Panasyuk уже опередил меня, показав самый короткий вариант (заметно удобнее чем в самом C#). Правда я предпочитаю другой вариант, т.к. этот завязан на компилятор от MS, а я стараюсь кроссплатформенные решения использовать. Но мой вариант (через Boost) на целых две строчки длиннее, так что пускай остаётся вариант через PPL. Тем более что даже забавно, решение от Microsft для C++ vs. решение от Microsoft для C#.

P.S. Кстати, после того как мы выяснили что асинхронный код не просто можно записывать на C++, но он ещё и даже короче, было бы очень интересно ещё и сравнить быстродействие...
Re[23]: Что посоветуете как аналог С++
От: alex_public  
Дата: 23.06.13 04:26
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Пример для C# неточен.


G>Вот так надо:


G>
G>private async void handler(object sender, TaskArgs args)
G>{
G>    var client = new HttpClient();
G>    var response = await client.GetAsync(args.Url, args.Cancellation);
G>    response.EnsureSuccessStatusCode();
G>    textBox.Text +=  await response.Content.ReadAsStringAsync();
G>}

G>


G>Чтобы ты лучше понимал что происходит, распишу по-русски как оно работает. Предположим что это десктопное приложение.


G>1) вызывается handler

G>2) делается запрос на сервер, метод сразу же завершается и уходит а ожидание сообщений или делает полезную работу
G>3) Когда приходит заголовок ответа вызов хендлера маршалится в UI поток через цикл обработки сообщений
G>4) Когда в UI потоке находится время обработать, он проверяет успешность вызова и запускает асинхронное чтение данных ответа и завершает вызов.
G>5) когда весь ответ прочитан вызов хендлера снова маршалится в UI поток
G>6) Кода в UI потоке находится время, он добавляет текст ответа в TextBox

Ну и зачем проверка успешности вызова делается в UI потоке? Какой смысл в этом? ) Это как раз классический пример кривой архитектуры.

G>Такая архитектура позволяет делать очень много подобной "работы", вообще без создания потоков, при этом ни на долю секунды не потеряв отзывчивость интерфейса.


Не надо иллюзий. Потоки всё равно есть, просто они в чужом коде.

G>Давай, детка, сделай это на C++.


Абсолютно без проблем этот код повторяется с помощью std::async и boost.coroutines. Будет где-то на пару строк длиннее чем C# вариант. Но лично я никогда не буду писать такой код, т.к. на мой взгляд это явно кривая архитектура. Я предпочитая использовать эрланговскую модель потоков, которая без проблем реализуется и на C++ и на c#.

G>Более того, на сервере еще интереснее ситуация. Сделав правильно обработку входящих запросов можно обработанные данные писать на диск\в базу во время того как клиент данные еще отправляет. Причем для этого не надо плодить потоки.

G>Это позволяет таких показателей латентности добиться, что ни одному серверу на C++ не снилось.

Хаха. ))) А можно поинтересоваться, какой процент от рынка например http-серверов занимают серверы написанные на c#? )
Re[24]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 04:50
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну вот Evgeny.Panasyuk уже опередил меня, показав самый короткий вариант (заметно удобнее чем в самом C#). Правда я предпочитаю другой вариант, т.к. этот завязан на компилятор от MS, а я стараюсь кроссплатформенные решения использовать. Но мой вариант (через Boost) на целых две строчки длиннее, так что пускай остаётся вариант через PPL. Тем более что даже забавно, решение от Microsft для C++ vs. решение от Microsoft для C#.


Собственно вот этот код
Автор: Evgeny.Panasyuk
Дата: 23.06.13
я специально не завязывал на PPL, так как тоже предпочитаю кроссплатформенность — например в PPL нет функции background. Главное что он реализуем.

_>P.S. Кстати, после того как мы выяснили что асинхронный код не просто можно записывать на C++, но он ещё и даже короче, было бы очень интересно ещё и сравнить быстродействие...


Я сначала влепил .then(+gui continuation context для него) вместо запятой, прям из PPL — но всё же градус и тон дискуссии требовал чего-то поострее
Re[25]: Что посоветуете как аналог С++
От: alex_public  
Дата: 23.06.13 05:14
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Я сначала влепил .then(+gui continuation context для него) вместо запятой, прям из PPL — но всё же градус и тон дискуссии требовал чего-то поострее


А у меня стоит подписка в почту на эту темку форума, так что я как раз тот вариант видел и как раз на него отвечал. ))) И кстати даже такой он выглядел короче C# варианта...
Re[26]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.06.13 05:27
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, gandjustas, Вы писали:


G>>Мода на await как раз потому что он маленький и очень мощный. Можно написать пример в 3 строки, который другие языки не осилят в 100 строк.


EP>Ну так полезная фича для асинхронности, кто ж спорит. В Boost.Asio давно есть аналог — stackless coroutines, а Boost.Coroutine предоставляет ещё более мощное средство абстракции.

EP>Вот только по поводу 100 vs 3 строк ты преувеличил эдак так на порядок — это маркетологи по ушам съездили? Или какие такие "другие языки" ты конкретно имеешь ввиду? А то ведь действительно, языки разные бывают.

Я пока не увидел аналога await

EP>>>"Чтобы ты лучше понял", C++ код приведённый выше именно это и делает, ну разве кроме EnsureSuccessStatusCode и второго await'а которых не было в исходном запросе

G>>"Именно это" это что? Как он маршалит в UI?

EP>А ты присмотрись, там есть замыкание/продолжение, которое и постится в ui'шный event-loop

Без внутренностей background\Task этого не видно.

G>>Как он делает аснихронные вызовы?

EP>Из GUI потока в thread pool летит замыкаие (так же как и в первоначальном запросе), когда готово — продолжение/замыкание обратно в GUI поток.
Код покажи

G>>Ну и код background в студию. В нем скрыто самое интересное.


EP>Конечно, там ведь драгоценный type deduction, куда уж без него:

EP>
EP>template<typename F, typename T>
EP>Task<result_of<F()>::type> background(F f, T t)
EP>{
EP>    return Task<result_of<F()>::type>(f, t);
EP>}
EP>

EP>
We need to go deeper.
Покажи что делает task.
Re[19]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 06:58
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>Здравый смысл. Десктопное приложение, считающее что-то 30 минут, без возможности остановить и продолжить "потом", в реальном мире (у не программистов) существовать не будет.

EP>>Есть десктопные приложения, которые не то что часами, а то и целыми днями, и даже неделями "что-то вычисляют".
G>Давай, назови штук 5 таких.

ANSYS, Abaqus, LS-DYNA, и даже отечественные: MicroFe, Лира, SCAD. И это всё по одной теме, а есть ещё и другие.

EP>>Да и кто сказал, что нет возможности остановить и продолжить потом?

G>Потому что время работы такого приложения начинает зависеть от скорости диска Это делает неверным большинство твоих рассуждений.

Простейший пример: умножение плотных матриц достаточно ресурсоёмкая операция, но при этом загруженное однажды значение можно использовать N раз, если дело даже дойдёт до диска, то при современных объёмах ОЗУ N будет > 30000.
Если ты не отходил далее чем на 10км от дома — это не значит что мир плоский как диск.

G>>>Ускорить его в 600 раз переписыванием даже на ассемблере в реальном мире тоже не выйдет.

EP>>Откуда 600?
G>Разница между 30 минутами и 5 секундами.

Так, теперь откуда взялось 5 секунд, и как у тебя разница между 30мин и 5с получилась 600?

G>>>Перепиши его на C++, не изменяя семантики.

G>>>1) Чтобы closure не был виден вне GetFunc
G>>>2) Чтобы closure был освобожден когда станет недостижимым.
[...]
G>Семантика не сохранена, A не в куче.
G>Я думал ты хоть до этого сам догадаешься.

Пункты выше выполнил, но шапку для телепатии не надел, ага — запихивать int в кучу у меня рука не поднялась. Попробую с шапкой:
function<int()> GetFunc()
{
    auto c = make_shared<A>(A{0});
    return [=]{ return c->x++; };
}

Вернёмся к вопросу об "кастрированости" лямбд/замыканий, времени жизни, мусоре и т.п.
В некоторой функции foo, открывается некоторый ресурс bar (память/соединение/etc) — этот ресурс захватывается лямбдой. Лямбда принимает некий параметр, передаёт в ресурс (например записывает строчку в файл) и возвращает результат операции. Лямбда прокидывается на пару уровней наверх по call stack'у, причём по пути её могут использовать.
Задача: как только (это значит сразу, а не когда мир остановится ибо ресурс ценный) лямбда становится не достижима, ресурс должен быть освобождён, ибо на него очередь, причём он не должен быть потерян в мусорник при вылетевшем исключении.
Покажи код на C#.

EP>>>>Там где нужна производительность — у C++ пока практически нет конкурентов, там где не нужна — можно использовать либо C++, либо что-то другое — зависит от конкретной задачи

G>>>Неуловимого джо тоже поймать никто не может, потому что нафиг никому не нужно.
G>>>А там где C++ сидит плотно, то скорее всего по историческим причинам.
EP>>This is so ridiculous.
G>Ты случайно выделил два фрагмента и стала мыль правильнее? Сейчас есть тонны кода на C++, которые никто и никогда на другие языки не перепишет. Как на коболе в свое время.
G>Более того, говорят и сейчас на коболе работает больше всего кода.

Допустим есть C++ legacy код, который если бы разрабатывался сейчас — то было бы выбрано что-нибудь другое, ок — не спорю.
Как это относится к подчёркнутому выше, и согласен ли ты с этим?
Re[27]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 08:37
Оценка:
Здравствуйте, gandjustas, Вы писали:

EP>>Ну так полезная фича для асинхронности, кто ж спорит. В Boost.Asio давно есть аналог — stackless coroutines, а Boost.Coroutine предоставляет ещё более мощное средство абстракции.

EP>>Вот только по поводу 100 vs 3 строк ты преувеличил эдак так на порядок — это маркетологи по ушам съездили? Или какие такие "другие языки" ты конкретно имеешь ввиду? А то ведь действительно, языки разные бывают.
G>Я пока не увидел аналога await

Stackless coroutine аналог await это:
void test1(async)
{ 
    state_machine(test1)
    {
         cout << 1 << endl;
         await do_async( print("a1") );
         cout << 2 << endl;
         await do_async( print("a2") );
         cout << 3 << endl;
    }
}
 
void test2(async)
{ 
    state_machine(test2)
    {
         cout << "x" << endl;
         await do_async( print("b1") );
         cout << "y" << endl;
         await do_async( print("b2") );
         cout << "z" << endl;
    }
}
 
int main()
{
    test1();
    test2();
    while(!async_q.empty())
    {
        cout << "async loop" << endl;
        async_q.front()();
        async_q.pop();
    }
}

Вывод:
1
x
async loop
a1
async loop
2
async loop
b1
async loop
y
async loop
a2
async loop
3
async loop
b2
async loop
z


G>>>Как он делает аснихронные вызовы?

EP>>Из GUI потока в thread pool летит замыкаие (так же как и в первоначальном запросе), когда готово — продолжение/замыкание обратно в GUI поток.
G>Код покажи

Вот такой псевдокод понятней?
void handler(Object sender, TaskArgs args)
{
    StartNew( () => download(args.url), args.cancellation, on_workpool).then
    (
        result => textBox.Text += result,
        on_gui_thread
    );
}
Re[25]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 23.06.13 10:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Вот когда такой код появится в прошивке, драйвере файловой системы или движде базы данных или веб сервере, вот тогда и можно будет производительность сравнивать.

А он там есть. Большое managed-приложение съест кучу памяти, оставив меньше места под кэш.

Вот и получается:
if (connection->client_is_managed())
   connection->set_slow_mode();
Sapienti sat!
Re[24]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 10:12
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну и зачем проверка успешности вызова делается в UI потоке? Какой смысл в этом? ) Это как раз классический пример кривой архитектуры.


Проверка успешности вызова делается там, где нужно. Часто именно вызывающий код имеет все необходимое для такой обработки. Если делать как ты предложил, придется маршалить весь контекст, который очень часто привязан к потоку. Это необязательно UI, это может быть просто любой объект, который привязан к потоку. Почему именно так — да хрен его знает, спрашивай тех ребят, который писали многопоточность на православном С++ под вындоус тот же


G>>Это позволяет таких показателей латентности добиться, что ни одному серверу на C++ не снилось.


_>Хаха. ))) А можно поинтересоваться, какой процент от рынка например http-серверов занимают серверы написанные на c#? )


ASP.NET в IIS на С#, аналогичные вещи есть и в джаве и тд и тд и тд. Весь сервер никогда не пишется полностью на менеджед, в основном потому что обчно это завязано на ядро, то есть, нет внятного интерфейса для менеджед кода.
Re[25]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 10:40
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ля-ля-ля. Сначала выдай задачу так как это сделал я. Массивы, индексы, элементы- это ты решение конкретное предлагаешь. Не можешь — ничего не пиши в ответ.


Сумма векторов такая же задача как и FFT
Сферического "интенсивного заиспользования" java'ы за десяток сообщений ты так не показал — всё, уже не интересно.

EP>>ага, как попало:

EP>>
EP>>

EP>>А что это такое белое и пушистое прилетело в виде System.ObjectDisposedException?
I>Ты не видишь разницы между замыканием и внешним ресурсом ?

I>>>Отсюда ясно, что __обязательность__ какого то выбора это совсем не то же самое, что и свобода выбора. Вот если бы можно было передавать лямбды как попало, а вот тюнить надо было только для перформанса-расхода памяти, тогда другое дело.



EP>>И как то что где-то когда-то использовалось C, подтверждает твой тезис "быстрый код на С++ это точно так же работа против языка"?


I>Да все очевидно — хочешь быстродействия, надо реализовывать приседания с со стеком, вызывать низкоуровневые функции, писаные на ассемблере,


Как раз таки C++ позволяет сделать легковесные и удобные абстракции над машиной, даже на самых низких уровнях, поднимаясь потом всё выше и выше, например над интринсинками и это замечательно

I>и вообще писать код который не использует вообще ничего из С++.

I>Ты в курсе, что С это не С++ ?

"Остапа несло"

I>Потому не надо удивляться, что большинство работает с некачественным кодом.


А где я этому удивлялся? Твоя позиция какая:
1. На C++ можно писать очень быстрый код, используя богатые возможности языка. Но при этом язык нужно знать хорошо.
или
2. На C++ писать быстрый код нельзя вообще, нужно отказываться от всех возможностей и оставлять C.
Re[23]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 10:57
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>C++1998:

EP>>
EP>>void handler(Object &sender, TaskArgs &args)
EP>>{
EP>>    background(bind(download, args.url), args.cancellation),
EP>>    textBox.Text += _1;
EP>>}
EP>>

EP>>

I>И где здесь высокоуровневый подход?


define высокоуровневый. только тот что вшит в язык?

I>Ручное связывание через bind


Это вообще-то первый стандарт языка. Такой код можно писать очень давно, а не только с прошлого года.
Если не нравится bind (который уже стандарт), можно взять лямбду из нового стандарта:
background([=]{ return download(args.url); }, args.cancellation)



I>или _1 — это оно что ли ? Я надеюсь, это не глобальная переменная ?


Это placeholder для полиморфной лямбды — значения непосредственно через него не передаются, и да это глобальная константа

I>А как быть в случае, если в коде несколько await ? Я ведь и такой пример приводил.


Я не знаю где там этот пример — я отвечал на конкретное сообщение. Видимо у тебя там что-то типа:
    background(bind(download, args.url), args.cancellation),
    textBox.Text += _1,
    await([=]{ return download(args.url + "foo"); }),
    textBoxBar.Text += _1;

Re[24]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 14:44
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>И где здесь высокоуровневый подход?


EP>define высокоуровневый. только тот что вшит в язык?


Это значит качественные абстракции. то есть, ты пишешь собтсвенно логику задачи, а не используешь примитивы железа или операционной системы.
Если в твоих абстрациях куча указателей, ручной контроль памяти и ручное связывание — это низкоуровневый код, потому что ни одна пользовательская задача не формулируется в терминах массивов, ручного контроля, связывания, указателей и тд и тд.
Re[28]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.06.13 17:19
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>>А он там есть. Большое managed-приложение съест кучу памяти, оставив меньше места под кэш.

I>>Гипотетический случай. Утечки и ошибки с указателями в С++ дают куда больше реальных проблем.
C>На практике (которая есть критерий истины) утечки не являются серьёзной проблемой для С++ и легко обнаруживаются (valgrind со товарищи).

Надо полагать косяки и утечки оставляют специально для меня.
Re[27]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 19:26
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Сферического "интенсивного заиспользования" java'ы за десяток сообщений ты так не показал — всё, уже не интересно.

I>Джавый я как то не мог обещать показать, ибо на ней сроду не писал.

А это что
Автор: Ikemefula
Дата: 23.06.13
:

EP>>Как пример — эти аллокации вылезают по всему коду, <b><u>при простейших абстракциях</u></b> — просадка 16x на ровном месте.
I>Такой код в своём уме никто не пишет, кроме вчерашних плюсовиков, которые не знают как устроена память.
[...]
I>С такими проблемами как ты показал, не надо бороться против языка, наоборот, его надо интенсивно использовать.

?
Или в твоём понимании "интенсивно использовать язык" = "сменить его на C#"?
Re[25]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 23.06.13 19:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>И где здесь высокоуровневый подход?

EP>>define высокоуровневый. только тот что вшит в язык?
I>Это значит качественные абстракции. то есть, ты пишешь собтсвенно логику задачи, а не используешь примитивы железа или операционной системы.
I>Если в твоих абстрациях куча указателей, ручной контроль памяти и ручное связывание — это низкоуровневый код, потому что ни одна пользовательская задача не формулируется в терминах массивов, ручного контроля, связывания, указателей и тд и тд.

Здесь обсуждается конкретный код, из этого сообщения
Автор: Evgeny.Panasyuk
Дата: 23.06.13
.
Чем в этом случае твой C# 5.0 2012 код:
private async void handler(object sender, TaskArgs args)
{
    string result = await new Task(() => Download(args.Url), args.Cancellation);
    textBox.Text += result;
}

Более высокоуровневый, более "собственно логико-задачный", использует меньше примитивов железа и ос, ручного связывания, чем C++1998 код:
void handler(Object &sender, TaskArgs &args)
{
    background(bind(download, args.url), args.cancellation),
    textBox.Text += _1;
}

?
Re[25]: Что посоветуете как аналог С++
От: alex_public  
Дата: 23.06.13 21:11
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>А в случае ошибки выкинуть messagebox? Думаешь из non-ui thread это хорошая идея?

G>Да и откуда известно что ты там делать будешь? Просто status code сравнить или что-то сложное.

G>Как раз по умолчанию все маршалить UI поток для обработки — хорошая идея. Отключается одной функцией если ты пишешь либу.


Не о том речь. В данном примере можно было всё сделать в один асинхронный вызов, а не в два. И это существенно меняет ситуацию. А messagebox естественно в ui потоке, но после отработки всего асинхронного кода.

G>Если без проблем повторяется, то повтори. Только не скрывай важные детали.

G>Интереснее всего увидеть как осуществляется прерывание метода и передача данных. и как это все работает в реальном окружении (обработка нажатий конопок в интерфейсе).
G>Ибо твои boost.coroutines скорее всего ни один UI-Фреймворк не поддерживает.

Ну это будет что-то вроде такого:

void handler(object& sender, TaskArgs& args)
{
    coroutines_list.emplace_back([&](Coroutine::caller_type& c){
        HttpClient client;
        auto response=async(launch::async, [&](){return client.GetSync(args.Url, args.Cancellation);});
        while(response.wait_for(chrono::seconds(0))!=future_status::ready) c();
        response.get().EnsureSuccessStatusCode();
        auto result=async(launch::async, [&](){return response.get.Content.ReadAsStringSync();});
        while(result.wait_for(chrono::seconds(0))!=future_status::ready) c();
        textBox.Text+=result.get();
    });
}


Естественно тут выглядит пострашнее чем C# вариант, но я думаю что ни у кого нет сомнений, что в C++ (с его возможностями переопределения) это можно упаковать в такой синтаксический сахар, что будет ещё намного красивее чем в C#. Evgeny.Panasyuk уже отлично показал это. А я здесь показал именно все внутренности, как и заказывали.

Ну и да, чтобы это всё работало надо вставить в цикле обработки сообщений UI потока (обычно во всех GUI библиотеках заложен обработчик OnIdle — как раз подходящее место) пару строк:

for(auto& c: coroutines_list) c();
coroutines_list.remove_if([](const Coroutine& c){return !c;});


Но эта пара строк нужна одна на всё предложение — думаю не очень тяжёлая цена за реализацию этой вашей async/await модели.

Но как я уже говорил лично мне абсолютно не нравится подобная модель. Я предпочитая что-то вроде эрланговской. На мой взгляд это более логично структурирует код и одновременно избавляет от всех классических проблем синхронизации. Вот этот данный пример (только обрабатывая EnsureSuccessStatusCode не в ui потоке) я бы записал приблизительно так:

void Window::Handler(object& sender, TaskArgs& args)
{
    thread([&](){
        HttpClient client;
        auto response=client.GetSync(args.Url, args.Cancellation);
        response.EnsureSuccessStatusCode();
        PostMessage(NEW_DATA, response.Content.ReadAsStringSync());//PostMessage - функция-член Window
    }).detach();
}
void Window::OnNewData(const Data& data)
{
    textBox.Text+=data.get<string>();
}


Оно конечно чуть более многословно... Но зато и намного проще и расширяемо. Ну и кстати эффективнее с точки зрения производительности, хотя в таких задачах это обычно не важно.

G>Что ты имеешь ввиду под http-сервером? Штуку которая принимает http запрос и отдает ответ или штуку которая принимает http запрос и передает управление другому модулю?

G>Если второе, то таких нет по историческим причинам. Все промышленные серверы написаны давно, причем IIS например имеет часть в ядре, так что C# туда не пролезет.
G>Другое дело что это довольно малая часть всего конвеера обработки запросов, гораздо большая часть в том же IIS — asp.net, который 100% на .NET

Ой, вот только не надо отмазок. С учётом того, какую часть компьютерных ресурсов человечества потребляют http серверы и базы данных, думаю что даже 5% увеличения быстродействия при переписывание на C# хватило бы для мотивации переписывания ВСЕХ серверов и баз данных вообще. Однако мы этого не наблюдаем. А наблюдаем обратную картинку, что когда упираются в быстродействие, то идут переписывать на C++. Так что не на тут мифы плодить.
Re[25]: Что посоветуете как аналог С++
От: alex_public  
Дата: 23.06.13 21:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Проверка успешности вызова делается там, где нужно. Часто именно вызывающий код имеет все необходимое для такой обработки. Если делать как ты предложил, придется маршалить весь контекст, который очень часто привязан к потоку. Это необязательно UI, это может быть просто любой объект, который привязан к потоку. Почему именно так — да хрен его знает, спрашивай тех ребят, который писали многопоточность на православном С++ под вындоус тот же


Мы вообще то говорим не про какой-то абстрактный случай, а про вполне конкретный пример. И я абсолютно не вижу в данном случае никакой привязки к ui потоку у результата http вызова. Так что не надо отмазок — там код явно искусственно заточен под демонстрацию C# фишки. Но это заточка настолько кривая, что бросается в глаза.

I>ASP.NET в IIS на С#, аналогичные вещи есть и в джаве и тд и тд и тд. Весь сервер никогда не пишется полностью на менеджед, в основном потому что обчно это завязано на ядро, то есть, нет внятного интерфейса для менеджед кода.


Дааа? ) Ой, как интересно. И что там в реализации http сервера завязано на ядро? ) Хорошо бы на примере nginx... Он как раз с относительно небольшими исходниками, а при этом занимает второе место после апача среди активных сайтов и применяется обычно на самых нагруженных...
Re[25]: Что посоветуете как аналог С++
От: alex_public  
Дата: 23.06.13 21:56
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Это значит качественные абстракции. то есть, ты пишешь собтсвенно логику задачи, а не используешь примитивы железа или операционной системы.

I>Если в твоих абстрациях куча указателей, ручной контроль памяти и ручное связывание — это низкоуровневый код, потому что ни одна пользовательская задача не формулируется в терминах массивов, ручного контроля, связывания, указателей и тд и тд.

Это вообще не подходит ни под один язык общего назначения. Только под DSL. )))
Re[26]: Что посоветуете как аналог С++
От: alex_public  
Дата: 24.06.13 06:48
Оценка:
И ещё по поводу сайтов и серверов. Сайт rsdn же у нас кажется как раз на .net работает? ) Том самом высокуровневом, в котором не надо ничего руками отслеживать... Да и т.к. это программистский ресурс, то уж наверняка сайт написан не криворукими новичками... Интересно тогда, а почему заходя на форум, я периодически вижу такую страничку:

Внутренняя ошибка сервера

URL: /Forum/Main.aspx

Transaction (Process ID 74) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

support@rsdn.ru

Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 08:54
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Это значит качественные абстракции. то есть, ты пишешь собтсвенно логику задачи, а не используешь примитивы железа или операционной системы.

I>>Если в твоих абстрациях куча указателей, ручной контроль памяти и ручное связывание — это низкоуровневый код, потому что ни одна пользовательская задача не формулируется в терминах массивов, ручного контроля, связывания, указателей и тд и тд.

_>Это вообще не подходит ни под один язык общего назначения. Только под DSL. )))


"Уровневость" это вобщем не дискретная величина.
Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 09:01
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Мы вообще то говорим не про какой-то абстрактный случай, а про вполне конкретный пример. И я абсолютно не вижу в данном случае никакой привязки к ui потоку у результата http вызова. Так что не надо отмазок — там код явно искусственно заточен под демонстрацию C# фишки. Но это заточка настолько кривая, что бросается в глаза.


I>>ASP.NET в IIS на С#, аналогичные вещи есть и в джаве и тд и тд и тд. Весь сервер никогда не пишется полностью на менеджед, в основном потому что обчно это завязано на ядро, то есть, нет внятного интерфейса для менеджед кода.


_>Дааа? ) Ой, как интересно. И что там в реализации http сервера завязано на ядро?


Да, именно так. За подробностями обращайся к сиплюсплюсникам из микрософт

>Хорошо бы на примере nginx... Он как раз с относительно небольшими исходниками, а при этом занимает второе место после апача среди активных сайтов и применяется обычно на самых нагруженных...


Не в курсе что там с nginx
Re[30]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 09:03
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>>>>А он там есть. Большое managed-приложение съест кучу памяти, оставив меньше места под кэш.

I>>>>Гипотетический случай. Утечки и ошибки с указателями в С++ дают куда больше реальных проблем.
C>>>На практике (которая есть критерий истины) утечки не являются серьёзной проблемой для С++ и легко обнаруживаются (valgrind со товарищи).
I>>Надо полагать косяки и утечки оставляют специально для меня.
C>Ну не знаю, если пишешь код на С++ сам — то смотреть радиус кривизны своих рук. Если пишет команда, то применять ипатьевский метод.

Ну вот берем для примера виндовс, жрет памяти не в себя, по поводу и без повода. Надо полагать, в этом виноват дотнет который даже не запущен ?

И получается именно так как ты рассказал — "съест кучу памяти, оставив меньше места под кэш"
Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 09:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Ikemefula, Вы писали:


I>>>>И где здесь высокоуровневый подход?

EP>>>define высокоуровневый. только тот что вшит в язык?
I>>Это значит качественные абстракции. то есть, ты пишешь собтсвенно логику задачи, а не используешь примитивы железа или операционной системы.
I>>Если в твоих абстрациях куча указателей, ручной контроль памяти и ручное связывание — это низкоуровневый код, потому что ни одна пользовательская задача не формулируется в терминах массивов, ручного контроля, связывания, указателей и тд и тд.

EP>Здесь обсуждается конкретный код, из этого сообщения
Автор: Evgeny.Panasyuk
Дата: 23.06.13
.

EP>Чем в этом случае твой C# 5.0 2012 код:
EP>
EP>private async void handler(object sender, TaskArgs args)
EP>{
EP>    string result = await new Task(() => Download(args.Url), args.Cancellation);
EP>    textBox.Text += result;
EP>}
EP>

EP>Более высокоуровневый, более "собственно логико-задачный", использует меньше примитивов железа и ос, ручного связывания, чем C++1998 код:

Выделил. Нет ручного связывания, как ты видишь, bind нигде не вызывается, а параметры идут куда надо. Явно указано ожидание результата, при чем такой код совершенно не означает что будет какой то джополнительный поток. Всё.
А у тебя ручное связывание аргументов, результатов и явная команда запуска обработки в фоне.

При чем если минимально усложнить код, тебе придется заниматься ручно диспетчеризацией навроде "execute_on_ui_thread"
Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 10:09
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну это будет что-то вроде такого:


_>
_>void handler(object& sender, TaskArgs& args)
_>{
_>    coroutines_list.emplace_back([&](Coroutine::caller_type& c){
_>        HttpClient client;
_>        auto response=async(launch::async, [&](){return client.GetSync(args.Url, args.Cancellation);});
_>        while(response.wait_for(chrono::seconds(0))!=future_status::ready) c();
_>        response.get().EnsureSuccessStatusCode();
_>        auto result=async(launch::async, [&](){return response.get.Content.ReadAsStringSync();});
_>        while(result.wait_for(chrono::seconds(0))!=future_status::ready) c();
_>        textBox.Text+=result.get();
_>    });
_>}
_>




_>Естественно тут выглядит пострашнее чем C# вариант, но я думаю что ни у кого нет сомнений, что в C++ (с его возможностями переопределения) это можно упаковать в такой синтаксический сахар, что будет ещё намного красивее чем в C#


Красиво, это когда компилятор умеет связывание рахных сортов. В С# тоже можно все упаковать, притом используя именно поддержку компилятора.
Re[27]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 10:13
Оценка:
Здравствуйте, alex_public, Вы писали:

_>И ещё по поводу сайтов и серверов. Сайт rsdn же у нас кажется как раз на .net работает? )


Очень интересный вопрос. В вебе вечно не хватает ни перформанса, ни памяти. Очень большой и острый вопрос. Казалось бы — надо всё на С++ писать. Но вот шота прогресс пошел целиком и полностью в менеджед — дотнет, джава, питон, руби, пхп, перл и даже джаваскрипт.
Re[23]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 10:15
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Заметьте, этот код писался летом-осенью 2011 года, когда в C# ещё не было await.


В те времена была библиотека power threading, открой её и посмотри, насколько все просто.
Re[26]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 10:20
Оценка:
Здравствуйте, alex_public, Вы писали:


_>
_>void Window::Handler(object& sender, TaskArgs& args)
_>{
_>    thread([&](){
_>        HttpClient client;
_>        auto response=client.GetSync(args.Url, args.Cancellation);
_>        response.EnsureSuccessStatusCode();
_>        PostMessage(NEW_DATA, response.Content.ReadAsStringSync());//PostMessage - функция-член Window
_>    }).detach();
_>}
_>void Window::OnNewData(const Data& data)
_>{
_>    textBox.Text+=data.get<string>();
_>}
_>


_>Оно конечно чуть более многословно... Но зато и намного проще и расширяемо. Ну и кстати эффективнее с точки зрения производительности, хотя в таких задачах это обычно не важно.


Не совсем понятно, где то расширяемость, если для каждого случая надо писать какой то уникальный код
Re[24]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 24.06.13 10:40
Оценка:
Здравствуйте, Ikemefula, Вы писали:

M>>Заметьте, этот код писался летом-осенью 2011 года, когда в C# ещё не было await.


I>В те времена была библиотека power threading, открой её и посмотри, насколько все просто.


Ну посмотрел. Увидел пул потоков. Покажи как там просто организовать асинхронную работу в одном потоке.
https://github.com/Wintellect/PowerThreading/blob/master/PowerThreading-Desktop/Wintellect.Threading/ReaderWriterGate/ReaderWriterGate.cs
 /// <summary>Initiates an asynchronous write operation.</summary>
      /// <param name="callback">The method that will perform the write operation.</param>
      /// <param name="state">A value passed to the callback method.</param>
      /// <param name="asyncCallback">An optional asynchronous callback, to be called when the operation completes.</param>
      /// <param name="asyncState">A user-provided object that distinguishes this particular asynchronous operation request from other requests.</param>
      /// <returns>A System.IAsyncResult that represents the asynchronous operation, which could still be pending.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
      public IAsyncResult BeginWrite(ReaderWriterGateCallback callback, Object state,
        AsyncCallback asyncCallback, Object asyncState) {
         AsyncResult<Object> ar = new AsyncResult<Object>(asyncCallback, asyncState);
         ReaderWriterGateReleaser releaser = new ReaderWriterGateReleaser(callback, this, false, state, ar);
         m_syncLock.Enter(true);
         switch (m_state) {
            case ReaderWriterGateStates.Free: // If Free "RFW -> OBW, invoke, return
            case ReaderWriterGateStates.ReservedForWriter:
               m_state = ReaderWriterGateStates.OwnedByWriter;
               ThreadPool.QueueUserWorkItem(releaser.Invoke);
               break;

            case ReaderWriterGateStates.OwnedByReaders: // If OBR | OBRAWP -> OBRAWP, queue, return
            case ReaderWriterGateStates.OwnedByReadersAndWriterPending:
               m_state = ReaderWriterGateStates.OwnedByReadersAndWriterPending;
               m_qWriteRequests.Enqueue(releaser);
               break;

            case ReaderWriterGateStates.OwnedByWriter: // If OBW, queue, return
               m_qWriteRequests.Enqueue(releaser);
               break;
         }
         m_syncLock.Leave();
         return ar;
      }
Главное гармония ...
Re[25]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 10:58
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, Ikemefula, Вы писали:


M>>>Заметьте, этот код писался летом-осенью 2011 года, когда в C# ещё не было await.


I>>В те времена была библиотека power threading, открой её и посмотри, насколько все просто.


M>Ну посмотрел. Увидел пул потоков. Покажи как там просто организовать асинхронную работу в одном потоке.

M>https://github.com/Wintellect/PowerThreading/blob/master/PowerThreading-Desktop/Wintellect.Threading/ReaderWriterGate/ReaderWriterGate.cs

А при чем здесь ReadWriterGate ?
Re[26]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 24.06.13 11:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

M>>>>Заметьте, этот код писался летом-осенью 2011 года, когда в C# ещё не было await.


I>>>В те времена была библиотека power threading, открой её и посмотри, насколько все просто.


M>>Ну посмотрел. Увидел пул потоков. Покажи как там просто организовать асинхронную работу в одном потоке.

M>>https://github.com/Wintellect/PowerThreading/blob/master/PowerThreading-Desktop/Wintellect.Threading/ReaderWriterGate/ReaderWriterGate.cs

I>А при чем здесь ReadWriterGate ?


Мне показалось, что именно он предназначен для асинхронного чтения/записи. Нормальной документации и примеров я за 5 минут не нашёл. Ну, короче, ты же с этой библиотекой лучше знаком — покажи примеры, код.
Главное гармония ...
Re[28]: Что посоветуете как аналог С++
От: Константин Б. Россия  
Дата: 24.06.13 11:42
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>На практике (которая есть критерий истины) утечки не являются серьёзной проблемой для С++ и легко обнаруживаются (valgrind со товарищи).


Один вон тоже в дебиане openssl валгриндил... Знаешь что с ним стало?
Re[29]: Что посоветуете как аналог С++
От: Cyberax Марс  
Дата: 24.06.13 11:49
Оценка:
Здравствуйте, Константин Б., Вы писали:

C>>На практике (которая есть критерий истины) утечки не являются серьёзной проблемой для С++ и легко обнаруживаются (valgrind со товарищи).

КБ>Один вон тоже в дебиане openssl валгриндил... Знаешь что с ним стало?
Пока что ничего. И вообще, 65536 ключей должно быть достаточно для всех!

Это я к тому, что shit happens, но не так уж часто.
Sapienti sat!
Re[27]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 12:35
Оценка:
Здравствуйте, Mazay, Вы писали:

I>>А при чем здесь ReadWriterGate ?


M>Мне показалось, что именно он предназначен для асинхронного чтения/записи. Нормальной документации и примеров я за 5 минут не нашёл. Ну, короче, ты же с этой библиотекой лучше знаком — покажи примеры, код.


Я на ней пару вещей всего сделал, вместо await был yield и собтвенно всё.
Re[28]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 24.06.13 12:57
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Я на ней пару вещей всего сделал, вместо await был yield и собтвенно всё.


А-а-а. Понятно. yield можно использовать вместо корутин для прерывания и возобновления функций. А дальше всё тоже самое: асинхронный вызов с хэндлером, который вернёт управление в корутину (через обращение к энумератору), и прерывание исполнения функции сразу после этого вызова (yield return).
Главное гармония ...
Re[29]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.06.13 13:22
Оценка:
Здравствуйте, Mazay, Вы писали:

I>>Я на ней пару вещей всего сделал, вместо await был yield и собтвенно всё.


M>А-а-а. Понятно. yield можно использовать вместо корутин для прерывания и возобновления функций. А дальше всё тоже самое: асинхронный вызов с хэндлером, который вернёт управление в корутину (через обращение к энумератору), и прерывание исполнения функции сразу после этого вызова (yield return).


Да, примерно так. Если нужно в одном потоке что бы работало, то по идее для этого нужен шедулер специальный. Не в курсе, правда, есть ли в PowerThreading такой шедулер.
Re[27]: Что посоветуете как аналог С++
От: alex_public  
Дата: 24.06.13 17:53
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Да, именно так. За подробностями обращайся к сиплюсплюсникам из микрософт


Т.е. подтверждения своим словам не будет? ) Так и запишем, что болтовня просто...

I>Не в курсе что там с nginx


С nginx можно в любой момент глянуть все исходники и они даже не дико объёмные... Так что легко подтвердить или опровергнуть информацию о неком использование ядра... )))
Re[28]: Что посоветуете как аналог С++
От: alex_public  
Дата: 24.06.13 20:48
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Очень интересный вопрос. В вебе вечно не хватает ни перформанса, ни памяти. Очень большой и острый вопрос. Казалось бы — надо всё на С++ писать. Но вот шота прогресс пошел целиком и полностью в менеджед — дотнет, джава, питон, руби, пхп, перл и даже джаваскрипт.


Всё правильно, сейчас в инете большую часть веба занимаeт такой жуткий язык как php. Только вот надо понимать, что это скриптовой язык, который работает просто склейкой различных модулей. А для того что бы оценить на чём реально работает веб, надо посмотреть на чём написан интерпретатор и библиотеки php!

А то с такой логикой может получиться что современные мощные игры написаны на Lua или вообще Oracle Database написана на SQL.
Re[27]: Что посоветуете как аналог С++
От: alex_public  
Дата: 24.06.13 20:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Не совсем понятно, где то расширяемость, если для каждого случая надо писать какой то уникальный код


Чёткое разделение кода и данных разных потоков в разных функциях. При такой схеме не надо продумывать что там куда может маршалиться или не может — всё сразу чётко видно.
Re[28]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 07:11
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Да, именно так. За подробностями обращайся к сиплюсплюсникам из микрософт


_>Т.е. подтверждения своим словам не будет? ) Так и запишем, что болтовня просто...


Запусти IIS в юзермоде, да так, что бы всё шоколадно было, приходи и расскажи как я здесь всё наврал.

I>>Не в курсе что там с nginx


_>С nginx можно в любой момент глянуть все исходники и они даже не дико объёмные... Так что легко подтвердить или опровергнуть информацию о неком использование ядра... )))


В винде любая такая софтина может нормально работать только как сервис. nginx на винде пока что ничем не блещет, потому что умеет только синхронные сокеты. И кстати говоря в планах асунуть его в сервис. Интересно, зачем, если и так всё шоколадно ?
Re[29]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 07:13
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Всё правильно, сейчас в инете большую часть веба занимаeт такой жуткий язык как php. Только вот надо понимать, что это скриптовой язык, который работает просто склейкой различных модулей. А для того что бы оценить на чём реально работает веб, надо посмотреть на чём написан интерпретатор и библиотеки php!


бОльшая часть мелочевки пишется на php, который почему то общепризнанно тормозной. если тормозной скрипт, то странно, почему это живет в вебе, ибо здесь казалось бы место для С++. А если тормозят модули, снова странно — мудули на С++ и тормозят
Re[28]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 07:24
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Не совсем понятно, где то расширяемость, если для каждого случая надо писать какой то уникальный код


_>Чёткое разделение кода и данных разных потоков в разных функциях. При такой схеме не надо продумывать что там куда может маршалиться или не может — всё сразу чётко видно.


У тебя всего лишь ручное разделение кода и данных. Проблемы с расширением возникают как раз из за ручного разделения, а не из за маршалинга. Странно что тебе пришла в голову мысль, что может быть необходимость маршалить чего то в рамках одного процесса
Re[29]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 08:36
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>В винде любая такая софтина может нормально работать только как сервис. nginx на винде пока что ничем не блещет, потому что умеет только синхронные сокеты. И кстати говоря в планах асунуть его в сервис. Интересно, зачем, если и так всё шоколадно ?


А причём тут вообще винда и IIS? Вообще то подавляющее большинство веба живёт под разновидностями unix'a. Так что не надо кривых отмазок.

Ну и даже если говорить про винду (например в качестве машины разрабочика), то и nginx и apache тоже нормально работают без всяких сервисов.
Re[30]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 08:41
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>бОльшая часть мелочевки пишется на php, который почему то общепризнанно тормозной. если тормозной скрипт, то странно, почему это живет в вебе, ибо здесь казалось бы место для С++. А если тормозят модули, снова странно — мудули на С++ и тормозят


Тормозной если на нём считать — это я сам тестировал. Но в вебе мало считают, так что там производительность обычно вообще в базы данных упирается.

Но при определённых нагрузках уже и это перебор — смотри Facebook. )))
Re[17]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 25.06.13 09:28
Оценка:
Здравствуйте, IT, Вы писали:

IT>Это не тот ли самый случай из-за чего старый VB тормозил на операциях с памяться раз так в 200?


Нет, не тот. VB тормозил из-за передачи строк и Safe Array по значению при маршаллинге.
Re[30]: Что посоветуете как аналог С++
От: Sinix  
Дата: 25.06.13 10:17
Оценка:
Здравствуйте, alex_public, Вы писали:

_>А легко. Например мы можем сделать в одном обработчике несколько отдельных асинхронных вызовов. Или вообще в цикле погонять этот блок... Типа такого:


void handler(object& sender, TaskArgs& args)
{
    for(int i=0; i<5; i++){
        BEGIN_ASYNC
        HttpClient client;
        auto response=await_async(client.Get(args.Url+sufix[i], args.Cancellation));
        response.EnsureSuccessStatusCode();
        textBox[i].Text+=await_async(response.Content.ReadAsString());
        END_ASYNC
    }
}


_>Понятно что похожий код можно и в C# намутить, но это надо уже вставлять асинхронные лямбды и вызывать их... В общем код будет уже заметно пострашнее чем C++ выглядеть.


Да ладно

Первое что пришло в голову:
string[] urls = ...

var tasks = urls.ToList(url => httpClient.GetStringAsync(url));

while (tasks.Count > 0)
{
   var firstCompleted = await Task.WhenAny(tasks);
   tasks.Remove(firstCompleted);
   result.Text += firstCompleted.Result;
}


Хотя на rx/task.ContinueWith код поизящней будет.
Re[31]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 10:27
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Да ладно


S>Первое что пришло в голову:

S>
S>string[] urls = ...

S>var tasks = urls.ToList(url => httpClient.GetStringAsync(url));

S>while (tasks.Count > 0)
S>{
S>   var firstCompleted = await Task.WhenAny(tasks);
S>   tasks.Remove(firstCompleted);
S>   result.Text += firstCompleted.Result;
S>}
S>


S>Хотя на rx/task.ContinueWith код поизящней будет.


1. Там по два асинхронных вызова в каждом блоке с кодом в ui потоке между ними.
2. textbox результирующий свой для каждого блока.
Re[30]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 10:50
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>В винде любая такая софтина может нормально работать только как сервис. nginx на винде пока что ничем не блещет, потому что умеет только синхронные сокеты. И кстати говоря в планах асунуть его в сервис. Интересно, зачем, если и так всё шоколадно ?


_>А причём тут вообще винда и IIS? Вообще то подавляющее большинство веба живёт под разновидностями unix'a. Так что не надо кривых отмазок.

_>Ну и даже если говорить про винду (например в качестве машины разрабочика), то и nginx и apache тоже нормально работают без всяких сервисов.

Как бэ nginx на винде ничем не блещет , даже io cp не умеет.
Re[31]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 10:51
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Тормозной если на нём считать — это я сам тестировал. Но в вебе мало считают, так что там производительность обычно вообще в базы данных упирается.


То есть, ты хочешь сказать, что производительность не всегда упирается в процессор ?
Re[30]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 10:54
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Да, да, согласен, весь этот await/async стиль — это отстой. )))


У тебя только эмуляции, что и есть отстой

_>А легко. Например мы можем сделать в одном обработчике несколько отдельных асинхронных вызовов. Или вообще в цикле погонять этот блок... Типа такого:


_>
_>void handler(object& sender, TaskArgs& args)
_>{
_>    for(int i=0; i<5; i++){
_>        BEGIN_ASYNC
_>        HttpClient client;
_>        auto response=await_async(client.Get(args.Url+sufix[i], args.Cancellation));
_>        response.EnsureSuccessStatusCode();
_>        textBox[i].Text+=await_async(response.Content.ReadAsString());
_>        END_ASYNC
_>    }
_>}
_>


_>Понятно что похожий код можно и в C# намутить, но это надо уже вставлять асинхронные лямбды и вызывать их... В общем код будет уже заметно пострашнее чем C++ выглядеть.


И давно в C# запретили вставлять циклы в код ? Для твоего случая вообще ничего мутить не надо, работает искаропки Пробуй еще раз.

_>P.S. Но вообще мне нравится куда уже ушла наша дискуссия. Я вижу попытки доказать мне что реализация await/asynx в C# не хуже чем в C++. Это правильный подход... А то начали то с диких лозунгов что в C++ это вообще невозможно.


Ты пока что ничего не показал, если не считать "я бы всё равно не стал писать так".
Re[30]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 11:03
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>У тебя всего лишь ручное разделение кода и данных. Проблемы с расширением возникают как раз из за ручного разделения, а не из за маршалинга. Странно что тебе пришла в голову мысль, что может быть необходимость маршалить чего то в рамках одного процесса


_>Забавно. ))) Похоже у нас тут у кое-кого раздвоение личности... Например здесь http://www.rsdn.ru/forum/philosophy/5208835
Автор: Ikemefula
Дата: 23.06.13
некий Ikemefula как раз рассказывает нам об ужасах маршалинга. )))


В обоих случаях сказано примерно одно и то же

"Если делать как ты предложил, придется маршалить весь контекст" == маршалинг, именно в твоей реализации
"не надо продумывать что там куда может маршалиться или не може" == маршалинг, именно в твоей реализации

То есть, в обоих случаях я хочу сказать, что маршалинг есть только благодаря твоему подходу, а раз так, то это отстой, потому что процесс у нас один и тот же. Благодаря поддержке компилера нет необходимости маршалить, нужно всего то подождать возврата управления.
Re[32]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 11:15
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>То есть, ты хочешь сказать, что производительность не всегда упирается в процессор ?


По разному бывает, в зависимости от задачи. Но если например переписать mysql на php то тогда точно без шансов будет упираться только в процессор.
Re[32]: Что посоветуете как аналог С++
От: Sinix  
Дата: 25.06.13 11:18
Оценка:
Здравствуйте, alex_public, Вы писали:

_>1. Там по два асинхронных вызова в каждом блоке с кодом в ui потоке между ними.

_>2. textbox результирующий свой для каждого блока.

А, тогда .ContinueWith()/Rx. Async в том виде как есть заточен под описание последовательности инструкций в continuation-passing-стиле. Сахара для распараллеливания сейчас практически нет.
Re[31]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 11:20
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>У тебя только эмуляции, что и есть отстой


Покажи разницу с C#.

I>И давно в C# запретили вставлять циклы в код ? Для твоего случая вообще ничего мутить не надо, работает искаропки Пробуй еще раз.


Покажи код. Если просто вставить в тот C# код цикл, больше ничего не меняя, то получится последовательный, а не параллельный запуск скачиваний.

I>Ты пока что ничего не показал, если не считать "я бы всё равно не стал писать так".


Я как раз показал все примеры кода, а от тебя пока вижу только болтовню и ни одной строчки кода. То что мне не нравится подобный стиль (что в C#, что в C++) — это только мой личный вкус. И он не мешает мне продемонстрировать реализацию этой схемы в C++, даже если я сам и не собираюсь её применять.
Re[32]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 11:24
Оценка:
Здравствуйте, alex_public, Вы писали:

S>>Хотя на rx/task.ContinueWith код поизящней будет.


_>1. Там по два асинхронных вызова в каждом блоке с кодом в ui потоке между ними.

_>2. textbox результирующий свой для каждого блока.

Это ничего не меняет, у тебя просто запускается 5 паралельных асинхронных тасков. Все, больше у тебя ничего нет, то есть, вообще. Куда и как ты складываешь результаты, сколько асинхронных вызовов, без разницы — все равно будет 5 параллельных асинхронных тасков.

Вот вещь поинтереснее твоего барахла:

var tasks = urls.Select(x => GetContentByUrlAsync(x)).AsTask().ToList();

while (tasks.Count > 0)
{
    var first = await Task.WhenAny(tasks);
    var result = await first;                    
    tasks.Remove(first);
    resultContainer += result; 
}
Re[33]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 11:25
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>То есть, ты хочешь сказать, что производительность не всегда упирается в процессор ?


_>По разному бывает, в зависимости от задачи. Но если например переписать mysql на php то тогда точно без шансов будет упираться только в процессор.


Как речь про дотнет, так все тормозное и только С++ может победить. А как про пхп — "По разному бывает, в зависимости от задачи"
Re[33]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 11:30
Оценка:
Здравствуйте, Sinix, Вы писали:

S>А, тогда .ContinueWith()/Rx. Async в том виде как есть заточен под описание последовательности инструкций в continuation-passing-стиле. Сахара для распараллеливания сейчас практически нет.


Вот весь сахар для распараллеливания

ProcessAsync();
ProcessAsync();
ProcessAsync();
ProcessAsync();


Вуаля — 4 таска стартовали параллельно
Re[32]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 11:31
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>У тебя только эмуляции, что и есть отстой


_>Покажи разницу с C#.


В прошлый раз я все что нужно показал, в твоем новом примере только строчек больше.

_>Покажи код. Если просто вставить в тот C# код цикл, больше ничего не меняя, то получится последовательный, а не параллельный запуск скачиваний.


http://www.rsdn.ru/forum/philosophy/5211036.1
Автор: Ikemefula
Дата: 25.06.13


I>>Ты пока что ничего не показал, если не считать "я бы всё равно не стал писать так".


_>Я как раз показал все примеры кода, а от тебя пока вижу только болтовню и ни одной строчки кода.


Ля-ля-ля

> То что мне не нравится подобный стиль (что в C#, что в C++) — это только мой личный вкус. И он не мешает мне продемонстрировать реализацию этой схемы в C++, даже если я сам и не собираюсь её применять.


Ты лучше покажи ту схему, которую собираешься применять.
Re[34]: Что посоветуете как аналог С++
От: Sinix  
Дата: 25.06.13 11:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

ProcessAsync();
ProcessAsync();
ProcessAsync();
ProcessAsync();


I>Вуаля — 4 таска стартовали параллельно


Ещё неплохо бы дождаться завершения и скинуть результаты каждого из методов в свою переменную по мере завершения, как в примере с BEGIN_ASYNC и тогда сравнивать читаемость кода. Напомню, alex_public просил без явных лямбд/отдельных методов.
Re[33]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 12:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Это ничего не меняет, у тебя просто запускается 5 паралельных асинхронных тасков. Все, больше у тебя ничего нет, то есть, вообще. Куда и как ты складываешь результаты, сколько асинхронных вызовов, без разницы — все равно будет 5 параллельных асинхронных тасков.


Ну да, так и есть. Только вот ты почему-то упорно не хочешь показать код...

I>Вот вещь поинтереснее твоего барахла:


I>
I>var tasks = urls.Select(x => GetContentByUrlAsync(x)).AsTask().ToList();

I>while (tasks.Count > 0)
I>{
I>    var first = await Task.WhenAny(tasks);
I>    var result = await first;                    
I>    tasks.Remove(first);
I>    resultContainer += result; 
I>}
I>



И что тут интересного? ) Это мы типа так длинно записали следующий код?
for(auto url: urls)
BEGIN_ASYNC
    resultContainer+=await_async(GetContentByUrl(url));
END_ASYNC


Забавно, забавно....
Re[27]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 12:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Здесь обсуждается конкретный код, из этого сообщения
Автор: Evgeny.Panasyuk
Дата: 23.06.13
.

EP>>Чем в этом случае твой C# 5.0 2012 код:
EP>>
EP>>private async void handler(object sender, TaskArgs args)
EP>>{
EP>>    string result = await new Task(() => Download(args.Url), args.Cancellation);
EP>>    textBox.Text += result;
EP>>}
EP>>

EP>>Более высокоуровневый, более "собственно логико-задачный", использует меньше примитивов железа и ос, ручного связывания, чем C++1998 код:
I>Выделил. Нет ручного связывания, как ты видишь, bind нигде не вызывается, а параметры идут куда надо.

Если не брать C++11 то можно так:
background(download(args.url), args.cancellation),


I>Явно указано ожидание результата, при чем такой код совершенно не означает что будет какой то джополнительный поток. Всё.


Конечно не означает, ибо это вообще не код, так как не компилируется
А поток у тебя таки будет (либо постоянное ожидание), ибо твой download не асинхронный

I>А у тебя ручное связывание аргументов, результатов и явная команда запуска обработки в фоне.


У тебя task и запускается вручную, и ожидается

I>При чем если минимально усложнить код, тебе придется заниматься ручно диспетчеризацией навроде "execute_on_ui_thread"


Так у тебя тоже ручная диспетчеризация в виде await/task/async
Re[34]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 12:11
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Это ничего не меняет, у тебя просто запускается 5 паралельных асинхронных тасков. Все, больше у тебя ничего нет, то есть, вообще. Куда и как ты складываешь результаты, сколько асинхронных вызовов, без разницы — все равно будет 5 параллельных асинхронных тасков.


_>Ну да, так и есть. Только вот ты почему-то упорно не хочешь показать код...


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

I>>Вот вещь поинтереснее твоего барахла:


I>>
I>>var tasks = urls.Select(x => GetContentByUrlAsync(x)).AsTask().ToList();

I>>while (tasks.Count > 0)
I>>{
I>>    var first = await Task.WhenAny(tasks);
I>>    var result = await first;                    
I>>    tasks.Remove(first);
I>>    resultContainer += result; 
I>>}
I>>


_>И что тут интересного? ) Это мы типа так длинно записали следующий код?

_>
_>for(auto url: urls)
_>BEGIN_ASYNC
_>    resultContainer+=await_async(GetContentByUrl(url));
_>END_ASYNC
_>


:faceplam:

_>Забавно, забавно....


Забавно что ты не заметил, что код делает ровно то же, что и твой предыдущий пример — запускает паралельные таски и обрабатывает результаты.
Re[35]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 12:22
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Ещё неплохо бы дождаться завершения и скинуть результаты каждого из методов в свою переменную по мере завершения, как в примере с BEGIN_ASYNC и тогда сравнивать читаемость кода. Напомню, alex_public просил без явных лямбд/отдельных методов.


Макры использовать можно, а лямбды нельзя ? :faceplam:
Re[29]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 12:26
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>>>Сферического "интенсивного заиспользования" java'ы за десяток сообщений ты так не показал — всё, уже не интересно.

I>>>Джавый я как то не мог обещать показать, ибо на ней сроду не писал.

EP>>А это что
Автор: Ikemefula
Дата: 23.06.13
:

EP>>

EP>>>>Как пример — эти аллокации вылезают по всему коду, <b><u>при простейших абстракциях</u></b> — просадка 16x на ровном месте.
I>>>Такой код в своём уме никто не пишет, кроме вчерашних плюсовиков, которые не знают как устроена память.
EP>>[...]
I>>>С такими проблемами как ты показал, не надо бороться против языка, наоборот, его надо интенсивно использовать.

EP>>?
EP>>Или в твоём понимании "интенсивно использовать язык" = "сменить его на C#"?
I>В моём понимании здесь нет ни слова про джаву

То есть код ты посмотрел, что-то ляпнул, а java'у не увидел?

I>Код который ты привел, пишут именно вчерашние сиплюсники, силу многолетней привычки "зачем думать и так всё быстро".


Код показывает к чему приводят минимальные абстракции в java
И если нужно писать быстрый код, от этих абстракций придётся отказаться.

I>Покажи нормальную задачу, в терминах юзера, без использования слов "массив, элемент, индекс".


Я уже показывал — найти сумму векторов

I>Выяснил, что дотнет может справляться с вычислениями быстрее, чем нативная либа с отрисовкой результатов.


"Выяснил, что дотнет складывает два числа быстрее, чем нативная либа решает СЛАУ", что за бред?

I>Итого, пока что у нас расклад такой — я привел примеры, где С++ используют без плюсов или даже пишут "против языка", а вот от тебя пока что ничего не было.


То есть Eigen и Facebook ты за примеры не считаешь?

I>P.S. Если всё что ты хотел сказать, это разница во времени при проходе по массиву между C++ и С#, то мог бы и не напрягаться, я сам про это писал на этом форуме, при больше, чем всех твоих сообщений вместе взятых.


Мой поинт в том, что за многие абстракции в управляемых средах нужно платить производительностью. Массив структур на java — это простейший конкретный пример
Но почему-то за 20 страниц флейма до тебя это так и не дошло
Re[34]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 12:28
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>В прошлый раз я все что нужно показал, в твоем новом примере только строчек больше.


_>Ты нигде ничего не показал, а только уворачиваешься от ответа всеми возможными способами. И меня это уже если честно утомило. Или ответь один раз точно на конкретные вопросы или будем считать что ты слил по всем пунктам.


_>1. Покажи чем принципиально этот http://www.rsdn.ru/forum/philosophy/5208679
Автор: gandjustas
Дата: 23.06.13
код отличается от этого http://www.rsdn.ru/forum/philosophy/5210481
Автор: alex_public
Дата: 25.06.13
. Это же ведь ты утверждал они чем-то принципиально отличаются (как там, эмуляция кажется?)...


Меньше мусора, в т.ч. отсутствие макров, да-да.

_>2. Покажи точный аналог на C# этого http://www.rsdn.ru/forum/philosophy/5210899
Автор: alex_public
Дата: 25.06.13
кода. И поясни почему он на твой взгляд выглядит не хуже C++ варианта (ты же это утверждал, не так ли?).


http://rsdn.ru/forum/philosophy/5211111.1
Автор: Ikemefula
Дата: 25.06.13


На мой взгляд это лучше благодаря поддержке асинхронщины компилером, ибо в С++ есть только поддержка 1 либами 2 макрами.
Re[23]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 12:31
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, Evgeny.Panasyuk, Вы писали:


M>Я в своё время писал вот такую штуку:

[...]
M>Несетевая логика поскипана, остальной сетевой код коннектится к сокс-серверу и через него шлёт HTTP запрос на другой сервер.
M>Функции ***_resume выполняются асинхронно. То есть после их вызова корутина спит, а после получения результата возобновляется с того же места. Связь с остальными корутинами — через поля структуры fd. Прервать соединение тоже понятно как.
M>Функции ***_resume есть мною писанные обёртки над соответствующими функциями asio. Они все однотипные, покажу на примере connect_resume:

Ну так stackfull coroutines рулят
Автор: Evgeny.Panasyuk
Дата: 21.06.13
.

M>Заметьте, этот код писался летом-осенью 2011 года, когда в C# ещё не было await.


await это stackless coroutine, такой инкапсуляции как у stackfull им не добиться.
Re[28]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 12:39
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Если не брать C++11 то можно так:

EP>
EP>background(download(args.url), args.cancellation),
EP>


И что ? Чем это лучше
var r = await download(args.url, args.cancellation);

Тем, что на С++ ?

I>>Явно указано ожидание результата, при чем такой код совершенно не означает что будет какой то джополнительный поток. Всё.


EP>Конечно не означает, ибо это вообще не код, так как не компилируется

EP>А поток у тебя таки будет (либо постоянное ожидание), ибо твой download не асинхронный

Это несущественные детали.

I>>А у тебя ручное связывание аргументов, результатов и явная команда запуска обработки в фоне.


EP>У тебя task и запускается вручную, и ожидается


Таск != поток

I>>При чем если минимально усложнить код, тебе придется заниматься ручно диспетчеризацией навроде "execute_on_ui_thread"


EP>Так у тебя тоже ручная диспетчеризация в виде await/task/async


Я нигде не указываю в каком потоке чего выполнить, я всего то указываю ожидание результатов, по потокам раскидает компилятор, а ты это делаешь руками.
Re[35]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 12:47
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Ох, ну неужели прямые ответы. Я уж собрался писать что типа дискуссия закончена. )))

_>>1. Покажи чем принципиально этот http://www.rsdn.ru/forum/philosophy/5208679
Автор: gandjustas
Дата: 23.06.13
код отличается от этого http://www.rsdn.ru/forum/philosophy/5210481
Автор: alex_public
Дата: 25.06.13
. Это же ведь ты утверждал они чем-то принципиально отличаются (как там, эмуляция кажется?)...


I>Меньше мусора, в т.ч. отсутствие макров, да-да.


ОК, принимается. Ничего возразить не могу. Действительно в C++ коде на один лишний значок больше. Но хотелось бы зафиксировать что это единственный его недостаток в данном сравнение.

_>>2. Покажи точный аналог на C# этого http://www.rsdn.ru/forum/philosophy/5210899
Автор: alex_public
Дата: 25.06.13
кода. И поясни почему он на твой взгляд выглядит не хуже C++ варианта (ты же это утверждал, не так ли?).


I>http://rsdn.ru/forum/philosophy/5211111.1
Автор: Ikemefula
Дата: 25.06.13

I>На мой взгляд это лучше благодаря поддержке асинхронщины компилером, ибо в С++ есть только поддержка 1 либами 2 макрами.

А вот тут всё наоборот.

1. Этот твой код совершенно не является аналогом этого http://www.rsdn.ru/forum/philosophy/5210899
Автор: alex_public
Дата: 25.06.13
C++ кода, а является аналогом его сильного упрощение (http://rsdn.ru/forum/philosophy/5211111
Автор: Ikemefula
Дата: 25.06.13
внизу). Аналог же полноценного кода ты так и ни разу не показал.
2. Даже если брать это твоё упрощение и его C++ аналог, то видно что C# вариант в несколько раз объёмнее и сложнее. И кстати замечу что такая простота C++ варианта как раз из-за возможности (как ты там сказал?) "в конце метода находится код который выполнится в начале".
Re[21]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 12:54
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>На stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде, ибо такие сопроцедуры сразу возвращают управление в клиентский код — а это значит что либо данные ещё не получены, либо никакой асинхронности, так как только один поток.


"ибо такие сопроцедуры сразу возвращают управление в клиентский код" это как, если сопроцедура не сразу возвращает управление в клиентский код, то получается отсутствие асинхрощины ?
Re[36]: Что посоветуете как аналог С++
От: Sinix  
Дата: 25.06.13 12:59
Оценка:
Здравствуйте, Ikemefula, Вы писали:

S>>Ещё неплохо бы дождаться завершения и скинуть результаты каждого из методов в свою переменную по мере завершения, как в примере с BEGIN_ASYNC и тогда сравнивать читаемость кода. Напомню, alex_public просил без явных лямбд/отдельных методов.


I>Макры использовать можно, а лямбды нельзя ? :faceplam:

А то, всё честно
Re[37]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 13:02
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Макры использовать можно, а лямбды нельзя ? :faceplam:


_>Почему нельзя? ) Можно конечно что угодно. Собственно я и сказал что без лямбд не обойтись. А Sinix просто попытался попробовать как-нибудь без них...


Синикс взял да и повелся, ты то сам и лямбды и макры использовал
Re[31]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 13:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Код который ты привел, пишут именно вчерашние сиплюсники, силу многолетней привычки "зачем думать и так всё быстро".

EP>>Код показывает к чему приводят минимальные абстракции в java
I>Ровно к тому же, что и в Boost

Boost это набор библиотек, ты что сказать-то хотел?

EP>>И если нужно писать быстрый код, от этих абстракций придётся отказаться.

I>Правильно, смотри сишный nginx или сфинкс.

Ещё раз, то что где-то быстрый код написан не на C++ не означает, что при написании аналогичного кода на C++ придётся отказываться от абстракций. Логично же

I>>>Покажи нормальную задачу, в терминах юзера, без использования слов "массив, элемент, индекс".

EP>>Я уже показывал — найти сумму векторов
I>Никаких требований и ограничений стало быть нет ? Ну тогда идельный результат "нашел!"

Ну тогда и для:

I>Смотри, как все просто — реализовать оконное FFT.

"Реализовал!"
детский сад

I>>>Выяснил, что дотнет может справляться с вычислениями быстрее, чем нативная либа с отрисовкой результатов.

EP>>"Выяснил, что дотнет складывает два числа быстрее, чем нативная либа решает СЛАУ", что за бред?
I>Похоже, если в контексте дотнета ты слышишь вычисления, то тебе мерещится "складыват два числа". Это скорее к доктору, а не на форум.

Я тебе показал, что из твоей фразы видно, что ты сравниваешь абсолютно разные задачи на разных языках

I>>>Итого, пока что у нас расклад такой — я привел примеры, где С++ используют без плюсов или даже пишут "против языка", а вот от тебя пока что ничего не было.

EP>>То есть Eigen и Facebook ты за примеры не считаешь?
I>По моему мы остановились на том, что ты не понимаешь слово "типичный" и что это означает.

А где я говорил что-то про типичный?

I>А на счет фейсбука даже не знаю, php вместо С++ как пример классной нативной разработки ?


Конечно, с такими-то тылами:

HipHop VM (and before it HPHPc) has realized > 5x increase in throughput for Facebook compared with Zend PHP 5.2.

Re[36]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 13:08
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Меньше мусора, в т.ч. отсутствие макров, да-да.


_>ОК, принимается. Ничего возразить не могу. Действительно в C++ коде на один лишний значок больше. Но хотелось бы зафиксировать что это единственный его недостаток в данном сравнение.


И макры не забудь.

_>>>2. Покажи точный аналог на C# этого http://www.rsdn.ru/forum/philosophy/5210899
Автор: alex_public
Дата: 25.06.13
кода. И поясни почему он на твой взгляд выглядит не хуже C++ варианта (ты же это утверждал, не так ли?).


I>>http://rsdn.ru/forum/philosophy/5211111.1
Автор: Ikemefula
Дата: 25.06.13

I>>На мой взгляд это лучше благодаря поддержке асинхронщины компилером, ибо в С++ есть только поддержка 1 либами 2 макрами.

_>А вот тут всё наоборот.


_>1. Этот твой код совершенно не является аналогом этого http://www.rsdn.ru/forum/philosophy/5210899
Автор: alex_public
Дата: 25.06.13
C++ кода, а является аналогом его сильного упрощение (http://rsdn.ru/forum/philosophy/5211111
Автор: Ikemefula
Дата: 25.06.13
внизу). Аналог же полноценного кода ты так и ни разу не показал.


Угадывать по коду, какую задачу ты хотел решать, я не хочу, потому уже который раз прошу описание человеческим языком.
Без этого у меня складывается ощущение, что ты чего то не понимаешь похоже. Сначала ты был уверен, что в C# нельзя цикл всунуть в имеющийся код. Щас утверждаешь, что цепочка из двух последовательных ожиданий намного сложнее, чем из одного
Это конечно лучше, чем спутать лямбды и внешние ресурсы, но примерно так же смешно.

Вобщем если хочешь получить внятный ответ, дай внятное описание задачи. Например — 5 параллельных асинхронных тасков, каждый таск состоит из двух(трех, десяти) цепочек. Валяй.
Re[29]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 13:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Если не брать C++11 то можно так:

EP>>
EP>>background(download(args.url), args.cancellation),
EP>>

I>И что ? Чем это лучше
I>
I>var r = await download(args.url, args.cancellation);
I>

I>Тем, что на С++ ?

А где я говорил, что это чем-то лучше, круче? Ты спрашивал про аналог

I>>>Явно указано ожидание результата, при чем такой код совершенно не означает что будет какой то джополнительный поток. Всё.

EP>>Конечно не означает, ибо это вообще не код, так как не компилируется
EP>>А поток у тебя таки будет (либо постоянное ожидание), ибо твой download не асинхронный
I>Это несущественные детали.

Ну так и в коде на C++ — там не обязательно дополнительный поток.

I>>>При чем если минимально усложнить код, тебе придется заниматься ручно диспетчеризацией навроде "execute_on_ui_thread"

EP>>Так у тебя тоже ручная диспетчеризация в виде await/task/async
I>Я нигде не указываю в каком потоке чего выполнить, я всего то указываю ожидание результатов, по потокам раскидает компилятор,

По потокам у тебя раскидает библиотека/среда на основе глобального состояния.

I>а ты это делаешь руками.


ничто не мешает также задавать это параметрами среды
Re[32]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 13:17
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>>>Код который ты привел, пишут именно вчерашние сиплюсники, силу многолетней привычки "зачем думать и так всё быстро".

EP>>>Код показывает к чему приводят минимальные абстракции в java
I>>Ровно к тому же, что и в Boost

EP>Boost это набор библиотек, ты что сказать-то хотел?


Java это вобщем тоже набор библиотек по большому счету. И stackfull coroutines там есть. И точно такие же приседания со стеком.

EP>Ещё раз, то что где-то быстрый код написан не на C++ не означает, что при написании аналогичного кода на C++ придётся отказываться от абстракций. Логично же


Смотря что называть абстракциями. Я вот честно не знаю, что ты под этим понимаешь.

EP>Ну тогда и для:

EP>

I>>Смотри, как все просто — реализовать оконное FFT.

EP>"Реализовал!"
EP>детский сад

По моему, мы уже выяснили, что все что ты силился сказать, это про разницу в перформансе низкоуровневого кода. Отдохни, примерно за 10 лет я про это и писал на этом же форуме не единожды, загляни в хистори и убедись.

I>>Похоже, если в контексте дотнета ты слышишь вычисления, то тебе мерещится "складыват два числа". Это скорее к доктору, а не на форум.

EP>Я тебе показал, что из твоей фразы видно, что ты сравниваешь абсолютно разные задачи на разных языках

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

I>>По моему мы остановились на том, что ты не понимаешь слово "типичный" и что это означает.


EP>А где я говорил что-то про типичный?


Вещи которые ты тут сообщал непосредтсвенно связаны с этим понятием. Твоих разовых примеров недостаточно, что бы сказать, что в С++ все шоколадно.

EP>Конечно, с такими-то тылами:

EP>

EP>HipHop VM (and before it HPHPc) has realized > 5x increase in throughput for Facebook compared with Zend PHP 5.2.


Да, это нечестно по отношению к С++, надо было этим дуракам на бусте все захерачить, шоб все знали, что быстрые приложения можно только на С++ писать.
Re[38]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 13:18
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Синикс взял да и повелся, ты то сам и лямбды и макры использовал


Ну я же не виноват что в C# нет макросов. ))) Ну и кстати замечу что в данном случае они использовались исключительно для эстетических целей, а не для магии, как иногда бывает.
Re[39]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 13:21
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну я же не виноват что в C# нет макросов. ))) Ну и кстати замечу что в данном случае они использовались исключительно для эстетических целей, а не для магии, как иногда бывает.


Не ясно, где тут эстетика, если ты сам не хочешь использовать свой же подход.
Re[22]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 13:21
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>На stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде, ибо такие сопроцедуры сразу возвращают управление в клиентский код — а это значит что либо данные ещё не получены, либо никакой асинхронности, так как только один поток.

I>"ибо такие сопроцедуры сразу возвращают управление в клиентский код" это как, если сопроцедура не сразу возвращает управление в клиентский код, то получается отсутствие асинхрощины ?

Чтобы тебе было понятней, покажи аналог кода на C#:
void foo(TcpStream &client_stream)
{
    string msg;
    do
    {
        getline(client_stream, msg);
        cout << msg << endl; 
    } while(msg != "exit");
}

getline выполняется асинхронно, давай возможность другим соединениям отработать (поток один).
Этот код абсолютно ничем не отличается от синхронного.
Re[37]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 13:29
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Угадывать по коду, какую задачу ты хотел решать, я не хочу, потому уже который раз прошу описание человеческим языком.

I>Без этого у меня складывается ощущение, что ты чего то не понимаешь похоже. Сначала ты был уверен, что в C# нельзя цикл всунуть в имеющийся код. Щас утверждаешь, что цепочка из двух последовательных ожиданий намного сложнее, чем из одного
I>Это конечно лучше, чем спутать лямбды и внешние ресурсы, но примерно так же смешно.

Не в том дело. Просто если ты пишешь не точный аналог кода, а пропускаешь его часть, то как нам тогда сравнивать эти два куска на предмет красоты и лаконичности языка?

I>Вобщем если хочешь получить внятный ответ, дай внятное описание задачи. Например — 5 параллельных асинхронных тасков, каждый таск состоит из двух(трех, десяти) цепочек. Валяй.


Да вообще то уже не особо и надо. Проще было написать C++ аналог к той твоей другой реализации. И как мы видим http://www.rsdn.ru/forum/philosophy/5211094
Автор: alex_public
Дата: 25.06.13
C++ вариант реализации await/async (да, кстати, это всего лишь мой вариант придуманный вчера сходу на форуме, а вообще в C++ их может быть ещё сколько угодно других видов) позволяет писать код на порядок (!) лаконичнее и проще чем C#.

Но если всё же почему-то ещё интересно, то та задачка звучала так: делаем в точности тоже самое что и здесь http://www.rsdn.ru/forum/philosophy/5208679
Автор: gandjustas
Дата: 23.06.13
только на 5 разных url параллельно и записываем результат в 5 соответствующих textBox. Соответственно аналог на C++ выглядел так: http://www.rsdn.ru/forum/philosophy/5210899
Автор: alex_public
Дата: 25.06.13
Re[40]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 13:33
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Не ясно, где тут эстетика, если ты сам не хочешь использовать свой же подход.


Эстетика в смысле маскировки кишок, а не принципа вообще. )))
Re[33]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 13:52
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Evgeny.Panasyuk, Вы писали:


I>>>>>Код который ты привел, пишут именно вчерашние сиплюсники, силу многолетней привычки "зачем думать и так всё быстро".

EP>>>>Код показывает к чему приводят минимальные абстракции в java
I>>>Ровно к тому же, что и в Boost
EP>>Boost это набор библиотек, ты что сказать-то хотел?
I>Java это вобщем тоже набор библиотек по большому счету. И stackfull coroutines там есть. И точно такие же приседания со стеком.

Как это всё относится к выделенному?

EP>>Ещё раз, то что где-то быстрый код написан не на C++ не означает, что при написании аналогичного кода на C++ придётся отказываться от абстракций. Логично же

I>Смотря что называть абстракциями. Я вот честно не знаю, что ты под этим понимаешь.

Самые обыкновенные абстракции:

Абстра́кция (от лат. abstractio — отвлечение) — отвлечение в процессе познания от несущественных сторон, свойств, связей объекта (предмета или явления) с целью выделения их существенных, закономерных признаков; абстрагирование; теоретическое обобщение как результат такого отвлечения.

Простой пример — при сложении двух векторов, не имеет значения сколько и каких компонентов в этих векторах. С такими элементами можно работать как с элементами абелевой группы, пренебрегая несущественными деталями.
Или другой пример, раз уж тут разговор про C, сортировка элементов для которых есть strict weak ordering — в C++ код будет один, для элементов разных типов и последовательностей. В то время как в C, будет либо один код и потеря производительности, либо много неудобного кода. В итоге в C, в большинстве мест отказываются от производительности в пользу платной абстракции.

EP>>Я тебе показал, что из твоей фразы видно, что ты сравниваешь абсолютно разные задачи на разных языках

I>Я показываю, что менеджед код запросто может не быть узким местом, даже если требования к перформансу в виде тактов процессора и тд.

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

I>>>Выяснил, что дотнет может справляться с вычислениями быстрее, чем нативная либа с отрисовкой результатов.



I>>>По моему мы остановились на том, что ты не понимаешь слово "типичный" и что это означает.

EP>>А где я говорил что-то про типичный?
I>Вещи которые ты тут сообщал непосредтсвенно связаны с этим понятием.

Как именно?
Re[34]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 14:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Boost это набор библиотек, ты что сказать-то хотел?

I>>Java это вобщем тоже набор библиотек по большому счету. И stackfull coroutines там есть. И точно такие же приседания со стеком.

EP>Как это всё относится к выделенному?


Если ты хочешь узнать, что не так с джавой, сильно вряд ли я тебе помогу, я джавы не знаю. Минимальных абстракций в твоем коде я не видел — там
________________________низкоуровневый________________________код________________________без________________________каких________________________либо________________________абстракций.
Эдак у тебя ассемлерная инструкция станет минимальной абстракцей, дескать, позволяет работать с процессором не задумываясь о сигналах на конкретных пинах.
Максимум что можно назвать абстракцией это имя массива

EP>Ну так развей свою мысль, в чём была проблема? Я вижу только сравнение двух языков на основе разных задач:

EP>

I>>>>Выяснил, что дотнет может справляться с вычислениями быстрее, чем нативная либа с отрисовкой результатов.


Здесь нет никакого сравнения, ты контекст потерял. Здесь сказано, что для конкретной задачи(sic!) узкое место это нативная либа которая занимается отрисовкой. Насколько тормозной дотнет, никого, кроме сиплюсников, не интересует. Просто еще один пример до кучи.
Ну и ясно, что тебе тут мерещится "два числа сложить", не волнуйся, я в курсе.


I>>>>По моему мы остановились на том, что ты не понимаешь слово "типичный" и что это означает.

EP>>>А где я говорил что-то про типичный?
I>>Вещи которые ты тут сообщал непосредтсвенно связаны с этим понятием.

EP>Как именно?


Например
"Почему то самые критичные куски кода пишутся практически на С или подобным образом"
"Я привел пример..."

Чего показал твой один пример ? Что он есть ? Спасибо, это и без тебя ясно было. Или может ты думал, что я утверждаю "никто никогда нигде не писал критичный к перформансу код на с++ и делал бы это успешно" ?
Re[18]: Что посоветуете как аналог С++
От: IT Россия linq2db.com
Дата: 25.06.13 15:05
Оценка:
Здравствуйте, vdimas, Вы писали:

IT>>Это не тот ли самый случай из-за чего старый VB тормозил на операциях с памяться раз так в 200?

V>Нет, не тот. VB тормозил из-за передачи строк и Safe Array по значению при маршаллинге.

Не скажу за строки, но он жутко тормозил на счётчиках ссылок.
... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[38]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 15:14
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Не в том дело. Просто если ты пишешь не точный аналог кода, а пропускаешь его часть, то как нам тогда сравнивать эти два куска на предмет красоты и лаконичности языка?


Смотри, ответ прямо сразу был, выделено:

I>>Вобщем если хочешь получить внятный ответ, дай внятное описание задачи. Например — 5 параллельных асинхронных тасков, каждый таск состоит из двух(трех, десяти) цепочек. Валяй.



_>Да вообще то уже не особо и надо. Проще было написать C++ аналог к той твоей другой реализации. И как мы видим http://www.rsdn.ru/forum/philosophy/5211094
Автор: alex_public
Дата: 25.06.13
C++ вариант реализации await/async (да, кстати, это всего лишь мой вариант придуманный вчера сходу на форуме, а вообще в C++ их может быть ещё сколько угодно других видов) позволяет писать код на порядок (!) лаконичнее и проще чем C#.


Ты путаешь язык и либу. В либе можно навернуть все что угодно. Вот смотри, упаковать можно примерно так
asyncStream(send).pipeTo(asyncStream(receive)).pipeTo(streamFromConsole).pipeTo(streamFromDbBlob);


И это всего лишь либа. Тебя же все тянет сравнивать языковые возможности с конкретной либой. И что это покажет ? Эдак одна либа на ассемблере может зарулить весь Хаскель с плюсами и даталогом в минуса.

_>Но если всё же почему-то ещё интересно, то та задачка звучала так: делаем в точности тоже самое что и здесь http://www.rsdn.ru/forum/philosophy/5208679
Автор: gandjustas
Дата: 23.06.13
только на 5 разных url параллельно и записываем результат в 5 соответствующих textBox. Соответственно аналог на C++ выглядел так: http://www.rsdn.ru/forum/philosophy/5210899
Автор: alex_public
Дата: 25.06.13


еще раз у тебя 5 паралельных тасков, каждый из которых асинхронный, из двух цепочек. Сколько цепочек, вообще не важно. Одна, две три — нет разницы. Это понятно ?
Я показал тебе другой фокус — как ожидать таски, которые ты запускаешь. В твоем коде этого нет.
Re[23]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 15:18
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:


I>>"ибо такие сопроцедуры сразу возвращают управление в клиентский код" это как, если сопроцедура не сразу возвращает управление в клиентский код, то получается отсутствие асинхрощины ?


EP>Чтобы тебе было понятней, покажи аналог кода на C#:


Ты уже в который раз отвечаешь вопросом на вопрос.

EP>getline выполняется асинхронно, давай возможность другим соединениям отработать (поток один).

EP>Этот код абсолютно ничем не отличается от синхронного.

когда получит управление код после getline ? Ну, например, если сделать вот так

getline(client_stream, msg);
SendMessage(hwnd,WM_SET_TEXT,msg, NULL); // когда сюда придет управление


Покажи мне эту самую асинхронщину. Для начала выясним, какую часть своего решения ты не показал
Re[32]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 15:45
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>>>И что ? Чем это лучше

I>>>>Тем, что на С++ ?
EP>>>А где я говорил, что это чем-то лучше, круче? Ты спрашивал про аналог
I>>Договорились — ничем не лучше Не ясно, с чем же ты раньше спорил

EP>Дискуссия действительна приняла интересный оборот
Автор: alex_public
Дата: 25.06.13
, "покажи мне аналог await'а" плавно перетекает в "И что ? Чем это лучше"


Ожидаемый вопрос. Если ты считаешь, что это приемлемый вариант, то надо полагать у тебя есть мнение отличное от "ящетаю".
Re[24]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 15:54
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>когда получит управление код после getline ? Ну, например, если сделать вот так

I>
I>getline(client_stream, msg);
I>SendMessage(hwnd,WM_SET_TEXT,msg, NULL); // когда сюда придет управление
I>


Управление придёт после того как msg прочитается из stream'а.

I>Покажи мне эту самую асинхронщину.


Вся "асинхронщина" спрятана внутри TcpStream.
Re[39]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 15:55
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты путаешь язык и либу. В либе можно навернуть все что угодно. Вот смотри, упаковать можно примерно так

I>
I>asyncStream(send).pipeTo(asyncStream(receive)).pipeTo(streamFromConsole).pipeTo(streamFromDbBlob);
I>


I>И это всего лишь либа. Тебя же все тянет сравнивать языковые возможности с конкретной либой. И что это покажет ? Эдак одна либа на ассемблере может зарулить весь Хаскель с плюсами и даталогом в минуса.


В том то и дело что не всё что угодно можно реализовать в либе, а только то, что позволяют конструкции языка. Например написать Boost.Spirit на C# просто не реально. Причём как по скорости, так и по синтаксису.

Ну или в нашем конкретном случае, ты не сможешь написать код полностью подобный моему в C#, т.к. там реализация асинхронности обязательно резко возвращает управление из функции после вызова await. В то время как с нормальными coroutines это совсем не обязательно.

I>еще раз у тебя 5 паралельных тасков, каждый из которых асинхронный, из двух цепочек. Сколько цепочек, вообще не важно. Одна, две три — нет разницы. Это понятно ?


Ну так если разницы нет, то в чём проблема была показать код? ) У меня уже был КОНКРЕТНЫЙ пример на C++ и я хотел в точности соответствующий ему аналог на C#.

I>Я показал тебе другой фокус — как ожидать таски, которые ты запускаешь. В твоем коде этого нет.


Как раз именно это он и делает. )))
Re[25]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 16:09
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>когда получит управление код после getline ? Ну, например, если сделать вот так

I>>
I>>getline(client_stream, msg);
I>>SendMessage(hwnd,WM_SET_TEXT,msg, NULL); // когда сюда придет управление
I>>


EP>Управление придёт после того как msg прочитается из stream'а.


А где же асинхронщина ? Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.

I>>Покажи мне эту самую асинхронщину.

EP>Вся "асинхронщина" спрятана внутри TcpStream.

У тебя никакой асинхронщины нет
Re[40]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 16:18
Оценка:
Здравствуйте, alex_public, Вы писали:

_>В том то и дело что не всё что угодно можно реализовать в либе, а только то, что позволяют конструкции языка. Например написать Boost.Spirit на C# просто не реально. Причём как по скорости, так и по синтаксису.


По синтаксису вполне реально — либо через перегрузку операторов, либо через expression trees. Но да, в обоих случаях будет много динамики.
Re[26]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 16:21
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Управление придёт после того как msg прочитается из stream'а.

I>А где же асинхронщина ?

У тебя какое-то плоское представление о мире.

I>Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.


Не будет зависания — до прихода данных из стрима управление передаться в другое место. Если там UI — то в UI loop
Re[27]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 16:27
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Управление придёт после того как msg прочитается из stream'а.

I>>А где же асинхронщина ?

EP>У тебя какое-то плоское представление о мире.


Ты хочешь показать асинхронщину "где то то там", а я прошу "где то здесь"

I>>Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.


EP>Не будет зависания — до прихода данных из стрима управление передаться в другое место. Если там UI — то в UI loop


В какое другое ? Или короутина такая умная, что пороется в адресном пространстве процесса и скажет "О, пока я буду спать, пусть повыполняется вот этот кусочек кода" и некоторым чудом окажетс так, что этот некоторый кусочек кода и будет тем который мне нужен ?

Покажи весь код, для полноты картины. Если UI loop и короутина работают асинхронно, покажи именно эту асинхронщину. Ну и до кучи покажи как руками написать метод навроде getline.
Re[27]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 16:40
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>У тебя какое-то плоское представление о мире.


I>>Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.


EP>Не будет зависания — до прихода данных из стрима управление передаться в другое место. Если там UI — то в UI loop


Судя по описанию boost.coroutine это аналог yield в сишарп или питоне, потому никакой асинхронщины тут нет, когда работает один — другой спит и наоборот.
Re[28]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 16:41
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты хочешь показать асинхронщину "где то то там", а я прошу "где то здесь"


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

I>>>Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.

EP>>Не будет зависания — до прихода данных из стрима управление передаться в другое место. Если там UI — то в UI loop

I>В какое другое?


В любое. Если надо — в event loop, если надо в asio, или ещё куда-нибудь.

I>Или короутина такая умная, что пороется в адресном пространстве процесса и скажет "О, пока я буду спать, пусть повыполняется вот этот кусочек кода" и некоторым чудом окажетс так, что этот некоторый кусочек кода и будет тем который мне нужен ?


Нигде она не будет рыться, она просто сделает yield.

I>Покажи весь код, для полноты картины.


Давай ты сначала покажешь аналог, ок? Может тогда станет ясно, почему "на stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде"
Автор: Evgeny.Panasyuk
Дата: 25.06.13
, и мне не придётся показывать ещё один пример.

I>Если UI loop и короутина работают асинхронно, покажи именно эту асинхронщину. Ну и до кучи покажи как руками написать метод навроде getline.


getline тут самый стандартный, который std::getline.
Re[28]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 16:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Судя по описанию boost.coroutine это аналог yield в сишарп или питоне


Hint: ты в Python или C# через сколько уровней можешь yield'ануть?
Если брать Python то ближайший аналог это gevent, который ни разу ни yield. Более того, у gevent есть фишка — он может на ходу сделать monkey patch стандартных сокетов, и фактически весь синхронный код становится асинхронным

I>потому никакой асинхронщины тут нет, когда работает один — другой спит и наоборот.


В моём примере, при вызове getline, если данные сразу не готовы, то текущий засыпает и управление передаётся другому.
Re[29]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 25.06.13 17:01
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>getline тут самый стандартный, который std::getline.

Ну ты не перебарщивай. К этому getline нужна таки обёртка, которая будет откидывать управление из корутины и получать его назад, по типу той что я писал выше.
Главное гармония ...
Re[29]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 17:02
Оценка:
Здравствуйте, Mazay, Вы писали:

I>>Покажи весь код, для полноты картины. Если UI loop и короутина работают асинхронно, покажи именно эту асинхронщину. Ну и до кучи покажи как руками написать метод навроде getline.


M>Я же тебе показал здесь: http://rsdn.ru/forum/philosophy/5209707.1
Автор: Mazay
Дата: 24.06.13

M>Смотри реализацию connect_resume.

Я этот код не понимаю и там так же не очевидно, как именно вернется управление в UI Loop
Re[29]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 17:03
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>потому никакой асинхронщины тут нет, когда работает один — другой спит и наоборот.


EP>В моём примере, при вызове getline, если данные сразу не готовы, то текущий засыпает и управление передаётся другому.


Кому другому ? Покажи как приготовить этого другого.
Re[41]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 17:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>По синтаксису вполне реально — либо через перегрузку операторов, либо через expression trees. Но да, в обоих случаях будет много динамики.


Ну так а зачем тогда кодировать парсер кодом, если он всё равно собирается динамично? Тогда уж более гибко его внешним текстом настраивать, а таких у нас полно. Bison тот же берём и всё. )))
Re[41]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 17:40
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Написать просто что бы написать а требования к производительности взяты от балды ? Цель какая у этой задач ?


Там много для чего можно использовать. Например те же самые Boost.Xpressive (регэкспы кодирующиеся прямо в C++ и компилирующиеся там же) релизованы через Spirit. Но лично я чаще всего вижу его как максимально быстрый и удобный парсер (хотя там есть и генератор и лексер).

I>Если таки речь про либу и патчить стек это нормально, то в дотнете, как и в джаве, никто не мешает сделать вот так https://code.google.com/p/coroutines/

I>Это собственно аналог boost.coroutines.

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

I>"там реализация асинхронности обязательно резко возвращает управление из функции после вызова await"

I>Это и есть асинхронность. Если управление не возвращать, асинхронности не получится. Как то так.

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

I>У тебя запускается 5 паралельных тасков. Покажи цитатой из кода ожидание именно этих пяти тасков, а не тех, что внутри этих пяти.


Аааа в этом смысле ожидать. Ну так в той задаче это просто не требовалось, но думаю что очевидно что прямо нужный код у нас имеется, т.к, он запускается для внутренних функций.
Re[28]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 17:46
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Покажи весь код, для полноты картины. Если UI loop и короутина работают асинхронно, покажи именно эту асинхронщину. Ну и до кучи покажи как руками написать метод навроде getline.


Асинхронность то кодируется совсем не с помощью coroutine, а например (как в моём коде) через std::async. A coroutine нужна что бы вернуть управление после выполнения асинхронной части в код расположенный после кода запуска асинхронной задачи.
Re[28]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 25.06.13 17:57
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Mazay, Вы писали:


I>>>А где же асинхронщина ? Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.


M>>Так а после await когда придёт управление? Это же полный аналог твоего кода:

M>>
M>>private async void handler(object sender, TaskArgs args)
M>>{
M>>    string result = await new Task(() => Download(args.Url), args.Cancellation);

M>>    textBox.Text += result;   // когда сюда придет управление
M>>}
M>>


I>Нет, это не аналог. Этот хандлер вернет управление сразу, без блокирования, то есть, отпустит UI Loop. А вот внутренности хандлера будут работать иначе — сколько раз эти внутренности пнет шедулер — зависит от кода хандлера.


Так тогда ещё проще:

    boost::asio::ip::tcp::resolver::iterator it = ...;
    auto textBox = new TextBox(...);
    ...
    sock.async_connect(*it, [&textBox](const boost::system::error_code& ec)
                  { if (not ec) textBox->text = "connected!!!" /*это хэндлер, который выполнится сразу после завершения асинхронного коннекта*/ }
           );

    textBox->text = "connecting ..."; // а это выполнится сразу после асинхронного вызова, то есть sock.async_connect вернёт управление сразу.


Здесь даже корутины ни к чему.

Слушай, у меня тут подозрения на счёт await возникло:

private async void handler(object sender, TaskArgs args)
{
    string result = await new Task(() => Download(args.Url), args.Cancellation);

    textBox.Text += result;

    textBox.Color = Red; // а когда сюда придет управление ??
}
Главное гармония ...
Re[28]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 17:58
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Судя по описанию boost.coroutine это аналог yield в сишарп или питоне, потому никакой асинхронщины тут нет, когда работает один — другой спит и наоборот.


Всё правильно. Только данный yield работает не просто как возврат из функции, а связывает два произвольных (!) куска кода в программе. Соответственно мы ставим одну метку на требуемый код, а вторую в обработчик ui потока и получаем нужный результат. И да, он при этом полностью синхронный. Но в самой асинхронности то вообще ни у кого никогда проблем не было. Вызываем любой вариант (например std::async) и добавляем асинхронность. Но фишка await/async же не в тупо асинхронности, а в продолжение исполнения кода внутри вызывающего потока после завершения вызванного, причём с точки запуска асинхронного вызова. Вот как раз это boot.coroutine и реализует.
Re[29]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 18:06
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здесь даже корутины ни к чему.


Спасибо, капитан

M>Слушай, у меня тут подозрения на счёт await возникло:


M>
M>private async void handler(object sender, TaskArgs args)
M>{
M>    string result = await new Task(() => Download(args.Url), args.Cancellation);

M>    textBox.Text += result;

M>    textBox.Color = Red; // а когда сюда придет управление ??
M>}
M>


После await, что очевидно. Хандлер развернется в класс, вызывающий метод просто инстанцирует класс и сразу получит управление. А дальше за выполнением кода собственно хандлера будет следить шедулер. Код между await заменится на промисы и замыкания.
async/await это не короутина, это сахар для вызова шедулера и заворачивания кода в промисы и замыкания, примерно так, короутина всего лишь будет использоваться этим сахаром.
Re[30]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 25.06.13 18:15
Оценка:
Здравствуйте, Ikemefula, Вы писали:

M>>Слушай, у меня тут подозрения на счёт await возникло:


M>>
M>>private async void handler(object sender, TaskArgs args)
M>>{
M>>    string result = await new Task(() => Download(args.Url), args.Cancellation);

M>>    textBox.Text += result;

M>>    textBox.Color = Red; // а когда сюда придет управление ??
M>>}
M>>


I>После await, что очевидно. Хандлер развернется в класс, вызывающий метод просто инстанцирует класс и сразу получит управление. А дальше за выполнением кода собственно хандлера будет следить шедулер. Код между await заменится на промисы и замыкания.

I>async/await это не короутина, это сахар для вызова шедулера и заворачивания кода в промисы и замыкания, примерно так, короутина всего лишь будет использоваться этим сахаром.

Понятно, что после await. Но до или после завершения скачивания файла? Если до, что за результат будет записан в textBox.Text? Если после, то получается, что handler() будет блокироваться?
Главное гармония ...
Re[28]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 25.06.13 18:26
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>А где же асинхронщина ? Предположим, это единственный код в приложении, а чтение из стрима занимает 5 минут. Итого — асинхронщина, в твоем понимании, это зависание UI на 5 минут.


M>>Так а после await когда придёт управление? Это же полный аналог твоего кода:

M>>
M>>private async void handler(object sender, TaskArgs args)
M>>{
M>>    string result = await new Task(() => Download(args.Url), args.Cancellation);

M>>    textBox.Text += result;   // когда сюда придет управление
M>>}
M>>


I>Нет, это не аналог. Этот хандлер вернет управление сразу, без блокирования, то есть, отпустит UI Loop. А вот внутренности хандлера будут работать иначе — сколько раз эти внутренности пнет шедулер — зависит от кода хандлера.


Стоп. Ты меня не путай.

The await operator is applied to a task in an asynchronous method to suspend the execution of the method until the awaited task completes. The task represents ongoing work.

Управление к "textBox.Text += result" придёт только после завершения скачки файла. А до этого управление вернётся в код, который вызвал handler() (у тебя видимо это UI Loop). То есть handler() и есть корутина. Поэтому ему и нужно слово async в объявлении. И это есть полная аналогия моего кода. Только у меня вместо UI Loop выступает io_service::run() который выполняет ещё сотню таких же корутин. То есть выполнение корутины будет заблокировано, но выполнение потока, в котором она вызвалась — нет.
Главное гармония ...
Re[29]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 18:45
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Стоп. Ты меня не путай.


Я тебя не путаю, Выше по контексту пример синхронного getline и тд и тд и тд.
Re[31]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 18:47
Оценка:
Здравствуйте, Mazay, Вы писали:

I>>После await, что очевидно. Хандлер развернется в класс, вызывающий метод просто инстанцирует класс и сразу получит управление. А дальше за выполнением кода собственно хандлера будет следить шедулер. Код между await заменится на промисы и замыкания.

I>>async/await это не короутина, это сахар для вызова шедулера и заворачивания кода в промисы и замыкания, примерно так, короутина всего лишь будет использоваться этим сахаром.

M>Понятно, что после await. Но до или после завершения скачивания файла? Если до, что за результат будет записан в textBox.Text? Если после, то получается, что handler() будет блокироваться?


Унутре — будет конечно, await именно это и делает. Вызывающий код — нет. EP показал _другой_ пример, где блокируется сам вызывающий код.
Re[30]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 18:48
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Правильно, об чем и речь. Потому никаких фокусов нет и быть не может, о чем я и говорю. Короутина нужна для того, что бы сделать энергичный код ленивым, как результат, легко делается кооперативная многозадачность. В винде есть файберы, как раз это же и делают. В бусте сэмулировали эти файберы. В дотнет есть проблема — файберы не поддерживаются рантаймом, и по моему хорошо что так сделано

I>При этом повторяю — нет в короутинах асинхронщины, асинхронщину берет на себя шедулер, который надо еще правильно приготовить, скормить ему набор короутин между которыми он и будет переключаться.

Конечно. Но с помощью таких инструментов как boost.coroutine и std::async подобный шедулер кодируется буквально в 5 строк кода. И это не преувеличение для красного словца, а именно факт показанный мною в этой темке. Правда эти строки несколько страшненькие, так что пришлось их срочно спрятать за макросами. ))) Но думаю сам факт реализации await/async модели в 5 строк на C++ весьма показателен. Особенно с учётом того, что это писалось в ответ на предположения о невозможности такого в C++ в принципе. )))
Re[31]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 18:48
Оценка:
Здравствуйте, Mazay, Вы писали:

I>>Правильно, об чем и речь. Потому никаких фокусов нет и быть не может, о чем я и говорю. Короутина нужна для того, что бы сделать энергичный код ленивым, как результат, легко делается кооперативная многозадачность. В винде есть файберы, как раз это же и делают. В бусте сэмулировали эти файберы. В дотнет есть проблема — файберы не поддерживаются рантаймом, и по моему хорошо что так сделано


M>Ты так говоришь, будет файберы это какие процессорные инструкции. Это те же самые стэковые корутины, просто под виндой их так назвали. А в бусте назвали корутинами.


Я в курсе, не боись.

I>>При этом повторяю — нет в короутинах асинхронщины, асинхронщину берет на себя шедулер, который надо еще правильно приготовить, скормить ему набор короутин между которыми он и будет переключаться.


M>Ну да. В asio этим занимается io_service, который ждёт на каком-нибудь WaitForMultipleObjects, а потом дёргает сработавшие хэндлы.


!!!
Re[30]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 19:01
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Покажи этот код, а то вот EP не может


Так в изначальном сообщение, которое ещё без макросов, было всё целиком. Вот тут http://www.rsdn.ru/forum/philosophy/5209186
Автор: alex_public
Дата: 24.06.13
в первом страшненьком куске кода ставится "маркер" (точнее даже два, т.к. там две асинхронности) на одну часть кода программы. А потом идёт отдельный кусок кода из двух строк для вставки в обработчик UI потока — это второй "маркер" ставится.
Re[31]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.06.13 19:09
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Конечно. Но с помощью таких инструментов как boost.coroutine и std::async подобный шедулер кодируется буквально в 5 строк кода. И это не преувеличение для красного словца, а именно факт показанный мною в этой темке.


Такой шедулер писать нужно долго и упорно, взять хотя бы реализацию Round Robin.

>Правда эти строки несколько страшненькие, так что пришлось их срочно спрятать за макросами. ))) Но думаю сам факт реализации await/async модели в 5 строк на C++ весьма показателен. Особенно с учётом того, что это писалось в ответ на предположения о невозможности такого в C++ в принципе. )))


ты спрятал не шедулер, а всего лишь ожидание.
Re[30]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 19:20
Оценка:
Здравствуйте, Mazay, Вы писали:

EP>>getline тут самый стандартный, который std::getline.

M>Ну ты не перебарщивай. К этому getline нужна таки обёртка, которая будет откидывать управление из корутины и получать его назад, по типу той что я писал выше.

getline там стандартный, не перегруженный
А stream да — специальный, я этого и не скрывал — в том коде даже тип для стрима специальный, хотя можно было показать только std::istream
Re[31]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 19:42
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>>getline тут самый стандартный, который std::getline.

M>>Ну ты не перебарщивай. К этому getline нужна таки обёртка, которая будет откидывать управление из корутины и получать его назад, по типу той что я писал выше.
I>Качественно ты его слил

getline там стандартный

[...]
I>Я тебя не путаю, Выше по контексту пример синхронного getline и тд и тд и тд.

Тот код асинхронный

[...]
I> Ты лучше помоги EP, а то он не может асинхрощину найти в синхронном коде
[...]
I> Покажи этот код, а то вот EP не может

Балабольство чистой воды

Тот код с getline я скопировал из примеров к Boost.Coroutine, о чём сразу и сказал
Автор: Evgeny.Panasyuk
Дата: 21.06.13
:

Например, в examples к Boost.Coroutine есть пример простого сервера, который асинхронно считывает сообщения из tcp порта и выводит их на экран — причём всё это происходит в одном потоке. Цикл считывания выглядит точно также как и обыкновенный синхронный код:

Вникай, там асинхронные соединения, и getline стадартный
Re[32]: Что посоветуете как аналог С++
От: alex_public  
Дата: 25.06.13 19:46
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Такой шедулер писать нужно долго и упорно, взять хотя бы реализацию Round Robin.


Ну так в большинстве случаем мы тут просто используем планировщик из ОС. Хотя если использовать std::async из последнего msvc, то там оно вроде как использует небольшой пул потоков и само перекидывает задачки между ними.

I>ты спрятал не шедулер, а всего лишь ожидание.


Так о том и речь, что это единственно что пришлось дописать, а всё остальное уже в языке/библиотеках реализовано.
Re[30]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 25.06.13 21:45
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Я этот код не понимаю и там так же не очевидно, как именно вернется управление в UI Loop


Полностью локализованный код, со своим scheduler'ом, блэкджеком и шлюхами:
#include <boost/range/algorithm_ext.hpp>
#include <boost/range/algorithm.hpp>

#include <boost/iostreams/categories.hpp>
#include <boost/iostreams/stream.hpp>

#include <boost/coroutine/all.hpp>

#include <functional>
#include <algorithm>
#include <iostream>
#include <cstddef>
#include <utility>
#include <string>
#include <vector>
#include <deque>

using namespace boost;
using namespace std;
using namespace placeholders;

typedef coroutines::coroutine<void()> Coro;
typedef deque<char> Buffer;

struct DataSource
{
    typedef char        char_type;
    typedef iostreams::source_tag category;

    Coro::caller_type &ca;
    Buffer &buffer;

    std::streamsize read(char* out, streamsize n)
    {
        if(buffer.empty())
        {
            ca();
            if(buffer.empty()) return -1;
        }
        auto actual_n = min(n, streamsize(buffer.size()));
        auto first = buffer.begin();
        auto last = first + actual_n;
        copy(first, last, out);
        buffer.erase(first, last);
        return actual_n;
    }
};
typedef iostreams::stream<DataSource> TcpStream;

void foo(TcpStream &client_stream)
{
    string msg;
    do
    {
        getline(client_stream, msg);
        cout << "stream address: " << &client_stream << "|\t";
        cout << msg << endl;
    } while(msg != "exit");
}

void coroutine_start(Buffer *buffer,Coro::caller_type &ca)
{
    DataSource source{ca, *buffer};
    TcpStream client_stream(source);
    foo(client_stream);
}

int main()
{
    vector<Coro> fibers;
    vector<Buffer> buffers(4);
    for(auto &buffer : buffers)
        fibers.emplace_back(bind(coroutine_start, &buffer, _1));

    struct StreamData
    {
        size_t receiver;
        string msg;
    } const stream_datas[] =
    {
        {0, "Hello"},
        {1, "World"},
        {2, "Stackfull"},
        {3, "Coroutines"},
        {2, "Rulez!"},
        {1, "Hasta la vista"},
        {0, "Baby"}
    };

    for(auto &sd : stream_datas)
    {
        auto &buffer = buffers[sd.receiver];
        push_back(buffer, sd.msg);
        buffer.push_back('\n');
        fibers[sd.receiver]();
    }

    for(auto &buffer : buffers)
        push_back(buffer, "exit\n");
    for(auto &c : fibers)
       c();
}

Вывод:
stream address: 0x7fc742afdc10| Hello
stream address: 0x7fc742aebc10| World
stream address: 0x7fc742ad9c10| Stackfull
stream address: 0x7fc742ac7c10| Coroutines
stream address: 0x7fc742ad9c10| Rulez!
stream address: 0x7fc742aebc10| Hasta la vista
stream address: 0x7fc742afdc10| Baby
stream address: 0x7fc742afdc10| exit
stream address: 0x7fc742aebc10| exit
stream address: 0x7fc742ad9c10| exit
stream address: 0x7fc742ac7c10| exit

В функцию foo, я добавил вывод уникальной части — в остальном всё идентично коду показанному выше.
Сопроцедуры работают асинхронно, а getline стандартный, ага.

Чтобы было понятней, stackfull coroutine это двусторонний портал — в него можно нырнуть с двух сторон.

Здесь один конец находится в "event-loop", а другой в асинхронном вызове.
Когда асинхронному коду нужны данные — он ныряет в свой портал.
Когда "event-loop" видит что пришли данные — он просто ныряет в нужный портал в зависимости от того, кому эти данные адресуются.
Re[32]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 26.06.13 04:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>В функцию foo, я добавил вывод уникальной части — в остальном всё идентично коду показанному выше.

EP>>Сопроцедуры работают асинхронно, а getline стандартный, ага.
I>Ты бы еще привел пример операциооной системы. Все что от тебя требовалось — минимально возможный код который показывает как работает собтсвенно переключение задач для асинхронной задачи.

Минимально достаточного того, что я писал — почему-то до других дошло

I>Странно, но ты снова привел __синхронный__ код Если короутина прыгает между стеками, еще не значит, что код автоматически становится асинхронным.


http://en.wikipedia.org/wiki/Asynchronous_I/O

Asynchronous I/O, in computer science, is a form of input/output processing that permits other processing to continue before the transmission has finished.



Вот тут:
for(auto &buffer : buffers)
        fibers.emplace_back(bind(coroutine_start, &buffer, _1));

Вызываются "handler"'ы (в твоих терминах).
В каждом "handler"'е код выполняется до каждого yield'а и сразу возвращается сюда — так же как и в C# с async/await код выполняется до первого await'а. Это в твоих понятиях являются асинхронными вызовами или нет?
Когда "event loop" ныряет в сопроцедуру — это аналог тому, когда await дожидается своего таска.
Все остальные yield'ы в "handler"'ах — аналогичны последующим await'ам и т.п.

I>Ну и так же ты показал, что в предыдущем примере у тебя, мягко говоря, отсутствовало 99% решения


Опустим этот "толстый, толстый слой шоколада" и вернёмся к исходному вопросу
Автор: Evgeny.Panasyuk
Дата: 25.06.13
.
Аналогичный код можно написать на await'ах — но там неизбежно "асинхронные кишки будут торчать в клиентском коде". Ты теперь понял почему?
Re[31]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 26.06.13 04:21
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Mazay, Вы писали:


EP>>>getline тут самый стандартный, который std::getline.

M>>Ну ты не перебарщивай. К этому getline нужна таки обёртка, которая будет откидывать управление из корутины и получать его назад, по типу той что я писал выше.

EP>getline там стандартный, не перегруженный

EP>А stream да — специальный, я этого и не скрывал — в том коде даже тип для стрима специальный, хотя можно было показать только std::istream

Аааа. Тады ой. Тады всё правильно — полный аналог await.
Главное гармония ...
Re[32]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 26.06.13 04:42
Оценка:
Здравствуйте, Mazay, Вы писали:

EP>>А stream да — специальный, я этого и не скрывал — в том коде даже тип для стрима специальный, хотя можно было показать только std::istream

M>Аааа. Тады ой. Тады всё правильно — полный аналог await.

Ну да, только мощнее.
Если всё же заменить на std::istream:
void foo(std::istream &client_stream)
{
    string msg;
    do
    {
        getline(client_stream, msg);
        cout << msg << endl; 
    } while(msg != "exit");
}

То этот код будет работать с любыми потоками — что с синхронными, что с асинхронными, потому что код одинаковый для обоих случаев, так как можно yield спрятать внутри сокета.

На await-те так не получится — в асинхронной версии будет await(+async в объявлении) + по всему call stack'у выше, вплоть до вызова handler'а, точно также будут добавляться await+await.
Re[33]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.06.13 08:11
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>Вот тут:

EP>
EP>for(auto &buffer : buffers)
EP>        fibers.emplace_back(bind(coroutine_start, &buffer, _1));
EP>

EP>Вызываются "handler"'ы (в твоих терминах).
EP>В каждом "handler"'е код выполняется до каждого yield'а и сразу возвращается сюда — так же как и в C# с async/await код выполняется до первого await'а. Это в твоих понятиях являются асинхронными вызовами или нет?

Нет, что очевидно — у тебя просто синхронный код.

EP>Когда "event loop" ныряет в сопроцедуру — это аналог тому, когда await дожидается своего таска.

EP>Все остальные yield'ы в "handler"'ах — аналогичны последующим await'ам и т.п.

На вских yield можно построить асинхронный процессинг, но при этом не любой код на короутинах будет асинхронным.

I>>Ну и так же ты показал, что в предыдущем примере у тебя, мягко говоря, отсутствовало 99% решения


EP>Опустим этот "толстый, толстый слой шоколада" и вернёмся к исходному вопросу
Автор: Evgeny.Panasyuk
Дата: 25.06.13
.

EP>Аналогичный код можно написать на await'ах — но там неизбежно "асинхронные кишки будут торчать в клиентском коде". Ты теперь понял почему?

ca(); — вот так что ли ? Там где ты явно, руками вызываешь короутину, будет стоять await. И эту самую асинхронщину как раз и надо контролировать руками.

Собтсвенно асинхронщина это не то, для чего нужны короутины.
Re[35]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.06.13 09:40
Оценка:
Здравствуйте, Mazay, Вы писали:

I>>Собтсвенно асинхронщина это не то, для чего нужны короутины.


M>Согласен. Но с корутинами можно писать асинхронный код, который будет выглядеть как синхронный. И await это и есть корутина.


async это короутина, а await это подсказка компилеру где делать прерывание
Re[19]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 26.06.13 11:33
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Это не тот ли самый случай из-за чего старый VB тормозил на операциях с памяться раз так в 200?

V>>Нет, не тот. VB тормозил из-за передачи строк и Safe Array по значению при маршаллинге.

IT>Не скажу за строки, но он жутко тормозил на счётчиках ссылок.


Я не замерял совсем старые VB, но при разборе ассемлерных листингов программ на последних VB5/VB6 и сравнении их с аналогичным кодом на C++ со смарт-поинтерами, общее кол-во парных AddRef/Release на VB5/VB6 было намного меньше, т.е. компилятор был довольно-таки умен. Более того, приятно поразила неплохая оптимизация целочисленных вычислений.

Проблемы в VB не в компиляторе, а в программистах. Язык позволяет писать без аннотации типов. Хотя позволяет задавать опции модуля для требований обязательного описания переменных, но всегда можно описать бестиповую переменную. Вот и выходит, что даже простое копирование VARIANT будет выполняться уже с вызовом библиотечной VariantCopy, безо-всякой оптимизации, да еще из DLL, т.е. через переходник, а внутри затем будет распаковка и вызовы AddRef/Release, короч, много лишнего кода на простейший чих. В общем, типизация в VB6 давала нехилый буст.

Ну и ниша, опять же. VB использовался для шлепанья формочек, а числодробильную нагрузку во времена VB делали на С/С++. Нагруженные формочки на VB "летали" на тех машинках в сравнении с MFC, бо там многие контролы шли как windowless: http://support.microsoft.com/kb/184687
Re[7]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 26.06.13 12:27
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Экономика корпоративных систем оставляет C++ за бортом.


Не изобретай, экономике корпоративных систем на язык реализации ваще наплевать.

G>На десктопе ситуация для C++ не лучше, так как ресурсов дофига, даже на планшетах, никто за лишние 30-50 мегабайт не будет беспокоиться и почти везде уже больше одного ядра.


Тебе-то что, если львиная доля любого софременного софта — это библиотечный код?

При наличии нормальных библиотек язык уже не столь принципиален. Джава стала популярна когда-то не из-за языка (он же чудовищен!), а из-за мега-инфраструктуры на тоннах библиотек. Дотнет лишь повторил эту модель на чуть более хорошем уровне.


G>Остаются встраиваемые системы с малыми ресурсами и всяческие HFT.


Хи. Помимо этого остаетcя ~99% софта на десктопе. Какие, право, мелочи.

=====
Как обычно, разработчикам заказухи из подвала виднее, угу...
Re[34]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 26.06.13 13:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Вызываются "handler"'ы (в твоих терминах).

EP>>В каждом "handler"'е код выполняется до каждого yield'а и сразу возвращается сюда — так же как и в C# с async/await код выполняется до первого await'а. Это в твоих понятиях являются асинхронными вызовами или нет?
I>Нет, что очевидно — у тебя просто синхронный код.

Основные претензии к "обычному асинхронному коду" в том, что он не похож на синхронный, то что нужно лепить callback'и, continuations, причём заворачивать в несколько уровней.
Основная фича await в том, что он позволяет распрямить асинхронный код, сделать его похожим на синхронный. Именно этим радикальные C#-исты пытались козырнуть в этом топике, типа "покажи аналог"
Так вот, если асинхронный код идентичен синхронному аналогу — то это же самый лучший вариант, вроде же очевидно

EP>>Когда "event loop" ныряет в сопроцедуру — это аналог тому, когда await дожидается своего таска.

EP>>Все остальные yield'ы в "handler"'ах — аналогичны последующим await'ам и т.п.
I>На вских yield можно построить асинхронный процессинг, но при этом не любой код на короутинах будет асинхронным.

А где я говорил что любой?

I>>>Ну и так же ты показал, что в предыдущем примере у тебя, мягко говоря, отсутствовало 99% решения

EP>>Опустим этот "толстый, толстый слой шоколада" и вернёмся к исходному вопросу
Автор: Evgeny.Panasyuk
Дата: 25.06.13
.

EP>>Аналогичный код можно написать на await'ах — но там неизбежно "асинхронные кишки будут торчать в клиентском коде". Ты теперь понял почему?

I>ca(); — вот так что ли ? Там где ты явно, руками вызываешь короутину, будет стоять await.


Фишка в том, что эти ca() можно инкапсуировать в библиотеки, асинхронные вызовы — а await'ы будут засорять все уровни кода.
Более того, синтаксис await'ов можно полностью реализовать на stackfull coroutines (async в объявлении будет не нужен, но будет нужен call_async в месте вызова + такие await могут стоят на "любой глубине").

I>И эту самую асинхронщину как раз и надо контролировать руками.

I>Собтсвенно асинхронщина это не то, для чего нужны короутины.

Корутины позволяют делать асинхронный код похожим на синхронный, и ещё много чего.
C#-повский async/await, как я уже описывал выше
Автор: Evgeny.Panasyuk
Дата: 21.06.13
, транслируется в подобие stackless coroutine.
Re[35]: Что посоветуете как аналог С++
От: alex_public  
Дата: 26.06.13 14:05
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Основные претензии к "обычному асинхронному коду" в том, что он не похож на синхронный, то что нужно лепить callback'и, continuations, причём заворачивать в несколько уровней.

EP>Основная фича await в том, что он позволяет распрямить асинхронный код, сделать его похожим на синхронный. Именно этим радикальные C#-исты пытались козырнуть в этом топике, типа "покажи аналог"
EP>Так вот, если асинхронный код идентичен синхронному аналогу — то это же самый лучший вариант, вроде же очевидно

Вот, отличная формулировка. А я всё не мог подобрать точных слов, когда говорил что лично мне совершенно не нравится этот await/async стиль. Вот как раз тем, что реально асинхронный код притворяется синхронным, оно мне и не нравится. Зачем лишние запутывания на пустом месте и без всякой выгоды?

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

А в приведённом пример с фоновым скачиванием файла по запросу пользователя я не вижу разумных причин для применения подобной техники.
Re[15]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 27.06.13 14:23
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Но у тебя следующий пакет обработается когда полный цикл отправить-получить-сохранить-отправить.


Откуда ты это берешь? Читай код внимательней.

G>А кабель не при чем, больше всего времени уходит в ожидание ответа сервера.


Какая разница? В любом случае, конкретика будет зависеть от ТЗ, если требуется действия юзера обрабатывать последовательно с т.з. базы, то они ДОЛЖНЫ быть обработаны последовательно.


G>А Queue у тебя thread-safe?


Более того, по коду ProcessorQueue::ProcessTask() и сказанного до этого можно сделать вывод, что там допустима даже дисциплина "один писатель, много читателей", если, скажем, можно было бы запросы пользователя к базе обрабатывать параллельно согласно ТЗ.

G>>>3) запись в базу и в сеть идет последовательно, а не параллельно.

MTD>>С чего вдруг? Очередь может иметь пул и по ним раскидывать данные.
G>Код в студию.
G>Вот уже сложность растет.

Это внешняя сложность диспетчера пула потоков и нужна только для случая, когда запросы пользователя к базе можно обрабатывать параллельно (применительно к вашему примеру). Но такой диспетчер, заметь, пишется однажды на целый дотнетный фремворк. Аналогично он пишется на С++ однажды для целой фирмы для всех проектов/задач или берется один из многих в сети готовых.


G>Ты пот покажи как сделать эту самую эффективную работу, чтобы не ожидать завершения IO в потоке и параллелить операции.


А где там видно, что NetworkRespondQueue.Push(data) что-то там ожидает? Я вижу простое заталкивание в очередь. Сами данные могут пересылаться из очереди асинхронно, через какой-нить boost::asio. Причем, в зависимости от выбранной асинхронной модели, допустима даже асинхронная отсылка без каких-либо неявно создаваемых дополнительных потоков.
Re[36]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 27.06.13 16:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Фишка в том, что эти ca() можно инкапсуировать в библиотеки, асинхронные вызовы — а await'ы будут засорять все уровни кода.

EP>>Более того, синтаксис await'ов можно полностью реализовать на stackfull coroutines (async в объявлении будет не нужен, но будет нужен call_async в месте вызова + такие await могут стоят на "любой глубине").
I>Это просто чушь и незнание истории операционных системы и их возможностей. В винде и лялихе файберы/короутины есть с незапамятных времен.

Congratulation, you won Taradiddle Black Belt!
Где я говорил что в Windows/Linux нет fibers, etc?

I>Потом появляется async/await, хотя казалось бы, stackfull coroutines работают искаропки.


Stackless coroutine реализуются простейшим переписыванием одного кода в другой, т.е. банальный rewrite. Те stackless coroutine которые в Boost.Asio — тому подтверждение.
В то время как stackful coroutines требуют поддержки на уровне среды, вроде же очевидно?

EP>>Корутины позволяют делать асинхронный код похожим на синхронный, и ещё много чего.

I>Скажи пожалуйста, а кто будет контролировать все эти нелокальные переходы ? В async/await все понятно — компилятор. Максимум контроля над одной единсвенной небольшой задачей. А что stackfull даёт ? Переходы непойми где ? Вместо однозадачного кода получить кооперативную многозадачность со всеми её проблемами — starvation, гонки, инверсия приоретитов и тд.

Да нет никаких starvation, то что в моём примере есть цикл распределения пакетов, не означает что он должен быть всегда при использовании сопроцедур.
Сопрецедуры не требуют изменения event loop, пример из Boost.Coroutine приведённый выше — тому подтверждение. Там не было никаких изменений в Boost.Asio

I>Ну и вопрос с message pump — http://rsdn.ru/forum/philosophy/5211489.1
Автор: Ikemefula
Дата: 25.06.13

I>Тебе понятно, что короутины нужно встроить вообще везде, что бы работал такой код ? В твоем случае он работать не будет, что очевидно, винда не знает про то, что ты используешь короутины.

Да и не должна она знать

I>То есть, для того что бы нормально использовать короутины, надо применить их тотально, то есть вообще везде где угодно.


нет, ты просто не понял как их можно использовать, и разводишь истерику

I>Для примера выше — покажи приблизительный код, который нужно добавить, что бы работала и твоя модная асинхронщина и этот цикл выборки сообщений.


Я уже много всякого кода здесь приводил. А ты даже не осилил
Автор: Evgeny.Panasyuk
Дата: 25.06.13
показать простой пример на C#.
Давай ты приведёшь полностью рабочий пример с асинхронностью в "традиционном стиле", на callback'ах — а я переделаю его на stackful coroutine, ок?
Re[37]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 27.06.13 16:29
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Что бы это забороть, надо явно делать короутинами вообще всё, в т.ч. и message pump. То есть на ровном месте педалить и приседать с кооперативной многозадачностью.


Вот смотри, есть у нас некий асинхронный метод, который принимает продолжение:
async_something([=]{ on_completion(); });
// checkpoint



У сопроцедур есть двусторонний портал.
С одной стороны он красный:
— это вход в корутину.
С другой синий:
— это выход из корутины, в вызвавший её код.
Корутина может дать попользоваться красным порталом кому угодно, в том числе в callback асинхронного метода.


Код приведённый выше, механически переписывается в:
auto &&red_portal = make_shared<Coro>();
*red_portal = Coro([=](Coro::caller_type &blue_portal)
{
    async_something( [=]{ (*red_portal)(); } );
    blue_portal(); // goes to checkpoint
    on_completion();
});
// checkpoint
// Это всё можно заправить синтаксическим сахаром, таким образом, чтобы код был похож на синхронный аналог.

Как видишь, никаких вмешательств в event-loop тут не было — трансформация полностью локализована
Re[38]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 27.06.13 19:26
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Сопрецедуры не требуют изменения event loop, пример из Boost.Coroutine приведённый выше — тому подтверждение. Там не было никаких изменений в Boost.Asio

I>Ну раз не требуют, стало быть ты легко накидаешь примерчик с моим message pump. Какие проблемы ?

в этом примере
Автор: Evgeny.Panasyuk
Дата: 27.06.13
есть только трансформация локального кода, никакой другой код не менялся

EP>>Давай ты приведёшь полностью рабочий пример с асинхронностью в "традиционном стиле", на callback'ах — а я переделаю его на stackful coroutine, ок?

I>Возьми любой мой пример, я ажно пять вариантов привел. Только должно быть явно обозначено, как будет вызываться message pump. И message pump именно мой, а не просто какой то эвентлуп для короутин.

Ты понимаешь что такое полностью рабочий пример? Это не те огрызки которые ты тут приводил.
Re[36]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 27.06.13 19:52
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Вот, отличная формулировка. А я всё не мог подобрать точных слов, когда говорил что лично мне совершенно не нравится этот await/async стиль. Вот как раз тем, что реально асинхронный код притворяется синхронным, оно мне и не нравится. Зачем лишние запутывания на пустом месте и без всякой выгоды?

_>А в приведённом пример с фоновым скачиванием файла по запросу пользователя я не вижу разумных причин для применения подобной техники.

ИМХО, основная выгода в том, что synchronous-like код легче понять и меньше синтаксического шума.

Но "легче понять", в случае с await, имеет несколько граней: та синхроноподобность которая добавляется, безусловного помогает упростить видимость control flow'а, но в то же время программист должен знать как оно работает, когда передаётся управление в вызывающий код, в каком контексте что вызывается(UI, etc).
Например есть некая асинхронная функция которая возвращает результат, вызывающему код нужен этот результат. По большому счёту у него два варианта — вызывать .wait() на том future который вернулся, либо воткнуть await и самому стать async'ом. Такой выбор транзитивно распространяется наверх по call stack'у. Конкретно этого недостатка у кода на stackful coroutines нет.

Если всё что нужно это сделать фоновую скачку файла, то вполне могу себе представить ситуацию, где даже при наличии await'а — вместо него будет использоваться явный код с .then'ом, указанием ui контекста и т.п., ибо очевидно что у await'а есть свой порог вхождения, а код не только пишется, но ещё и обслуживается, причём зачастую разными людьми. Например тот же Ikemefula, который бьёт себя пяткой в грудь что заменит целый взвод азиатов, уже неделю не может понять как можно использовать stackful coroutine. Тогда чего уж там говорить о "типичных" программистах.
Re[39]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.06.13 20:51
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>в этом примере
Автор: Evgeny.Panasyuk
Дата: 27.06.13
есть только трансформация локального кода, никакой другой код не менялся


Я уже помнится задавал вопрос — как получит управление message pump, не любой, а именно тот который я привел.

I>>Возьми любой мой пример, я ажно пять вариантов привел. Только должно быть явно обозначено, как будет вызываться message pump. И message pump именно мой, а не просто какой то эвентлуп для короутин.


EP>Ты понимаешь что такое полностью рабочий пример? Это не те огрызки которые ты тут приводил.


Внятно ответь на вопросы
1 — как получит управление МОЙ message pump.
2 — как message pump передаст управление короутине когда процессинг закончится.

Условно считаем так — есть message pump и есть ровно один хандлер который вызывается этим message pump. От тебя требуется показать что нибудь предельно простое, асинхронное, которое реализовано унутре этого хандлера.

Пока что ты продемонстрировал замерзание UI.
Re[40]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 27.06.13 21:24
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Возьми любой мой пример, я ажно пять вариантов привел. Только должно быть явно обозначено, как будет вызываться message pump. И message pump именно мой, а не просто какой то эвентлуп для короутин.

EP>>Ты понимаешь что такое полностью рабочий пример? Это не те огрызки которые ты тут приводил.
I>Внятно ответь на вопросы
I>1 — как получит управление МОЙ message pump.
I>2 — как message pump передаст управление короутине когда процессинг закончится.

Зависит от того какую асинхронную операцию и как (по какому событию) ты собрался выполнять, поэтому и прошу привести полный пример.

I>Условно считаем так — есть message pump и есть ровно один хандлер который вызывается этим message pump. От тебя требуется показать что нибудь предельно простое, асинхронное, которое реализовано унутре этого хандлера.


Видимо конкретного кода я не дождусь. Давай тогда так:
#include <functional>
#include <algorithm>
#include <cstring>
#include <memory>
using namespace std;

#include <windows.h>

function<void()> on_exit;

LRESULT CALLBACK window_procedure(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
{
    switch (msg)
    {
        case WM_DESTROY:
            on_exit();
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd, msg, w_param, l_param);
    }
}

template<typename F>
void async_something(F f)
{
    on_exit = f;
}

void task()
{
    MessageBox(0, TEXT("on start"), TEXT(""), MB_OK);
    async_something([]
    {
        MessageBox(0, TEXT("on exit"), TEXT(""), MB_OK);
    });
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
    WNDCLASS wincl = {};
    wincl.hInstance = hInstance;
    wincl.lpszClassName = TEXT("SFC");
    wincl.lpfnWndProc = window_procedure;
    RegisterClass(&wincl);

    auto hwnd = CreateWindow(wincl.lpszClassName, TEXT(""), WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, 0);
    ShowWindow (hwnd, nCmdShow);

    task();

    MSG msg;
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

Я только добавивлю include корутин, и сделаю трансформацию описанную выше внутри task.
Такой пример подойдёт?

I>Пока что ты продемонстрировал замерзание UI.


Где?
Re[37]: Что посоветуете как аналог С++
От: alex_public  
Дата: 28.06.13 02:34
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>На stackfull короутинах здесь не было ни одного примера асинхронщины. Ни одного, зато есть вопли, как всё просто и шоколадно. Есть мой пример с message pump — допили его и продемонстрируй асинхронщину


Да легко. В начале для наглядности исходный (синхронный блокирующий) код:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
    AttachConsole();
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)>0){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

void SomeMessageHandler()
{
    wstring buf;
    getline(wcin, buf);
    wcout<<L"Эхо: "<<buf;
}


И его асинхронный вариант:
AsyncPool async_pool;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
    AttachConsole();
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)>0){
        async_pool.RunAll();
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

void SomeMessageHandler()
{
    async_pool.Add([=](AsyncPool::This& this_async){//эти две строки можно для красоты запрятать
        wistream async_wcin(new АsyncBuf(this_async, wcin.rdbuf()));//в макрос :D
        wstring buf;
        getline(async_wcin, buf);
        wcout<<L"Эхо: "<<buf;
    });
}


Насколько я понимаю (хотя я не особо разбирался — может поправишь меня?), написать подобный однопоточный код на C# без модификации функции getline и класса wistream нереально. Ну а тут как видишь без проблем пишется.

Ну и реализации async классов (по сути всё тоже самое что и в моих предыдущих примерах тут, только чуть формальнее):
class AsyncPool{
    using Coro=boost::coroutines::coroutine<void()>;
    list<Coro> coro_list;
public:
    using This=Coro::caller_type;
    template<typename L> void Add(L l) {coro_list.emplace_back(l);}
    void RunAll()
    {
        for(auto& c: coro_list) c();
        coro_list.remove_if([](const Coro& c) {return !c;});
    }
}

class АsyncBuf: public wstreambuf{
AsyncPool::This& this_async;
wstreambuf* sync_buf;
public:
    АsyncBuf(AsyncPool::This& c, wstreambuf* sb): this_async(c), sync_buf(sb){}
    wchar_t getc()//псевдокод, т.к. я не помню реальный api у std::streambuf
    {
        while(!sync_buf->is_avail()) this_async();
        return sync_buf->getc();
    }
};


I>Пока что очевидно, что вызов любого метода из message pump приведет замораживанию приложения. Что бы это забороть, надо явно делать короутинами вообще всё, в т.ч. и message pump. То есть на ровном месте педалить и приседать с кооперативной многозадачностью.


Как видишь ничего подобного. )))

I>Смешно — короутины есть в современных OS с незапамятных времен и как то это никак не сказалось на асинхронщине


Потому как реально эта самая асинхронщина (не путаем с нормальным многопоточным кодом) очень мало где нужна.
Re[38]: Что посоветуете как аналог С++
От: alex_public  
Дата: 28.06.13 03:13
Оценка:
Да, кстати, для сравнения можно ещё и многопоточный вариант твоего кода представить:
AsyncPool async_pool;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
    AttachConsole();
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)>0){
        async_pool.RunAll();
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

void SomeMessageHandler()
{
    async_pool.Add([=](AsyncPool::This& this_async){//эти две строки можно для красоты
        auto r=await_async(this_async, [&](){//запрятать в макрос :D
            wstring buf;
            getline(wcin, buf);
            return buf;
        });
        wcout<<L"Эхо: "<<r;
    });
}

Но это скучный (т.к. он на C# без проблем пишется , да и некорректный (если несколько getline'ов будут параллельно бороться за ввод пользователя) вариант.
Re[37]: Что посоветуете как аналог С++
От: alex_public  
Дата: 28.06.13 03:24
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Если всё что нужно это сделать фоновую скачку файла, то вполне могу себе представить ситуацию, где даже при наличии await'а — вместо него будет использоваться явный код с .then'ом, указанием ui контекста и т.п., ибо очевидно что у await'а есть свой порог вхождения, а код не только пишется, но ещё и обслуживается, причём зачастую разными людьми. Например тот же Ikemefula, который бьёт себя пяткой в грудь что заменит целый взвод азиатов, уже неделю не может понять как можно использовать stackful coroutine. Тогда чего уж там говорить о "типичных" программистах.


Вот вот. И дело даже не только в тех случаях, когда не понимают. Даже для всё знающего профессионала более наглядный (где чётко видно в каком потоке какой код исполняется) код может приводить к уменьшению случайных ошибок.

На мой вкус подобные техники реально полезны в двух случаях:
1. Написание библиотек, которые должны работать в двух режимах (синхронный и асинхронный) — тут естественно это должно быть замечательным решением без избыточного кода. Хотя пока реальных примеров не видел.
2. Случаи когда нам требуются много тысяч параллельных задач.

Может и ещё что-то есть, что сейчас в голову не пришло. А во всех остальных задачах на мой вкус проще, нагляднее и эффективнее использовать классическое многопоточное программирование.
Re[38]: Что посоветуете как аналог С++
От: Mazay Россия  
Дата: 28.06.13 10:46
Оценка:
Здравствуйте, alex_public, Вы писали:

_>И его асинхронный вариант:

_>
_>AsyncPool async_pool;

_>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
_>{
_>    AttachConsole();
_>    MSG msg;
_>    while(GetMessage(&msg, NULL, 0, 0)>0){
_>         async_pool.RunAll();
_>        TranslateMessage(&msg);
_>        DispatchMessage(&msg);
_>    }
_>    return msg.wParam;
_>}

_>void SomeMessageHandler()
_>{
_>    async_pool.Add([=](AsyncPool::This& this_async){//эти две строки можно для красоты запрятать
_>        wistream async_wcin(new АsyncBuf(this_async, wcin.rdbuf()));//в макрос :D
_>        wstring buf;
_>        getline(async_wcin, buf);
_>        wcout<<L"Эхо: "<<buf;
_>    });
_>}
_>


В принципе работать будет но могут быть осложнения:
1. Если сообщения не приходят достаточно часто, то и вызов async_pool.RunAll(); будет необоснованно задерживаться.
2. Вызов async_pool.RunAll(); может долго не отдавать управление, если асинхронные операции долго не завершаются. Он же там ждёт на select() каком-нибудь.

Строго однопоточное и неблокирующееся решение состоит в использовании MsgWaitForMultipleObjects() под виндой и использовании хэндлера ConnectionNumber() под X Window.
А правильное решение состоит в использовани отдельного потока для GUI.
Главное гармония ...
Re[38]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 11:02
Оценка:
Здравствуйте, alex_public, Вы писали:

_>И его асинхронный вариант:

_>
_>AsyncPool async_pool;

_>void SomeMessageHandler()
_>{
_>    async_pool.Add([=](AsyncPool::This& this_async){//эти две строки можно для красоты запрятать
_>        wistream async_wcin(new АsyncBuf(this_async, wcin.rdbuf()));//в макрос :D
_>        wstring buf;
_>        getline(async_wcin, buf);
_>        wcout<<L"Эхо: "<<buf;
_>    });
_>}
_>


_>Насколько я понимаю (хотя я не особо разбирался — может поправишь меня?), написать подобный однопоточный код на C# без модификации функции getline и класса wistream нереально. Ну а тут как видишь без проблем пишется.


То есть, снова появляется или функция или макрос, то есть, наружу торчат асинхронные кишки ?

_>Ну и реализации async классов (по сути всё тоже самое что и в моих предыдущих примерах тут, только чуть формальнее):

_>
_>class AsyncPool{
_>    using Coro=boost::coroutines::coroutine<void()>;
_>    list<Coro> coro_list;
_>public:
_>    using This=Coro::caller_type;
_>    template<typename L> void Add(L l) {coro_list.emplace_back(l);}
_>    void RunAll()
_>    {
_>        for(auto& c: coro_list) c();
_>        coro_list.remove_if([](const Coro& c) {return !c;});
_>    }
_>}

Где вызов RunAll ?

_>class АsyncBuf: public wstreambuf{
_>AsyncPool::This& this_async;
_>wstreambuf* sync_buf;
_>public:
_>    АsyncBuf(AsyncPool::This& c, wstreambuf* sb): this_async(c), sync_buf(sb){}
_>    wchar_t getc()//псевдокод, т.к. я не помню реальный api у std::streambuf
_>    {
_>        while(!sync_buf->is_avail()) this_async();
_>        return sync_buf->getc();
_>    }
_>};
_>


И снова не совсем ясно,
1 как вернется управление к моему message pump
2 когда будет получать управление диспетчер короутин

I>>Пока что очевидно, что вызов любого метода из message pump приведет замораживанию приложения. Что бы это забороть, надо явно делать короутинами вообще всё, в т.ч. и message pump. То есть на ровном месте педалить и приседать с кооперативной многозадачностью.


_>Как видишь ничего подобного. )))


Я пока что вижу в лучшем случае надо писать ровно то же, только руками строить короутину. В C# нужно писать async-await, а у тебя макры

I>>Смешно — короутины есть в современных OS с незапамятных времен и как то это никак не сказалось на асинхронщине

_>Потому как реально эта самая асинхронщина (не путаем с нормальным многопоточным кодом) очень мало где нужна.

Да как бы наоборот — асинхронщина нужна везде и всегда.
Re[41]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 12:11
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Ikemefula, Вы писали:


I>>>>Возьми любой мой пример, я ажно пять вариантов привел. Только должно быть явно обозначено, как будет вызываться message pump. И message pump именно мой, а не просто какой то эвентлуп для короутин.

EP>>>Ты понимаешь что такое полностью рабочий пример? Это не те огрызки которые ты тут приводил.
I>>Внятно ответь на вопросы
I>>1 — как получит управление МОЙ message pump.
I>>2 — как message pump передаст управление короутине когда процессинг закончится.

EP>Зависит от того какую асинхронную операцию и как (по какому событию) ты собрался выполнять, поэтому и прошу привести полный пример.



case WM_USER: // все прост, никаких фокусов
  textBox.text += await handler();
  break;


операция примерно такая, аналог на с# чз AsyncCallback, AsyncResult и тд.

string async handler()
{
  var http = new Http("some url");
  var result = await Task.FromBeginEnd(asyncCallback)=>http.BeginRead(asyncCallback), (asyncResult)=>http.EndRead(asyncResult) );

  return string;
}



I>>Условно считаем так — есть message pump и есть ровно один хандлер который вызывается этим message pump. От тебя требуется показать что нибудь предельно простое, асинхронное, которое реализовано унутре этого хандлера.


EP>Видимо конкретного кода я не дождусь. Давай тогда так:

EP>Я только добавивлю include корутин, и сделаю трансформацию описанную выше внутри task.
EP>Такой пример подойдёт?

Не ясно, что за трансформацию ты собираешься делать внутри таска. Если всю асинхронщину, то её надо делать в хандлере.

I>>Пока что ты продемонстрировал замерзание UI.


EP>Где?


Твой код останавливает message pump и нигде не было показано как этот памп будет продолжен.
Re[42]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 28.06.13 12:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Зависит от того какую асинхронную операцию и как (по какому событию) ты собрался выполнять, поэтому и прошу привести полный пример.

I>
I>case WM_USER: // все прост, никаких фокусов
I>  textBox.text += await handler();
I>  break;
I>


покажи полный код

I>Не ясно, что за трансформацию ты собираешься делать внутри таска. Если всю асинхронщину, то её надо делать в хандлере.


Так подойдёт? Всё в хендлере:
#include <boost/coroutine/all.hpp>
#include <functional>
#include <algorithm>
#include <cstring>
#include <memory>
using namespace std;

#include <windows.h>

function<void()> on_minization;

template<typename F>
void async_something(F f)
{
    on_minization = f;
}

void task()
{
    MessageBox(0, TEXT("on max"), TEXT(""), MB_OK);
    async_something([]
    {
        MessageBox(0, TEXT("on min"), TEXT(""), MB_OK);
    });
}

LRESULT CALLBACK window_procedure(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
{
    switch (msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_SIZE:
            switch(w_param)
            {
                case SIZE_MAXIMIZED:
                    task();
                    break;
                case SIZE_MINIMIZED:
                    if(on_minization) on_minization();
                    break;
            }
        default:
            return DefWindowProc(hwnd, msg, w_param, l_param);
    }
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
    WNDCLASS wincl = {};
    wincl.hInstance = hInstance;
    wincl.lpszClassName = TEXT("SFC");
    wincl.lpfnWndProc = window_procedure;
    RegisterClass(&wincl);

    auto hwnd = CreateWindow(wincl.lpszClassName, TEXT(""), WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, 0);
    ShowWindow (hwnd, nCmdShow);

    MSG msg;
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

task переписывается на корутины без каких-либо изменений остального кода
Re[39]: Что посоветуете как аналог С++
От: alex_public  
Дата: 28.06.13 12:50
Оценка:
Здравствуйте, Mazay, Вы писали:

M>В принципе работать будет но могут быть осложнения:

M>1. Если сообщения не приходят достаточно часто, то и вызов async_pool.RunAll(); будет необоснованно задерживаться.

Ага, точно, надо MsgWaitForMultipleObjects. Ну собственно я то в любом случае не стал бы писать такой код, а это было по запросу Ikemefula на его примере. Я то написал бы просто
void SomeMessageHandler()
{
    thread([=](){
        wstring buf;
        getline(wcin, buf);
        PostMessage(buf);
    }.detach();
}



M>2. Вызов async_pool.RunAll(); может долго не отдавать управление, если асинхронные операции долго не завершаются. Он же там ждёт на select() каком-нибудь.


Нет, там нет ничего блокирующего вообще.

M>А правильное решение состоит в использовани отдельного потока для GUI.


Нуу да, правда формулировка какая-то нестандартная. Чаще же основной поток как раз для GUI и куча отдельных для какой-то работы.
Re[39]: Что посоветуете как аналог С++
От: alex_public  
Дата: 28.06.13 13:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>То есть, снова появляется или функция или макрос, то есть, наружу торчат асинхронные кишки ?


Ну так кишки то по любому есть и в C++ и в C#. Фишка данного кода в том, что мы используем обычную синхронную блокирующую функцию getline в асинхронном однопоточном режиме без всякой её модификации.

I>Где вызов RunAll ?


В главном цикле же.

I>И снова не совсем ясно,

I>1 как вернется управление к моему message pump

Handler возвращает управление немедленно при любом раскладе.

I>2 когда будет получать управление диспетчер короутин


Когда будут пробегать сообщения в главном цикле. В принципе Mazay уже правильно указал, что просто GetMessage тогда тут некорректно и надо поправить главный цикл чтобы он крутился не только по обычным сообщениям.

I>Я пока что вижу в лучшем случае надо писать ровно то же, только руками строить короутину. В C# нужно писать async-await, а у тебя макры


Хыхыхы, если речь конкретно про этот код, то его аналог на C# вообще не написать никак. Так что до сравнения стилистических нюансов дело как бы вообще не должно доходить. )))

I>Да как бы наоборот — асинхронщина нужна везде и всегда.


Ну это смотря что под ней подразумевать... Например такой код
thread([=](){
    PostMessage(Download(url));
}).detach();

это всё ещё асинхронщина или уже нет? )))
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 13:24
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>покажи полный код


Это будет 100-200кб которые я выдеру из декомпиленой сборки. Тебя это устроит ?

Можешь сделать все что угодно, ожидание UI запущеного приложение, ожидание какого либо объекта ядра — все что угодно, только не бустовскую хрень, где это все упаковано хрен знает куда.

EP>task переписывается на корутины без каких-либо изменений остального кода


Мне нужно что бы ты показал
1 где будет ожидание результата
2 как управление вернется в message pump
2 как управление будет передаваться в твой шедулер или короутину
Re[44]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 28.06.13 13:31
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>task переписывается на корутины без каких-либо изменений остального кода

I>Мне нужно что бы ты показал
I>1 где будет ожидание результата

Тут ожидание события SIZE_MINIMIZED.

I>2 как управление вернется в message pump


После вызова async_something

I>2 как управление будет передаваться в твой шедулер или короутину


По событию, так же как в примере с task выше.
Подходит?
Re[45]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 13:47
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>task переписывается на корутины без каких-либо изменений остального кода

I>>Мне нужно что бы ты показал
I>>1 где будет ожидание результата

EP>Тут ожидание события SIZE_MINIMIZED.


Не надо такое.

I>>2 как управление вернется в message pump


EP>После вызова async_something


I>>2 как управление будет передаваться в твой шедулер или короутину


EP>По событию, так же как в примере с task выше.

EP>Подходит?

Сделай ожидание какого нибудь объекта ядра или еще чего навроде.
Re[40]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 13:56
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Где вызов RunAll ?

_>В главном цикле же.

Выдели жирным, взял из твоего кода этот самый главный цикл
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
    AttachConsole();
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)>0){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}



I>>2 когда будет получать управление диспетчер короутин

_>Когда будут пробегать сообщения в главном цикле. В принципе Mazay уже правильно указал, что просто GetMessage тогда тут некорректно и надо поправить главный цикл чтобы он крутился не только по обычным сообщениям.

Шота у тебя и EP показания не сходятся

I>>Я пока что вижу в лучшем случае надо писать ровно то же, только руками строить короутину. В C# нужно писать async-await, а у тебя макры


_>Хыхыхы, если речь конкретно про этот код, то его аналог на C# вообще не написать никак. Так что до сравнения стилистических нюансов дело как бы вообще не должно доходить. )))


Цель, понятное дело, написать так как нельзя в сишарп а не решить конкретную проблему ?

I>>Да как бы наоборот — асинхронщина нужна везде и всегда.


_>Ну это смотря что под ней подразумевать...


Да все как везде — скачивание, обращение к базе, устройству и тд и тд и тд и тд и тд и тд и тд
Re[46]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 28.06.13 14:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>1 где будет ожидание результата

EP>>Тут ожидание события SIZE_MINIMIZED.
I>Не надо такое.

Почему? Чем отличается от "ожидания результата" в данном контексте?

I>>>2 как управление будет передаваться в твой шедулер или короутину

EP>>По событию, так же как в примере с task выше.
EP>>Подходит?
I>Сделай ожидание какого нибудь объекта ядра или еще чего навроде.

Не увиливай, чем тебе minimize event не подходит?
Re[47]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 16:24
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>>>1 где будет ожидание результата

EP>>>Тут ожидание события SIZE_MINIMIZED.
I>>Не надо такое.

EP>Почему? Чем отличается от "ожидания результата" в данном контексте?


Я чуток запутался, по WM_SIZE будет таск запускаться, тогда нормально. Где будет ожидание результата в task ?
Re[40]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 16:39
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ага, точно, надо MsgWaitForMultipleObjects. Ну собственно я то в любом случае не стал бы писать такой код, а это было по запросу Ikemefula на его примере. Я то написал бы просто


Ага и еще тебе придется таймер подключать к этому.

M>>2. Вызов async_pool.RunAll(); может долго не отдавать управление, если асинхронные операции долго не завершаются. Он же там ждёт на select() каком-нибудь.


_>Нет, там нет ничего блокирующего вообще.


Теперь мы пришли к выводу, что надо патчить Message Pump.

::MessageBox() — вот эта функция похерит всю твою асинхронность по той простой причине, что запускает message pump и ничего не знает про твой RunAll

Теперь задачка посложнее, представь себе, что у тебя нет доступа к Message Pump, как заставить работать твою асинхронность ?

И похоже, что ваша хваленая асинхронность будет дико лагать, т.к. сильно зависит от частоты эвентов в системе и целой кучи других факторов.
Re[48]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 28.06.13 17:43
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Я чуток запутался, по WM_SIZE будет таск запускаться, тогда нормально.


В первом варианте он был в main, во втором он в хэндлере по WM_SIZE — но суть от этого не меняется.

I>Где будет ожидание результата в task ?


void task()
{
    MessageBox(0, TEXT("on max"), TEXT(""), MB_OK);
    async_something([]
    {
        MessageBox(0, TEXT("on min"), TEXT(""), MB_OK);
    });
}

Во втором statement'е таск запускает асинхронную обработку, и передаёт лямбду-продолжение как параметр, completion callback — т.е. что делать, когда это something (например download) произойдёт.
Re[41]: Что посоветуете как аналог С++
От: alex_public  
Дата: 28.06.13 18:17
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Выдели жирным, взял из твоего кода этот самый главный цикл


Это ты скопиривал из синхронного кода, а не асинхронного. )))

I>Шота у тебя и EP показания не сходятся


Так он там тогда другую модельку обсуждал.

I>Цель, понятное дело, написать так как нельзя в сишарп а не решить конкретную проблему ?


Вообще то в последнее время дискуссия свернула к вопросу превосходства stackfull coroutines над остальными вариантами. И этот код отлично демонстрирует один из нюансов превосходства: при переходе с синхронного кода на асинхронный нам не требуется менять весь код в стеке вызова, а правится только самый высший и самый низший уровень.

I>Да все как везде — скачивание, обращение к базе, устройству и тд и тд и тд и тд и тд и тд и тд


Ну я же вроде привёл конкретный пример... Снова отмазываемся? )))

Вот это
thread([=](){PostMessage(download(url));}).detach();

"асинхронщина" или же нет?

Если да, то тогда я подпишусь под утверждением что она нужна везде... Правда я привык называть такое самым обычным многопоточным программированием... Но лишнее название не помеха. )))

Если же нет, то тогда формулируй что же такое "асинхронщина" и будем уже разбираться по формулировке нужно оно где-то или нет...
Re[41]: Что посоветуете как аналог С++
От: alex_public  
Дата: 28.06.13 18:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ага и еще тебе придется таймер подключать к этому.


Нет, если использовать MsgWaitForMultipleObjects, то таймер не нужен. Кстати, там даже есть вариант ждать событий с вводом в консоль, так что вообще оптимально для данной задачки выходит.

Ну или же можно действительно таймер сделать и тогда можно оставить старый GetMessage. Но это уже не так оптимально.


I>Теперь мы пришли к выводу, что надо патчить Message Pump.

I>::MessageBox() — вот эта функция похерит всю твою асинхронность по той простой причине, что запускает message pump и ничего не знает про твой RunAll
I>Теперь задачка посложнее, представь себе, что у тебя нет доступа к Message Pump, как заставить работать твою асинхронность ?
I>И похоже, что ваша хваленая асинхронность будет дико лагать, т.к. сильно зависит от частоты эвентов в системе и целой кучи других факторов.

Эээ ты похоже бредишь. ))) Цель всей этой нашей асинхронщины (что в многопоточном, что в однопоточном варианте) в том, что сделать какие-то дела на стороне и вернуть результат в UI поток. Так что в этой задачке при любой схеме (однопоточной/многопоточной) и при любом языке программирования нам надо будет ждать пока UI поток не освободится для обработки асинхронного результата.

Если же нам можно обрабатывать результат не в UI потоке, то это совсем другая задача становится, которая решается вообще элементарно, но вроде как к "асинхронщине" уже совсем никакого отношения не имеет.
Re[42]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 20:20
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Цель, понятное дело, написать так как нельзя в сишарп а не решить конкретную проблему ?


_>Вообще то в последнее время дискуссия свернула к вопросу превосходства stackfull coroutines над остальными вариантами. И этот код отлично демонстрирует один из нюансов превосходства: при переходе с синхронного кода на асинхронный нам не требуется менять весь код в стеке вызова, а правится только самый высший и самый низший уровень.


Самый высший — это надо контролировать глобальный цикл выборки сообщений или чтото навроде. Этой возможности может и не быть. Даже так — в общем случае её нет. Любое модальное окно порушит всю твою стройную идею.

I>>Да все как везде — скачивание, обращение к базе, устройству и тд и тд и тд и тд и тд и тд и тд


_>Ну я же вроде привёл конкретный пример... Снова отмазываемся? )))


_>Вот это

_>
_>thread([=](){PostMessage(download(url));}).detach();
_>

_>"асинхронщина" или же нет?

Асинхронщина.
Re[49]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 20:27
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>
EP>void task()
EP>{
EP>    MessageBox(0, TEXT("on max"), TEXT(""), MB_OK);
EP>    async_something([]
EP>    {
EP>        MessageBox(0, TEXT("on min"), TEXT(""), MB_OK);
EP>    });
EP>}
EP>

EP>Во втором statement'е таск запускает асинхронную обработку, и передаёт лямбду-продолжение как параметр, completion callback — т.е. что делать, когда это something (например download) произойдёт.

То есть, ты предлагаешь локальную задачу растаскивать на 4 разных части ? Я чтото не вижу, как у тебя будет работать скажем скачивание
Re[43]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 28.06.13 20:35
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Самый высший — это надо контролировать глобальный цикл выборки сообщений или чтото навроде. Этой возможности может и не быть.


Нужен не самый высший, а просто выше.
В C# async'и расползаются транзитивно вверх по callstack'у, с самого нижнего уровня где нужен await, до самого высшего уровня где результата можно не ждать. Назовём все такие уровни "цепочкой async". Верх цепочки — не тоже самое что верх call stack'а, и не тоже самое что самый верхний message pump.
Так вот, в случае stackful coroutine, какой-то специальный код нужен только в самом вверху цепочки и в самом низу, а в случае async/await — по всей цепочке.
Длина цепочки в аналогичном коде и там и там будет одинаковая.

I>Даже так — в общем случае её нет. Любое модальное окно порушит всю твою стройную идею.


Точно также как и модальное окно в неправильном месте async метода в C#.
Re[49]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.06.13 20:35
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Во втором statement'е таск запускает асинхронную обработку, и передаёт лямбду-продолжение как параметр, completion callback — т.е. что делать, когда это something (например download) произойдёт.


Твой код работает безо всяких короутин. Проверь сам.
Re[50]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 28.06.13 20:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Во втором statement'е таск запускает асинхронную обработку, и передаёт лямбду-продолжение как параметр, completion callback — т.е. что делать, когда это something (например download) произойдёт.

I>Твой код работает безо всяких короутин. Проверь сам.

Так я код с корутинами специально пока не показываю, а то ты опять скажешь — всё не так, нет асинхронности, ui замёрз.
В этом коде, без корутин по твоему есть асинхронность? Если есть то я выложу task переписанный на корутинах, без всяких изменений message pump.
Re[43]: Что посоветуете как аналог С++
От: alex_public  
Дата: 28.06.13 20:58
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Самый высший — это надо контролировать глобальный цикл выборки сообщений или чтото навроде. Этой возможности может и не быть. Даже так — в общем случае её нет. Любое модальное окно порушит всю твою стройную идею.


Оно и должно порушить (точнее отложить обработку до своего закрытия), если мы хотим обрабатывать результаты в UI потоке. Так будет в любом языке или платформе. И это не ошибка, а следование условиям задачи.

I>Асинхронщина.


ОК. Тогда я признаю что "асинхронщина" действительно постоянно нужна везде. Но тогда ещё пара комментариев на эту тему:

1. Нормальная асинхронщина отлично реализуется без всяких fiber, coroutine, await/async.
2. Люди спокойно программируют подобные вещи уже не первый десяток лет, просто не называя это всякими модными словами. )))
Re[50]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 28.06.13 21:02
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>
EP>>void task()
EP>>{
EP>>    MessageBox(0, TEXT("on max"), TEXT(""), MB_OK);
EP>>    async_something([]
EP>>    {
EP>>        MessageBox(0, TEXT("on min"), TEXT(""), MB_OK);
EP>>    });
EP>>}
EP>>

EP>>Во втором statement'е таск запускает асинхронную обработку, и передаёт лямбду-продолжение как параметр, completion callback — т.е. что делать, когда это something (например download) произойдёт.
I>То есть, ты предлагаешь локальную задачу растаскивать на 4 разных части ?

Какую задачу?
Я показываю пример асинхронного кода, который переписывается на stackful coroutine посредством локальной трансформации.
Re[21]: Что посоветуете как аналог С++
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.06.13 21:29
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Это было давно и неправда.


Он и сейчас пока что на плюсах написан, Розлин ХЗ когда релизнут. И это, кстати, самая большая его проблема.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[20]: Что посоветуете как аналог С++
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.06.13 21:29
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Есть бенчмарки?


Есть бенчмарки про СУБД: https://code.google.com/p/csharp-sqlite/wiki/Benchmarks
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[51]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.06.13 05:36
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Какую задачу?

EP>Я показываю пример асинхронного кода, который переписывается на stackful coroutine посредством локальной трансформации.

А зачем его переписывать если и так все работает ? ПОкажи внятную задачу.
Re[44]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.06.13 05:38
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Самый высший — это надо контролировать глобальный цикл выборки сообщений или чтото навроде. Этой возможности может и не быть. Даже так — в общем случае её нет. Любое модальное окно порушит всю твою стройную идею.


_>Оно и должно порушить (точнее отложить обработку до своего закрытия), если мы хотим обрабатывать результаты в UI потоке. Так будет в любом языке или платформе. И это не ошибка, а следование условиям задачи.


Как то так выходит, что модальные окна ничего не рушат

_>1. Нормальная асинхронщина отлично реализуется без всяких fiber, coroutine, await/async.


Да, и даже на ассемблере !!!!

_>2. Люди спокойно программируют подобные вещи уже не первый десяток лет, просто не называя это всякими модными словами. )))


Как то незаметно, глядя на замерзания UI и тд и тд и тд
Re[51]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.06.13 05:42
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Так я код с корутинами специально пока не показываю, а то ты опять скажешь — всё не так, нет асинхронности, ui замёрз.

EP>В этом коде, без корутин по твоему есть асинхронность? Если есть то я выложу task переписанный на корутинах, без всяких изменений message pump.

Неинтересно, у тебя и так все работает. Покажи нормальную задачу, которая иначе как черз долгое ожидание не решается без асинхронщины.
Re[44]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.06.13 05:52
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Так вот, в случае stackful coroutine, какой-то специальный код нужен только в самом вверху цепочки и в самом низу, а в случае async/await — по всей цепочке.


Покажи.

EP>Длина цепочки в аналогичном коде и там и там будет одинаковая.

I>>Даже так — в общем случае её нет. Любое модальное окно порушит всю твою стройную идею.

EP>Точно также как и модальное окно в неправильном месте async метода в C#.


Если ты влазишь в message pump то любое модальное окно все порушит, потому что создает свой pump. А та проблема про которую ты говоришь высосана из пальца.
Re[45]: Что посоветуете как аналог С++
От: alex_public  
Дата: 29.06.13 06:20
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Как то так выходит, что модальные окна ничего не рушат


Дааа? ) Ну давай протестируем следующий C# код:
private async void start()
{
    string result = await new Task(() => Download(args.Url), args.Cancellation);
    MessageBox(result);
}
private void handler(object sender, TaskArgs args)
{
    start();
    MessageBox("На закрываем окно, пока не появится второе!");
}

Вопрос: если мы не закроем первый MessageBox, то какое время нам придётся ждать второго?
Re[45]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 29.06.13 09:48
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Так вот, в случае stackful coroutine, какой-то специальный код нужен только в самом вверху цепочки и в самом низу, а в случае async/await — по всей цепочке.

I>Покажи.

Я уже показывал — код с TcpStream — от запуска корутины до yield'а может быть сколько угодно пользовательских уровней не засорённых асинхронными аретфактами.

EP>>Я показываю пример асинхронного кода, который переписывается на stackful coroutine посредством локальной трансформации.

I>А зачем его переписывать если и так все работает ? ПОкажи внятную задачу.

Без await/async тоже и так всё работает

EP>>Так я код с корутинами специально пока не показываю, а то ты опять скажешь — всё не так, нет асинхронности, ui замёрз.

EP>>В этом коде, без корутин по твоему есть асинхронность? Если есть то я выложу task переписанный на корутинах, без всяких изменений message pump.
I>Неинтересно, у тебя и так все работает. Покажи нормальную задачу, которая иначе как черз долгое ожидание не решается без асинхронщины.

Ты говорил
Автор: Ikemefula
Дата: 25.06.13
что UI вызовется только чудом:

Ну значит UI Loop из моего примера вызовется чудом, например сканированием адресного пространства на предмет наличия ::GetMessage и ::TranslateMessage или, как вариант, короутина догадается WinMain вызвать.

что UI висит
Автор: Ikemefula
Дата: 25.06.13
:

Итого если этот метод висит до получаения результат, то очевидно, что и UI loop висит, а соответсвенно и UI висит. Может короутина догадается что надо сделать луп ? Или догадается вызвать WinMain ?

что корутине нужно знать про event loop:

Аналог чего ? Я не вижу асинхронного кода, ты даже не можешь показать, каким образом короутина узнает про UI loop.

что нужно готовить scheduler
Автор: Ikemefula
Дата: 25.06.13
:

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



Вот полный, рабочий пример, показывающий что все эти утверждения от банального незнания/неумения.
Корутина здесь ничего не знает про UI loop, ничего не висит, UI loop работает без всяких чудес, никакой scheduler готовить не надо, трансформация из обычного кода в код на корутине — полностью локальная
#include <boost/coroutine/all.hpp>
#include <functional>
#include <algorithm>
#include <cstring>
#include <memory>
using namespace std;

#include <windows.h>

function<void()> on_minization;

template<typename F>
void async_something(F f)
{
    on_minization = f;
}

#if 0

void task()
{
    MessageBox(0, TEXT("on max"), TEXT(""), MB_OK);
    async_something([]
    {
        MessageBox(0, TEXT("on min"), TEXT(""), MB_OK);
    });
}

#else

void task()
{
    typedef boost::coroutines::coroutine<void()> Coro;
    auto &&red_portal = make_shared<Coro>();
    *red_portal = Coro([=](Coro::caller_type &blue_portal)
    {
        MessageBox(0, TEXT("on max"), TEXT(""), MB_OK);
        async_something( [=]{ (*red_portal)(); } );
        blue_portal();
        MessageBox(0, TEXT("on min"), TEXT(""), MB_OK);
    });
}

#endif


LRESULT CALLBACK window_procedure(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
{
    switch (msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_SIZE:
            switch(w_param)
            {
                case SIZE_MAXIMIZED:
                    task();
                    break;
                case SIZE_MINIMIZED:
                    if(on_minization) on_minization();
                    break;
            }
        default:
            return DefWindowProc(hwnd, msg, w_param, l_param);
    }
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
    WNDCLASS wincl = {};
    wincl.hInstance = hInstance;
    wincl.lpszClassName = TEXT("SFC");
    wincl.lpfnWndProc = window_procedure;
    RegisterClass(&wincl);

    auto hwnd = CreateWindow(wincl.lpszClassName, TEXT(""), WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, 0);
    ShowWindow (hwnd, nCmdShow);

    MSG msg;
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

Корутины здесь без синтаксического захара, для наглядности. Выше, на примере TcpStream уже показывал как можно убрать весь шум.
Re[46]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.06.13 14:18
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Я показываю пример асинхронного кода, который переписывается на stackful coroutine посредством локальной трансформации.

I>>А зачем его переписывать если и так все работает ? ПОкажи внятную задачу.

EP>Без await/async тоже и так всё работает


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

EP>

EP>При этом повторяю — нет в короутинах асинхронщины, асинхронщину берет на себя шедулер, который надо еще правильно приготовить, скормить ему набор короутин между которыми он и будет переключаться.


Вот и покажи эту асинхронщину на короутинах. Забудь про MesageBox, TcpStream и тд. Сделай что нибудь внятное, ну хоть Thread.Sleep() если ничего в голову не приходит.

EP>

EP>Вот полный, рабочий пример, показывающий что все эти утверждения от банального незнания/неумения.
EP>Корутина здесь ничего не знает про UI loop, ничего не висит, UI loop работает без всяких чудес, никакой scheduler готовить не надо, трансформация из обычного кода в код на корутине — полностью локальная
EP>Корутины здесь без синтаксического захара, для наглядности. Выше, на примере TcpStream уже показывал как можно убрать весь шум.

Ты еще тридцать раз запости этот же пример. Он работает и без короутин, потому ничего не демонстрирует, вообще.
Re[46]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.06.13 14:22
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Дааа? ) Ну давай протестируем следующий C# код:


Да, именно так.

_>Вопрос: если мы не закроем первый MessageBox, то какое время нам придётся ждать второго?


Это ДРУГАЯ проблема ! Что характерно, она есть и в твоем случае.

void handler()
{ 
   ::MessageBox(); // пошел новый цикл и вся твоя асинхронщина на короутинах встала колом.
}


А вот такой проблемы с async/await нет.
Re[47]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 29.06.13 15:03
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>>>Я показываю пример асинхронного кода, который переписывается на stackful coroutine посредством локальной трансформации.

I>>>А зачем его переписывать если и так все работает ? ПОкажи внятную задачу.
EP>>Без await/async тоже и так всё работает
I>Не работает и даже не компилится, потому что связывание результатов никто не сделает.

Как не работает? То есть по твоему до await'а асинхронного кода вообще не было?

EP>>

EP>>При этом повторяю — нет в короутинах асинхронщины, асинхронщину берет на себя шедулер, который надо еще правильно приготовить, скормить ему набор короутин между которыми он и будет переключаться.

I>Вот и покажи эту асинхронщину на короутинах. Забудь про MesageBox, TcpStream и тд. Сделай что нибудь внятное, ну хоть Thread.Sleep() если ничего в голову не приходит.

Покажи версию без корутин на C++ — я её переделаю на корутины. А то ты опять будешь кричать что это не "асинхронщина".

EP>>Корутина здесь ничего не знает про UI loop, ничего не висит, UI loop работает без всяких чудес, никакой scheduler готовить не надо, трансформация из обычного кода в код на корутине — полностью локальная

I>Ты еще тридцать раз запости этот же пример.

В этом случае я добавил код корутин.

I>Он работает и без короутин, потому ничего не демонстрирует, вообще.


Асинхронный код на C# можно писать без await/async
Re[47]: Что посоветуете как аналог С++
От: alex_public  
Дата: 29.06.13 17:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Это ДРУГАЯ проблема ! Что характерно, она есть и в твоем случае.


Ну так я правильно понял, что она есть и в C#? ))) Тогда какие претензии к тому коду? )

I>А вот такой проблемы с async/await нет.


Ничего не понял. ) Покажи пример с async/await которому пофиг на открытый MessageBox.
Re[48]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.06.13 05:04
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Это ДРУГАЯ проблема ! Что характерно, она есть и в твоем случае.


_>Ну так я правильно понял, что она есть и в C#? ))) Тогда какие претензии к тому коду? )


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

Не в асинхронном коде и не в коде который вызывается из асинхронного и не в коде который вызывает асинхронный, а вообще в любом месте.

То есть, в твоем случае надо тупо запретить делать любые MessageBox и модальные окна.

I>>А вот такой проблемы с async/await нет.


_>Ничего не понял. ) Покажи пример с async/await которому пофиг на открытый MessageBox.


Все что ему нужно — работающий message pump. Откуда он будет запускаться — из Main или MessageBox, абсолютно не важно. А вот в твоем случае надо научить тот цикл что в MessageBox/DoModal делать RunAll, иначе твоя асинхронщина не будет работать.
Re[27]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 30.06.13 22:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:

V>>Но когда они вникают в подробности конкретного участка, поверь, их точно так же интересуют точные типы.


AVK>Отучайся говорить за всех. Лично я первое, что делаю при ковырянии чужого кода — Full Cleanup, который, в числе прочего, заменяет все типы в декларациях на var.


Мало ли, что лично ты делаешь? Например, банальная замена беззнакового целого на знаковое иногда порождает интересные эффекты. Я предпочитаю видеть точные целочисленные типы, хотя бы потому, что они отличаются лишь ограничениями в реализации.
Re[23]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 30.06.13 23:10
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Давай, детка, сделай это на C++.


Потрясающее неумение читать код...

G>Это позволяет таких показателей латентности добиться, что ни одному серверу на C++ не снилось.


Хи.
Re[41]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 01.07.13 00:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Теперь мы пришли к выводу, что надо патчить Message Pump.

I>::MessageBox() — вот эта функция похерит всю твою асинхронность по той простой причине, что запускает message pump и ничего не знает про твой RunAll

Угу, но это зависит от организации асинхронности IO. Если асинхронность сделана на completion routine, то прекрасно будет работать из того же потока. А если на основе completion ports, то в любом случае для асинхронных операций нужен пул потоков (или минимум один дополнительный поток), но в этом случае твои вопросы сразу отпадают — будет обычное неблокирующее перекидывание задач м/у очередями в потоках.

I>Теперь задачка посложнее, представь себе, что у тебя нет доступа к Message Pump, как заставить работать твою асинхронность ?


Курить completion routines. Чудес не бывает. Дотнет "унутре" тоже как-то реализован.
Именно так. В крайнем случае, если где-то древний код использует GUI-loop без реакции на alertable IO, то вешается хук, который перехватывает этот loop.


I>И похоже, что ваша хваленая асинхронность будет дико лагать, т.к. сильно зависит от частоты эвентов в системе и целой кучи других факторов.


Это ты не туда смотришь. Которутины — лишь кубики Лего, из которых можно собрать произвольную модель. Для твоих требований надо прыгать на alertable IO. При том, что это будет несколько лишних строк кода кода... этот код однократен для любых проектов с такой моделью. Кароч, это C++ way, — лепи себе нужную модель. В т.ч. ту, к которой конкртено ты привык, например, как в дотнете.
Re[49]: Что посоветуете как аналог С++
От: alex_public  
Дата: 01.07.13 03:52
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты используешь цикл выборки сообщений для своих целей особо маргинальным способом. Если не дай бог приложение где нибудь покажет MessageBox или модальную форму, твой маргинальный способ резко закончится.


В каком смысле закончится? Как только MessageBox закроется, то всё отработает как положено. И это весьма логично для многих задач. Ну и в любом случае это особенность данной конкретной реализации. Если очень хочется что бы оно работало и внутри messagebox'ов, то можно например завести таймер и вызывать RunAll в его обработчике вместо главного цикла. Будет работать без проблем.

Да, и всё вышеописанное касается исключительно реализации поддерживающей однопоточный режим! Если же сделать реализацию исключительно для многопоточного варианта (как я уже показывал, через std::async), то все эти проблемы вообще полностью пропадают так что будет работать где угодно без всяких таймеров и не трогая главный цикл. Собственно там уже даже этот пул короутин вообще не нужен — можно держать ссылку на самого себя. Просто подобная реализация возможна и в C#, так что обсуждать её было не особо интересно в отличие от однопоточного случая, которым в C# уже хуже... )))
Re[24]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 01.07.13 08:42
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Проблемы там начинаются при вложении этих async, а они обычно вложены друг в друга довольно глубоко. Каждый шаг внешнего автомата вызывает по цепочке кучу шагов внутренних "матрешек". Дешевле уже переключить фибер сразу в нужное место.


Кстати да, хорошее замечание: каждый вызов цепочки stackless coroutine это O(N), а stackful coroutine — O(1).
Re[42]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.07.13 10:52
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Ikemefula, Вы писали:


I>>Теперь мы пришли к выводу, что надо патчить Message Pump.

I>>::MessageBox() — вот эта функция похерит всю твою асинхронность по той простой причине, что запускает message pump и ничего не знает про твой RunAll

V>Угу, но это зависит от организации асинхронности IO.


А ты похоже не читатель — обсуждается предложеный вариант, а не любой. Дальше скипнул — смысла нет. Хочешь показать чего интересного — давай свой код.
Re[50]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.07.13 11:09
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, Ikemefula, Вы писали:


I>>Ты используешь цикл выборки сообщений для своих целей особо маргинальным способом. Если не дай бог приложение где нибудь покажет MessageBox или модальную форму, твой маргинальный способ резко закончится.


_>В каком смысле закончится? Как только MessageBox закроется, то всё отработает как положено. И это весьма логично для многих задач.


Для каких то задач MessageBox не критичен, он долго не висит. А скажем DoModal обычно висит долго. Юзеру не понравится, что пока он раотает в формочке, фоновый процессинг висит.

>Если очень хочется что бы оно работало и внутри messagebox'ов, то можно например завести таймер и вызывать RunAll в его обработчике вместо главного цикла. Будет работать без проблем.


Будет. Только по таймеру внезапно время отклика уменьшается и все преимущества перед stackless сходят на нет.

_>Да, и всё вышеописанное касается исключительно реализации поддерживающей однопоточный режим! Если же сделать реализацию исключительно для многопоточного варианта (как я уже показывал, через std::async), то все эти проблемы вообще полностью пропадают так что будет работать где угодно без всяких таймеров и не трогая главный цикл. Собственно там уже даже этот пул короутин вообще не нужен — можно держать ссылку на самого себя. Просто подобная реализация возможна и в C#, так что обсуждать её было не особо интересно в отличие от однопоточного случая, которым в C# уже хуже... )))


А здесь, как выяснили, нужны все аналоги async/await
Re[28]: Что посоветуете как аналог С++
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 01.07.13 11:33
Оценка:
Здравствуйте, vdimas, Вы писали:

V>>>Но когда они вникают в подробности конкретного участка, поверь, их точно так же интересуют точные типы.

AVK>>Отучайся говорить за всех. Лично я первое, что делаю при ковырянии чужого кода — Full Cleanup, который, в числе прочего, заменяет все типы в декларациях на var.
V>Мало ли, что лично ты делаешь?

Тогда поясни — либо "их" это все таки несколько более узкий круг, чем заявлено, либо я не принадлежу к "более опытным разработчикам".
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[51]: Что посоветуете как аналог С++
От: alex_public  
Дата: 01.07.13 14:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Для каких то задач MessageBox не критичен, он долго не висит. А скажем DoModal обычно висит долго. Юзеру не понравится, что пока он раотает в формочке, фоновый процессинг висит.


Ну собственно говоря "однопоточную асинхронщину" явно не нет смысла применять для организации фоновых процессов. Это скорее средство реорганизации обычного линейного кода. Например в случае сервера (с большим числом соединений, так что удобная техника "по потоку на соединение" уже не подходит) надо писать некий линейный код опрашивающий массив сокетов и что-то там делающий дальше. А с помощью coroutine это полностью переделывается в набор виртуальных потоков. Ну и понятно что в таком случае нет никакого главного ui цикла, а остаётся только цикл while(!AsyncPool.IsEmpty()) AsyncPool.RunAll();.

I>Будет. Только по таймеру внезапно время отклика уменьшается и все преимущества перед stackless сходят на нет.


Да это вообще кривое решение, но оно демонстрирует что в C++ у нас есть десятки их видов на любой вкус — конструируешь сам. В отличие от...

I>А здесь, как выяснили, нужны все аналоги async/await


Ну да, реализация многопоточной асинхронщины что средствами C# (async/await), что средствами C++ (std::async, boost.coroutines) выглядят в итоге практически неотличимо.
Re[52]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.07.13 14:45
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну собственно говоря "однопоточную асинхронщину" явно не нет смысла применять для организации фоновых процессов. Это скорее средство реорганизации обычного линейного кода. Например в случае сервера (с большим числом соединений, так что удобная техника "по потоку на соединение" уже не подходит) надо писать некий линейный код опрашивающий массив сокетов и что-то там делающий дальше. А с помощью coroutine это полностью переделывается в набор виртуальных потоков. Ну и понятно что в таком случае нет никакого главного ui цикла, а остаётся только цикл while(!AsyncPool.IsEmpty()) AsyncPool.RunAll();.


Посмотри в nginx, там как то живут без короутин Для того, что бы комфортно работать с асинхронщиной, нужно добиваться локальности изменений под конкретную задачу, а stackfull короутины дают прямо противоположный результат.

_>Да это вообще кривое решение, но оно демонстрирует что в C++ у нас есть десятки их видов на любой вкус — конструируешь сам. В отличие от...


Ну то есть решение кривое — я об этом и говорю.

I>>А здесь, как выяснили, нужны все аналоги async/await


_>Ну да, реализация многопоточной асинхронщины что средствами C# (async/await), что средствами C++ (std::async, boost.coroutines) выглядят в итоге практически неотличимо.


Теоретически. На практике надо следить руками, чего где надо вызывать и тд.
Re[53]: Что посоветуете как аналог С++
От: alex_public  
Дата: 01.07.13 17:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Посмотри в nginx, там как то живут без короутин Для того, что бы комфортно работать с асинхронщиной, нужно добиваться локальности изменений под конкретную задачу, а stackfull короутины дают прямо противоположный результат.


Конечно без проблем можно и без них. Собственно говоря coroutine — это всего лишь своеобразный синтаксический сахар. Правда очень модный. С его помощью мы можем переписать такой код:
Data1 data1[N];
for(int i=0; i<N; i++) data1[i]=op1();
Data2 data2[N];
for(int i=0; i<N; i++) data2[i]=op2(data1[i]);
Data3 data3[N];
for(int i=0; i<N; i++) data3[i]=op3(data2[i]);

в такой:
for(int i=0; i<N; i++) AsyncPool.Add([]{
    Data1 d1=op1(); yield();
    Data2 d2=op2(d1); yield();
    Data3 d3=op3(d2); yield();
});
while(!AsyncPool.IsEmpty()) AsyncPool.RunAll();.

И при этом реальная последовательность исполнения не изменится — на мой взгляд самое оно для подобных задач. Но именно что для подобных, а не для скачивания файла в фоне от GUI. Для последнего надо во-первых отдельный поток, а во-вторых нафиг не нужен подобный синтаксический сахар — он только запутывает на пустом месте. Так что для скачивания файла в фоне мне и C# async/await сахар тоже совсем не нравится...
Re[43]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 01.07.13 23:25
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Угу, но это зависит от организации асинхронности IO.


I>А ты похоже не читатель — обсуждается предложеный вариант, а не любой.


Это ты не читатель:

Это ты не туда смотришь. Которутины — лишь кубики Лего, из которых можно собрать произвольную модель.


I>Дальше скипнул — смысла нет. Хочешь показать чего интересного — давай свой код.


Дык, самое интересное, — прикладной код, тебе уже показали. Схематичную реализацию такого фреймворка тебе тоже уже показали. Показали с целью продемонстрировать, откуда вызываются короутины. Там должно было уже давно быть понятно даже тому, что первый раз про асинхрнность слышит...

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

В виндах существует минимум 3 модели асинхронности, каждая из которых имеет право на жизнь в своих сценариях. Для GUI-потока наиболее естественно — это completion routines. Для серверного приложения — completion ports. Каждая из моделей специфична, но (!!!) практически не влияет на прикладной код. И в этом прелесть.
Re[54]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 02.07.13 10:51
Оценка:
Здравствуйте, alex_public, Вы писали:

_>в такой:

_>
_>for(int i=0; i<N; i++) AsyncPool.Add([]{
_>    Data1 d1=op1(); yield();
_>    Data2 d2=op2(d1); yield();
_>    Data3 d3=op3(d2); yield();
_>});
_>while(!AsyncPool.IsEmpty()) AsyncPool.RunAll();.
_>


Чем твой yield лучше await в таком случае ?
Re[54]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 02.07.13 12:51
Оценка:
Здравствуйте, alex_public, Вы писали:

_>... Но именно что для подобных, а не для скачивания файла в фоне от GUI. Для последнего надо во-первых отдельный поток,


Кстате, вовсе не надо отдельный поток, если использовать неблокирующий ввод-вывод, либое какие-нить completion routines.
Re: Что посоветуете как аналог С++
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 02.07.13 18:38
Оценка:
Здравствуйте, Grundik2, Вы писали:

G>Хочу поиграться с чем-нибудь, чтобы компилилось сразу в native код. Аналог C++'са, но не слишком экзотическое, малоизвестное или вымирающее. На ум приходит только D и Rust. Что порекомендуете?


Аналогов С++ не существует. И слава богу! :D

Из перечисленных я бы выбрал Go. Rust — слишком долго ждать стабильного релиза, язык сейчас сильно меняется. Go самый стабильный из всех вышеперечисленных, много всякого полезного барахла в стандартной библиотеке, очень приятный и простой язык, message passing + shared memory concurrency, очень клевый и крутой go tool, отличная документация, очень быстрые билды, возможность писать unsafe код, очень простой интероп с сишечкой.
Re[56]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 02.07.13 21:25
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Чем твой yield лучше await в таком случае ?


_>Ну так это оно и есть.))) Только await менее удобный и эффективный.


Где именно потери эффективности ? Где больше удобства ?

_>2.

_>auto r=async(launch::async, []{return CalcSomething();});
_>DoAnother();
_>ProcessResult(r.get());
_>

_>и с циклом сообщений:
_>
_>thread([]{PostMessage(CalcSomething());}).detach();
_>...
_>OnDataMessage(Data d){ProcessResult(d.get<type>());}
_>


И вот что бы не городить такой мусор, придумали async/await.



_>3 Существует такая довольно специфическая вещь как сопроцедуры, позволяющая иметь множественные точки входа во вроде бы линейный код. Реально полезное применение в основном в случае наличия очень большого числа параллельных задач, т.к. реализация подобного через обычные потоки уже весьма неэффективна. Так же может применяться для реализации "генераторов". В силу своей специфичности имеют реализации не во всех языках (реализацию от ОС не рассматриваем). В C++ реализация есть и даже не одна, а много разных. В том числе и наиболее эффективная (stackfull) из всех — Boost.Coroutine. Для C# тоже имеется своя реализация (await), причём встроенная в сам язык, но при этом весьма ограниченная и неэффективная.


Правильно — stackfull короутины нужны именно для кооперативной многозадачности. А ты и EP рассказывали басни что де все шоколадно с асинхронщиной, стоит только насовать короутин куда попало.

await это не короутины, это поддержка асинхронных вычислений. Короутины просто используются для этого.
Ты путаешь два разных инструмента.


Ну и не ясно, как ты эффект меряешь.

_>4. Агрессивные евангелисты C#'а однажды (не так давно кстати) записав пункт 2 с помощью пункта 3 неожиданно "обнаружили" что:

_> — совершён очередной великий прорыв в программирование (гыгы)
_> — естественно не имеющий аналогов в других языках (гыгыгы)
_> — программировать асинхронный код удобнее именно так (ага, как же, только кривую архитектуру плодить)
_> — только теперь люди смогут заниматься настоящим асинхронное программированием (гыгы)

Предлагаешь обсудить твои фантазии ? Где ты видел высказыавния про великий прорыв, не имеющий аналогов и тд и тд ?
Re[46]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 02.07.13 21:34
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Спасибо, капитан ! Я то думал, что короутины дотнета для которых прикручено N апи комбинаторов это кубики лего из которых можно собрать произвольную модель,


V>Увы, нельзя произвольную.


Берешь свои слова обратно что ли или сомневаешься в полноте по тьюрингу того же linq ?

I>>а на самом деле это апи комбинаторов, из которых можно собрать произвольную модель.


V>Только stackless, со всеми торчащими наружу кишками/модификаторами/ограничениями в сценариях и складыванием такого кода в глубокие "матрешки" дергающих друг друга конечных автоматов.


Я пока не увидел внятного примера, что бы кишки никуда не торчали в С++, то async понадобится, то await, то yield.
Что касается упаковывания внутрь фремворка, вот смотри, асинхронный код:

source.pipe(destination)


Никаких кишок не торчит, а код асинхронный. Надо полагать раз кишки не торчат, то такой результат и есть самая что ни есть круть на С++ ? А если я скажу, что это C# или джаваскрипт, что будешь делать ?

I>>Мне нужен пример не любых короутин, а stackfull. E.P. сделал много заявлений, но кроме синхронного кода ничего и не показал. Если бы alex_public не прикрыл его с фланга, был бы провал.


V>Нет там никакого синхронного кода.


Там все синхронное. Вообще все. Если короутины вызывают друг друга по кругу, вовсе не значит, что там чтото асинхронное появилось.

>Ты неоднократно прямо спросил кто и откуда вызывает короутины — тебе схематично показали,


Глаза раскрой — убираешь короутины и код продолжает работать. Это значит, что код тупо синхронный.

I>>Разумеется, а то первый же пример stackfull замораживал UI


V>Если ввод-вывод неблокирующий, то он никак не замораживает UI


Ты лучше возьми первый этот пример и покажи, как это он UI незамораживает.

I>>Правильно и все три работают без короутин.


V>Не надо валить всё в кучу. ))


Разговор начался с того, как все шоколадно в С++ благодаря особым короутинам.

V>Это модели диспетчеризации событий/задач, отличающиеся используемым низлежащим АПИ ОС. А то, что некая задача является "короутиной", диспетчеру должно быть вообще до фени. Пусть выгребает из очереди некий абстрактный Task и запускает его. Короутина — это уже нечто более высокоуровневое, это трюк для выпрямления прикладного автоматного/событийного кода в якобы линейный.


Правильно — якобы. Кишки будут торчать и там и там, вопрос только в наличии поддержки компилятора.
Re[48]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 03.07.13 19:40
Оценка:
Здравствуйте, vdimas, Вы писали:

V>>>Увы, нельзя произвольную.

I>>Берешь свои слова обратно что ли или сомневаешься в полноте по тьюрингу того же linq ?

V>Конечно не беру, если мы все еще об встроенном async. Ручками я тебе что хошь накручу, ес-но, благо интероп и ансейф дотнета в "шаговой доступности".


То есть, не согласен, но ручками можно накрутить что угодно ? Не входит ли в это что угодно "произвольная модель" или как ?

I>>Я пока не увидел внятного примера, что бы кишки никуда не торчали в С++, то async понадобится, то await, то yield.


V>В сигнатуре ниче не торчит. Нет ограничений на уровне контрактов.


И это неправильно. В сигнатуре должно быть указание, как можно вызывать метод и чего от этого можно ожидать.

V>В том-то и дело, что под дотнетный async надо было разработать еще один фреймворк, помимо имеющегося под обычные коллекции, Rx или Linq + связку с этими имеющимися


А как ты хотел, что бы появились плюшки в языке и фремворки внезапно стали их поддерживать ?

I>>Никаких кишок не торчит, а код асинхронный.


V>Вот эта строчка "отложения" операции, которую ты показал, она вообще ни о чем в данном споре.


Ну ведь говорили что должны торчать какие то кишки. А тут ничего не торчит.

V>Чтобы кишки торчали, нужен контракт с торчащими кишками. Я не увидел там контракта.


Ну да, а у меня, прикинь, никакого async не торчит, вот незадача то.

V>Блин, опять ты все в кучу!!! Короутины НЕ НУЖНЫ для асинхронности.


Я уже десятый раз об этом и говорю.

V>Вообще. Они нужны для выпрямления событийного кода в якобы линейный.


"якобы". О том, что это якобы как раз и должна сообщать сигнатура.

>Ты лучше возьми первый этот пример и покажи, как это он UI незамораживает.


V>Тут было много примеров, я ворвался посреди спора, кинь точной ссылкой плиз.


Ищи по getline

I>>Разговор начался с того, как все шоколадно в С++ благодаря особым короутинам.


V>Конечно, ведь начали хвалить async в C#, поэтому речь зашла о короутинах в C++. В дотнете отродясь была асинхронность и без всякого async. Ты просто пытаешься путать синт. сахар с принципом работы.


Вообще говоря искали альтернативы С++, потому резонно возник вопрос про асинхронщину.

I>>Правильно — якобы. Кишки будут торчать и там и там, вопрос только в наличии поддержки компилятора.


V>Да вот, увы, сигнатура await торчит так уж торчит. Да и вообще. Весь спор можно было сворачивать сразу после поста о stackless/stackfull, всё и так понятно. Две модели, два подхода.


Сворачивайся.
Re[58]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 03.07.13 19:47
Оценка:
Здравствуйте, alex_public, Вы писали:

_>По эффективности: у C# реализации будет O(N) по стеку, вместо O(1)


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

_>По удобству: в C# реализации надо модифицировать код (как минимум расставлять async) на всех уровнях стека.


Модифицировать код надо там, где тебе нужно ожидание. Тебя это пугает ?

I>>И вот что бы не городить такой мусор, придумали async/await.

_>Нуу а на мой взгляд это async/await мусор, т.к. ведёт к кривой архитектуре.

Кривая архитектура, это когда переходы непойми где делаются. А когда код легко майнтейнить, это хорошая архитектура. async упрощает майнтенанс.

_>Причём эта реализация в десяток строк ещё и заметно эффективнее (фирменный знак C++) C#'ой по накладным расходам. Вот такие дела.


Эффективность нужно мерять в конкретной задаче, а не в синтетике. Если реальная задача это будет чтото навроде скачивания, работы с файловой системой и тд, то все твои эффективности ничего не стоят.

_>Это была ирония, но она не особо отличалась от настроя некоторых товарищей в этой темке. Ну и вообще для агрессивных евангелистов C# это обычно дело. Помнится до async/await у нас был прорыв с LINQ, а перед этим ещё что-то (а ну да, DLL hell же)...


Linq это действительно прорыв. Главное не путать linq c query comprehension.
Re[59]: Что посоветуете как аналог С++
От: alex_public  
Дата: 03.07.13 21:15
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Эффективность нужно мерять в конкретной задаче, а не в синтетике. Если реальная задача это будет чтото навроде скачивания, работы с файловой системой и тд, то все твои эффективности ничего не стоят.


Да, правильно. Если бы для достижений этой эффективности надо было приложить усилия, то делать это вне реального кода под профайлером было бы глупо. Но весь фокус заключается в том, что делая этот пример я вообще не думал об эффективности, а реализовал именно самый простой и удобный способ. А он при этом автоматически стал ещё и эффективнее других — это как раз и есть классический "C++ стиль". )))

I>Linq это действительно прорыв. Главное не путать linq c query comprehension.


Гыгыгы

Ну разве что для людей считающих SQL идеалом DSL'ей для работы с коллекциями. )))
Re[49]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 04.07.13 12:48
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Конечно не беру, если мы все еще об встроенном async. Ручками я тебе что хошь накручу, ес-но, благо интероп и ансейф дотнета в "шаговой доступности".

I>То есть, не согласен, но ручками можно накрутить что угодно ? Не входит ли в это что угодно "произвольная модель" или как ?

Входит, ес-но, но поддержка её ср-вами языка — нет.


I>>>Я пока не увидел внятного примера, что бы кишки никуда не торчали в С++, то async понадобится, то await, то yield.


V>>В сигнатуре ниче не торчит. Нет ограничений на уровне контрактов.


I>И это неправильно. В сигнатуре должно быть указание, как можно вызывать метод и чего от этого можно ожидать.


Да никак. Обычно вызывай и все. Это именно настоящее "выпрямление" кода. Легковесная многозадачность, где ВНУТРИ метода стоят хинты, когда переключать задачу, как в виндах 3.x.

С т.з. вызывающего метода это обычный синхронный код, а вся асинхронность сугубо внешняя, как внешим является переключение потоков ОС по отношению к обычному коду на C#.


V>>В том-то и дело, что под дотнетный async надо было разработать еще один фреймворк, помимо имеющегося под обычные коллекции, Rx или Linq + связку с этими имеющимися

I>А как ты хотел, что бы появились плюшки в языке и фремворки внезапно стали их поддерживать ?

Да. Программы для виндов 3.х прекрасно работали на win95, но уже с нормальной многозадачностью.

V>>Вот эта строчка "отложения" операции, которую ты показал, она вообще ни о чем в данном споре.

I>Ну ведь говорили что должны торчать какие то кишки. А тут ничего не торчит.

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

V>>Чтобы кишки торчали, нужен контракт с торчащими кишками. Я не увидел там контракта.

I>Ну да, а у меня, прикинь, никакого async не торчит, вот незадача то.

Торчит в том месте, где надо требует контракт. Давай полные сигнатуры и мы проверим, подходят ли типы.

V>>Блин, опять ты все в кучу!!! Короутины НЕ НУЖНЫ для асинхронности.

I>Я уже десятый раз об этом и говорю.

Дык, async еще более не нужен хотя бы потому, что на порядки менее удобный.


V>>Вообще. Они нужны для выпрямления событийного кода в якобы линейный.

I>"якобы". О том, что это якобы как раз и должна сообщать сигнатура.

Не должна. Просто так сделано в конкретном языке. Но это было не обязательно.


>>Ты лучше возьми первый этот пример и покажи, как это он UI незамораживает.


V>>Тут было много примеров, я ворвался посреди спора, кинь точной ссылкой плиз.

I>Ищи по getline

Насколько я понял, там потом показали обертку над стандартной ф-ий с неблокирующими ветками.


I>>>Разговор начался с того, как все шоколадно в С++ благодаря особым короутинам.


V>>Конечно, ведь начали хвалить async в C#, поэтому речь зашла о короутинах в C++. В дотнете отродясь была асинхронность и без всякого async. Ты просто пытаешься путать синт. сахар с принципом работы.


I>Вообще говоря искали альтернативы С++, потому резонно возник вопрос про асинхронщину.


Но с ней в С++ всегда было лучше, чем в других ООП языках, именно из-за многообразия функциональных типов и именно из-за того, что вся асинхронщина, которая "в лоб" (без asyc), идет как IoC, в котором функциональный подход заруливает ООП. А с короутинами еще проще...

Но кста, есть либы с реализацией короутин-автоматов наподобие async. Единственно что, раньше переменные из замыканий надо было явно располагать в объекте-контексте, сейчас, уверен, появятся новые либы на плюсах, которые избавят от такого приседания.
Re[60]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 13:52
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Эффективность нужно мерять в конкретной задаче, а не в синтетике. Если реальная задача это будет чтото навроде скачивания, работы с файловой системой и тд, то все твои эффективности ничего не стоят.


_>Да, правильно. Если бы для достижений этой эффективности надо было приложить усилия, то делать это вне реального кода под профайлером было бы глупо. Но весь фокус заключается в том, что делая этот пример я вообще не думал об эффективности, а реализовал именно самый простой и удобный способ. А он при этом автоматически стал ещё и эффективнее других — это как раз и есть классический "C++ стиль". )))


Мне интересно, как ты проверил, что он самый эффективный ? Ты скажешь наконец, что ты брал в качестве затрат и какой у тебя эффект, что бы можно было проверить это руками ?

I>>Linq это действительно прорыв. Главное не путать linq c query comprehension.


_>Ну разве что для людей считающих SQL идеалом DSL'ей для работы с коллекциями. )))


linq он нужен НЕ для работы с коллекциями. Коллекции — побочный эффект. Основная его фишка в том, что все relational-like структуры данных можно обрабатывать одним кодом независимо от источника — разные БД, XML, поток событий, Dataset/DataTable и даже коллекции, если они хранят relational-like данные и тд.
Re[50]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 14:04
Оценка:
Здравствуйте, vdimas, Вы писали:

V>>>Конечно не беру, если мы все еще об встроенном async. Ручками я тебе что хошь накручу, ес-но, благо интероп и ансейф дотнета в "шаговой доступности".

I>>То есть, не согласен, но ручками можно накрутить что угодно ? Не входит ли в это что угодно "произвольная модель" или как ?

V>Входит, ес-но, но поддержка её ср-вами языка — нет.


И в С++, что характерно, точно так же — скажем те же короутины буста сделаны самым честным хаком.

I>>И это неправильно. В сигнатуре должно быть указание, как можно вызывать метод и чего от этого можно ожидать.


V>Да никак. Обычно вызывай и все. Это именно настоящее "выпрямление" кода. Легковесная многозадачность, где ВНУТРИ метода стоят хинты, когда переключать задачу, как в виндах 3.x.


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

V>С т.з. вызывающего метода это обычный синхронный код, а вся асинхронность сугубо внешняя, как внешим является переключение потоков ОС по отношению к обычному коду на C#.


То есть, все функции будут синхронными с т.з. вызывающего кода, что внезапно останавливает message pump.

V>>>В том-то и дело, что под дотнетный async надо было разработать еще один фреймворк, помимо имеющегося под обычные коллекции, Rx или Linq + связку с этими имеющимися

I>>А как ты хотел, что бы появились плюшки в языке и фремворки внезапно стали их поддерживать ?

V>Да. Программы для виндов 3.х прекрасно работали на win95, но уже с нормальной многозадачностью.


Не понял идею. Речь про изменения в языке и использование этих изменений во фремворках. Или винда вдруг стала каким то языком ?

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


см "функция вдруг сама узнает, ожидаю ли я её результат"

I>>Ну да, а у меня, прикинь, никакого async не торчит, вот незадача то.


V>Торчит в том месте, где надо требует контракт. Давай полные сигнатуры и мы проверим, подходят ли типы.


Pipeline pipe(Pipeline p)


V>Дык, async еще более не нужен хотя бы потому, что на порядки менее удобный.


"функция вдруг сама узнает, ожидаю ли я её результат"

I>>"якобы". О том, что это якобы как раз и должна сообщать сигнатура.


V>Не должна. Просто так сделано в конкретном языке. Но это было не обязательно.


"функция вдруг сама узнает, ожидаю ли я её результат"

V>Насколько я понял, там потом показали обертку над стандартной ф-ий с неблокирующими ветками.


Там были блокирующие вызовы.

I>>Вообще говоря искали альтернативы С++, потому резонно возник вопрос про асинхронщину.


V>Но с ней в С++ всегда было лучше, чем в других ООП языках, именно из-за многообразия функциональных типов и именно из-за того, что вся асинхронщина, которая "в лоб" (без asyc), идет как IoC, в котором функциональный подход заруливает ООП. А с короутинами еще проще...


Надо понимать async/await появились как ответ на одскульную асинхронщину.
Re[61]: Что посоветуете как аналог С++
От: alex_public  
Дата: 04.07.13 14:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Мне интересно, как ты проверил, что он самый эффективный ? Ты скажешь наконец, что ты брал в качестве затрат и какой у тебя эффект, что бы можно было проверить это руками ?


Нуу смотри. Предположим что у нас есть функция, которая делает какую-то полезную работу. Далее, у нас есть один вариант кода, который просто берёт и вызывает её. И есть второй вариант кода, который делает 20 вложенных вызовов функций-обёрток (причём не в исходнике, где это ещё может компенсировать компилятор, а в бинарнике), в самом низу которых и лежит наша полезная. Как ты считаешь, при таком раскладе я могу сказать, что первый вариант более эффективный чем второй, или же мне надо ещё пойти и поизмерять всё точно? )))

I>linq он нужен НЕ для работы с коллекциями. Коллекции — побочный эффект. Основная его фишка в том, что все relational-like структуры данных можно обрабатывать одним кодом независимо от источника — разные БД, XML, поток событий, Dataset/DataTable и даже коллекции, если они хранят relational-like данные и тд.


Под коллекциями я и подразумевал наборы данных, а не какие-то конкретные классы из C#. ) Только вот это не отменяет того, что набор команд SQL'я скажем так далеко не самый удобный.
Re[57]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 04.07.13 15:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>await это не короутины, это поддержка асинхронных вычислений. Короутины просто используются для этого.


Гы, наоборот, Это просто ср-во реализации короутин.
Без проблем использовать await без всякой надуманной асинхронщины по прямому назначению — для того, чтобы наплодить легковесных безстековых короутин для той самой кооперативной многозадачности.


I>Ты путаешь два разных инструмента.


Еще раз. Асинхронность не требует короутин. Т.е. асинхронность не требует ни async в C#, ни короутины из буста или еще какой либы. Короутинам, в свою очередь, плевать на то, как называется код, который их использует. Это независимые трюки. Прибили их гвоздями друг к другу только в C#. Но и то, прибили не очень сильно, а только для невнимательных. Ты ведь можешь крутить почти такую же точно кооперативную многозадачность на своих async, обвинениями в которой ты уже прямо закидал короутины из буста. Почему почти такую же — потому что менее эффективную при вложенных вызовах и при разыменовании переменных в цепочке контекстов/замыканий из кучи при их вложенности. Ну и торчащие ослиные уши в сигнатурах доставляют.

Ну и названия ключевых слов вводят тебя в заблуждение настолько, что такое заблуждение преодолеть фактически нереально. )))


I>Предлагаешь обсудить твои фантазии ? Где ты видел высказыавния про великий прорыв, не имеющий аналогов и тд и тд ?


Ну так ты хвалишь заведомо более слабый инструмент, обвиняя более сильный в том, что это "просто кооперативная многозадачность". На C# async/await можно сэмулировать почти такую же. Только хуже. )))
Re[58]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 15:12
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>await это не короутины, это поддержка асинхронных вычислений. Короутины просто используются для этого.


V>Гы, наоборот, Это просто ср-во реализации короутин.


Это именно поддержка асинхронщины, т.к. короутины есть и без этого.

V>Без проблем использовать await без всякой надуманной асинхронщины по прямому назначению — для того, чтобы наплодить легковесных безстековых короутин для той самой кооперативной многозадачности.


Можно и это неосновное назначение.

V>Еще раз. Асинхронность не требует короутин.


Спасибо, капитан, я об этого говорил уже раз пятнадцать.

>Т.е. асинхронность не требует ни async в C#, ни короутины из буста или еще какой либы. Короутинам, в свою очередь, плевать на то, как называется код, который их использует. Это независимые трюки.


Ты и дальше будешь меня цитировать ?

V>Ну и названия ключевых слов вводят тебя в заблуждение настолько, что такое заблуждение преодолеть фактически нереально. )))


Я собтсвенно говорил про разницу между двумя вещами.

V>Ну так ты хвалишь заведомо более слабый инструмент, обвиняя более сильный в том, что это "просто кооперативная многозадачность". На C# async/await можно сэмулировать почти такую же. Только хуже. )))


Кооперативная многозадачность в чистом виде нужна чуть менее чем никогда.
Re[62]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 15:22
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Мне интересно, как ты проверил, что он самый эффективный ? Ты скажешь наконец, что ты брал в качестве затрат и какой у тебя эффект, что бы можно было проверить это руками ?


_>Нуу смотри. Предположим что у нас есть функция, которая делает какую-то полезную работу. Далее, у нас есть один вариант кода, который просто берёт и вызывает её. И есть второй вариант кода, который делает 20 вложенных вызовов функций-обёрток (причём не в исходнике, где это ещё может компенсировать компилятор, а в бинарнике), в самом низу которых и лежит наша полезная. Как ты считаешь, при таком раскладе я могу сказать, что первый вариант более эффективный чем второй, или же мне надо ещё пойти и поизмерять всё точно? )))


То есть, эффективность меряем в символах кода ? Если так, то очевидно, что вариант с C# наиболее эффективный благодаря поддержке компилятора.

I>>linq он нужен НЕ для работы с коллекциями. Коллекции — побочный эффект. Основная его фишка в том, что все relational-like структуры данных можно обрабатывать одним кодом независимо от источника — разные БД, XML, поток событий, Dataset/DataTable и даже коллекции, если они хранят relational-like данные и тд.


_>Под коллекциями я и подразумевал наборы данных, а не какие-то конкретные классы из C#. ) Только вот это не отменяет того, что набор команд SQL'я скажем так далеко не самый удобный.


Для каких операций он не самый удобный ? для relational-like он практически самое лучше из того, что есть. ДЛя noSql он естесвенно не будет таким удобным, скажем для graph database нужна поддержка математики навроде bfs, dfs и тд.
Ты ошибочно понимаешь linq как мега универсальный подход. Он нужен для relational-like операций, данных и тд.
Re[59]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 04.07.13 15:45
Оценка:
Здравствуйте, Ikemefula, Вы писали:

_>>По эффективности: у C# реализации будет O(N) по стеку, вместо O(1)

I>Это копейки, потому что в асинхронщине основные издержки на порядки больше.

С какой радости?
Если у тебя десяток тыщ серверных соединений, то диспетчеризация — это фактически основные издержки.


I>Кривая архитектура, это когда переходы непойми где делаются. А когда код легко майнтейнить, это хорошая архитектура. async упрощает майнтенанс.


Ну ты же как-то поддерживаешь обычный код? Тебя же не смущает, что переключение потоков в многопоточной ОС происходит "где-то" за пределами твоей программы? Тут аналогично.
Re[63]: Что посоветуете как аналог С++
От: alex_public  
Дата: 04.07.13 16:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>То есть, эффективность меряем в символах кода ? Если так, то очевидно, что вариант с C# наиболее эффективный благодаря поддержке компилятора.


Я же вроде там чётко написал что "не в исходнике". Так что речь грубо говоря о количестве процессорных инструкций затраченных на достижение одной и той же цели.

I>Для каких операций он не самый удобный ? для relational-like он практически самое лучше из того, что есть. ДЛя noSql он естесвенно не будет таким удобным, скажем для graph database нужна поддержка математики навроде bfs, dfs и тд.

I>Ты ошибочно понимаешь linq как мега универсальный подход. Он нужен для relational-like операций, данных и тд.

Нуу про нетабличные данные то я вообще молчу. ))) Но и для табличных "самое лучше что есть" звучит очень забавно, особенно с учётом того, что SQL создавался не для программистов.
Re[60]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 16:25
Оценка:
Здравствуйте, vdimas, Вы писали:

_>>>По эффективности: у C# реализации будет O(N) по стеку, вместо O(1)

I>>Это копейки, потому что в асинхронщине основные издержки на порядки больше.

V>С какой радости?

V>Если у тебя десяток тыщ серверных соединений, то диспетчеризация — это фактически основные издержки.

:faceplam:

Обработка IO completion уже займет порядка на три-четыре больше затрат. Для сравнения, один поток в nginx обрабатывает всего 1024 соединения. Ядро современного процессора делает делает примерно 5млрд операций в секунду. Обслуживание на async-await займет в худшем случае 1000-2000 тактов процессора. Это вообще ни о чем. Потому даже если С++ версия будет отрабатывать за 1 такт, то экономии нет и быть не может.

I>>Кривая архитектура, это когда переходы непойми где делаются. А когда код легко майнтейнить, это хорошая архитектура. async упрощает майнтенанс.

V>Ну ты же как-то поддерживаешь обычный код? Тебя же не смущает, что переключение потоков в многопоточной ОС происходит "где-то" за пределами твоей программы? Тут аналогично.

Да вот как то смущает ибо надо использовать всевозможные схемы синхронизации. А теперь ты хочешь получить на ровном месте еще одну такую же по сложности проблему.
Re[64]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 16:36
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Я же вроде там чётко написал что "не в исходнике". Так что речь грубо говоря о количестве процессорных инструкций затраченных на достижение одной и той же цели.


Это ни о чем. Нужна конкретная задача. Скажем тормозного джаваскрипта хватает для задач UI. Все твои эффективности в С++ дают нулевой выхлоп, если говорить про эту задачу. Или так — ядро проца выполняет около 5 млрд инструкций, а nginx почему то работает всего с 1024 коннектам на один поток.
Скажем в реалтайм процессинге проблемы уже давно не в скорости линейного кода, ибо полно реалтаймных приложений для всяких фондовых бирж которые работают джаве.
Вопрос так и остался открытым — где же будет та самая эффективность про которую ты говоришь.

I>>Для каких операций он не самый удобный ? для relational-like он практически самое лучше из того, что есть. ДЛя noSql он естесвенно не будет таким удобным, скажем для graph database нужна поддержка математики навроде bfs, dfs и тд.

I>>Ты ошибочно понимаешь linq как мега универсальный подход. Он нужен для relational-like операций, данных и тд.

_>Нуу про нетабличные данные то я вообще молчу. ))) Но и для табличных "самое лучше что есть" звучит очень забавно, особенно с учётом того, что SQL создавался не для программистов.


Ну стало быть ты знаешь хороший способ, который гораздо лучше с этим справляется и при этом доступен как минимум всей аудитории C# девелоперов.
Теоретичеки можно заставить людей знать на раз теорию категорий и на этой основе строить апи для обработки данных. Реально это утопия, ибо теорию категорий знают единицы и следовательно такой способ недоступен всей аудитории.
Re[61]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 04.07.13 17:48
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Обработка IO completion уже займет порядка на три-четыре больше затрат.


Тебя обманули. Унутре там lock-free структуры, поэтому постановка задач в очередь в ядре почти бесплатная, а выгребать можно через GetQueuedCompletionStatusEx все накопившиеся задачи за раз и диспетчить их тоже забесплатно фактически. ТАм основная нагрузка собсно вызов ядерных ф-ий, поэтому уменьшение этих вызовов в пересчете на операцию дает буст.

I>Для сравнения, один поток в nginx обрабатывает всего 1024 соединения.


Сравнения с чем?

I>Обслуживание на async-await займет в худшем случае 1000-2000 тактов процессора. Это вообще ни о чем.


Это зависит от частоты событий. Раз в секунду — ни о чем... Под сотню тыщ раз в секунду — уже что-то.

I>Потому даже если С++ версия будет отрабатывать за 1 такт, то экономии нет и быть не может.


Смешно.


I>>>Кривая архитектура, это когда переходы непойми где делаются. А когда код легко майнтейнить, это хорошая архитектура. async упрощает майнтенанс.

V>>Ну ты же как-то поддерживаешь обычный код? Тебя же не смущает, что переключение потоков в многопоточной ОС происходит "где-то" за пределами твоей программы? Тут аналогично.
I>Да вот как то смущает ибо надо использовать всевозможные схемы синхронизации. А теперь ты хочешь получить на ровном месте еще одну такую же по сложности проблему.

Проще намного. Если несколько твоих фиберов лезут в одну и ту же переменную из одного и того же аппаратного потока, то никакая синхронизация не нужна. Ведь у нас на самом деле не неуправляемое переключение "потоков", а детерминированное. Получить такие же гарантии на async/await нереально. )) В общем случае нет гарантии, из какого потока что вызывается.
Re[59]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 04.07.13 18:01
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Без проблем использовать await без всякой надуманной асинхронщины по прямому назначению — для того, чтобы наплодить легковесных безстековых короутин для той самой кооперативной многозадачности.

I>Можно и это неосновное назначение.

У трюка не может быть другого назначения, кроме его принципа действия. ))
Характерно, что в дотнете, из-за привязки к "назначению", один и тот же трюк сделали дважды: yield для коллекций и await для короутин. И то и то идентичные короутины на генерируемом автомате с той разницей, что в последнем случае await равен yield, возвращающему void.

Ну и с вложением енумераторов у исходного yield не ахти, зато await это умеет изкаробки. Вот и вся разница. Тупо, не правда ли? Как я вижу на этом форуме, вводит хомячков в дикое заблуждение.


V>>Ну и названия ключевых слов вводят тебя в заблуждение настолько, что такое заблуждение преодолеть фактически нереально. )))

I>Я собтсвенно говорил про разницу между двумя вещами.

Если ты действительно это говорил, то ты споришь сам с собой уже. Короутины из буста и async/await — это похожие инструменты, даже работают практически одинаково за тем исключением, что в async/await потоки исполнения не настоящие, а эмулируемые через конечные автоматы.


V>>Ну так ты хвалишь заведомо более слабый инструмент, обвиняя более сильный в том, что это "просто кооперативная многозадачность". На C# async/await можно сэмулировать почти такую же. Только хуже. )))

I>Кооперативная многозадачность в чистом виде нужна чуть менее чем никогда.

Разве? )))
Как раз диспетчеризация событий в одном потоке на некоем completion port — это кооперативная многозадачность в незамутненном чистом виде. Про GUI loop даже и упоминать нелепо, ты сам его раз 100 упомянул уже.
Re[62]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 18:20
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Тебя обманули. Унутре там lock-free структуры, поэтому постановка задач в очередь в ядре почти бесплатная, а выгребать можно через GetQueuedCompletionStatusEx все накопившиеся задачи за раз и диспетчить их тоже забесплатно фактически. ТАм основная нагрузка собсно вызов ядерных ф-ий, поэтому уменьшение этих вызовов в пересчете на операцию дает буст.


И все это бесплатное почемуто может выдать только 1024 коннекта, ага.

I>>Для сравнения, один поток в nginx обрабатывает всего 1024 соединения.

V>Сравнения с чем?

С издержками на async/await.

I>>Обслуживание на async-await займет в худшем случае 1000-2000 тактов процессора. Это вообще ни о чем.

V>Это зависит от частоты событий. Раз в секунду — ни о чем... Под сотню тыщ раз в секунду — уже что-то.

Даже так это <5% от того, что может одно ядро.

I>>Потому даже если С++ версия будет отрабатывать за 1 такт, то экономии нет и быть не может.

V>Смешно.

V>Проще намного. Если несколько твоих фиберов лезут в одну и ту же переменную из одного и того же аппаратного потока, то никакая синхронизация не нужна. Ведь у нас на самом деле не неуправляемое переключение "потоков", а детерминированное.


Гонки, голодание никуда не деваются. Все как было, так и осталось. Не ясно, как ты дашь какие то гарантии.

>Получить такие же гарантии на async/await нереально. )) В общем случае нет гарантии, из какого потока что вызывается.


Как и в С++
Re[60]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 18:26
Оценка:
Здравствуйте, vdimas, Вы писали:

V>>>Без проблем использовать await без всякой надуманной асинхронщины по прямому назначению — для того, чтобы наплодить легковесных безстековых короутин для той самой кооперативной многозадачности.

I>>Можно и это неосновное назначение.

V>У трюка не может быть другого назначения, кроме его принципа действия. ))


Ты путаешь короутину с конкретным вариантом её использования. Скажем унутре это гораздо больше похоже на continuation.

V>Характерно, что в дотнете, из-за привязки к "назначению", один и тот же трюк сделали дважды: yield для коллекций и await для короутин. И то и то идентичные короутины на генерируемом автомате с той разницей, что в последнем случае await равен yield, возвращающему void.


yield и есть короутины, это никакие не коллекции. await — это уже решение для асинхронщины.

V>Если ты действительно это говорил, то ты споришь сам с собой уже. Короутины из буста и async/await — это похожие инструменты, даже работают практически одинаково за тем исключением, что в async/await потоки исполнения не настоящие, а эмулируемые через конечные автоматы.


Спасибо, капитан, скажи наконец уже хоть что нибудь, чего я до твоего пришествия не повторил хотя бы дважды.

I>>Кооперативная многозадачность в чистом виде нужна чуть менее чем никогда.


V>Разве? )))

V>Как раз диспетчеризация событий в одном потоке на некоем completion port — это кооперативная многозадачность в незамутненном чистом виде. Про GUI loop даже и упоминать нелепо, ты сам его раз 100 упомянул уже.

И практически все нативные реализации которые используют completion port не используют короутины.
Re[51]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 04.07.13 18:53
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Входит, ес-но, но поддержка её ср-вами языка — нет.

I>И в С++, что характерно, точно так же — скажем те же короутины буста сделаны самым честным хаком.

Язык позволяет. ))


V>>Да никак. Обычно вызывай и все. Это именно настоящее "выпрямление" кода. Легковесная многозадачность, где ВНУТРИ метода стоят хинты, когда переключать задачу, как в виндах 3.x.

I>Ну ка, подробнее, что же за фокус такой, ты ни много ни мало утверждаешь, функция вдруг сама узнает, ожидаю ли я её результат и в зависимости от этого решит как делать процессинг ?

Какая ф-ий что узнает? Там просто в теле ф-ии есть хинты, когда забирать у фибера ресурсы и отдавать следующему. Или у тебя вопрос про шедуллинг, т.е. вопрос про управление очередью фиберов? Шедуллинг делается на уровне задач, требующих ожидания, т.е. на уровне поддержки задач ввода-вывода. Остальное пляшет оттуда. Собсно, кооперативная многозадачность на операция ввода-вывода в Win 3.x тому пример.


V>>С т.з. вызывающего метода это обычный синхронный код, а вся асинхронность сугубо внешняя, как внешим является переключение потоков ОС по отношению к обычному коду на C#.

I>То есть, все функции будут синхронными с т.з. вызывающего кода, что внезапно останавливает message pump.

Оп-па...
Твой message pump вызывает не ф-ии, а короутины, т.е. передает управление потокам. Это не есть вызов ф-ии.

V>>Да. Программы для виндов 3.х прекрасно работали на win95, но уже с нормальной многозадачностью.

I>Не понял идею. Речь про изменения в языке и использование этих изменений во фремворках. Или винда вдруг стала каким то языком ?

Да нет. Просто те же самые проги, которые раньше работали на основе кооперативной ОС, прекрасно работают в многозадачной. Сейчас ты работаешь в многозадачной, и у тебя проблем с поддержкой обычного кода нет. Вот и в "многозадачной ОС" проблем не было, если не делать 10 GOTO 10.


I>см "функция вдруг сама узнает, ожидаю ли я её результат"


Смотрел. Улыбнуло. Ф-ия должна делать некий yield next (твой await), если текущее состояние внешнего мира вынуждает её крутиться в 10 GOTO 10. А подробности этого "кручения" зависят от низлежащей ОС, от предоставляемых ср-в сигнализации готовности ввода/вывода.

Т.е., конечно должен быть набор библиотек IO, на основекоторых написан твой код. Все эти подробности с yield next должны быть упрятаны в эти либы, а твой прикладной код будет уже как простой линейный код.


V>>Дык, async еще более не нужен хотя бы потому, что на порядки менее удобный.

I>"функция вдруг сама узнает, ожидаю ли я её результат"

Я уже понял, что ты ничего не понял.)

V>>Но с ней в С++ всегда было лучше, чем в других ООП языках, именно из-за многообразия функциональных типов и именно из-за того, что вся асинхронщина, которая "в лоб" (без asyc), идет как IoC, в котором функциональный подход заруливает ООП. А с короутинами еще проще...


I>Надо понимать async/await появились как ответ на одскульную асинхронщину.


Ес-но. Так же как подобные либы на плюсах задолго до. (а их полно)
Просто язык позволяет делать многое в рамках всё того же самого языка.
Re[63]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 04.07.13 19:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Для сравнения, один поток в nginx обрабатывает всего 1024 соединения.

V>>Сравнения с чем?
I>С издержками на async/await.

Нашел с чем сравнить.


I>>>Обслуживание на async-await займет в худшем случае 1000-2000 тактов процессора. Это вообще ни о чем.

V>>Это зависит от частоты событий. Раз в секунду — ни о чем... Под сотню тыщ раз в секунду — уже что-то.

I>Даже так это <5% от того, что может одно ядро.


Да не все так просто. Дело не только в кол-ве тактов, но и в проходах по памяти. В async/await мы имеем графы наверченных друг на друга автоматов в куче и проход по этому графу при каждом шаге. Лишние косвенности каждый раз, а косвенность по внешней памяти обычно стоит намного больше тактов.


V>>Проще намного. Если несколько твоих фиберов лезут в одну и ту же переменную из одного и того же аппаратного потока, то никакая синхронизация не нужна. Ведь у нас на самом деле не неуправляемое переключение "потоков", а детерминированное.

I>Гонки, голодание никуда не деваются. Все как было, так и осталось. Не ясно, как ты дашь какие то гарантии.

При отсутствии конкуренции за ресурсы нет ни гонок, ни голоданий.


>>Получить такие же гарантии на async/await нереально. )) В общем случае нет гарантии, из какого потока что вызывается.

I>Как и в С++

Дудки. В С++ ты управляешь ситуацией — располагай легкие потоки в аппаратных как угодно. Т.е. ты имеешь возможность решать прикладные задачи через свою диспетчеризацию.
Re[65]: Что посоветуете как аналог С++
От: alex_public  
Дата: 04.07.13 20:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Это ни о чем. Нужна конкретная задача. Скажем тормозного джаваскрипта хватает для задач UI. Все твои эффективности в С++ дают нулевой выхлоп, если говорить про эту задачу. Или так — ядро проца выполняет около 5 млрд инструкций, а nginx почему то работает всего с 1024 коннектам на один поток.

I>Скажем в реалтайм процессинге проблемы уже давно не в скорости линейного кода, ибо полно реалтаймных приложений для всяких фондовых бирж которые работают джаве.
I>Вопрос так и остался открытым — где же будет та самая эффективность про которую ты говоришь.

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

Но если мы получаем отсутствие накладных расходов на халяву (просто работая в обычном стиле) то это в любом случае и есть настоящая эффективность. )))

I>Ну стало быть ты знаешь хороший способ, который гораздо лучше с этим справляется и при этом доступен как минимум всей аудитории C# девелоперов.

I>Теоретичеки можно заставить людей знать на раз теорию категорий и на этой основе строить апи для обработки данных. Реально это утопия, ибо теорию категорий знают единицы и следовательно такой способ недоступен всей аудитории.

Ээээ ну с таким подходом то я не буду спорить... Тут всё правильно. Но изначально у нас же был тезис об абсолютной "крутизне" linq, без привязки к C#, анализа уровня разработчиков и т.п.
Re[66]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 20:59
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Так я же тебе уже говорил, что если бы эта эффективность чего-то нам стоила (например каких-то дополнительных усилий при написание кода), то тогда имело бы смысл рассматривать конкретные задачи и в каждом частном случае считать есть ли смысл для подобной оптимизации или нет.


Халява в данном случае это ручная диспетчеризация и ручной контроль. Когда это нужно для оптимизации — это нормально. А как правило проблемы создает 10-20% кода, за это надо платить тем, что остальные 80-90% кода будет контролировать руками, даже если тебе это не хочется.

_>Но если мы получаем отсутствие накладных расходов на халяву (просто работая в обычном стиле) то это в любом случае и есть настоящая эффективность. )))


Это не эффективность а баловство. Любые оптимизации вне узкого места как минимум лишние, как максимум — создают проблемы на ровном месте.

_>Ээээ ну с таким подходом то я не буду спорить... Тут всё правильно.


!!!
Re[64]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 21:07
Оценка:
Здравствуйте, vdimas, Вы писали:

V>>>Сравнения с чем?

I>>С издержками на async/await.

V>Нашел с чем сравнить.


А что, сравнивать с синтетикой, навроде getline ?

I>>Даже так это <5% от того, что может одно ядро.


V>Да не все так просто. Дело не только в кол-ве тактов, но и в проходах по памяти. В async/await мы имеем графы наверченных друг на друга автоматов в куче и проход по этому графу при каждом шаге. Лишние косвенности каждый раз, а косвенность по внешней памяти обычно стоит намного больше тактов.


Это все теория. А на практике один лишь переход в ядро и обратно даст столько такто, что покроет минимум десять таких проходв.

I>>Гонки, голодание никуда не деваются. Все как было, так и осталось. Не ясно, как ты дашь какие то гарантии.


V>При отсутствии конкуренции за ресурсы нет ни гонок, ни голоданий.


Спасибо, капитан ! Похоже это новая концепция в многозадачном программировании.
А вот мне кажется, что проблемы уже могут быть в случае с тремя короутинами, каждая из которых готовит данные для другой.

I>>Как и в С++


V>Дудки. В С++ ты управляешь ситуацией — располагай легкие потоки в аппаратных как угодно. Т.е. ты имеешь возможность решать прикладные задачи через свою диспетчеризацию.


И это гарантирует что проблем с многозадачностью не будет ? Это слишком сильно сказано, что бы принимать без доказательства. Вот простой пример — три короутины, каждая готовит данные для одной из двух других, эдакое колечко. Нарушаешь порядок — получаешь проблемы. Но похоже твоя концепция как то гарантирует невозможность такой ситуации.
Re[52]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.07.13 21:09
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Ну ка, подробнее, что же за фокус такой, ты ни много ни мало утверждаешь, функция вдруг сама узнает, ожидаю ли я её результат и в зависимости от этого решит как делать процессинг ?


V>Какая ф-ий что узнает? Там просто в теле ф-ии есть хинты, когда забирать у фибера ресурсы и отдавать следующему. Или у тебя вопрос про шедуллинг, т.е. вопрос про управление очередью фиберов? Шедуллинг делается на уровне задач, требующих ожидания, т.е. на уровне поддержки задач ввода-вывода. Остальное пляшет оттуда. Собсно, кооперативная многозадачность на операция ввода-вывода в Win 3.x тому пример.


И что же это за хинты унутре такие, которые подскажут функции, как она вызвана ? Не иначе сканирование назад по стеку и анализ на предмет вызова функции ожидания.

С async все ясно — можно вызывать с ожиданием, можно без ожидания. А как быть с твоими мега-функциями ?

V>>>С т.з. вызывающего метода это обычный синхронный код, а вся асинхронность сугубо внешняя, как внешим является переключение потоков ОС по отношению к обычному коду на C#.

I>>То есть, все функции будут синхронными с т.з. вызывающего кода, что внезапно останавливает message pump.

V>Оп-па...

V>Твой message pump вызывает не ф-ии, а короутины, т.е. передает управление потокам. Это не есть вызов ф-ии.

V>>>Да. Программы для виндов 3.х прекрасно работали на win95, но уже с нормальной многозадачностью.

I>>Не понял идею. Речь про изменения в языке и использование этих изменений во фремворках. Или винда вдруг стала каким то языком ?

V>Да нет. Просто те же самые проги, которые раньше работали на основе кооперативной ОС, прекрасно работают в многозадачной. Сейчас ты работаешь в многозадачной, и у тебя проблем с поддержкой обычного кода нет. Вот и в "многозадачной ОС" проблем не было, если не делать 10 GOTO 10.



I>>см "функция вдруг сама узнает, ожидаю ли я её результат"


V>Смотрел. Улыбнуло. Ф-ия должна делать некий yield next (твой await), если текущее состояние внешнего мира вынуждает её крутиться в 10 GOTO 10. А подробности этого "кручения" зависят от низлежащей ОС, от предоставляемых ср-в сигнализации готовности ввода/вывода.


V>Т.е., конечно должен быть набор библиотек IO, на основекоторых написан твой код. Все эти подробности с yield next должны быть упрятаны в эти либы, а твой прикладной код будет уже как простой линейный код.



V>>>Дык, async еще более не нужен хотя бы потому, что на порядки менее удобный.

I>>"функция вдруг сама узнает, ожидаю ли я её результат"

V>Я уже понял, что ты ничего не понял.)


V>>>Но с ней в С++ всегда было лучше, чем в других ООП языках, именно из-за многообразия функциональных типов и именно из-за того, что вся асинхронщина, которая "в лоб" (без asyc), идет как IoC, в котором функциональный подход заруливает ООП. А с короутинами еще проще...


I>>Надо понимать async/await появились как ответ на одскульную асинхронщину.


V>Ес-но. Так же как подобные либы на плюсах задолго до. (а их полно)

V>Просто язык позволяет делать многое в рамках всё того же самого языка.
Re[65]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 05.07.13 00:34
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Нашел с чем сравнить.

I>А что, сравнивать с синтетикой, навроде getline ?

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


V>>Да не все так просто. Дело не только в кол-ве тактов, но и в проходах по памяти. В async/await мы имеем графы наверченных друг на друга автоматов в куче и проход по этому графу при каждом шаге. Лишние косвенности каждый раз, а косвенность по внешней памяти обычно стоит намного больше тактов.

I>Это все теория. А на практике один лишь переход в ядро и обратно даст столько такто, что покроет минимум десять таких проходв.

Не каждый ядерный вызов тяжел. Стоимость голой SYSENTER не так уж высока.


V>>При отсутствии конкуренции за ресурсы нет ни гонок, ни голоданий.

I>Спасибо, капитан ! Похоже это новая концепция в многозадачном программировании.

Ну гонок при описанном сценарии избегаем в любом случае. А голодание лечится завязкой шедуллинга на состояние прикладных данных.

I>А вот мне кажется, что проблемы уже могут быть в случае с тремя короутинами, каждая из которых готовит данные для другой.


Простейшая автовыравнивание нагрузки — взаимная очередь фиксированного сверху размера, блокируемая для кода короутины, если очередь полна при записи или пуста при чтении. Но есть и еще более динамичные варианты, например, на основе некоей информации по обратной связи. Можно сэмулировать простейший фильтр 1-го порядка по обратной связи по информации о текущей длине очереди, по его показаниям фибер-производитель может назначать себе "штрафы".


I>И это гарантирует что проблем с многозадачностью не будет ? Это слишком сильно сказано, что бы принимать без доказательства. Вот простой пример — три короутины, каждая готовит данные для одной из двух других, эдакое колечко. Нарушаешь порядок — получаешь проблемы. Но похоже твоя концепция как то гарантирует невозможность такой ситуации.


У каждой короутины доложен быть некий сигнал готовности, чтобы она не получала управление для "холостого" оборота. В чем будет заключаться этот сигнал — сугубо прикладная хрень.
Re[53]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 05.07.13 00:40
Оценка:
Здравствуйте, Ikemefula, Вы писали:


I>>>Ну ка, подробнее, что же за фокус такой, ты ни много ни мало утверждаешь, функция вдруг сама узнает, ожидаю ли я её результат и в зависимости от этого решит как делать процессинг ?


V>>Какая ф-ий что узнает? Там просто в теле ф-ии есть хинты, когда забирать у фибера ресурсы и отдавать следующему. Или у тебя вопрос про шедуллинг, т.е. вопрос про управление очередью фиберов? Шедуллинг делается на уровне задач, требующих ожидания, т.е. на уровне поддержки задач ввода-вывода. Остальное пляшет оттуда. Собсно, кооперативная многозадачность на операция ввода-вывода в Win 3.x тому пример.


I>И что же это за хинты унутре такие, которые подскажут функции, как она вызвана ? Не иначе сканирование назад по стеку и анализ на предмет вызова функции ожидания.


Ты опять путаешь вызов ф-ии внутри короутины и передачу управления самой короутине.


I>С async все ясно — можно вызывать с ожиданием, можно без ожидания. А как быть с твоими мега-функциями ?


Должен быть сформирован сам фибер изначально, который будет запущен на исполнение. Код внутри него всегда с ожиданием, т.е. синхронный.
Re[54]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 08:23
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>И что же это за хинты унутре такие, которые подскажут функции, как она вызвана ? Не иначе сканирование назад по стеку и анализ на предмет вызова функции ожидания.


V>Ты опять путаешь вызов ф-ии внутри короутины и передачу управления самой короутине.


Не я, а ты. Ожидание возникает не от того, какие у тебя функции, а от того, когда нужно делать вызов и когда ожидать данных. Как ты чего вызываешь не имеет никакого значения. Если задача требует блокировки — надо делать ожидание. Если задача требует неблокирующий вызов — надо делать именно такой.

Покажи аналог для каждой из строчек
await X();

X();



>>С async все ясно — можно вызывать с ожиданием, можно без ожидания. А как быть с твоими мега-функциями ?


V>Должен быть сформирован сам фибер изначально, который будет запущен на исполнение. Код внутри него всегда с ожиданием, т.е. синхронный.


Код покажи.
Re[67]: Что посоветуете как аналог С++
От: alex_public  
Дата: 05.07.13 09:21
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Халява в данном случае это ручная диспетчеризация и ручной контроль. Когда это нужно для оптимизации — это нормально. А как правило проблемы создает 10-20% кода, за это надо платить тем, что остальные 80-90% кода будет контролировать руками, даже если тебе это не хочется.


Какая ещё ручная диспетчеризация и ручной контроль? ) Мы же вроде бы уже давно договорились что C++ вариант внешне отличается от C# варианта только тем что там макросы (которые пишутся один раз вообще).

I>Это не эффективность а баловство. Любые оптимизации вне узкого места как минимум лишние, как максимум — создают проблемы на ровном месте.


Т.е. если завтра компилятор C# каким-то чудом ускорят раза в два, то ты скажешь "извините, но я возможно не буду этим пользоваться, т.к. я ещё не замерил есть ли у меня узкие места в моём ПО или нет"? )))

I>!!!


Ну так никто и не спорил что linq — это прорыв внутри C#. Это факт естественно. Просто некоторые странные личности иногда начинают говорить что это прорыв не внутри C#, а вообще в программирование (типа как концепция) — вот это конечно вызывает только смех. )))
Re[66]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 09:49
Оценка:
Здравствуйте, vdimas, Вы писали:

V>>>Нашел с чем сравнить.

I>>А что, сравнивать с синтетикой, навроде getline ?

V>Вообще-то, да, с синтетикой. Если сравниваются голые затраты механизма диспетчеризации событий.


Это никому не интересно. Скажем, это не дает объяснения, почему веб-приложения массово пишутся на менеджед платформах, хотя казалось бы, они вечно испытывают нехватку ресусорв, памяти, процессора и тд и тд.
Если смотреть синтетику, то веб-приложения должны писаться на С++. А вот десктоп приложения, где вагон ресурсов, почему то до сих пор частенько пишутся на С++, хотя я бы не сказал что в большинстве случаев. Казалось бы — должно быть наоборот. Ан нет.
А если глянуть на реальные задачи, стновится понятно, где чего экономится. Скажем ручное управление памятью в веб-приложении задача адски сложная и неудивительно, что GC справляется гораздо лучше -> managed. Цена низкоуровневой оптимизации в таких задачах слишком высока, потому весь функционал предельно упрощен. А в десктопе все проще — ресурсов в пересчете на задачу больше + есть вещи, которые требуют перформанс. Вот здесь ручные оптимизации вводить достаточно легко и цена таких изменений сравнительно мала, отсюда ясно, что для десктопа все еще актуально писать на С++.
Реалтайм приложения, что характерно, требуют в первую очередь корретной работы с ресурсами, низкоуровневый перформанс дело второстепенное. Отсюда понятно, почему приложения для биржи и тд, пишутся в т.ч. на Джаве той же.
Есть другие случаи, скажем серверные приложения которые требуют достаточно высокий перформанс в задачах, которые упираются в низкоуровневый перформанс, такие невозможно решить в менеджед — обработка звука, видео, изображений. Менеджед применяется очень осторожно и всегда вместе с нативными библиотеками. Скажем, никто в своем уме не будет заниматься обработкой видео на C# или Джаве. И даже в этом случае цветут и пахнут гибридные приложения.

I>>Это все теория. А на практике один лишь переход в ядро и обратно даст столько такто, что покроет минимум десять таких проходв.


V>Не каждый ядерный вызов тяжел. Стоимость голой SYSENTER не так уж высока.


Давай ближе к конкретному примеру.

I>>Спасибо, капитан ! Похоже это новая концепция в многозадачном программировании.


V>Ну гонок при описанном сценарии избегаем в любом случае. А голодание лечится завязкой шедуллинга на состояние прикладных данных.


"Вот простой пример — три короутины, каждая готовит данные для одной из двух других, эдакое колечко. Нарушаешь порядок — получаешь проблемы."

I>>А вот мне кажется, что проблемы уже могут быть в случае с тремя короутинами, каждая из которых готовит данные для другой.


V>Простейшая автовыравнивание нагрузки — взаимная очередь фиксированного сверху размера, блокируемая для кода короутины, если очередь полна при записи или пуста при чтении. Но есть и еще более динамичные варианты, например, на основе некоей информации по обратной связи. Можно сэмулировать простейший фильтр 1-го порядка по обратной связи по информации о текущей длине очереди, по его показаниям фибер-производитель может назначать себе "штрафы".


Вот так время процессора начинает расходоваться непойми на что.

I>>И это гарантирует что проблем с многозадачностью не будет ? Это слишком сильно сказано, что бы принимать без доказательства. Вот простой пример — три короутины, каждая готовит данные для одной из двух других, эдакое колечко. Нарушаешь порядок — получаешь проблемы. Но похоже твоя концепция как то гарантирует невозможность такой ситуации.


V>У каждой короутины доложен быть некий сигнал готовности, чтобы она не получала управление для "холостого" оборота. В чем будет заключаться этот сигнал — сугубо прикладная хрень.


То есть, гарантий никаких, что и требовалось доказать, все конфликты надо разруливать руками, руками и еще раз руками.
Re[68]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 09:56
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Халява в данном случае это ручная диспетчеризация и ручной контроль. Когда это нужно для оптимизации — это нормально. А как правило проблемы создает 10-20% кода, за это надо платить тем, что остальные 80-90% кода будет контролировать руками, даже если тебе это не хочется.


_>Какая ещё ручная диспетчеризация и ручной контроль? ) Мы же вроде бы уже давно договорились что C++ вариант внешне отличается от C# варианта только тем что там макросы (которые пишутся один раз вообще).


Это теоретически. Для случаев посложнее надо пилить или макросы посложнее или расширять фремворк или колбасить все вручную.

I>>Это не эффективность а баловство. Любые оптимизации вне узкого места как минимум лишние, как максимум — создают проблемы на ровном месте.


_>Т.е. если завтра компилятор C# каким-то чудом ускорят раза в два, то ты скажешь "извините, но я возможно не буду этим пользоваться, т.к. я ещё не замерил есть ли у меня узкие места в моём ПО или нет"? )))


Скорость компиляции является узким местом в средствах разработки. Полноценная навигация, интеллисенс, юнит тесты и прочие вкусности IDE невозможны без быстрого компилятора. Никто не будет пускать юнит-тесты, если проект надо компилировать по сорок минут.
Re[67]: Что посоветуете как аналог С++
От: alex_public  
Дата: 05.07.13 10:08
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Это никому не интересно. Скажем, это не дает объяснения, почему веб-приложения массово пишутся на менеджед платформах, хотя казалось бы, они вечно испытывают нехватку ресусорв, памяти, процессора и тд и тд.


Уже же обсуждали это. Подавляющее чисто всех серверов и баз данных написаны на C/C++ и именно там происходят все критические нагрузки. А то, что ты называешь гордым именем "веб-приложения" — это всего лишь тончайшая скриптовая прослойка между вызовами функций веб-сервера и базы данных. И не удивительно что там лидируют всякие php — у него запредельная скорость написания и модификации кода (говнокода обычно ). Причём для последнего даже не нужны никакие перекомпиляции т.п.

Вот если бы у нас сами сервера и базы данных были написаны на управляемых платформах, то твои слова уже имели бы реальное обоснование....
Re[69]: Что посоветуете как аналог С++
От: alex_public  
Дата: 05.07.13 10:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Это теоретически. Для случаев посложнее надо пилить или макросы посложнее или расширять фремворк или колбасить все вручную.


Для каких ещё случаев посложнее? Представленное решение полностью повторяет всё поведение C# реализации. Всё, точка. Никакие модификации этих 20 строчек не требуются — оно работает в любых условиях, в которых работает C# вариант.

_>>Т.е. если завтра компилятор C# каким-то чудом ускорят раза в два, то ты скажешь "извините, но я возможно не буду этим пользоваться, т.к. я ещё не замерил есть ли у меня узкие места в моём ПО или нет"? )))

I>Скорость компиляции является узким местом в средствах разработки. Полноценная навигация, интеллисенс, юнит тесты и прочие вкусности IDE невозможны без быстрого компилятора. Никто не будет пускать юнит-тесты, если проект надо компилировать по сорок минут.

Имелось ввиду ускорение генерируемого кода, а не скорости компиляции. Я конечно мутно сказал там... )
Re[29]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 05.07.13 10:25
Оценка:
Здравствуйте, AndrewVK, Вы писали:

V>>>>Но когда они вникают в подробности конкретного участка, поверь, их точно так же интересуют точные типы.

AVK>>>Отучайся говорить за всех. Лично я первое, что делаю при ковырянии чужого кода — Full Cleanup, который, в числе прочего, заменяет все типы в декларациях на var.
V>>Мало ли, что лично ты делаешь?

AVK>Тогда поясни — либо "их" это все таки несколько более узкий круг, чем заявлено, либо я не принадлежу к "более опытным разработчикам".


Угу, характерно, что упоминание конкретного примера, где точный тип обязателен, ты проигнорил...
Re[67]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 05.07.13 10:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Вообще-то, да, с синтетикой. Если сравниваются голые затраты механизма диспетчеризации событий.


I>Это никому не интересно. Скажем, это не дает объяснения, почему веб-приложения массово пишутся на менеджед платформах, хотя казалось бы, они вечно испытывают нехватку ресусорв, памяти, процессора и тд и тд.

I>Если смотреть синтетику, то веб-приложения должны писаться на С++. А вот десктоп приложения, где вагон ресурсов, почему то до сих пор частенько пишутся на С++, хотя я бы не сказал что в большинстве случаев. Казалось бы — должно быть наоборот. Ан нет.
I>А если глянуть на реальные задачи, стновится понятно, где чего экономится. Скажем ручное управление памятью в веб-приложении задача адски сложная и неудивительно, что GC справляется гораздо лучше -> managed. Цена низкоуровневой оптимизации в таких задачах слишком высока, потому весь функционал предельно упрощен. А в десктопе все проще — ресурсов в пересчете на задачу больше + есть вещи, которые требуют перформанс. Вот здесь ручные оптимизации вводить достаточно легко и цена таких изменений сравнительно мала, отсюда ясно, что для десктопа все еще актуально писать на С++.

Думаю, и в десктопе полно приложух, где достаточно реакции управляемых сред. Дело не в этом, а в том, что исторически производительность серверных приложух меряется на клиенте через время отклика. Так вот, время отклика, получаемое из-за сети, позволяет чувствовать себя комфортно даже всякому тормозному коду на серваках. Но ситуация постепенно меняется, сетка убыстряется... Не зря же IIS отдает статические ресурсы не выходя из ядра...

I>Реалтайм приложения, что характерно, требуют в первую очередь корретной работы с ресурсами, низкоуровневый перформанс дело второстепенное. Отсюда понятно, почему приложения для биржи и тд, пишутся в т.ч. на Джаве той же.


Уже не пишутся. Джава уже умирает на биржах.

I>Есть другие случаи, скажем серверные приложения которые требуют достаточно высокий перформанс в задачах, которые упираются в низкоуровневый перформанс, такие невозможно решить в менеджед — обработка звука, видео, изображений.


Ну так и чего споришь, если сам знаешь? Да, звуковые пакеты на серверах диспатчат на нейтиве, там сотни тыщ событий в сек. На управляемых средах это в принципе невозможно. Причем, речь даже не об обработке, а о простом диспатчинге.

I>Менеджед применяется очень осторожно и всегда вместе с нативными библиотеками.


Управляемая часть там занимается "управлением" максимум. ))) Т.е. той логикой, которая происходит в момент установления/разрыва канала, т.е. тем, что занимает 0.00001% всех ресурсов.

I>>>Это все теория. А на практике один лишь переход в ядро и обратно даст столько такто, что покроет минимум десять таких проходв.

V>>Не каждый ядерный вызов тяжел. Стоимость голой SYSENTER не так уж высока.

I>Давай ближе к конкретному примеру.


Например ф-ия АПИ GetSystemTimeAsFileTime. Погоняй на досуге.

V>>Ну гонок при описанном сценарии избегаем в любом случае. А голодание лечится завязкой шедуллинга на состояние прикладных данных.

I>"Вот простой пример — три короутины, каждая готовит данные для одной из двух других, эдакое колечко. Нарушаешь порядок — получаешь проблемы."

Хочешь получить подробный ответ — спрашивай подробно.

I>>>А вот мне кажется, что проблемы уже могут быть в случае с тремя короутинами, каждая из которых готовит данные для другой.


V>>Простейшая автовыравнивание нагрузки — взаимная очередь фиксированного сверху размера, блокируемая для кода короутины, если очередь полна при записи или пуста при чтении. Но есть и еще более динамичные варианты, например, на основе некоей информации по обратной связи. Можно сэмулировать простейший фильтр 1-го порядка по обратной связи по информации о текущей длине очереди, по его показаниям фибер-производитель может назначать себе "штрафы".


I>Вот так время процессора начинает расходоваться непойми на что.


Один шаг фильтра 1-го порядка — это одно умножение и одно сложение. Вот и весь шедуллинг. ))

V>>У каждой короутины доложен быть некий сигнал готовности, чтобы она не получала управление для "холостого" оборота. В чем будет заключаться этот сигнал — сугубо прикладная хрень.

I>То есть, гарантий никаких, что и требовалось доказать, все конфликты надо разруливать руками, руками и еще раз руками.

Коллега... Как бы тебе сказать помягче... Ну конечно, кол-во потоков, как аппаратных, так и легковесных, а так же способы их взаимодействия являются частью решения прикладной задачи.
Re[68]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 11:09
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Есть другие случаи, скажем серверные приложения которые требуют достаточно высокий перформанс в задачах, которые упираются в низкоуровневый перформанс, такие невозможно решить в менеджед — обработка звука, видео, изображений.


V>Ну так и чего споришь, если сам знаешь? Да, звуковые пакеты на серверах диспатчат на нейтиве, там сотни тыщ событий в сек. На управляемых средах это в принципе невозможно. Причем, речь даже не об обработке, а о простом диспатчинге.


Показываю, что сравнение с синтетикой не дает ответа ни на один вопрос.

I>>Давай ближе к конкретному примеру.


V>Например ф-ия АПИ GetSystemTimeAsFileTime. Погоняй на досуге.


с IO completion на GetSystemTimeAsFileTime ? Ловкач

V>>>Ну гонок при описанном сценарии избегаем в любом случае. А голодание лечится завязкой шедуллинга на состояние прикладных данных.

I>>"Вот простой пример — три короутины, каждая готовит данные для одной из двух других, эдакое колечко. Нарушаешь порядок — получаешь проблемы."

V>Хочешь получить подробный ответ — спрашивай подробно.


I>>>>А вот мне кажется, что проблемы уже могут быть в случае с тремя короутинами, каждая из которых готовит данные для другой.


V>>>Простейшая автовыравнивание нагрузки — взаимная очередь фиксированного сверху размера, блокируемая для кода короутины, если очередь полна при записи или пуста при чтении. Но есть и еще более динамичные варианты, например, на основе некоей информации по обратной связи. Можно сэмулировать простейший фильтр 1-го порядка по обратной связи по информации о текущей длине очереди, по его показаниям фибер-производитель может назначать себе "штрафы".


I>>Вот так время процессора начинает расходоваться непойми на что.


V>Один шаг фильтра 1-го порядка — это одно умножение и одно сложение. Вот и весь шедуллинг. ))


Да, я в курсе. Почему то в реальных приложениях используется какой нибудь round robin. Дураки наверное, не знаю что можно одно умножение и одно сложение сделать.

V>>>У каждой короутины доложен быть некий сигнал готовности, чтобы она не получала управление для "холостого" оборота. В чем будет заключаться этот сигнал — сугубо прикладная хрень.

I>>То есть, гарантий никаких, что и требовалось доказать, все конфликты надо разруливать руками, руками и еще раз руками.

V>Коллега... Как бы тебе сказать помягче... Ну конечно, кол-во потоков, как аппаратных, так и легковесных, а так же способы их взаимодействия являются частью решения прикладной задачи.


Ты не отвлекайся, лучше покажи ту магию, кторая даст некие гарантии.
Re[68]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 11:11
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Это никому не интересно. Скажем, это не дает объяснения, почему веб-приложения массово пишутся на менеджед платформах, хотя казалось бы, они вечно испытывают нехватку ресусорв, памяти, процессора и тд и тд.


_>Уже же обсуждали это. Подавляющее чисто всех серверов и баз данных написаны на C/C++ и именно там происходят все критические нагрузки. А то, что ты называешь гордым именем "веб-приложения" — это всего лишь тончайшая скриптовая прослойка между вызовами функций веб-сервера и базы данных. И не удивительно что там лидируют всякие php — у него запредельная скорость написания и модификации кода (говнокода обычно ). Причём для последнего даже не нужны никакие перекомпиляции т.п.


Эта тончайшая скриптовая прослойка составляет 99% логики тех задач за которые и платят деньги.

_>Вот если бы у нас сами сервера и базы данных были написаны на управляемых платформах, то твои слова уже имели бы реальное обоснование....


Сервера писаные на питоне или джаваскрипте считать или нет ?
Re[70]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 11:16
Оценка:
Здравствуйте, alex_public, Вы писали:

_>>>Т.е. если завтра компилятор C# каким-то чудом ускорят раза в два, то ты скажешь "извините, но я возможно не буду этим пользоваться, т.к. я ещё не замерил есть ли у меня узкие места в моём ПО или нет"? )))

I>>Скорость компиляции является узким местом в средствах разработки. Полноценная навигация, интеллисенс, юнит тесты и прочие вкусности IDE невозможны без быстрого компилятора. Никто не будет пускать юнит-тесты, если проект надо компилировать по сорок минут.

_>Имелось ввиду ускорение генерируемого кода, а не скорости компиляции. Я конечно мутно сказал там... )


Переходить на новую версию просто ради перформанса, если мне это некритично, я точно не стану.
Re[30]: Что посоветуете как аналог С++
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.07.13 11:16
Оценка:
Здравствуйте, vdimas, Вы писали:

AVK>>Тогда поясни — либо "их" это все таки несколько более узкий круг, чем заявлено, либо я не принадлежу к "более опытным разработчикам".


V>Угу, характерно, что упоминание конкретного примера, где точный тип обязателен, ты проигнорил...


А ты умудрился проигнорить явно заданный вопрос, при этом ответить на сообщение, целиком состоящее из этого вопроса.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[55]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 05.07.13 12:09
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Ты опять путаешь вызов ф-ии внутри короутины и передачу управления самой короутине.

I>Не я, а ты. Ожидание возникает не от того, какие у тебя функции, а от того, когда нужно делать вызов и когда ожидать данных. Как ты чего вызываешь не имеет никакого значения. Если задача требует блокировки — надо делать ожидание. Если задача требует неблокирующий вызов — надо делать именно такой.

I>Покажи аналог для каждой из строчек

I>
I>await X();

I>X();
I>


Ага, ясно, чего ты не понимаешь. У тебя код "линейный" в обоих случаях с т.з. потока управления, описанного программой. Разница там в том, в случае первой строчки будет крутиться "фибер" для внешней задачи (всех внешних задач по цепочке вложенности await), а во второй — нет. Для короутины это эквивалентно наличию/отсутствию каких-нить "yield next".


>>>С async все ясно — можно вызывать с ожиданием, можно без ожидания. А как быть с твоими мега-функциями ?

V>>Должен быть сформирован сам фибер изначально, который будет запущен на исполнение. Код внутри него всегда с ожиданием, т.е. синхронный.
I>Код покажи.

Тебе показывали формирование task через замыкания в современном С++. Т.е. единственно что удобнее в C# на мой взгляд — это более простой (синтаксически) захват контекста для короутины.

Для ассинхронщины обычно создается "зеркальное" АПИ, можно с суффикасами Async, как в дотнете. ))

Унутре таких АПИ обычно поведение такое: если задачу удается выполнить без блокировки, она выполняется сразу (и сразу вызывается callback с соотв. флагом), если нет, то инициализируется отложенная операция, т.е. создается короутина/замыкание (что в C#, что в C++), и добавляется "куда-то" в очередь. Это "куда-то", увы, сильно зависит от реализации. Это может быть либо системиная очередь, типа как alertable io (т.е. все описанное может происходить за один вызов АПИ ОС), либо некая пользовательская, со всякими адаптерами, если не получается привести все абстракции к хендлам ОС + привязанный к хендлу callback + user data. Пример такой ручной очереди тебе показывали уже. Но обычно все эти кишки прячутся в некий "системный фреймворк", который есть у каждой С++ конторы. )) Иногда их более одного.
Re[56]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 12:32
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Покажи аналог для каждой из строчек

I>>
I>>await X();

I>>X();
I>>


V>Ага, ясно, чего ты не понимаешь. У тебя код "линейный" в обоих случаях с т.з. потока управления, описанного программой. Разница там в том, в случае первой строчки будет крутиться "фибер" для внешней задачи (всех внешних задач по цепочке вложенности await), а во второй — нет. Для короутины это эквивалентно наличию/отсутствию каких-нить "yield next".


Покажи код, главное не забудь то о чем ты сам говорил:"В сигнатуре ниче не торчит. Нет ограничений на уровне контрактов."

V>Для ассинхронщины обычно создается "зеркальное" АПИ, можно с суффикасами Async, как в дотнете. ))


"В сигнатуре ниче не торчит. Нет ограничений на уровне контрактов."

Мне кажется или ты взял свои слова назад ?

V>Унутре таких АПИ обычно поведение такое: если задачу удается выполнить без блокировки, она выполняется сразу (и сразу вызывается callback с соотв. флагом), если нет, то инициализируется отложенная операция, т.е. создается короутина/замыкание (что в C#, что в C++), и добавляется "куда-то" в очередь.


"В сигнатуре ниче не торчит. Нет ограничений на уровне контрактов."

Re[69]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 05.07.13 13:16
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Один шаг фильтра 1-го порядка — это одно умножение и одно сложение. Вот и весь шедуллинг. ))

I>Да, я в курсе. Почему то в реальных приложениях используется какой нибудь round robin. Дураки наверное, не знаю что можно одно умножение и одно сложение сделать.

Ты уже теряешь нить беседы. Ты говорил о ЗАВИСИМЫХ потоках, но упомянул алгоритм для независимых вычислений. Так вот, для баланса нагрузки в ЗАВИСИМЫХ системах хорошо подходят наработки ТАУ. Там вообще невозможно что-либо обеспечить без применения в шедуллинге знаний о мгновенной прикладной ситуации. Например, в виндах шедуллинг завязан на состояние окошек, если они есть у процесса, а в линухах — нет. ))) Поэтому, гуй на винды летал еще на 386-х машинах, когда любой другой гуй жутко тормозил.


V>>>>У каждой короутины доложен быть некий сигнал готовности, чтобы она не получала управление для "холостого" оборота. В чем будет заключаться этот сигнал — сугубо прикладная хрень.

I>>>То есть, гарантий никаких, что и требовалось доказать, все конфликты надо разруливать руками, руками и еще раз руками.

V>>Коллега... Как бы тебе сказать помягче... Ну конечно, кол-во потоков, как аппаратных, так и легковесных, а так же способы их взаимодействия являются частью решения прикладной задачи.


I>Ты не отвлекайся, лучше покажи ту магию, кторая даст некие гарантии.


Грантии от ошибок? )) Нет такой магии ни в C# ни в С++, конечно. ))
посталенный процесс разработки и контроля кач-ва ПО дает результаты лучше любых языковых ср-в. но это темы для других топиков, которые мы уже не раз обсуждали.
Re[70]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 13:47
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Ты уже теряешь нить беседы. Ты говорил о ЗАВИСИМЫХ потоках, но упомянул алгоритм для независимых вычислений. Так вот, для баланса нагрузки в ЗАВИСИМЫХ системах хорошо подходят наработки ТАУ. Там вообще невозможно что-либо обеспечить без применения в шедуллинге знаний о мгновенной прикладной ситуации.


Правильно — нужны знания о ситуации. Кстати, у зависимых потоках появляются такие вещи как инверсия приоритетов. А у тебя все просто — одно сложение и одно умножение.

I>>Ты не отвлекайся, лучше покажи ту магию, кторая даст некие гарантии.

V>Грантии от ошибок? )) Нет такой магии ни в C# ни в С++, конечно. ))

Гарантии чего тогда есть, что если все написано без ошибок, то все будет работаеть без ошибок ?
Re[71]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 05.07.13 15:14
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Ты уже теряешь нить беседы. Ты говорил о ЗАВИСИМЫХ потоках, но упомянул алгоритм для независимых вычислений. Так вот, для баланса нагрузки в ЗАВИСИМЫХ системах хорошо подходят наработки ТАУ. Там вообще невозможно что-либо обеспечить без применения в шедуллинге знаний о мгновенной прикладной ситуации.


I>Правильно — нужны знания о ситуации. Кстати, у зависимых потоках появляются такие вещи как инверсия приоритетов. А у тебя все просто — одно сложение и одно умножение.


Да! Фильтр первого порядка оч неплох и обладает наилучшим переходным процессом. )))
А любая обработка данных по большей части — вычисление рядов и многочленов. Просто тут в ряду всего 2 члена.

Любое управление — оно же структурное. Т.е. суть не только в вычислениях, но в том, откуда берутся исходные данные и куда прикладывается результат. А насчет инверсии... Коллега, я же говорил про обратную связь. Нарисуй два потока и направление той связи, которая управляет приоритетом, там всё просто. Даже более чем. Все твои инверсии приоритетов — это способ решения конкуренции в сильно упрощенном варианте, в сравнении с полноценным ПИД из ТАУ. Т.е. это "затычка" на случай, когда низлежащщая ОС не понимает, что происходит на прикладном уровне. И просто ест ьтакой незатейливый способ в конце концов обслужить всех. Т.е. инверсии приоритетов нужны для недетерминированного переключения потоков, как в системах с выталкиванием, когда такое недетерминированное переключение создает конфликт. В случае кооперативной многозадачности приоритетами можно управлять точно, отказавшись от такого понятия-посредника м/у прикладной задачей и шедуллером как "приоритет", заменив её на живую, т.е. управляемую прикладным алгоритмом, очередь диспетчеризации задач.


V>>Грантии от ошибок? )) Нет такой магии ни в C# ни в С++, конечно. ))

I>Гарантии чего тогда есть, что если все написано без ошибок, то все будет работаеть без ошибок ?

Хм)))
Вот эти строки с ошибками написаны или нет?

var x = calcX();

while(x >= 0)
    doSmthng(x--);


А если после рефакотрингов calcX начнет возвращать uint?
Так же в асинхронщине в C#. Ты вполне можешь написать компиллируемый, но при этом некорректный код, использующий асинхронное АПИ. Собсно, новички в асинхронщине почти поголовно так и делают. Все компиллируется, но ничего не работает.

(дурацкий был вопрос, согласись)
Re[72]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 16:27
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Правильно — нужны знания о ситуации. Кстати, у зависимых потоках появляются такие вещи как инверсия приоритетов. А у тебя все просто — одно сложение и одно умножение.


V>Да! Фильтр первого порядка оч неплох и обладает наилучшим переходным процессом. )))

V>А любая обработка данных по большей части — вычисление рядов и многочленов. Просто тут в ряду всего 2 члена.

А зачем же тогда наработки из ТАУ если хватает одной простейшей эвристики ?


V>Т.е. инверсии приоритетов нужны для недетерминированного переключения потоков, как в системах с выталкиванием, когда такое недетерминированное переключение создает конфликт. В случае кооперативной многозадачности приоритетами можно управлять точно, отказавшись от такого понятия-посредника м/у прикладной задачей и шедуллером как "приоритет", заменив её на живую, т.е. управляемую прикладным алгоритмом, очередь диспетчеризации задач.


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

V>>>Грантии от ошибок? )) Нет такой магии ни в C# ни в С++, конечно. ))

I>>Гарантии чего тогда есть, что если все написано без ошибок, то все будет работаеть без ошибок ?

V>Хм)))

V>Вот эти строки с ошибками написаны или нет?

От тебя было утверждение про некие гарантии. Хочу увидеть эти гарантии примером кода.
Re[70]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 16:51
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Давай рассмотрим уже последовательность действий происходящих про работе какого-нибудь "веб-приложения". Возьмём что-нибудь самое самое распространённое по статистике. Ну например форум на php. И так:


php не интересно. httpy, tornado, twisted годятся ? В стеке asp.net нативной фигни наверное только http.sys.
Re[34]: Что посоветуете как аналог С++
От: artelk  
Дата: 05.07.13 17:03
Оценка:
Здравствуйте, artelk, Вы писали:

"await" использует текущий контекст синхронизации. В случае консольного приложения его нет, поэтому работа ведется на основе ThreadPool.
В WPF приложении, например, используется специальный контекст синхронизации, запускающий таски в UI потоке. Аналог второго примера там выдаст, что все делается в том же потоке.

Если перепишем F1 вот так
private async Task<int> F1()
{
    WriteLine("F1: {0}", Thread.CurrentThread.ManagedThreadId);
    return await SomeWork();
}

private Task<int> SomeWork()
{
    return Task.Factory.StartNew(() =>
    {
        WriteLine("SomeWork: {0}", Thread.CurrentThread.ManagedThreadId);
        return 42;
    });
}

, то вывод (в WPF приложении) будет, например, таким:

Main: 10
F1: 10
SomeWork: 6
FF_1: 10
F2: 10
FF_2: 10
55

Re[71]: Что посоветуете как аналог С++
От: alex_public  
Дата: 05.07.13 17:59
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>php не интересно.


Ага, ага, язык на котором написана большая часть современного веб и неинтересен. Понятненько... )

I>httpy, tornado, twisted годятся ?


О, кстати эти товарищи мне очень хорошо знакомы. У нас то сейчас вся серверная часть на питончике живёт... Правда этих всё же лучше через nginx (в качестве прокси) раздавать, за одно и статику на него скинуть.

I>В стеке asp.net нативной фигни наверное только http.sys.


Ну да, ну да... Всего то только самый основной модуль и всё.

О, кстати, а mssql тоже не нативный?
Re[72]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.07.13 18:57
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>php не интересно.


_>Ага, ага, язык на котором написана большая часть современного веб и неинтересен. Понятненько... )


Это сильно спорное утверждение.

I>>httpy, tornado, twisted годятся ?


_>О, кстати эти товарищи мне очень хорошо знакомы. У нас то сейчас вся серверная часть на питончике живёт... Правда этих всё же лучше через nginx (в качестве прокси) раздавать, за одно и статику на него скинуть.


I>>В стеке asp.net нативной фигни наверное только http.sys.


_>Ну да, ну да... Всего то только самый основной модуль и всё.


Все что он берет на себя, это протокол http и ничего больше.

_>О, кстати, а mssql тоже не нативный?


А noSql движки БД куда деть ? Они через один то на джаве, то на дотнете, то на каком эрланге написаны.
Re[34]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 06.07.13 06:45
Оценка:
Здравствуйте, artelk, Вы писали:

EP>>Ну да, только мощнее.

EP>>Если всё же заменить на std::istream:
EP>>
void foo(std::istream &client_stream)
{
    string msg;
    do
    {
        getline(client_stream, msg);
        cout << msg << endl; 
    } while(msg != "exit");
}

EP>>То этот код будет работать с любыми потоками — что с синхронными, что с асинхронными, потому что код одинаковый для обоих случаев, так как можно yield спрятать внутри сокета.
EP>>На await-те так не получится — в асинхронной версии будет await(+async в объявлении) + по всему call stack'у выше, вплоть до вызова handler'а, точно также будут добавляться await+await.
A>На всякий случай спрошу: а ты уверен, что понимаешь как работает async\await?

Уверен
Автор: Evgeny.Panasyuk
Дата: 21.06.13
.
Да, асинхронный код можно легко сделать синхронным, но как тут уже не раз обсуждалось — getline тут стандартный, изначально ничего не знающий об асинхронности — std::istream тоже самый обычный. Код который вызывает void foo также может ничего не знать об асинхронности — он просто передаёт istream&.
Re[35]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 06.07.13 06:54
Оценка:
Здравствуйте, artelk, Вы писали:

A>"await" использует текущий контекст синхронизации. В случае консольного приложения его нет, поэтому работа ведется на основе ThreadPool.

A>В WPF приложении, например, используется специальный контекст синхронизации, запускающий таски в UI потоке. Аналог второго примера там выдаст, что все делается в том же потоке.

Что я ранее и пытался объяснить
Автор: Evgeny.Panasyuk
Дата: 25.06.13
:

I>>>>При чем если минимально усложнить код, тебе придется заниматься ручно диспетчеризацией навроде "execute_on_ui_thread"
EP>>>Так у тебя тоже ручная диспетчеризация в виде await/task/async
I>>Я нигде не указываю в каком потоке чего выполнить, я всего то указываю ожидание результатов, по потокам раскидает компилятор,
EP>По потокам у тебя раскидает библиотека/среда на основе глобального состояния.

I>>а ты это делаешь руками.
EP>ничто не мешает также задавать это параметрами среды

Re[35]: Что посоветуете как аналог С++
От: artelk  
Дата: 06.07.13 14:30
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>
EP>void foo(std::istream &client_stream)
EP>{
EP>    string msg;
EP>    do
EP>    {
EP>        getline(client_stream, msg);
EP>        cout << msg << endl; 
EP>    } while(msg != "exit");
EP>}
EP>

EP>>>То этот код будет работать с любыми потоками — что с синхронными, что с асинхронными, потому что код одинаковый для обоих случаев, так как можно yield спрятать внутри сокета.
1. Покажи, как это будет выглядеть, если foo возвращает результат? Причем, чтобы было, что "код который вызывает foo может ничего не знать об асинхронности".
2. Покажи, как это будет выглядеть, если foo принимает не istream&, а, например, адрес или путь к файлу.

EP>>>На await-те так не получится — в асинхронной версии будет await(+async в объявлении) + по всему call stack'у выше, вплоть до вызова handler'а, точно также будут добавляться await+await.

Async не является частью сигнатуры — можешь вызвать как обычную функцию и что-то делать с возвращаемым Task-ом.
Но таки да, придется возвращать Task<TResult>, вместо TResult, чтобы можно было делать "TResult r = await foo();". А что, на C++ можно вернуть TResult и сделать асинхронщину?
Re[36]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 06.07.13 15:11
Оценка:
Здравствуйте, artelk, Вы писали:

A>1. Покажи, как это будет выглядеть, если foo возвращает результат? Причем, чтобы было, что "код который вызывает foo может ничего не знать об асинхронности".


Result foo(std::istream &client_stream)
{
    string msg;
    do
    {
        getline(client_stream, msg);
        cout << msg << endl; 
    } while(msg != "exit");
    // ...
    return result;
}
Result bar(std::istream &client1, std::istream &client2)
{
    auto result = foo(client1) + foo(client2);
    return result;
}


A>2. Покажи, как это будет выглядеть, если foo принимает не istream&, а, например, адрес или путь к файлу.


Result foo(Address &address)
{
    TcpStream client_stream(address); // or factory, or type template parameter
    string msg;
    // ... same as above
}


EP>>>>На await-те так не получится — в асинхронной версии будет await(+async в объявлении) + по всему call stack'у выше, вплоть до вызова handler'а, точно также будут добавляться await+await.

A>Async не является частью сигнатуры — можешь вызвать как обычную функцию и что-то делать с возвращаемым Task-ом.

Я знаю А ещё можно "просто вызвать" (ничего не делая с Task'ом), если результат не важен.

A>Но таки да, придется возвращать Task<TResult>, вместо TResult, чтобы можно было делать "TResult r = await foo();". А что, на C++ можно вернуть TResult и сделать асинхронщину?


Да, именно так — с помощью stackful coroutines.
Re[37]: Что посоветуете как аналог С++
От: artelk  
Дата: 06.07.13 17:18
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, artelk, Вы писали:


A>>1. Покажи, как это будет выглядеть, если foo возвращает результат? Причем, чтобы было, что "код который вызывает foo может ничего не знать об асинхронности".


EP>
EP>Result foo(std::istream &client_stream)
EP>{
EP>    string msg;
EP>    do
EP>    {
EP>        getline(client_stream, msg);
EP>        cout << msg << endl; 
EP>    } while(msg != "exit");
EP>    // ...
EP>    return result;
EP>}
EP>Result bar(std::istream &client1, std::istream &client2)
EP>{
EP>    auto result = foo(client1) + foo(client2);
EP>    return result;
EP>}
EP>


Т.е. вызывающий поток блокируется до тех пор, пока Result не будет вычислен?

A>>2. Покажи, как это будет выглядеть, если foo принимает не istream&, а, например, адрес или путь к файлу.


EP>
EP>Result foo(Address &address)
EP>{
EP>    TcpStream client_stream(address); // or factory, or type template parameter
EP>    string msg;
EP>    // ... same as above
EP>}
EP>


TcpStream — это какой-то специальный stream, который периодически делает yield?
Re[38]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 06.07.13 17:41
Оценка:
Здравствуйте, artelk, Вы писали:

A>>>1. Покажи, как это будет выглядеть, если foo возвращает результат? Причем, чтобы было, что "код который вызывает foo может ничего не знать об асинхронности".

EP>>
EP>>Result foo(std::istream &client_stream)
EP>>{
EP>>    string msg;
EP>>    do
EP>>    {
EP>>        getline(client_stream, msg);
EP>>        cout << msg << endl; 
EP>>    } while(msg != "exit");
EP>>    // ...
EP>>    return result;
EP>>}
EP>>Result bar(std::istream &client1, std::istream &client2)
EP>>{
EP>>    auto result = foo(client1) + foo(client2);
EP>>    return result;
EP>>}
EP>>

A>Т.е. вызывающий поток блокируется до тех пор, пока Result не будет вычислен?

По смыслу, это примерно тоже самое, что и:
async Task<Result> bar(istream client1, istream client2)
{
    var result = await foo(client1) + await foo(client2);
    return result;
}

Вызывающий поток(thread) не блокируется, а возвращается к другим задачам, например по event loop.

A>>>2. Покажи, как это будет выглядеть, если foo принимает не istream&, а, например, адрес или путь к файлу.

EP>>
EP>>Result foo(Address &address)
EP>>{
EP>>    TcpStream client_stream(address); // or factory, or type template parameter
EP>>    string msg;
EP>>    // ... same as above
EP>>}
EP>>

A>TcpStream — это какой-то специальный stream, который периодически делает yield?

Да, только не периодически, а по необходимости. Внутри у него что-то типа:
async_read(connection, buffer, /* completion callback: */ [coro]{ coro.resume(); } );
coro.yeild(); // "sleep", will be awakened by completion callback

Причём у него интерфейс как у обычного блокирующего потока, без намёков на асинхронность, поэтому он и совместим с std::istream.
Re[37]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.07.13 22:12
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

A>>Но таки да, придется возвращать Task<TResult>, вместо TResult, чтобы можно было делать "TResult r = await foo();". А что, на C++ можно вернуть TResult и сделать асинхронщину?


EP>Да, именно так — с помощью stackful coroutines.


Ну раз так, покажи два способа вызова getline, например один вызвали и ожидаем результата, второй раз вызвали и результата НЕ ожидаем а получаем когда нибудь потом.
Re[35]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 06.07.13 22:16
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>
EP>void foo(std::istream &client_stream)
EP>{
EP>    string msg;
EP>    do
EP>    {
EP>        getline(client_stream, msg);
EP>        cout << msg << endl; 
EP>    } while(msg != "exit");
EP>}
EP>

EP>>>То этот код будет работать с любыми потоками — что с синхронными, что с асинхронными, потому что код одинаковый для обоих случаев, так как можно yield спрятать внутри сокета.

EP>Уверен
Автор: Evgeny.Panasyuk
Дата: 21.06.13
.

EP>Да, асинхронный код можно легко сделать синхронным, но как тут уже не раз обсуждалось — getline тут стандартный, изначально ничего не знающий об асинхронности — std::istream тоже самый обычный. Код который вызывает void foo также может ничего не знать об асинхронности — он просто передаёт istream&.

Ты лучше сделай наконец тот пример что я тебя просил. Ну или покажи как один раз вызвать getline с ожиданием а другой раз без ожидания.
Re[38]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 06.07.13 22:48
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ну раз так, покажи два способа вызова getline, например один вызвали и ожидаем результата,


уже было

I>второй раз вызвали и результата НЕ ожидаем а получаем когда нибудь потом.


auto future = asynchronous([&]{ getline(client_stream, msg); });
Re[39]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 06.07.13 22:54
Оценка:
Здравствуйте, Ikemefula, Вы писали:

A>>Т.е. вызывающий поток блокируется до тех пор, пока Result не будет вычислен?

I>Именно так и он это называет асинхронщиной, потому что де в этом потоке будет выполняться какая нибудь другая короутина,

Так ты определись — либо блокируется, либо "в этом потоке"

I>которая делает хрен знает что.


цирк. async download
Автор: Ikemefula
Дата: 20.06.13

"во время download, будет выполняться какая-нибудь обработка UI события, которая делает хрен знает что"
Re[40]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 06.07.13 23:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>По смыслу, это примерно тоже самое, что и:

EP>>
EP>>async Task<Result> bar(istream client1, istream client2)
EP>>{
EP>>    var result = await foo(client1) + await foo(client2);
EP>>    return result;
EP>>}
EP>>

EP>>Вызывающий поток(thread) не блокируется, а возвращается к другим задачам, например по event loop.
I>Для этого надо псать специальный код.

Этот код пишется один раз, и едет библиотеку, при этом ни каркас приложения, ни event loop — не меняются.

I>То есть, его можно использовать ровно одним способом или синхронно или асинхронно.


О, уже прогресс!

I>При этом await позволаяет включать ожидание там где тебе надо.


Так и тут при необходимости можно явно указать где не нужно ожидание
Re[36]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 06.07.13 23:09
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты лучше сделай наконец тот пример что я тебя просил.


какой? тут уже было достаточно ликбез-примеров

I>Ну или покажи как один раз вызвать getline с ожиданием а другой раз без ожидания.


см выше.
Re[38]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 09:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Ты лучше сделай наконец тот пример что я тебя просил.

EP>>какой? тут уже было достаточно ликбез-примеров
I>Понятно, аргументы закончились

алле, какой пример?

EP>>>>Вызывающий поток(thread) не блокируется, а возвращается к другим задачам, например по event loop.

I>>>Для этого надо псать специальный код.
EP>>Этот код пишется один раз, и едет библиотеку, при этом ни каркас приложения, ни event loop — не меняются.
I>Ну это просто вранье. alex_public показал, как event-loop "не меняется" — путем встраивания RunAll в event loop или прикручивая таймер

Так я же выше показывал пример с полностью локальной трансформацией, без модификации event-loop

I>>>При этом await позволаяет включать ожидание там где тебе надо.

EP>>Так и тут при необходимости можно явно указать где не нужно ожидание
I>Продемонстрируй свой getline один раз с ожиданием, другой раз без ожидания. Надеюсь, ты не станешь эмулировать await путем параметризации gitline специальным потоком ?

Выше есть оба примера

A>>>>Т.е. вызывающий поток блокируется до тех пор, пока Result не будет вычислен?

I>>>Именно так и он это называет асинхронщиной, потому что де в этом потоке будет выполняться какая нибудь другая короутина,
EP>>Так ты определись — либо блокируется, либо "в этом потоке"
I>UI поток заблокируется, потому что буст не знает про message pump.

Так он и не должен ничего знать про message pump. Я же выше показывал пример

I>В этом потоке будет чтото выполняться, при чем не ясно, как указать что именно должно выполняться.


У асинхронных операций есть callback'и принимающие продолжения, вот в этот callback и нырнёт наша корутина — event loop это никак не трогает — всё полностью локально

I>Представь себе либу, которая ничего про твои короутины не знает. У ней ровно один метод, как водится, блокирующий, это именно то ради чего нужна асинхронщина:

I>http://rsdn.ru/forum/philosophy/5215721.1
Автор: Ikemefula
Дата: 30.06.13


То есть по твоему "асинхронщина" — это только выполнение в отдельном потоке?
Ничто не мешает закинуть post_event с unyield'ом корутины в конец нового потока Уже надоело объяснять банальные вещи
Re[40]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 09:31
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Остался один открытый вопрос — сделать так, что бы буст, наконец, узнал про message pump.


ты действительно не понял, что трансформация полностью локальная?

EP>>>Так ты определись — либо блокируется, либо "в этом потоке"

I>>UI поток заблокируется, потому что буст не знает про message pump. В этом потоке будет чтото выполняться, при чем не ясно, как указать что именно должно выполняться.

Тебе что-то неясно != "UI поток заблокируется"

I>Например пока UI поток блокирован, ни один из потоков не сможет внятно обратиться к этому потоку, потому что все синхронные вызовы замерзнут. То есть, снаружи потока не будет способа отличить блокированый UI поток от потока который надолго завис в короутинах.


Почему завис на корутинах? Ты о чём?
Если в случае C# долгие операции будут выполнятся в отдельном потоке, и ожидаться по await:
await Task.Factory.StartNew(() => DoAction());

То и на stackful coroutines никто не заставляет всё пилить в одном потоке:
async([]{ DoAction(); }).then([=]
{
    synchronization_context_post( [=]{ coro.un_yield(); } );
}); // without syntax sugar
coro.yield();

Неважно где будет выполнятся асинхронная операция — в отдельном потоке или позже в этом, главное чтобы была возможность присоединить продолжение в виде:
synchronization_context_post( [=]{ coro.un_yield(); } );
Re[42]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 10:33
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Остался один открытый вопрос — сделать так, что бы буст, наконец, узнал про message pump.

EP>>ты действительно не понял, что трансформация полностью локальная?
I>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами.

В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ?

I>>>>UI поток заблокируется, потому что буст не знает про message pump. В этом потоке будет чтото выполняться, при чем не ясно, как указать что именно должно выполняться.

EP>>Тебе что-то неясно != "UI поток заблокируется"
I>Покажи каким образом буст узнает про message pump.

Зачем Boost'у знать про message pump?

EP>>Почему завис на корутинах? Ты о чём?

I>Очень просто. твой пример с getline именно это и демонстрирует. Если ты делаешь вызов с ожиданием, то надо РУКАМИ пнуть message pump. В С# это делает компилятор.

В C#'пе нужный message pump выбирается глобальным synchronization context'ом, что и я и artelk пытались тебе растолковать
Ничто не мешает иметь такой же глобальный synchronization context

EP>>То и на stackful coroutines никто не заставляет всё пилить в одном потоке:

EP>>
EP>>async([]{ DoAction(); }).then([=]
EP>>{
EP>>    synchronization_context_post( [=]{ coro.un_yield(); } );
EP>>}); // without syntax sugar
EP>>coro.yield();
EP>>

I>И снова торчит та самая асинхронщина, которая, как ты утверждал, нигде не торчит ?

1. without syntax sugar
2. Это может быть на нижних уровнях, без изменения интерфейса выше. Внутри TcpStream, показанного выше, о ужас, тоже есть yield

EP>>Неважно где будет выполнятся асинхронная операция — в отдельном потоке или позже в этом, главное чтобы была возможность присоединить продолжение в виде:

EP>>
EP>>synchronization_context_post( [=]{ coro.un_yield(); } );
EP>>

I>То есть, делать все что может сделать компилятор, но руками.

Сделать тоже самое один раз, и спрятать в либу

I>Итого — одним сообщением ты взял все свои слова назад


ты уныл, чесслово

I>В сухом остатке, так сказать, все по прежнему — все что надо, в С++ пилится и контролируется руками, в сигнатуре и коде торчит ровно то же, что торчит в C#.


балабольство — ты так и не показал аналог кода на C##
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— так что сравнивать не с чем
Re[40]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 10:51
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Ну это просто вранье. alex_public показал, как event-loop "не меняется" — путем встраивания RunAll в event loop или прикручивая таймер

EP>>Так я же выше показывал пример с полностью локальной трансформацией, без модификации event-loop
I>Тот где торчит asynchronous или тот где getline ?

с win32 окнами

EP>>У асинхронных операций есть callback'и принимающие продолжения, вот в этот callback и нырнёт наша корутина — event loop это никак не трогает — всё полностью локально

I>То есть, вместо линейного кода на ровном месте получаются continuations

Ты не поверишь, при использовании await под капотом точно такие же continuations.
Так и тут continuations прячутся под капот, пользовательский код остаётся линейным

EP>>То есть по твоему "асинхронщина" — это только выполнение в отдельном потоке?

I>Асинхронщина это обращение к некоторой сущности, у которой время отличное от времени центрального процессора. Все что ты показывал, это просто другая форма эвентов, т.е. все выполняется в одном процессоре а стало быть асинхронщины нет и быть не может, только эмуляция.
I>То есть, синхронный код с нелькальными переходами.

То есть ты до сих пор не понял, как происходит описанная локальная трансформация
Автор: Evgeny.Panasyuk
Дата: 27.06.13
, и то что async_something может быть любым?

EP>>Ничто не мешает закинуть post_event с unyield'ом корутины в конец нового потока Уже надоело объяснять банальные вещи

I>Ну да, лучше делать руками то, что может легко сделать компилятор

Я объяснил в деталях что происходит под капотом, ибо уже >30 страниц дискуссии — а до тебя только сейчас начинает доходить.
Руками это делать не обязательно — это всё прячется в библиотеку.
Re[41]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 12:19
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Ikemefula, Вы писали:


I>>>>Ну это просто вранье. alex_public показал, как event-loop "не меняется" — путем встраивания RunAll в event loop или прикручивая таймер

EP>>>Так я же выше показывал пример с полностью локальной трансформацией, без модификации event-loop
I>>Тот где торчит asynchronous или тот где getline ?

EP>с win32 окнами


EP>Ты не поверишь, при использовании await под капотом точно такие же continuations.

EP>Так и тут continuations прячутся под капот, пользовательский код остаётся линейным

Это неважно, "какая унутре неонка"

это просто другая форма эвентов, т.е. все выполняется в одном процессоре а стало быть асинхронщины нет и быть не может, только эмуляция.
I>>То есть, синхронный код с нелькальными переходами.

EP>То есть ты до сих пор не понял, как происходит описанная локальная трансформация
Автор: Evgeny.Panasyuk
Дата: 27.06.13
, и то что async_something может быть любым?


Это и есть нелокальный переход. Ты его путаешь с асинхронщиной.

EP>Я объяснил в деталях что происходит под капотом, ибо уже >30 страниц дискуссии — а до тебя только сейчас начинает доходить.


От тебя никто не просил показывать, что происходит унутре. Нужно было написать 5 строчек кода что бы показать как используется message pump.
alex_public так и сделал, а ты пошел рассказывать непойми что.

EP>Руками это делать не обязательно — это всё прячется в библиотеку.


Спасибо, капитан ! Буду знать, что на С++ можно писать библиотеки.
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 12:53
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами.


EP>В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ?


Очевидно, нет.

I>>Покажи каким образом буст узнает про message pump.


EP>Зачем Boost'у знать про message pump?


Затем, что когда ты вошел в свой getline и конкретная нить зависла в нём, одна из других нитей должна крутить message pump, как вариант. Ты это яростно отрицал примерно до сегодняшнего дня.

I>>Очень просто. твой пример с getline именно это и демонстрирует. Если ты делаешь вызов с ожиданием, то надо РУКАМИ пнуть message pump. В С# это делает компилятор.


EP>В C#'пе нужный message pump выбирается глобальным synchronization context'ом, что и я и artelk пытались тебе растолковать


Не гони, ты ничего кроме "все работает само" нигде не говорил.
Вызов через synchronization context это явное обращение к message pump и это деляет компилятор.

EP>Ничто не мешает иметь такой же глобальный synchronization context


Я боюсь что для этого придется написать сначала аналог .Net framework или сделать так, что бы буст стал стандартом C++.

EP>>>То и на stackful coroutines никто не заставляет всё пилить в одном потоке:


I>>И снова торчит та самая асинхронщина, которая, как ты утверждал, нигде не торчит ?


EP>1. without syntax sugar


Естественно, ведь в С++ у тебя ничего нет и все надо колбасить руками.

EP>2. Это может быть на нижних уровнях, без изменения интерфейса выше. Внутри TcpStream, показанного выше, о ужас, тоже есть yield


Серия 155 увлекальтельной истории "на С++ можно писать библиотеки"


I>>То есть, делать все что может сделать компилятор, но руками.

EP>Сделать тоже самое один раз, и спрятать в либу

Серия 156 увлекальтельной истории "на С++ можно писать библиотеки"

I>>В сухом остатке, так сказать, все по прежнему — все что надо, в С++ пилится и контролируется руками, в сигнатуре и коде торчит ровно то же, что торчит в C#.


EP>балабольство — ты так и не показал аналог кода на C##
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— так что сравнивать не с чем


Балабольство это когда ты две недели кряду не можешь понять, что в твоем коде только нелокальные переходы и синхронный код.

Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:

void foo(Stream stream)
{
    string msg;
    do
    {
        msg = getline(stream);
        Trace.WriteLine(msg); 
    } while(msg != "exit");
}

Вариант 1: генераторы
IEnumerable<string> StrinsForStream()
{
  yield return "1";
}

foo(new StreamFromEnumerable (StrinsForStream()));

class StreamFromEnumerable : Stream
{
...
   if(strings.MoveNext())
     return strings.Current;
   else
     return "exit";
...

}

Вариант 3: эвенты
foo(new StreamFromEvents (()=>GetNextString()));

class StreamFromEvents : Stream
{
...
       return strings.RequestNextString() ?? "exit";
...

}

Вариант 3: олдскульноее ООП, которое есть даже в Джаве, Джаваскрипте и где угодно

class StringsRequester : IStringsRequester
{
  string IStringsRequester.Next()
  {
    ... // return все что хочешь и как хочешь
  } 
}

foo(new StreamFrom(new StringsRequester());

class StreamFrom : Stream
{
...
       return stringRequester.Next() ?? "exit";
...

}
Re[42]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 12:56
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>>>Ну это просто вранье. alex_public показал, как event-loop "не меняется" — путем встраивания RunAll в event loop или прикручивая таймер

EP>>>>Так я же выше показывал пример с полностью локальной трансформацией, без модификации event-loop
I>>>Тот где торчит asynchronous или тот где getline ?
EP>>с win32 окнами
EP>>Ты не поверишь, при использовании await под капотом точно такие же continuations.
EP>>Так и тут continuations прячутся под капот, пользовательский код остаётся линейным
I>Это неважно, "какая унутре неонка"
I>это просто другая форма эвентов, т.е. все выполняется в одном процессоре а стало быть асинхронщины нет и быть не может, только эмуляция.

То есть пример с await download это не "асинхронщина"?

I>>>То есть, синхронный код с нелькальными переходами.

EP>>То есть ты до сих пор не понял, как происходит описанная локальная трансформация
Автор: Evgeny.Panasyuk
Дата: 27.06.13
, и то что async_something может быть любым?

I>Это и есть нелокальный переход. Ты его путаешь с асинхронщиной.

async_something/async_download — это "асинхронщина"?

EP>>Я объяснил в деталях что происходит под капотом, ибо уже >30 страниц дискуссии — а до тебя только сейчас начинает доходить.

I>От тебя никто не просил показывать, что происходит унутре. Нужно было написать 5 строчек кода что бы показать как используется message pump.

Уфф — ты прикидываешься или действительно всё так плохо?
Ещё раз, есть операция async_something (которая допустим что-то выполняет в pool'е), принимающая продолжение:
async_something([=]{ on_completion(); });

Продолжение вызывается в UI потоке — как именно (по глобальному synchronization context, или ещё как) — это всё детали, которые не зависят от того используется-ли корутины для выпрямления кода или обычные continuations.
Я уже ни раз показывал
Автор: Evgeny.Panasyuk
Дата: 27.06.13
что этот вызов async_something механически трансформируется на корутины.

I>>>Ну да, лучше делать руками то, что может легко сделать компилятор

EP>>Руками это делать не обязательно — это всё прячется в библиотеку.
I>Спасибо, капитан ! Буду знать, что на С++ можно писать библиотеки.

теперь ты перестанешь ныть об "лучше делать руками то, что может легко сделать компилятор"?
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 13:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>То есть пример с await download это не "асинхронщина"?


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

EP>>>То есть ты до сих пор не понял, как происходит описанная локальная трансформация
Автор: Evgeny.Panasyuk
Дата: 27.06.13
, и то что async_something может быть любым?

I>>Это и есть нелокальный переход. Ты его путаешь с асинхронщиной.

EP>async_something/async_download — это "асинхронщина"?


См выше.

EP>Продолжение вызывается в UI потоке — как именно (по глобальному synchronization context, или ещё как) — это всё детали, которые не зависят от того используется-ли корутины для выпрямления кода или обычные continuations.

EP>Я уже ни раз показывал
Автор: Evgeny.Panasyuk
Дата: 27.06.13
что этот вызов async_something механически трансформируется на корутины.


Ты сам то заметил, что в твоем коде нет вообще никакого message pump ?


EP>теперь ты перестанешь ныть об "лучше делать руками то, что может легко сделать компилятор"?


Это ж ты повторяешь это как максиму.
Re[44]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 13:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами.

EP>>В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ?
I>Очевидно, нет.

Почему?

I>>>Покажи каким образом буст узнает про message pump.

EP>>Зачем Boost'у знать про message pump?
I>Затем, что когда ты вошел в свой getline и конкретная нить зависла в нём, одна из других нитей должна крутить message pump, как вариант. Ты это яростно отрицал примерно до сегодняшнего дня.

Boost не нужно никак модифицировать
Пример со сторонним message pump я показал 25 июня
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— ты его до сих пор не осилил.
Там как раз примерно такая же локальная трансформация:
s_.async_read_some(
        boost::asio::buffer( buffer_ + pb_size, bf_size - pb_size),
        boost::bind( & coro_t::operator(), & coro_, _1, _2) );
ca_();

Как управление передастся из message pump опять в эту корутину — это проблемы async_read_some, причём эта передача управления должна произойти как с корутинами так и без(в продолжение), поэтому не имеет отношения к дискуссии coroutine/await

I>>>Очень просто. твой пример с getline именно это и демонстрирует. Если ты делаешь вызов с ожиданием, то надо РУКАМИ пнуть message pump. В С# это делает компилятор.

EP>>В C#'пе нужный message pump выбирается глобальным synchronization context'ом, что и я и artelk пытались тебе растолковать
I>Не гони, ты ничего кроме "все работает само" нигде не говорил.
I>Вызов через synchronization context это явное обращение к message pump и это деляет компилятор.

Ты действительно не понимаешь, что:
Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );

подходит под описанную концепцию async_something
Автор: Evgeny.Panasyuk
Дата: 27.06.13
?
async_something([=]{ on_completion(); });
// ...
void async_something(CompletionHandler ch)
{
    Task(calc).then(on_global_sync_context, ch );
}

Или ты думаешь что асинхронного кода с обычными продолжениями на C++ вообще нет?

Ты действительно не понимаешь, что такой async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
:
template<typename F>
void async_something(F f)
{
    on_minization = f;
}

принципиально (в рамках дискуссии coroutine/await) ничем не отличается от event_queue.post(f); ?

EP>>Ничто не мешает иметь такой же глобальный synchronization context

I>Я боюсь что для этого придется написать сначала аналог .Net framework

Ещё раз, такого типа код:
Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );

механически трансформируется на корутины — в нём уже есть этот самый synchronization context

I>или сделать так, что бы буст стал стандартом C++.


Зачем?

I>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:


I>
I>void foo(Stream stream)
I>{
I>    string msg;
I>    do
I>    {
I>        msg = getline(stream);
I>        Trace.WriteLine(msg); 
I>    } while(msg != "exit");
I>}
I>


1. facepalm, как ты запустишь несколько foo в одном потоке?
2. покажи полный код, а не эти огрызки
Re[44]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 13:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>То есть пример с await download это не "асинхронщина"?

I>Асинхронщина, т.к. скачивание обычно делатется не из строчки, которую ты подложил в стрим в другом месте, а из источника, у которого изначально другое время.

Так, небольшой сдвиг уже есть.
Идём дальше, мелкими шажками:
async_download(address).then(sync_context, [=]{ on_completion(); } );

Это "асинхронщина"?

А это:
void async_something(Handler h)
{
    async_download(address).then(sync_context, h);
}
// ...
async_something([=]{ on_completion(); });

?

EP>>Ещё раз, есть операция async_something (которая допустим что-то выполняет в pool'е), принимающая продолжение:

EP>>
async_something([=]{ on_completion(); });

EP>>Продолжение вызывается в UI потоке — как именно (по глобальному synchronization context, или ещё как) — это всё детали, которые не зависят от того используется-ли корутины для выпрямления кода или обычные continuations.
EP>>Я уже ни раз показывал
Автор: Evgeny.Panasyuk
Дата: 27.06.13
что этот вызов async_something механически трансформируется на корутины.

I>Ты сам то заметил, что в твоем коде нет вообще никакого message pump ?

Я правильно понимаю, что до тебя до сих пор не дошло, что это всё ортогональные детали спрятанные в async_something (которые точно также присутствуют в коде без корутин)?
Re[45]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 14:23
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>>>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами.

EP>>>В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ?
I>>Очевидно, нет.

EP>Почему?


если чтото навроде f = await Task.FromResult(13) то очевидно, будут только нелокальные переходы.

Собтсвенно это никому не интересно, т.к. нелокальными переходами никого не удивишь.

EP>Boost не нужно никак модифицировать


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

EP>Пример со сторонним message pump я показал 25 июня
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— ты его до сих пор не осилил.


Там снова нет никакого упоминания message pump. Я сколько ни приводил пример message pump ты так внятно ничего и не сказал.

EP>Как управление передастся из message pump опять в эту корутину — это проблемы async_read_some


Не управление из message pump, а управление после вызова твоей функции навроде getline

нить вызывает getline и висит, пока её не отпустят, поскольку она вызвалась из message pump то висит и message pump

I>>Не гони, ты ничего кроме "все работает само" нигде не говорил.

I>>Вызов через synchronization context это явное обращение к message pump и это деляет компилятор.

EP>Ты действительно не понимаешь, что:

EP>
EP>Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );
EP>

EP>подходит под описанную концепцию async_something
Автор: Evgeny.Panasyuk
Дата: 27.06.13
?


Ты лучше подумай чем отличатеся эвент-дривен от асинхронщины. Для тебя похоже это одно и то же.

EP>Или ты думаешь что асинхронного кода с обычными продолжениями на C++ вообще нет?


Нет, я так не думаю. Ты похоже вообще не понимаешь, про что мы тут разговариваем.

EP>принципиально (в рамках дискуссии coroutine/await) ничем не отличается от event_queue.post(f); ?


Принципиально твои примеры это синхронный код с нелокальным переходом. Убираешь весь мусор и все работает само. Это никому не интересно.

EP>>>Ничто не мешает иметь такой же глобальный synchronization context

I>>Я боюсь что для этого придется написать сначала аналог .Net framework

EP>Ещё раз, такого типа код:

EP>
EP>Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );
EP>

EP>механически трансформируется на корутины — в нём уже есть этот самый synchronization context

Это уже неинтерсно, потому что сначала ты рассказывал что нигде ничего не торчит вперемешку с плачем "в С++ можно писать библиотеки"

I>>или сделать так, что бы буст стал стандартом C++.


EP>Зачем?


затем, что есть код который ничего не знает ни про твои контексты, ни про message pump.

I>>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:


I>>
I>>void foo(Stream stream)
I>>{
I>>    string msg;
I>>    do
I>>    {
I>>        msg = getline(stream);
I>>        Trace.WriteLine(msg); 
I>>    } while(msg != "exit");
I>>}
I>>


EP>1. facepalm, как ты запустишь несколько foo в одном потоке?


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

Ликбез находится здесь:
http://dabeaz.com/coroutines/
Код на питоне, короутины переписываются почти один к одному

Но вообще можно и без короутин

EP>2. покажи полный код, а не эти огрызки


Не, такой фокус не выйдет, ибо я не получил от тебя ничего на случай твоего getline и моего message pump:

while(::GetMessage(&msg))
{
  ::DispatchMessage(msg);
}

И один из хандлеров внезапно вызывает getline вот так

getline(stream, &result) // здесь нить ожидает результата и вместе с ней висит message pump выше -> UI Thread блокирован для вызовов извне, соответсвенно нужно что бы другая нить вызвала этот самый message pump
Re[45]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 14:29
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Так, небольшой сдвиг уже есть.

EP>Идём дальше, мелкими шажками:
EP>
EP>async_download(address).then(sync_context, [=]{ on_completion(); } );
EP>

EP>Это "асинхронщина"?

Если async_download скачивает не из строчек, заранее приготовленых, а по честному, то да. Обычные continuations, которые были до async/await.
Сравни:
await async_download(address);
on_completion();



I>>Ты сам то заметил, что в твоем коде нет вообще никакого message pump ?


EP>Я правильно понимаю, что до тебя до сих пор не дошло, что это всё ортогональные детали спрятанные в async_something (которые точно также присутствуют в коде без корутин)?


Хватит уже басни рассказывать. Делов то — взять МОЙ message pump и показать как он вызовется, пока getline будет ожидать результата.
Re[42]: Что посоветуете как аналог С++
От: alex_public  
Дата: 07.07.13 14:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Я уже решил завязать с этой дискуссией, т.к. всё уже сказано и если кто-то ещё не понял, то только из-за своей непробиваемости. ))) Но сейчас всё же вмешаюсь, т.к. я вижу что вроде бы и ты и Evgeny.Panasyuk пишете правильные вещи, но при этом в упор не понимаете друг друга... )))

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

Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования. Это случаи когда у нас есть некий callback, вызываемый откуда-то снаружи (например из ОС). Это на самом деле вполне часто встречающаяся задача и как раз асинхронная. Соответственно Evgeny.Panasyuk показал что можно красиво и удобно записывать такой код с помощью сопроцедур (из Boost'a), превращая их в линейный, без выделения спец. функции для callback'a.

Так что:
1. Примеры Evgeny.Panasyuk'а действительно не являются аналогами await/async C#.
2. Но при этом однозначно являются примерами асинхронного программирования
3. Насколько я понимаю, сделать аналоги примеров Evgeny.Panasyuk'а на C# await/async вообще не реально. Так что это были весьма важные примеры для данной дискуссии — они показывают где реализация мощнее.

P.S. Да, кстати, моя реализация полного аналога C# await/async в принципе сводится к примерами Evgeny.Panasyuk'а с добавлением какого-то механизма инициации асинхронного вызова.
Re[46]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 14:53
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Пример со сторонним message pump я показал 25 июня
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— ты его до сих пор не осилил.

I>Там снова нет никакого упоминания message pump. Я сколько ни приводил пример message pump ты так внятно ничего и не сказал.

очевидно, что message pump внутри asio

EP>>Как управление передастся из message pump опять в эту корутину — это проблемы async_read_some

I>Не управление из message pump, а управление после вызова твоей функции навроде getline
I>нить вызывает getline и висит, пока её не отпустят, поскольку она вызвалась из message pump то висит и message pump

getline дёрнет TcpStream, который вызовет yield, после которого управление вернётся в message pump

EP>>>>Ничто не мешает иметь такой же глобальный synchronization context

I>>>Я боюсь что для этого придется написать сначала аналог .Net framework
EP>>Ещё раз, такого типа код:
EP>>
EP>>Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );
EP>>

EP>>механически трансформируется на корутины — в нём уже есть этот самый synchronization context
I>Это уже неинтерсно, потому что сначала ты рассказывал что нигде ничего не торчит

...и показал конкретный пример с TcpStream — там действительно ничего не торчит, yield'ы только на самом нижнем уровне

I>>>или сделать так, что бы буст стал стандартом C++.

EP>>Зачем?
I>затем, что есть код который ничего не знает ни про твои контексты, ни про message pump.

Ещё раз, корутины позволяют распрямить код который вызывает асинхронные операции.
Контексты и message-pump-ы есть и до распрямления, очевидно же

I>>>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:

I>>>
I>>>void foo(Stream stream)
I>>>{
I>>>    string msg;
I>>>    do
I>>>    {
I>>>        msg = getline(stream);
I>>>        Trace.WriteLine(msg); 
I>>>    } while(msg != "exit");
I>>>}
I>>>

EP>>1. facepalm, как ты запустишь несколько foo в одном потоке?
I>Теперь ты уже просишь не один вызов, как было у тебя, а коорперативную многозадачность в явном виде ? Это так же реализуемо, представь себе весь ужас, на stackless короутинах

Чукчка не читатель?
Давай, перечитывай
Автор: Evgeny.Panasyuk
Дата: 25.06.13
:

getline выполняется асинхронно, давай возможность другим соединениям отработать (поток один).


EP>>2. покажи полный код, а не эти огрызки

I>Не, такой фокус не выйдет

я ничего другого кроме передёргивания от тебя и не ожидал
Re[43]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 15:03
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования. Это случаи когда у нас есть некий callback, вызываемый откуда-то снаружи (например из ОС). Это на самом деле вполне часто встречающаяся задача и как раз асинхронная.


await внутри точно также навешивает completion callback:
//Schedules the state machine to proceed
//to the next action when the specified awaiter completes.
//Also: sending this state machine here will trigger it's boxing into heap.
this.<>t__builder.AwaitUnsafeOnCompleted<TaskAwaiter<string>, 
  AsyncMethods.<DownloadHtmlAsyncTask>d__0>(ref taskAwaiter, ref this);
Re[46]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 15:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Если async_download скачивает не из строчек, заранее приготовленых, а по честному, то да.


Пример из Boost.Asio, на который я неоднократно ссылался, считывает данные из tcp порта, куда уж честнее
Пример win32 с событиями, реагирует на "честные" события minimize, которые инициируются пользователем, у которого очевидно "время отличное от времени центрального процессора"
Re[44]: Что посоветуете как аналог С++
От: alex_public  
Дата: 07.07.13 15:29
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>await внутри точно также навешивает completion callback:


Ну да, но там:
1. возможны только такие callback'и
2. это уже реализовано

Соответственно твои примеры в сравнение с await/async:
1. более обобщённые (что Ikemefula не хочет видеть)
2. недоделанные (на что Ikemefula и упирает последние n страниц)
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 15:57
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования.


Это просто примеры event driven кода, их можно прикрутить к асинхронщине, но сами они не являются асинхронщиной.
Re[47]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 16:00
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Пример win32 с событиями, реагирует на "честные" события minimize, которые инициируются пользователем, у которого очевидно "время отличное от времени центрального процессора"


При этом весь мусор из твоего кода можно выбросить, и все будет работать. Вот так пример !
Re[47]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 16:08
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Там снова нет никакого упоминания message pump. Я сколько ни приводил пример message pump ты так внятно ничего и не сказал.


EP>очевидно, что message pump внутри asio


Очевидно, что такой message pump никому не нужен, кроме boost.asio, т.е. message pump всегда требует дополнительных вещей.

EP>getline дёрнет TcpStream, который вызовет yield, после которого управление вернётся в message pump


Ну а до того цикл будет висеть, правильно ? Вопрос — как его запустить ДО того как getline вернет управление.

I>>Это уже неинтерсно, потому что сначала ты рассказывал что нигде ничего не торчит


I>>затем, что есть код который ничего не знает ни про твои контексты, ни про message pump.


EP>Ещё раз, корутины позволяют распрямить код который вызывает асинхронные операции.


Спасибо, капитан !

EP>Контексты и message-pump-ы есть и до распрямления, очевидно же


От тебя требовался один пример явной работы с message pump, а вместо этого ты ударился в порталы и прочие картинки.


EP>>>1. facepalm, как ты запустишь несколько foo в одном потоке?

I>>Теперь ты уже просишь не один вызов, как было у тебя, а коорперативную многозадачность в явном виде ? Это так же реализуемо, представь себе весь ужас, на stackless короутинах

EP>Чукчка не читатель?

EP>Давай, перечитывай
Автор: Evgeny.Panasyuk
Дата: 25.06.13
:

EP>

EP>getline выполняется асинхронно, давай возможность другим соединениям отработать (поток один).


getline в твоем примере выполняется СИНХРОННО. Это значит, что следующая строчка после getline получит результат ПОСЛЕ того, как getline вернет управление.
Что бы он отработал асинхронно, надо обернуть вызов в asynchronous([]=>{getline();});

Соответсвенно ты просишь КООПЕРАТИВНУЮ МНОГОЗАДАЧНОСТЬ, а не асинхронщину, пора бы уже это понять.
Я трижды спрашивал тебя, чего ты хочешь, а ты никак не можешь понять, что асинхронщины, эвент-дривен и коорперативная многоздачность это три разные вещи.

I>>Не, такой фокус не выйдет


EP>я ничего другого кроме передёргивания от тебя и не ожидал


На себя смотри, две недели бегаешь от одного примера.
Re[48]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 16:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:


EP>>getline дёрнет TcpStream, который вызовет yield, после которого управление вернётся в message pump

I>Ну а до того цикл будет висеть, правильно ?

До yield'а? Ну да, так же как и до await'а

I>Вопрос — как его запустить ДО того как getline вернет управление.


Вернёт управление куда? в while цикл с getline'ом? Ну так message pump и так запустится до этого, сразу после yield'а внутри TcpStream

EP>>Контексты и message-pump-ы есть и до распрямления, очевидно же

I>От тебя требовался один пример явной работы с message pump

Был не один пример с message pump'ом — и с asio'вским, и с win32, и даже с самодельным

I>а вместо этого ты ударился в порталы и прочие картинки.


и даже они не помогли тебе понять

EP>>Чукчка не читатель?

EP>>Давай, перечитывай
Автор: Evgeny.Panasyuk
Дата: 25.06.13
:

EP>>

EP>>getline выполняется асинхронно, давай возможность другим соединениям отработать (поток один).

I>getline в твоем примере выполняется СИНХРОННО. Это значит, что следующая строчка после getline получит результат ПОСЛЕ того, как getline вернет управление.

1. Asynchronous I/O:

Asynchronous I/O, in computer science, is a form of input/output processing that permits other processing to continue before the transmission has finished.

2. Если по-твоему строчка getline выполняется "СИНХРОННО", то и строчка await async_download:
await async_download(address);
on_completion();

также выполняется синхронно? ведь "следующая строчка после getline await async_download получит результат ПОСЛЕ того, как getline await async_download вернет управление"
Re[44]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 16:47
Оценка:
Здравствуйте, Ikemefula, Вы писали:

_>>Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования. Это случаи когда у нас есть некий callback, вызываемый откуда-то снаружи (например из ОС). Это на самом деле вполне часто встречающаяся задача и как раз асинхронная. Соответственно Evgeny.Panasyuk показал что можно красиво и удобно записывать такой код с помощью сопроцедур (из Boost'a), превращая их в линейный, без выделения спец. функции для callback'a.

I>
I>function getSin(param, end)
I>{
I>  end(Math.sin(param));
I>}
I>getSin(45, function(result){ ля ля ля})
I>

I>вот этот вызов выглядит как асинхронный, при этом в данном примере нет ничего асинхронного, обычный event driven подоход, а вы с EP почему то называете такой хлам асинхронщиной

ловко ты async_something превратил просто в something, ага
так ведь и async_download
Автор: Ikemefula
Дата: 07.07.13
спокойно превращается в download
Re[45]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 18:17
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Так вот, Evgeny.Panasyuk показывал что можно пользоваться не только традиционным способом, но и так:

_>
_>Read(buf, coro);//передаём вместо обычного callback'a наш специальный на базе сопроцедуры
_>yield();//вызодим из функции
_>ProcessBuf(buf);//выполняется как callback функции read, но в контексте текущей функции
_>


_>Это вполне удобный механизм сам по себе. И кстати я не очень представляю как можно записать подобное на C#.


await/async

_>Ну а если дополнить это механизмами инициации этого самого callback'a (как было в моих примерах), то получим как раз реализацию await/async. )))


только все руками.
Re[45]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 18:21
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>ловко ты async_something превратил просто в something, ага


Ты лучше свой пример про getline изучи внимательно.

EP>так ведь и async_download
Автор: Ikemefula
Дата: 07.07.13
спокойно превращается в download


Ты так и не понял, что такое async await

у меня в примере async_download неблокирующий. await делает ожидание. сам метод где помещен код будет неблокирующим, что очевидно.

Если ты просто сделаешь download без асинхронщины то получишь одно из двух — или блокирующий или неблокирующий и надо приседать с этим дополнительно.
Re[49]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 18:37
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>getline дёрнет TcpStream, который вызовет yield, после которого управление вернётся в message pump

I>>Ну а до того цикл будет висеть, правильно ?

EP>До yield'а? Ну да, так же как и до await'а


Начинаем все сначала — кто вернет управление в message pump, пока getline не вернет значение ?

Ты хоть у alex_public подсмотри решение — RunAll в message pump или по таймеру (для которого тоже нужен message pump).

I>>Вопрос — как его запустить ДО того как getline вернет управление.


EP>Вернёт управление куда? в while цикл с getline'ом? Ну так message pump и так запустится до этого, сразу после yield'а внутри TcpStream


Представь себе такое — getline получит значения через полчаса. Каким образом будет работать UI ? С await все понятно — UI будет работать, потому что message pump никто не останавливал. А вот с getline все непросто — ты его просто вызвал в хандлере, который вызвался из message pump.

I>>От тебя требовался один пример явной работы с message pump


EP>Был не один пример с message pump'ом — и с asio'вским, и с win32, и даже с самодельным


Ты показал все, кроме того что надо — МОЙ message pump и твой getline.

I>>getline в твоем примере выполняется СИНХРОННО. Это значит, что следующая строчка после getline получит результат ПОСЛЕ того, как getline вернет управление.


EP>1. Asynchronous I/O:

EP>

EP>Asynchronous I/O, in computer science, is a form of input/output processing that permits other processing to continue before the transmission has finished.


Эдак у тебя всё станет асинхронным. Главный поток спит, но выполняются другие потоки, значит по этому определению все асинхронно. Ерунда что главный поток блокирован и юзер ничего не видит, главное что все асинхронно.

EP>2. Если по-твоему строчка getline выполняется "СИНХРОННО", то и строчка await async_download:

EP>
EP>await async_download(address);
EP>on_completion();
EP>

EP>также выполняется синхронно?

Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?

>ведь "следующая строчка после getline await async_download получит результат ПОСЛЕ того, как getline await async_download вернет управление"


Правильно, ты наконец понял, что я тебе говорю уже две недели. Представь, наличие await не блокирует message pump, просто по той причине, что компилер сам генерит нужный код. То есть, возвращает управление в message pump. Это вобщем очевидно — код раскидывается на continuation и далее выход из метода в вызывающий. Самый верхний хандлер дергается именно из message pump, который никогда не делает ожидания, представь себе весь ужас

Открой любой туториал по await/async и там найдешь красные стрелочки которые ведут в этот message pump. В твоем getline ничего такого нет, соответсвенно UI будет блокирован.
Re[46]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 18:43
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>ловко ты async_something превратил просто в something, ага

I>Ты лучше свой пример про getline изучи внимательно.

И где связь между твоим getSin, который сразу вызывает продолжение с результатом, и getline который внутри yield'ится в main loop?

EP>>так ведь и async_download
Автор: Ikemefula
Дата: 07.07.13
спокойно превращается в download

I>Ты так и не понял, что такое async await

я говорил про код:
async_download(address).then(sync_context, [=]{ on_completion(); } );

который ты таки называл "асинхронщиной", в котором никакого await'а

I>вот этот вызов выглядит как асинхронный, при этом в данном примере нет ничего асинхронного, обычный event driven подоход, а вы с EP ты почему то называете называешь такой хлам асинхронщиной




I>у меня в примере async_download неблокирующий. await делает ожидание. сам метод где помещен код будет неблокирующим, что очевидно.


coroutine_start
Автор: Evgeny.Panasyuk
Дата: 26.06.13
вызванный из корутины, и имеющий внутри getline тоже неблокирующий
Я уже тебе это объяснял, но как-то туго идёт:

Вот тут:

for(auto &buffer : buffers)
        fibers.emplace_back(bind(coroutine_start, &buffer, _1));

Вызываются "handler"'ы (в твоих терминах).
В каждом "handler"'е код выполняется до каждого yield'а и сразу возвращается сюда — так же как и в C# с async/await код выполняется до первого await'а. Это в твоих понятиях являются асинхронными вызовами или нет?
Когда "event loop" ныряет в сопроцедуру — это аналог тому, когда await дожидается своего таска.
Все остальные yield'ы в "handler"'ах — аналогичны последующим await'ам и т.п.

Re[50]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 19:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>>>getline дёрнет TcpStream, который вызовет yield, после которого управление вернётся в message pump

I>>>Ну а до того цикл будет висеть, правильно ?
EP>>До yield'а? Ну да, так же как и до await'а
I>Начинаем все сначала — кто вернет управление в message pump, пока getline не вернет значение ?

yield на 37 строчке, который находится внутри TcpStream, который дёргается getline'ом

I>>>Вопрос — как его запустить ДО того как getline вернет управление.

EP>>Вернёт управление куда? в while цикл с getline'ом? Ну так message pump и так запустится до этого, сразу после yield'а внутри TcpStream
I>Представь себе такое — getline получит значения через полчаса. Каким образом будет работать UI ? С await все понятно — UI будет работать, потому что message pump никто не останавливал. А вот с getline все непросто — ты его просто вызвал в хандлере, который вызвался из message pump.

И внутри он yield'нулся обратно в message pump

I>>>От тебя требовался один пример явной работы с message pump

EP>>Был не один пример с message pump'ом — и с asio'вским, и с win32, и даже с самодельным
I>Ты показал все, кроме того что надо — МОЙ message pump и твой getline.

Я уже показал пример асинхронной операции с win32 message pump. Делать ещё примеры нет никакого желания, по двум причинам: с твоей стороны не было запрошенных примеров (кроме неработающих огрызков), на каждый мой пример ты придумываешь нелепые отмазки

EP>>2. Если по-твоему строчка getline выполняется "СИНХРОННО", то и строчка await async_download:

EP>>
EP>>await async_download(address);
EP>>on_completion();
EP>>

EP>>также выполняется синхронно?
I>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?

Я уже показывал примеры где message pump не блокируется. Тебе они не понятны? Нужен очередной ликбез?

>>ведь "следующая строчка после getline await async_download получит результат ПОСЛЕ того, как getline await async_download вернет управление"


I>Правильно, ты наконец понял, что я тебе говорю уже две недели. Представь, наличие await не блокирует message pump, просто по той причине, что компилер сам генерит нужный код. То есть, возвращает управление в message pump. Это вобщем очевидно — код раскидывается на continuation и далее выход из метода в вызывающий.


Ты до сих пор не понял, что yield у stackful coroutine превращает весь последующий код в "неявное" продолжение и возвращает управление в message pump?

I>Открой любой туториал по await/async и там найдешь красные стрелочки которые ведут в этот message pump. В твоем getline ничего такого нет, соответсвенно UI будет блокирован.


Я понял, что ты совершенно не понял как здесь используются stackful coroutine, да нужен очередной ликбез..
Re[48]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 19:16
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>И где связь между твоим getSin, который сразу вызывает продолжение с результатом, и getline который внутри yield'ится в main loop?

I>твой getline в main loop ничего не yield'дит.

Если ты так думаешь, то объясни каким образом там получился результат
Автор: Evgeny.Panasyuk
Дата: 26.06.13
:
stream address: 0x7fc742afdc10| Hello
stream address: 0x7fc742aebc10| World
stream address: 0x7fc742ad9c10| Stackfull
stream address: 0x7fc742ac7c10| Coroutines
stream address: 0x7fc742ad9c10| Rulez!
stream address: 0x7fc742aebc10| Hasta la vista
stream address: 0x7fc742afdc10| Baby
stream address: 0x7fc742afdc10| exit
stream address: 0x7fc742aebc10| exit
stream address: 0x7fc742ad9c10| exit
stream address: 0x7fc742ac7c10| exit

С вот такими циклами:
string msg;
do
{
    getline(client_stream, msg);
    cout << "stream address: " << &client_stream << "|\t";
    cout << msg << endl;
} while(msg != "exit");

и в одном потоке?

EP>>coroutine_start
Автор: Evgeny.Panasyuk
Дата: 26.06.13
вызванный из корутины, и имеющий внутри getline тоже неблокирующий

I>если getline неблокирующий, значит следующая за ним строчка выполнится ДО того как придут данные. Ты это хотел сказать ?
I>Если нет, то getline блокирующий, а стало быть, если его вызвать из message loop, он все повесит

Ещё раз, coroutine_start вызванный из корутины — неблокирующий. Как только код выполнения наткнётся на первый yield (неважно на какой глубине, это не one-level await) — управление вернётся в message loop
Re[49]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 19:32
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>И где связь между твоим getSin, который сразу вызывает продолжение с результатом, и getline который внутри yield'ится в main loop?

I>>твой getline в main loop ничего не yield'дит.

EP>Если ты так думаешь, то объясни каким образом там получился результат
Автор: Evgeny.Panasyuk
Дата: 26.06.13
:


имелось ввиду message pump, которого у тебя просто нет, а надо что бы был

I>>если getline неблокирующий, значит следующая за ним строчка выполнится ДО того как придут данные. Ты это хотел сказать ?

I>>Если нет, то getline блокирующий, а стало быть, если его вызвать из message loop, он все повесит

EP>Ещё раз, coroutine_start вызванный из корутины


Не отвлекайся, дай наконец внятный ответ: "getline блокирующий или нет ?".

Если нет, с message pump все в порядке, но не ясно, как результат связывается.
Если да, то надо явно дергать message pump.
Других вариантов просто нет и до тебя это пока не доходит.

Пока что у тебя позиция "войны не объявлять, мира не подписывать, армию распутить"
Re[46]: Что посоветуете как аналог С++
От: alex_public  
Дата: 07.07.13 19:32
Оценка:
Здравствуйте, Ikemefula, Вы писали:

_>>Это вполне удобный механизм сам по себе. И кстати я не очень представляю как можно записать подобное на C#.

I>await/async

await чего будем вызывать? )

I>только все руками.


Ну да, руками, но как бы один раз, а не для каждого вызова отдельно. Как и было показано в моих примерах. Т.е. мы можем закинуть эту реализацию в библиотеку и ситуация станет неотличимой от C#. Ну это кроме того, что тут у нас больше возможностей.
Re[47]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 19:34
Оценка:
Здравствуйте, alex_public, Вы писали:

_>await чего будем вызывать? )


await method.

I>>только все руками.


_>Ну да, руками, но как бы один раз, а не для каждого вызова отдельно. Как и было показано в моих примерах. Т.е. мы можем закинуть эту реализацию в библиотеку и ситуация станет неотличимой от C#. Ну это кроме того, что тут у нас больше возможностей.


А еще больше возможностей будет если на ассемблере писать.
Re[48]: Что посоветуете как аналог С++
От: alex_public  
Дата: 07.07.13 19:43
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>await method.


Ещё раз, у нас есть функция Read(buf, callback). Такое частенько встречается. Сама функция не блокирующая, но и не возвращает никаких значений (типа Task). И так, await чего мы тут будем вызывать, что бы код следующий за Read вызвался внутри callback и обработал buf?
Re[49]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 19:56
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>await method.


_>Ещё раз, у нас есть функция Read(buf, callback). Такое частенько встречается. Сама функция не блокирующая, но и не возвращает никаких значений (типа Task). И так, await чего мы тут будем вызывать, что бы код следующий за Read вызвался внутри callback и обработал buf?


Значит будет возвращать Task и делать ему await, не вижу принципиальной разницы. Если сравнивать построчно, то можно дойти до того что "В С++ нет using, finally а в С# нет деструкторов"
Re[50]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 20:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Не отвлекайся, дай наконец внятный ответ: "getline блокирующий или нет ?".


Вызов getline, с точки зрения метода foo, очевидно блокирующий
coroutine_start вызванный из корутины, и имеющий внутри getline, — неблокирующий.

I>Если да, то надо явно дергать message pump.


Зачем дёргать? внутри TcpStream стоит yield, который вернёт управление (аналогично await'у, только "многоуровневый")
Re[51]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 20:39
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Вызов getline, с точки зрения метода foo, очевидно блокирующий


Правильно, и с чем ты спорил ?

I>>Если да, то надо явно дергать message pump.


EP>Зачем дёргать? внутри TcpStream стоит yield, который вернёт управление (аналогично await'у, только "многоуровневый")


Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?
Покажи код — мой message pump и твой getline.
Re[52]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 20:48
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Представь себе такое — getline получит значения через полчаса. Каким образом будет работать UI ? С await все понятно — UI будет работать, потому что message pump никто не останавливал. А вот с getline все непросто — ты его просто вызвал в хандлере, который вызвался из message pump.


EP>>И внутри он yield'нулся обратно в message pump

I>Там нет message pump, там просто какой то цикл.

конечно, просто какой-то цикл, просто по каким-то сообщениям стоящим в очереди, просто доставляемых конкретным корутинам

EP>>Я уже показал пример асинхронной операции с win32 message pump. Делать ещё примеры нет никакого желания, по двум причинам: с твоей стороны не было запрошенных примеров (кроме неработающих огрызков), на каждый мой пример ты придумываешь нелепые отмазки

I>Ты в начало треда посмотри и заметишь, что я повторяю один и тот же вопрос и так и не получил на него ответа.

"Ты в начало треда посмотри и заметишь" что запрошенного примера на C# нет до сих пор
"Ты в начало треда посмотри и заметишь" что запрошенного примера на С++ без корутин
Автор: Evgeny.Panasyuk
Дата: 29.06.13
нет до сих пор:

I>Вот и покажи эту асинхронщину на короутинах. Забудь про MesageBox, TcpStream и тд. Сделай что нибудь внятное, ну хоть Thread.Sleep() если ничего в голову не приходит.
Покажи версию без корутин на C++ — я её переделаю на корутины. А то ты опять будешь кричать что это не "асинхронщина".


EP>>>>также выполняется синхронно?

I>>>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?
EP>>Я уже показывал примеры где message pump не блокируется. Тебе они не понятны? Нужен очередной ликбез?
I>Нет, ты ничего подобного не показывал.

В моих примерах не было message pump? message pump блокировался?

I>Я уже лет наверное 7-8 в курсе как и для чего они используются, еще с тех времен, как писал такую логику на файберах, а потом писал на питоне, а потом писал логику под Q3 движок, а потом писал yield-expression для C#, а потом приспосабливал yield return под обработку эвентов и тд и тд и тд.


и если после этого тебе мерещатся заблокированные ui-loop-ы — то как-то совсем печально
Re[53]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 20:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Там нет message pump, там просто какой то цикл.


EP>конечно, просто какой-то цикл, просто по каким-то сообщениям стоящим в очереди, просто доставляемых конкретным корутинам


Это никому не интересно. Внезапно, если в системе есть message pump, то ни про какие 200К короутин речи быть не может. А я пока что слабо представляю преложение без такого message pump. То есть, короутины заканчиваются, не успев начаться.

EP>"Ты в начало треда посмотри и заметишь" что запрошенного примера на C# нет до сих пор


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

Ты напоказывал вагоны кода, которые тебя никто вообще не просил и так и не дал ответа на поставленый вопрос.

EP>Покажи версию без корутин на C++ — я её переделаю на корутины. А то ты опять будешь кричать что это не "асинхронщина".

EP>[/q]

Вот еще пример — я показал код со Sleep и все на этом закончилось.

I>>Нет, ты ничего подобного не показывал.


EP>В моих примерах не было message pump? message pump блокировался?


Какие то циклы меня не интересуют. Меня интересует ровно один вариант — твой getline и мой message pump

EP>и если после этого тебе мерещатся заблокированные ui-loop-ы — то как-то совсем печально


Ты сам сказал, что getline блокирующий, раз так, надо показывать всё решение, в частности, как при этом будет работать message pump.
Re[52]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 21:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Вызов getline, с точки зрения метода foo, очевидно блокирующий

I>Правильно, и с чем ты спорил ?

Где?
Я сразу сказал
Автор: Evgeny.Panasyuk
Дата: 21.06.13
:

На stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде, ибо такие сопроцедуры (без асинхронных кишок в клиентском коде) сразу возвращают управление в клиентский код — а это значит что либо данные ещё не получены, либо никакой асинхронности, так как только один поток.


I>>>Если да, то надо явно дергать message pump.

EP>>Зачем дёргать? внутри TcpStream стоит yield, который вернёт управление (аналогично await'у, только "многоуровневый")
I>Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?

стрим async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
заснул на пол-часа, нет данных minimize'а. Что будет с UI ? UI — не висит.
Re[54]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 21:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>"Ты в начало треда посмотри и заметишь" что запрошенного примера на C# нет до сих пор

I>Разумеется, пока ты не дашь ответа на мой вопрос, я его задал ажно две недели назад, я ничего не собираюсь показывать.

Какой именно вопрос? который ты задал после запрошенного примера на C#?

I>Ты напоказывал вагоны кода, которые тебя никто вообще не просил и так и не дал ответа на поставленый вопрос.

EP>>Покажи версию без корутин на C++ — я её переделаю на корутины. А то ты опять будешь кричать что это не "асинхронщина".
EP>>[/q]
I>Вот еще пример — я показал код со Sleep и все на этом закончилось.

Тех примеров что я показал — достаточно. Ты не показал ни одного запрошенного примера

EP>>и если после этого тебе мерещатся заблокированные ui-loop-ы — то как-то совсем печально

I>Ты сам сказал, что getline блокирующий

вызов getline из foo — блокирующий, вызов корутины, которая его содержит — нет
Re[54]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 21:35
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?

EP>>стрим async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
заснул на пол-часа, нет данных minimize'а. Что будет с UI ? UI — не висит.

I>Висит, потому что getline — блокирующий.

EP>>строчка await async_download:
EP>>

EP>>await async_download(address);
EP>>on_completion();
EP>>

EP>>также выполняется синхронно?
I>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?


getline — блокирующий, "толко не блокирует UI. Странно, да ?"
Re[55]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 21:37
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>

EP>>>строчка await async_download:
EP>>>

EP>>>await async_download(address);
EP>>>on_completion();
EP>>>

EP>>>также выполняется синхронно?
I>>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?


EP>getline — блокирующий, "толко не блокирует UI. Странно, да ?"


Ну ка, выдели мне в этом коде getline , чтото я плохо видеть стал.
Re[56]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 21:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>>>Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?

EP>>>>стрим async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
заснул на пол-часа, нет данных minimize'а. Что будет с UI ? UI — не висит.

I>>>Висит, потому что getline — блокирующий.
EP>>

EP>>>>строчка await async_download:
EP>>>>

EP>>>>await async_download(address);
EP>>>>on_completion();
EP>>>>

EP>>>>также выполняется синхронно?
I>>>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?

EP>>getline — блокирующий, "толко не блокирует UI. Странно, да ?"
I>Ну ка, выдели мне в этом коде getline , чтото я плохо видеть стал.

getline в сообщении
Re[56]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 21:45
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Разумеется, пока ты не дашь ответа на мой вопрос, я его задал ажно две недели назад, я ничего не собираюсь показывать.

EP>>Какой именно вопрос? который ты задал после запрошенного примера на C#?
I>Тот самый, про getline и message pump.

ну да, который задан после примера который ты так и не осилил показать

I>>>Вот еще пример — я показал код со Sleep и все на этом закончилось.


EP>>Тех примеров что я показал — достаточно. Ты не показал ни одного запрошенного примера

I>Разумеется и не собираюсь до тех пор, пока не получу внятные ответы на свои вопросы которым уже две недели.

вопросы заданны после запрошенного примера. примера нет до сих пор

I>Беда какая то — getline Блокирующий, значит нужна короутина что бы сделать неблокирующий вызов. getline неблокирующий — снова нужно чего то написать, что бы сделать блокирующий код.

I>Когда же ты наконец покажешь именно то что обещал ("код будет одинаковым в обоих случаях") ?

http://www.rsdn.ru/forum/philosophy/5211729.1
Автор: Evgeny.Panasyuk
Дата: 26.06.13
Re[50]: Что посоветуете как аналог С++
От: alex_public  
Дата: 07.07.13 23:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

_>>Ещё раз, у нас есть функция Read(buf, callback). Такое частенько встречается. Сама функция не блокирующая, но и не возвращает никаких значений (типа Task). И так, await чего мы тут будем вызывать, что бы код следующий за Read вызвался внутри callback и обработал buf?

I>Значит будет возвращать Task и делать ему await, не вижу принципиальной разницы. Если сравнивать построчно, то можно дойти до того что "В С++ нет using, finally а в С# нет деструкторов"

Ну так покажи как преобразовать void Read(byte* buf, func callback) (которая нам дана извне, например от ОС) в Task MyRead(byte* buf). Я пока не очень представляю как это сделать в C#.
Re[51]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 07:50
Оценка:
Здравствуйте, alex_public, Вы писали:

_>>>Ещё раз, у нас есть функция Read(buf, callback). Такое частенько встречается. Сама функция не блокирующая, но и не возвращает никаких значений (типа Task). И так, await чего мы тут будем вызывать, что бы код следующий за Read вызвался внутри callback и обработал buf?

I>>Значит будет возвращать Task и делать ему await, не вижу принципиальной разницы. Если сравнивать построчно, то можно дойти до того что "В С++ нет using, finally а в С# нет деструкторов"

_>Ну так покажи как преобразовать void Read(byte* buf, func callback) (которая нам дана извне, например от ОС) в Task MyRead(byte* buf). Я пока не очень представляю как это сделать в C#.


Чуть более чем все функции OS в таком вот виде и ничего, как то живут люди
Re[57]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 07:55
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>>>Разумеется, пока ты не дашь ответа на мой вопрос, я его задал ажно две недели назад, я ничего не собираюсь показывать.

EP>>>Какой именно вопрос? который ты задал после запрошенного примера на C#?
I>>Тот самый, про getline и message pump.

EP>ну да, который задан после примера который ты так и не осилил показать


Я все ще жду ответа на самый первый свой вопрос

EP>>>Тех примеров что я показал — достаточно. Ты не показал ни одного запрошенного примера

I>>Разумеется и не собираюсь до тех пор, пока не получу внятные ответы на свои вопросы которым уже две недели.
EP>вопросы заданны после запрошенного примера. примера нет до сих пор

И не будет, потому что я не получил ответа на свой первый вопрос.

I>>Беда какая то — getline Блокирующий, значит нужна короутина что бы сделать неблокирующий вызов. getline неблокирующий — снова нужно чего то написать, что бы сделать блокирующий код.

I>>Когда же ты наконец покажешь именно то что обещал ("код будет одинаковым в обоих случаях") ?

EP>http://www.rsdn.ru/forum/philosophy/5211729.1
Автор: Evgeny.Panasyuk
Дата: 26.06.13


Я вижу что здесь один вызов и он блокирующий, как ты сам и сказал. Теперь надо показать такой же вызов, но неблокирующий и что бы код был одинаковым.

Собтсвенно это и есть асинхронщина, а не то что "там, унутре все шоколадно".
Re[55]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 10:17
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Надеюсь такого bullshit'а про подвисший UI больше не будет после очередного ликбеза:

EP>void task()
EP>{
EP>    auto &&coro = make_shared<Coro>();
EP>    *coro = Coro([&coro](Coro::caller_type &ca)
EP>    {
EP>        DataSource source = {ca, &coro};
EP>        InputStream client_stream(source);
EP>        foo(client_stream);
EP>    });
EP>}


EP>И никакого подвисшего UI


Не совсем понятно зачем тебе сотня строк, если хватило бы и десяти
В таком виде я согласен, что UI не будет блокироваться, так что вопрос снят. Но теперь во всю торчат уши асинхронщины, хотя ты был себя пяткой в грудь что ничо нигде не торчит Такшта дело за малым — упаковать всё это библиотеку, шоб вообще никаких ушей не осталось, а то мне интересно, как без этих самых ушей одна и та же строчка может быть как блокирующей, так и неблокирующей.
Re[56]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 08.07.13 11:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Не совсем понятно зачем тебе сотня строк, если хватило бы и десяти


Большую часть кода я скопировал из примеров которые приводил выше — ничего принципиально нового в этот пример я не добавил. async_something превратился в async_read, в foo по очевидным причинам istream заменился на wistream, cout на SendMessage WM_SETTEXT, и т.п.

I>Но теперь во всю торчат уши асинхронщины, хотя ты был себя пяткой в грудь что ничо нигде не торчит


Весь асинхронный stuff размещается на двух концах call stack'а — в начале, где запускается корутина, и в конце, где делается yield. Между ними может быть сколько угодно уровней кода не использующих никаких асинхронных конструкций.
В примере выше task может вызывать не foo, а bar, который вызывает baz, который вызывает qux, который вызывает foo — и ни в одной из этих функций не торчат "уши асинхронщины". На await, stackless coroutine, etc — так не получится.

Более того, можно взять обычное консольное приложение использующие std::cin/cout, сделать некоторые изменения в main — и приложение превратится в сервер на асинхронных сокетах. (очевидно на код налагаются некоторые ограничениями на использование глобального состояния)
Re[52]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 12:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Чуть более чем все функции OS в таком вот виде и ничего, как то живут люди


Т.е. ответа не будет... Понятно)))
Re[57]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 12:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Но теперь во всю торчат уши асинхронщины, хотя ты был себя пяткой в грудь что ничо нигде не торчит


EP>Весь асинхронный stuff размещается на двух концах call stack'а — в начале, где запускается корутина, и в конце, где делается yield. Между ними может быть сколько угодно уровней кода не использующих никаких асинхронных конструкций.

EP>В примере выше task может вызывать не foo, а bar, который вызывает baz, который вызывает qux, который вызывает foo — и ни в одной из этих функций не торчат "уши асинхронщины". На await, stackless coroutine, etc — так не получится.

Правильно, потому что вся эта цепочка становится блокирующей. Блокирующие функции в C# не требуют никаких await, что бы получить аналог такого getline нужны всего лишь нелокальные переходы.

EP>Более того, можно взять обычное консольное приложение использующие std::cin/cout, сделать некоторые изменения в main — и приложение превратится в сервер на асинхронных сокетах. (очевидно на код налагаются некоторые ограничениями на использование глобального состояния)


А это уже кооперативная многозадачность, но тебе почему то удобно называть это асинхронщиной на том основании что "унутре така неонка". Эдак Console.WriteLine можно назвать асинхронщиной, на том основании что таймер будет срабатывать как положено.
Re[53]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 12:21
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Чуть более чем все функции OS в таком вот виде и ничего, как то живут люди


_>Т.е. ответа не будет... Понятно)))


Ты пойми простую вещь, на C# я уже не пишу, а TPL знаю не так хорошо, что бы быстро накидать код который будет работать в твоем случае.

Нет у тебя никаких чудес — указатель и колбек. И то и другое нормально дружит с интеропом. Остается самое малое — связать колбек и тпл.
Re[54]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 12:52
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты пойми простую вещь, на C# я уже не пишу, а TPL знаю не так хорошо, что бы быстро накидать код который будет работать в твоем случае.


I>Нет у тебя никаких чудес — указатель и колбек. И то и другое нормально дружит с интеропом. Остается самое малое — связать колбек и тпл.


Эээ речь вообще о другом. То, что подобную функцию можно без проблем использовать из C# я даже не сомневаюсь... Вопрос в том, чтобы сделать линеаризацию кода (код обрабатывающий буфер расположен прямо после вызова этой функции), работающего с этой функцией. С помощью Boost.Coroutine это делается без проблем. А вот с помощью await/async я лично не особо представляю как можно подобное сделать.
Re[55]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 13:33
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Эээ речь вообще о другом. То, что подобную функцию можно без проблем использовать из C# я даже не сомневаюсь... Вопрос в том, чтобы сделать линеаризацию кода (код обрабатывающий буфер расположен прямо после вызова этой функции), работающего с этой функцией. С помощью Boost.Coroutine это делается без проблем. А вот с помощью await/async я лично не особо представляю как можно подобное сделать.


после того, как врапнется в task, будет вот такое
buffer = await Read();
Re[58]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 08.07.13 14:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>В примере выше task может вызывать не foo, а bar, который вызывает baz, который вызывает qux, который вызывает foo — и ни в одной из этих функций не торчат "уши асинхронщины". На await, stackless coroutine, etc — так не получится.

I>Правильно, потому что вся эта цепочка становится блокирующей.

Снаружи вызов такой цепочки не блокирующий.

I>Блокирующие функции в C# не требуют никаких await, что бы получить аналог такого getline нужны всего лишь нелокальные переходы.


.. которых нет, о чём и речь.
Хотя, ты же что-то пытался показать, аж 3 варианта :

I>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#

void foo(Stream stream)
{
    string msg;
    do
    {
        msg = getline(stream);
        Trace.WriteLine(msg); 
    } while(msg != "exit");
}

Вариант 1: генераторы
(skipped)
Вариант 3: эвенты
(skipped)
Вариант 3: олдскульноее ООП, которое есть даже в Джаве, Джаваскрипте и где угодно
(skipped)


EP>>Более того, можно взять обычное консольное приложение использующие std::cin/cout, сделать некоторые изменения в main — и приложение превратится в сервер на асинхронных сокетах. (очевидно на код налагаются некоторые ограничениями на использование глобального состояния)

I>А это уже кооперативная многозадачность, но тебе почему то удобно называть это асинхронщиной на том основании что "унутре така неонка". Эдак Console.WriteLine можно назвать асинхронщиной, на том основании что таймер будет срабатывать как положено.

1. Если цепочка будет сделана на явных await'ах, и async'ах, вместо спрятанных yield'ов — то внезапно это становится асинхронщинной?
2. Какая разница какой именно термин? С использованием stackful coroutine так можно сделать, а с stackless-like (await, one-level yield) — нет.
Re[59]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 14:10
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Правильно, потому что вся эта цепочка становится блокирующей.


EP>Снаружи вызов такой цепочки не блокирующий.


Главное что унутре она вся блокирующая, потому никаких чудес здесь нет.

I>>Блокирующие функции в C# не требуют никаких await, что бы получить аналог такого getline нужны всего лишь нелокальные переходы.


EP>.. которых нет, о чём и речь.


Ага, в C# отменили эвенты, генераторы, ооп-диспетчеризацию и прочие вещи

EP>1. Если цепочка будет сделана на явных await'ах, и async'ах, вместо спрятанных yield'ов — то внезапно это становится асинхронщинной?


У тебя цепочка вся напрочь блокирующая, толко вызывается через неблокирующую короутину. Мне нужно сделать ровно то же — унутре все блокироваться, а снаружи async

EP>2. Какая разница какой именно термин? С использованием stackful coroutine так можно сделать, а с stackless-like (await, one-level yield) — нет.




Одно из двух,
или "в C# отменили эвенты, генераторы, ооп-диспетчеризацию и прочие вещи"
или ты хочешь кооперативную многозадачность (непонятно на каком основании)
Re[60]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 08.07.13 14:17
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>1. Если цепочка будет сделана на явных await'ах, и async'ах, вместо спрятанных yield'ов — то внезапно это становится асинхронщинной?

I>У тебя цепочка вся напрочь блокирующая, толко вызывается через неблокирующую короутину. Мне нужно сделать ровно то же — унутре все блокироваться, а снаружи async

у тебя будет await в каждом звене цепи если нет, то код в студию
Re[56]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 14:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>после того, как врапнется в task, будет вот такое

I>
I>buffer = await Read();
I>


Это понятно))) Но как "врапнуть в task" подобное я как раз и не представляю себе.
Re[57]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 08.07.13 14:44
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Это понятно))) Но как "врапнуть в task" подобное я как раз и не представляю себе.


Наверное также как и в C++:
#include <iostream>
#include <future>
using namespace std;

template<typename Handler>
void read_cps(Handler h)
{
    h(11);
}

int main()
{
    promise<int> p;
    read_cps([&](int x){ p.set_value(x); });
    cout << p.get_future().get() << endl;
}

(с поправкой на то что операция будет асинхронной, вместо .get() — await, и т.п.)
Task это фактически аналог std::future.
Re[57]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 14:51
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Это понятно))) Но как "врапнуть в task" подобное я как раз и не представляю себе.


Будет приблизительно так

[DllImport]
static void Read(Buffer buffer, Action<object> callback);

Task<Buffer> Read()
{
   var task = new Task<Buffer>();
   var buffer = new Buffer();

   Read(buffer, () => task.Continue(buffer) );

   return task;
}
Re[61]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 14:54
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>1. Если цепочка будет сделана на явных await'ах, и async'ах, вместо спрятанных yield'ов — то внезапно это становится асинхронщинной?

I>>У тебя цепочка вся напрочь блокирующая, толко вызывается через неблокирующую короутину. Мне нужно сделать ровно то же — унутре все блокироваться, а снаружи async

EP>у тебя будет await в каждом звене цепи если нет, то код в студию


Обычный код вообще без asynс и await. async-await будет только на самом верху.
Похоже, ты забыл что сам по себе getline у тебя блокирующий, потому мне надо сделать ровно то же — унутре православный синхронный код, а снаружи async. То есть, унутре будут обычное нелокальные переходы.
Ну или как вариант, ты все еще ждешь кооперативную многозадчность
Re[62]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 08.07.13 15:41
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>у тебя будет await в каждом звене цепи если нет, то код в студию

I>Обычный код вообще без asynс и await. async-await будет только на самом верху.

А смысл от await+async наверху, если внизу обычный код?

I>Похоже, ты забыл что сам по себе getline у тебя блокирующий, потому мне надо сделать ровно то же — унутре православный синхронный код, а снаружи async.


аналог моему getline на C# будет:
msg = await stream.getline();

Re[63]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 16:08
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Похоже, ты забыл что сам по себе getline у тебя блокирующий, потому мне надо сделать ровно то же — унутре православный синхронный код, а снаружи async.


EP>аналог моему getline на C# будет:

EP>
EP>msg = await stream.getline();
EP>

EP>

Это чушь. Твой getline БЛОКИРУЮЩИЙ. Какая у него унутре неонка, то есть, диспетчеризация, вообще не имеет никакого значения. В твоем примере есть кооперативная многозадачность ? Ни разу. Чего ты еще хочешь ?
Соответсвенно нужен просто блокирующий вызов getline безо всяких авайтов, который через нелокальные переходы вытащит все нужные данные.
Re[58]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 17:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Будет приблизительно так


I>
I>[DllImport]
I>static void Read(Buffer buffer, Action<object> callback);

I>Task<Buffer> Read()
I>{
I>   var task = new Task<Buffer>();
I>   var buffer = new Buffer();

I>   Read(buffer, () => task.Continue(buffer) );

I>   return task;
I>}
I>


Что-то я не вижу тут http://msdn.microsoft.com/en-us/library/dd321424.aspx ни конструктора без параметров, ни функции Continue. А так бы да, это был бы буквально ответ на мой вопрос. )
Re[58]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 17:30
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>(с поправкой на то что операция будет асинхронной, вместо .get() — await, и т.п.)

EP>Task это фактически аналог std::future.

Task то действительно аналог future. А вот аналога promise я как-то не вижу...
Re[59]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 18:03
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Task то действительно аналог future. А вот аналога promise я как-то не вижу...


О, хотя я тут полистал msdn — на самом деле есть аналог по имени TaskCompletionSource. Так что действительно в точности как на C++ выходит. Странно только что Ikemefula не в курсе про него был, хотя такой защитник C#'a...
Re[60]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 18:44
Оценка:
Здравствуйте, alex_public, Вы писали:

_>>Task то действительно аналог future. А вот аналога promise я как-то не вижу...


_>О, хотя я тут полистал msdn — на самом деле есть аналог по имени TaskCompletionSource. Так что действительно в точности как на C++ выходит. Странно только что Ikemefula не в курсе про него был, хотя такой защитник C#'a...


Я пока что не пишу на C# а tpl не знаю досконально. В .net не требуется знать все методы всех классов
Re[59]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 18:56
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Task то действительно аналог future. А вот аналога promise я как-то не вижу...


Не в курсе, чего ты имеешь ввиду под future, но Task может использоваться и как промис, собственно до await их так и юзали.
Re[59]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 18:58
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Что-то я не вижу тут http://msdn.microsoft.com/en-us/library/dd321424.aspx ни конструктора без параметров, ни функции Continue. А так бы да, это был бы буквально ответ на мой вопрос. )


попутал по привычке, ContinueWith видишь ?
Re[60]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 19:06
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>попутал по привычке, ContinueWith видишь ?


Так оно совершенно другую задачу делает, а не завершает задачку, как у тебя в примере. Это даже если забыть что у Task нет конструкторов по умолчанию.
Re[61]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 19:09
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>попутал по привычке, ContinueWith видишь ?


_>Так оно совершенно другую задачу делает, а не завершает задачку, как у тебя в примере. Это даже если забыть что у Task нет конструкторов по умолчанию.


А у меня в примере он и не завершает задачу
Re[61]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 19:21
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Ikemefula, Вы писали:


EP>>>1. Если цепочка будет сделана на явных await'ах, и async'ах, вместо спрятанных yield'ов — то внезапно это становится асинхронщинной?

I>>У тебя цепочка вся напрочь блокирующая, толко вызывается через неблокирующую короутину. Мне нужно сделать ровно то же — унутре все блокироваться, а снаружи async

EP>у тебя будет await в каждом звене цепи если нет, то код в студию


Вобще говоря, для реализации твоего последнего примера так и будет, шота я забыл забрало приподнять
Re[62]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 19:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А у меня в примере он и не завершает задачу


Эээ ContinueWith принимает в качестве параметра Action. А у тебя в примере он принимает Buffer.

Вообще не пойму чего ты отмазываешься то. Ну не знал и ладно. Я уже сам обнаружил что в принципе на C# можно записать подобный код, с помощью функции TaskCompletionSource.SetResult (вместо твоего Continue). Т.е. в принципе на C# можно писать код подобный примерам Evgeny.Panasyuk'а, хотя и более многословным и неэффективным (в смысле накладных расходов) способом.
Re[61]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 19:22
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>попутал по привычке, ContinueWith видишь ?


_>Так оно совершенно другую задачу делает, а не завершает задачку, как у тебя в примере. Это даже если забыть что у Task нет конструкторов по умолчанию.


Мне некогда было смотреть, какой метод может сорганизовать ожидаемый объект, потому сделал "кабутта" промис.
Re[63]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 19:23
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Эээ ContinueWith принимает в качестве параметра Action. А у тебя в примере он принимает Buffer.


Это дело десятое.

_>Вообще не пойму чего ты отмазываешься то. Ну не знал и ладно. Я уже сам обнаружил что в принципе на C# можно записать подобный код, с помощью функции TaskCompletionSource.SetResult (вместо твоего Continue). Т.е. в принципе на C# можно писать код подобный примерам Evgeny.Panasyuk'а, хотя и более многословным и неэффективным (в смысле накладных расходов) способом.


я раза три или четыре сказал, что не знаю тонкостев
Re[61]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 20:03
Оценка:
I>Я пока что не пишу на C# а tpl не знаю досконально. В .net не требуется знать все методы всех классов

Вообще весьма симптоматично, что самым верным защитником управляемых языков и C# в частности, оказался не использующий C# на практике.

А всякие официальные пользователи C# типа gandjustas и прочих IT резко слились из темы, как только дело дошло до обсуждения конкретики. )))

P.S. А Ikemefula хотя и дико упёртый, но в любом случае достоин уважения. )
Re[39]: Что посоветуете как аналог С++
От: artelk  
Дата: 09.07.13 07:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, artelk, Вы писали:


EP>По смыслу, это примерно тоже самое, что и:

EP>
EP>async Task<Result> bar(istream client1, istream client2)
EP>{
EP>    var result = await foo(client1) + await foo(client2);
EP>    return result;
EP>}
EP>

EP>Вызывающий поток(thread) не блокируется, а возвращается к другим задачам, например по event loop.

Т.е. твоя реализация ограничена кооперативной многозадачностью поверх event loop?
Для async/await это лишь один из способов выполнения.

А еще, то, что возвращается именно Task позволяет нам, например, написать так:
async Task<int> bar(client1, client2)
{
  var taskR1 = foo(client1);
  var taskR2 = foo(client2);
  M1();
  M2();
  return await taskR1 + await taskR2;
}

Т.е. распараллелить все. Задачи taskR1, taskR2 выполняются параллельно, в то время как bar продолжает работать, выполняя M1() и M2().

A>>TcpStream — это какой-то специальный stream, который периодически делает yield?

EP>Да, только не периодически, а по необходимости. Внутри у него что-то типа:
EP>
EP>async_read(connection, buffer, /* completion callback: */ [coro]{ coro.resume(); } );
EP>coro.yeild(); // "sleep", will be awakened by completion callback
EP>

EP>Причём у него интерфейс как у обычного блокирующего потока, без намёков на асинхронность, поэтому он и совместим с std::istream.
Понятно. Т.е. нужно не забывать, что инстанцировать нужно именно специальные стримы, которые "знают" о нашем трюке.
А как быть с задачами, которые вообще со стримами не работают?
Re[62]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.07.13 07:42
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Вообще весьма симптоматично, что самым верным защитником управляемых языков и C# в частности, оказался не использующий C# на практике.


10 лет C# этого разве недостаточно ?

_>А всякие официальные пользователи C# типа gandjustas и прочих IT резко слились из темы, как только дело дошло до обсуждения конкретики. )))


Наверное им было скучно по сто раз одно и то же объяснять.
Re[73]: Что посоветуете как аналог С++
От: vdimas Россия  
Дата: 09.07.13 12:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Твои идейки распространяются на случай из двух трех короутин, где все и так само работает. Общий случай такой — высокоприоритетный поток вдруг начинает ожидать результат низкоприоритетного потока, а тот спит, потому что выполняются другие потоки. Что бы такое не возникало, нужен хороший шедулер и возможность сообщать шедулеру, где какой приоритет и кто чего ожидает.

I>Кроме как расставить все руками у тебя ничего нет, правильно ?

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


I>От тебя было утверждение про некие гарантии. Хочу увидеть эти гарантии примером кода.


Еще раз сформулируй, гарантии чего именно. Пример кода я привел. Гарантий никогда нет. С async/await тоже, ес-но.
Re[74]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.07.13 13:26
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Твои идейки распространяются на случай из двух трех короутин, где все и так само работает. Общий случай такой — высокоприоритетный поток вдруг начинает ожидать результат низкоприоритетного потока, а тот спит, потому что выполняются другие потоки. Что бы такое не возникало, нужен хороший шедулер и возможность сообщать шедулеру, где какой приоритет и кто чего ожидает.

I>>Кроме как расставить все руками у тебя ничего нет, правильно ?

V>Я же тебе сказал, если ты сам в состоянии управлять очередью исполнения кода в кооперативной многозадачности, то тебе не нужен никакой "приоритет".


Нужен, в том то и дело. Одна короутина должна отработать пораньше, а другая может хоть пол-часа ждать.

I>>От тебя было утверждение про некие гарантии. Хочу увидеть эти гарантии примером кода.


V>Еще раз сформулируй, гарантии чего именно. Пример кода я привел. Гарантий никогда нет. С async/await тоже, ес-но.


Ты сам вспомни, чего ты вещал про гарантии
Re[40]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 09.07.13 14:19
Оценка:
Здравствуйте, artelk, Вы писали:

EP>>По смыслу, это примерно тоже самое, что и:

EP>>
EP>>async Task<Result> bar(istream client1, istream client2)
EP>>{
EP>>    var result = await foo(client1) + await foo(client2);
EP>>    return result;
EP>>}
EP>>

EP>>Вызывающий поток(thread) не блокируется, а возвращается к другим задачам, например по event loop.
A>Т.е. твоя реализация ограничена кооперативной многозадачностью поверх event loop?

Мой пример показывает то, чего на C# нельзя достичь.

A>Для async/await это лишь один из способов выполнения.

A>А еще, то, что возвращается именно Task позволяет нам, например, написать так:
A>
A>async Task<int> bar(client1, client2)
A>{
A>  var taskR1 = foo(client1);
A>  var taskR2 = foo(client2);
A>  M1();
A>  M2();
A>  return await taskR1 + await taskR2;
A>}
A>

A>Т.е. распараллелить все. Задачи taskR1, taskR2 выполняются параллельно, в то время как bar продолжает работать, выполняя M1() и M2().

Точно такой же синтаксис оператора await можно получить с помощью stackful coroutine, только он будет мощнее, так как может yield'ить через много уровней, а не один.

A>>>TcpStream — это какой-то специальный stream, который периодически делает yield?

EP>>Да, только не периодически, а по необходимости. Внутри у него что-то типа:
EP>>
EP>>async_read(connection, buffer, /* completion callback: */ [coro]{ coro.resume(); } );
EP>>coro.yeild(); // "sleep", will be awakened by completion callback
EP>>

EP>>Причём у него интерфейс как у обычного блокирующего потока, без намёков на асинхронность, поэтому он и совместим с std::istream.
A>Понятно. Т.е. нужно не забывать, что инстанцировать нужно именно специальные стримы, которые "знают" о нашем трюке.
A>А как быть с задачами, которые вообще со стримами не работают?

Ещё раз, это конкретный пример инкапсуляции асинхронной логики таким образом, что много уровней клиентского кода могут и не догадываться об этом — на C# так не получится, послушай своего коллегу
Автор: Ikemefula
Дата: 08.07.13
.
Очевидно, что так можно инкапсулировать что угодно, а не только стримы, в том числе реализовать более мощный аналог await
Re[41]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.07.13 15:01
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Мой пример показывает то, чего на C# нельзя достичь.


А надо ? Твой пример похож на "я и так могу".

A>>Т.е. распараллелить все. Задачи taskR1, taskR2 выполняются параллельно, в то время как bar продолжает работать, выполняя M1() и M2().


EP>Точно такой же синтаксис оператора await можно получить с помощью stackful coroutine, только он будет мощнее, так как может yield'ить через много уровней, а не один.


Это именно то чего делать ни в коем случае не нужно.

EP>Ещё раз, это конкретный пример инкапсуляции асинхронной логики таким образом, что много уровней клиентского кода могут и не догадываться об этом — на C# так не получится, послушай своего коллегу
Автор: Ikemefula
Дата: 08.07.13
.

EP>Очевидно, что так можно инкапсулировать что угодно, а не только стримы, в том числе реализовать более мощный аналог await

аналог await это хорошо, а если "через много уровней", то хуже некуда, хаос в коде гарантирован.
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.07.13 16:28
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>При использовании await'а, часто вырастают "вынужденные" цепочки await'ов/async'ов вверх по call stack'у — об этом говорится во многих туториалах по await.

EP>Имея возможность "через много уровней", можно по необходимости ввести ограничение на "один уровень".

Правильно быть в курсе, что ты в такой вот цепочке.

EP>Будет ли хаос при использовании "через много уровней" — сходу сказать не могу, ибо не использовал. Рассказы про "хаос" вообще окружают каждую фишку которая даёт что-то в обмен на потерю контроля.

EP>function pointer, virtual function, overloading — "хаос, неизвестно что вызывается"
EP>type inference, auto, template argument deduction — "хаос, неизвестно какие типы, и вообще duck typing" (даже в этой теме успели это пережевать)
EP>Как показывает история, зачастую все эти страхи от банального blub-парадокса и инерции

Ты лучше посмотри насколько "широко" используются файберы. Это собтсвенно демонстрация никчемности твоих короутин.
Re[44]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.07.13 16:53
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Будет ли хаос при использовании "через много уровней" — сходу сказать не могу, ибо не использовал. Рассказы про "хаос" вообще окружают каждую фишку которая даёт что-то в обмен на потерю контроля.

EP>>function pointer, virtual function, overloading — "хаос, неизвестно что вызывается"
EP>>type inference, auto, template argument deduction — "хаос, неизвестно какие типы, и вообще duck typing" (даже в этой теме успели это пережевать)
EP>>Как показывает история, зачастую все эти страхи от банального blub-парадокса и инерции

I>Ты лучше посмотри насколько "широко" используются файберы. Это собтсвенно демонстрация никчемности твоих короутин.


Ты предлагаешь неочевидный инструмент, который будут делать чтото интересное в глубоком стеке который и так непонятно, как контролировать.
Сейчас другой тренд — во все языки проникают всякие монады и разные вкусные вещи для декларативного кода. Эта хрень позволяет ужать стек вызовов до безобразия.
Re[5]: Что посоветуете как аналог С++
От: Figaro Россия  
Дата: 10.07.13 04:02
Оценка:
[skipped]

OFF: не пишу сюда как правило — теоритики собираются

Но, так как в чужом коде постоянно приходиться разбираться, то замечу — если человек поверхностно глянул, а потом проект "спустил" заказчику, то в той "армии" даже дубы не растут, Вы не заставляете себя вдуматься, что конкретный код делает... А плюсы заставляют...

P.S. Не ради флэйма... я могу, если трезвый и по-английский свободно, и на русском-командо-матерном и разговаривать и читать, и ту же Аду читать с вместе Паскакалем Остальное просто расслабляет программерский контингент, особенно сдача проекта вовремя...
avalon/1.0.433
Re[64]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.07.13 07:52
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>10 лет C# этого разве недостаточно ?


_>Что-то по отсутствию знания базовых примитивов многопоточности эти 10 лет совсем не чувствуются... )


Про базовые примитивы многопоточности здесь ни в одном месте речи не было Но вообще ты прав, я многопоточностью занимался совсем немного и в основном по собтсвенной инициативе.

I>>Наверное им было скучно по сто раз одно и то же объяснять.


_>Если бы. На деле там были громкие крики в стиле "а вот фиг вы сделаете такое на C++". И соответственно после того, как бы представлен код делающий именно это самое, мгновенный тихий слив из темки...


Ваши короутины это плак по тем возможностям которые были утеряны вместе с ассемблером.

На ассемблере это детский лепет, уровня лабораторной задачи на втором семестре ассемблера. Скажем вытесняющая и кооперативная многозадачность это примерно уровень курсовой работы. Щас вот функционалисты ищут способы оптимизации хвостовой рекурсии, а в ассемблере это само работало — continuations, рекурсия на бесконечном стеке и тд и тд и тд.

И кстати говоря, все согласуется с парадоксом Блаба — не хочешь учить ассемблер, значит пишешь на Блабе
Re[76]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.07.13 07:55
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Нужен, в том то и дело. Одна короутина должна отработать пораньше, а другая может хоть пол-часа ждать.


V>Для этого не нужен никакой числовой "приоритет", если мы все еще говорим о зависимых друг от друга короутинах, т.е. обладаем информацией об этой зависимости и о способе получать мгновеннную прикладную картинку востребованности ресурсов. Независимые же короутины вполне можно разносить по разным аппаратным потокам.


Для двух-трех короутин это работает, да.

I>>Ты сам вспомни, чего ты вещал про гарантии


V>Гарантии в обоих языках даются системой типов. Ты же попросил меня отличить синхронный вызов от асинхронного. Сорри, но в C# они отличаются лишь синтаксическим сахаром. Я вполне могу в действующей системе типов расписать происходящее без await.


Весь твой с++ это просто сахар для ассемблера. Вобщем, раз ты ничего не можешь вспомнить про гарантии, то можно и закончить.
Re[6]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.07.13 07:57
Оценка:
Здравствуйте, Figaro, Вы писали:

F>Но, так как в чужом коде постоянно приходиться разбираться, то замечу — если человек поверхностно глянул, а потом проект "спустил" заказчику, то в той "армии" даже дубы не растут, Вы не заставляете себя вдуматься, что конкретный код делает... А плюсы заставляют...


Что же ты на ассемблере не пишешь, он так заставит думать, не передать словами, только и будешь этим заниматься ? Что, парадокс Блаба мешает ?
Re[63]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.07.13 08:00
Оценка:
Здравствуйте, gandjustas, Вы писали:

_>>А всякие официальные пользователи C# типа gandjustas и прочих IT резко слились из темы, как только дело дошло до обсуждения конкретики. )))


G>не, я просто в отпуск уехал, а когда вернулся стало лениво все читать. Но я так понял что до сих пор никто не показал пример GUI Фреймворка с интегрированными stickful coroutines, так что все примеры ни о чем.


А может тебе сразу операционную систему накидать на коленке ?

G>Поправьте, если я ошибаюсь.


Все что надо уже давно показано.

_>>P.S. А Ikemefula хотя и дико упёртый, но в любом случае достоин уважения. )

G>ИМХО он может до бесконечности спорить на любую тему.

На любую не умею, в отличие от тебя я не лезу туда, где ничего не знаю. Ты подрываешь авторитет дотнетчиков своими аргументами
Re[64]: Что посоветуете как аналог С++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.07.13 15:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, gandjustas, Вы писали:


_>>>А всякие официальные пользователи C# типа gandjustas и прочих IT резко слились из темы, как только дело дошло до обсуждения конкретики. )))


G>>не, я просто в отпуск уехал, а когда вернулся стало лениво все читать. Но я так понял что до сих пор никто не показал пример GUI Фреймворка с интегрированными stickful coroutines, так что все примеры ни о чем.


I>А может тебе сразу операционную систему накидать на коленке ?


Если интеграция stackful coroutines с гуйней сравнима с написанием ОС, то это конечно говорит в пользу C++

G>>Поправьте, если я ошибаюсь.

I>Все что надо уже давно показано.
А ссылку не модно?

_>>>P.S. А Ikemefula хотя и дико упёртый, но в любом случае достоин уважения. )

G>>ИМХО он может до бесконечности спорить на любую тему.
I>На любую не умею, в отличие от тебя я не лезу туда, где ничего не знаю. Ты подрываешь авторитет дотнетчиков своими аргументами
Практика показывает обратное, но к данной теме отношения не имеет.
Re[65]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.07.13 08:46
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>Поправьте, если я ошибаюсь.

I>>Все что надо уже давно показано.
G>А ссылку не модно?

Нет.

_>>>>P.S. А Ikemefula хотя и дико упёртый, но в любом случае достоин уважения. )

G>>>ИМХО он может до бесконечности спорить на любую тему.
I>>На любую не умею, в отличие от тебя я не лезу туда, где ничего не знаю. Ты подрываешь авторитет дотнетчиков своими аргументами
G>Практика показывает обратное, но к данной теме отношения не имеет.

Ага, ты победил.
Re[7]: Что посоветуете как аналог С++
От: Figaro Россия  
Дата: 11.07.13 09:34
Оценка:
Не понял... Вас Ассемблер пугает?
avalon/1.0.433
Re[8]: Что посоветуете как аналог С++
От: artelk  
Дата: 11.07.13 13:19
Оценка:
Здравствуйте, Figaro, Вы писали:

F>Не понял... Вас Ассемблер пугает?


Представилось: команда из 20 разработчиков, помешанных на микрооптимизациях, совместно разрабатывают на Ассемблере какое-нибудь типичное энтерпрайз приложение с изменяющимися требованиями.
И что-то эта картина меня напугала.
Re[8]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.07.13 13:25
Оценка:
Здравствуйте, Figaro, Вы писали:

F>Не понял... Вас Ассемблер пугает?


Я спросил: "Почему ты не пишешь на ассемблере ?" Он гораздо лучше относительно плюсов заставляет вдумываться в то, что делаешь и уж точно не расслабаляет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.