Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>То есть ты предлагаешь включать в ISO C++ любой убогий костыль, в корне не соответствующую генеральной линии языка, который хоть как-то стандартизирован?
только самое необходимое.
EP>В смысле синтаксис? ну да, я о том и говорю.
не только синтаксис, но и "закулисная" реализация.
EP>Поддержка нужна, и она прекрасно реализуется library-only. Microsoft PPL, Intel TBB — тому подтверждение.
в отношении С++ и многопоточности — слова типа "хорошо"/"отлично"/"прекрасно" — вообще не соответствуют действительности. в С++ с многопоточностью полная жопа.
посмотри на такие компилируемые ЯП как haskell/Go/Rust — в них да, какое-то из этих слов может использоваться.
EP>Вот например: EP>1. В OpenMP Proposal они предлагают paralleltask, который по функциональности сильно пересекается с std::async. Но, почему-то их язык не устраивает — новый keyword подавай.
цель проста: упростить реализаторам жизнь.
EP>2. Предложенный ими "parallel for" — имеет свои семантические ограничения, ты не можешь любой for заменить на parallel for. Эти ограничения должны быть описаны в стандарте, захламляя core language. EP>В то время как library-only решение может забетонировать эти ограничения в API: EP>
это же можно реализовать в Cilk+ или OpenMP. достаточно лишь научить их принимать пользовательское функторы/предикаты.
EP>Да, кстати, что делать например с parallel reduce, parallel transform/map? тоже вводить openmp'шные костыли?
нет же, строка выше.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
EP>>То есть ты предлагаешь включать в ISO C++ любой убогий костыль, в корне не соответствующую генеральной линии языка, который хоть как-то стандартизирован? X>только самое необходимое.
Настолько необходимое, что нужно включать ASAP, а не подождать нормального library-only proposal типа N3554?
Я вообще не пойму какой-то тут может быть ASAP: на твоих компиляторах есть OpenMP? — ну замечательно, просто бери и используй — зачем тащить в C++ ISO?
EP>>Поддержка нужна, и она прекрасно реализуется library-only. Microsoft PPL, Intel TBB — тому подтверждение. X>в отношении С++ и многопоточности — слова типа "хорошо"/"отлично"/"прекрасно" — вообще не соответствуют действительности. в С++ с многопоточностью полная жопа. X>посмотри на такие компилируемые ЯП как haskell/Go/Rust — в них да, какое-то из этих слов может использоваться.
я конкретно говорю про сравнение openmp vs library-only
EP>>Вот например: EP>>1. В OpenMP Proposal они предлагают paralleltask, который по функциональности сильно пересекается с std::async. Но, почему-то их язык не устраивает — новый keyword подавай. X>цель проста: упростить реализаторам жизнь.
Реализаторы спокойно могут использовать openmp внутри реализации N3554
EP>>2. Предложенный ими "parallel for" — имеет свои семантические ограничения, ты не можешь любой for заменить на parallel for. Эти ограничения должны быть описаны в стандарте, захламляя core language. EP>>В то время как library-only решение может забетонировать эти ограничения в API: EP>>
X>это же можно реализовать в Cilk+ или OpenMP. достаточно лишь научить их принимать пользовательское функторы/предикаты.
Openmp с функторами это же вообще жесть и цирк с конями.
но речь не о них.
Пример выше показывает, что при использовании irange — интерфейс реинфосит использование инкремента одним только синтаксисом. В то время как в OpenMP семантику возможных инкрементов нужно дополнительно описывать, причём в core langauge.
EP>>Да, кстати, что делать например с parallel reduce, parallel transform/map? тоже вводить openmp'шные костыли? X>нет же, строка выше.
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, niXman, Вы писали:
X>>иначе С++ получается самым неподходящим ЯП для разработки многопоточных программ.
KP>Господа, проявите терпение, Rust почти готов
Ждём-с. Идеи в основе просто пальчики оближешь — movable owned values, non-nullable по умолчанию, type inference...
Хотя конечно с некоторыми вещами типа явного self для функций-членов класса и чрезмерной мании сокращать идентификаторы я бы поспорил.
Здравствуйте, Мишень-сан, Вы писали:
МС>Ждём-с. Идеи в основе просто пальчики оближешь — movable owned values, non-nullable по умолчанию, type inference...
радует то, что они компилятор строят на основе LLVM, а не как Go, самопальный =)
МС>Хотя конечно с некоторыми вещами типа явного self для функций-членов класса и чрезмерной мании сокращать идентификаторы я бы поспорил.
да, self в последней редакции языка меня тоже расстроил %)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
так а что, 'static if' в 2014 таки ждать не стОит?!
пишу тут кодец и думаю, будь доступен сабж — кода бы получилось в разы меньше, и он бы писался и читался в разы проще.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>так а что, 'static if' в 2014 таки ждать не стОит?! X>пишу тут кодец и думаю, будь доступен сабж — кода бы получилось в разы меньше, и он бы писался и читался в разы проще.
прочитал отговорку описанную в документе и улыбнулся =)))
аргументы не принимать 'static if' приводятся на реально нелепых примерах %)
template<typename T, typename A>
class dynarray {
T* start_;
T* finish_;
static if (!is_empty<A>::value) {
A alloc_;
}
};
// Although may seem like an elegant alternative, the impact
// on the class’s implementation is far less so.
// For example, how would we write a constructor?template<typename T, typename A>
dynarray<T, A>::dynarray(size_t n, T value, const A& alloc)
:start_(alloc.allocate(n * sizeof(T))
,finish_(start + n)
{
static if (!is_empty<A>::value) {
alloc = alloc_;
}
}
// Every access to the allocator member must be guarded by a new static if.
// Again, this use of static if is viral.
// A viable alternative to the use of static if or more traditional means of
// implementing the empty base optimization is to use a tuple. The tuple template
// will eliminate all of the overhead of empty classes.
// The use of static if might also be used to reorder data structures for tighter
// alignment, but this is a potentially dangerous idea that could lead to bugs that
// are exceptionally difficult to diagnose and fix.
// Being a new and relatively simple-to-use new feature, static_if would
// undoubtedly be used by many who have no need for the relatively small
// incremental improvement in performance offered. The library writers for which such
// techniques really are important, already have the tools and skills needed.
ну зачем тут статик иф?!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
// The static if feature is also available inside class scope. A number of possible
// applications have been presented. Below is an example of a metafunction for
// computing factorials.template <unsigned long n>
struct factorial {
static if (n <= 1) {
enum : unsigned long { value = 1 };
} else {
enum : unsigned long { value = factorial<n - 1>::value * n };
}
};
// This seems like a reasonable idea, but the motivating example simply moves
// the complexity from one style of idiomatic programming to another and does
// so in a way that requires a new language feature. A better solution would be
// to use constexpr functions. A significant negative consequence of that feature
// is increased confusion about how to write integer metaprograms.
ну реально же, зачем кому-то может понадобится написать такое, когда в стандарте есть constexpr?!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>прочитал отговорку описанную в документе и улыбнулся =))) X>аргументы не принимать 'static if' приводятся на реально нелепых примерах %)
Обрати внимание, какие веские контраргументы господин Страуструп умеет приводить, когда дело касается его предложений
Здравствуйте, Ku-ku, Вы писали:
KK>Обрати внимание, какие веские контраргументы господин Страуструп умеет приводить, когда дело касается его предложений
да он троллит =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, CoolCmd, Вы писали:
CC>Здравствуйте, Ops, Вы писали:
Ops>>Это как? CC>так. и для while тоже.
Тогда, имхо, было бы логично добавить две ветки — одна выполняется, если был break, другая — если не был. Опциональная третья ветка — если цикл выполнился 0 раз.