От разработчиков Unity.
Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык.
Отчасти можно согласиться после простотра примера про Пифагоровы тройки.
Здравствуйте, Nuzhny, Вы писали:
N>От разработчиков Unity. N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык.
а не надо тянуть в проект всё подряд, особенно boost, будет и быстрее собираться, и код станет понятнее.
и писать надо так, чтобы любой junior понимал.
N>От разработчиков Unity. N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. N>Типа пихают в С++ всё подряд, переусложняя язык.
Основные идеи:
1.В C++ очень важно время компиляции,
2.Производительность сборки без оптимизаций тоже важна,
3.Когнитивная нагрузка ещё важней. Вот по этому пункту особо распространяться не буду,
но если язык программирования заставляет меня чувствовать себя тупым, вряд ли я его буду использовать или тем более — любить. C++ делает это со мной постоянно.
По поводу пункта 3.
Это какой-то недопрограммист.
Комплекс неполноценности налицо.
Ни один язык программирования не способен заставить меня чувствовать себя тупым...
Потом вместо простого решения (которое написано на С) пишут какую-то хрень — НАФИГА.
Когда вполне можно написать на С++ так же как на С.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Потом вместо простого решения (которое написано на С) пишут какую-то хрень — НАФИГА. LVV>Когда вполне можно написать на С++ так же как на С.
Пишут сложно, потому что могут. И это плохо, потому что разбираться в коде библиотек время от времени приходится. Я себя ощущаю примерно также, как и автор статьи: С++ знаю давно, но некоторый современный код вызывает у меня удивление: что же там написано? Плохо, когда логика работы программы исчезает за кодом.
Здравствуйте, Nuzhny, Вы писали:
N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.
Оценивать язык по какому-то примеру сомнительного качества — так можно обосрать что угодно.
К тому же сравниваемые фрагменты кода не сопоставимы по своей значимости — если во втором примере выполняется просто перебор, то в первом определяются повторно используемы компоненты. которые, очевидно, не стоило бы определять ради одного только перебора.
Так что от всей этой "критики", как обычно попахивает депрессией и комплексами неполноценности. Простой вопрос: если вы нашли свой язык программирования, который вас полностью устраивает, зачем вам нужно кого-то и что-то критиковать? Казалось бы, наслаждайтесь любимым языком, будьте счастливы... Так нет же.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Nuzhny, Вы писали:
N>От разработчиков Unity. N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык. N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.
Довольно необоснованные претензии. Во-первых, код с пифагоровыми тройками на рэйнджах довольно легко читается, просто для начала надо потратить 20 минут и понять что такое рэйнджи. Можно возразить что "но это же время", что вроде верно, если забыть что интервал между C++17 и C++20, т.е. 3 года, не шибко маленький и уж найти 20 минут на то, чтобы разобраться можно. Во-вторых, наличие RANGES_FOR намекает на то, что текущее решение построено на макросах и будет заменено неким встроенным синтаксическим сахаром и уж наверняка будет оптимизировано. Это в свою очередь делает текущие стенания на тему скорости компиляции не очень обоснованными. В-третьих, проблема с производительностью имеет те же корни что и со скоростью сборки — экспериментальная реализация.
Ну а вот это вообще инфантилизм какой-то:
Некоторые из ответов вида «весь фидбек будет проигнорирован, если он не оформлен в виде документа, представленного на собрании комитета C++», которые я видел в последнее время не кажутся мне продуктивным подходом
Так и напрашивается вопрос "а кто же ты такой чтобы твои запросы были рассмотрены иначе чем запросы других?". C++ один из наиболее широко использующихся языков на данный момент и без досконального анализа ситуации отвлекаться на жалобы очередного неосилятора просто нелепо, тогда изменений не будет вообще.
Так же чувак и набежавшая школота приводит Rust в качестве альтернативы забывая о том, что в нем разных НЁХ-ов как бы не меньше и он просто еще не успел с ними столкнуться. Вообще гениальный пример на нём, и это, типа, проще?! Тот кто не осилил рэйнджи, осилит вот это?
Ну и последнее, у гейм-девелоперов очень особый мир и видение прекрасного с сильнейшим NIH синдромом, часто на ровном месте. Если свое — значит лучше, даже без тестовых замеров вполне себе типичная ситуация. BOOST — говно, STL — говно, давайте велосипедить, при этом уровень у велосипедистов даже рэйнджи не позволяет осилить.
Здравствуйте, Nuzhny, Вы писали:
N>От разработчиков Unity. N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык. N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.
Разумеется, если не понимать, что такое диапазон (range), то пример с их использованием покажется излишне сложным. Написать в линеечку на С с классами проще. Если же это понимать, то код идиоматичен и прост.
Здравствуйте, Nuzhny, Вы писали:
N>От разработчиков Unity. N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык. N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.
Авторы статьи ничего не поняли, но поспешили пойти поплакаться. Правда справедливости ради стоит сказать, что и сам Eric Niebler привел весьма неудачный пример .
ranges v3 просто бомбическая библиотека значительно облегчающая:
— отделение алгоритмов от структур данных
— использование функциональной композиции
— создание ленивых алгоритмов
— написание генераторов
Небольшой компилируемый пример для затравки:
#include <range/v3/view/transform.hpp>
#include <range/v3/view/filter.hpp>
#include <range/v3/view/take.hpp>
#include <range/v3/view/map.hpp>
#include <range/v3/view/cycle.hpp>
#include <range/v3/view/reverse.hpp>
#include <range/v3/algorithm/copy.hpp>
#include <range/v3/iterator/stream_iterators.hpp>
#include <iostream>
#include <vector>
#include <set>
#include <map>
using namespace ranges;
auto some_algo()
{
// некоторый алгоритм который ничего не знает о структурах данных и работает с произвольной последовательностьюreturn view::transform( []( auto x ){ return x * 2; } ) | // умножаем числа последовательности на 2
view::filter( []( auto x ){ return x >= 10 && x <= 100; } ) | // фильтруем числа не входящие в диапазон [10, 100]
view::take( 4 ); // берем не более 4 чисел из оставшихся после фильтрации
}
template <typename R>
void print( R&& range )
{
// печать на консоль произвольной последовательности
copy( range, make_ostream_joiner( std::cout, "," ) );
std::cout << '\n';
}
int main()
{
std::vector<int> vs = { 5, 10, 15, 20, 25 };
print( vs ); // печатаем содержимое vs
print( vs | some_algo() ); // печатаем последовательность полученную после применения алгоритма some_algo к vs
std::set<double> ss = { 15.5, 30.0, 42.4242, 100.0 };
print( ss | some_algo() ); // аналогично для ss
std::map<int, int> m = { { 10, 20 }, { 30, 40 }, { 50, 60 } };
auto some_range = m | view::keys // берем последовательность ключей мапы ( 10, 30, 50 )
| some_algo() // применяем наш алгоритм
| view::cycle // зацикливаем получившуюся последовательно
| view::take( 10 ); // берем из зацикленной ( бесконечной ) последовательности первые 10 элементов
print( some_range );
for( auto v : m | view::values | view::reverse ) // обходим в цикле значения мапы в обратном порядке
{
std::cout << v << ' ';
}
}
/*
output:
5,10,15,20,25
10,20,30,40
31,60,84.8484
20,60,100,20,60,100,20,60,100,20
60 40 20
*/
Одних только всяких разных view'ек в range v3 более 50-ти. А кроме них еще достаточно всего полезного. Вкупе с использованием boost::coroutines писать алгоритмы на C++ становится практически так же приятно, как и на функциональных языках ( хоть и увы, код конечно не такой лаконичный получается )
Забыл отметить, что алгоритмы полученные путем композиции view'шек — ленивые. Они не аллоцируют память для промежуточных результатов и выполняют все вычисления только по мере запроса результатов ( хорошо видно на примере с view::cycle | view::take( 10 ) )
Здравствуйте, Nuzhny, Вы писали:
N>От разработчиков Unity. N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык. N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.
Давайте лучше юнити покритикуем Мой любимый движок — народ пробует, плюётся и идёт ко мне.
Хотя, конечно вся школота наслышана, поэтому придётся к ним дописывать модули.
Здравствуйте, Voivoid, Вы писали:
V>Авторы статьи ничего не поняли, но поспешили пойти поплакаться. Правда справедливости ради стоит сказать, что и сам Eric Niebler привел весьма неудачный пример .
Прочитал по диагонали. Там упоминается падение производительности в 100 раз, это не считается?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Nuzhny, Вы писали:
N>От разработчиков Unity. N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык. N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.
1) У современного С++ действительно есть реальные проблемы, их и надо обсуждать.
Критика же в стиле "С++ плохой, потому что я тупой" это мусор.
2) Перечислять пифагоровы тройки путем полного перебора -- это от безграмотности.
Автору следовало бы почитать что-нибудь по теории чисел. Глядишь, и тупость вылечится.
3) Вот пример реальной проблемы языка. В современном C++ есть вывод параметров шаблонов из аргументов конструктора
/* main.cpp */#include <iostream>
using namespace std;
template <class T,class S>
struct Test
{
Test(T,S) {}
};
/* main() */int main()
{
Test t1(1,2);
Test<double> t2(1,2);
return 0;
}
Я, однако, не могу частично специализировать эти параметры, как в переменной t2.
Это недоделка в текущей версии языка.
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, Voivoid, Вы писали:
V>>Авторы статьи ничего не поняли, но поспешили пойти поплакаться. Правда справедливости ради стоит сказать, что и сам Eric Niebler привел весьма неудачный пример . V>Прочитал по диагонали. Там упоминается падение производительности в 100 раз, это не считается?
Да, есть такая проблема. Но зато время работы сборки с -O2 практически не отличается от plain C
Тут еще думаю стоит отметить, что видимо эти тройки вдвойне неудачный пример ( Eric наверное уже не раз проклял тот день, когда решил вставить этот пример ), потому как в других примерах использование ranges v3 я не наблюдаю такого катастрофического падения производительности в debug сборках. Я периодически решаю с помощью ranges v3 алгоритмические задачки разной сложности с advent of code ( https://adventofcode.com/ ). Сейчас у меня 37 решенных задач ( https://github.com/voivoid/advent-of-code ) из которых в 33-х используется ranges v3. Время прогона тестов для этих задачек на -O2 сборке — 10.47 sec, на дебажной сборке — 65.99 sec. Разница чуть больше чем в 6 раз. Тоже конечно неприятно, но уже не так фатально.
Если такое падение оказывается критичным, то можно, ну например, попробовать вынести тяжелые вычисления в отдельную библиотеку, собирающуюся с оптимизаций. Ну или в худшем случае придется писать код как раньше
Ш>3) Вот пример реальной проблемы языка. В современном C++ есть вывод параметров шаблонов из аргументов конструктора Ш>Я, однако, не могу частично специализировать эти параметры
σ>>>>В лиспе нет RAII. S>>>Добавляется одним макросом. σ>>Дай угадаю. unwind-protect? S>В CL можно и его юзать.
Но ведь он не позволяет передачу ресурсов вызывающей стороне (для последующего освобождения).
Здравствуйте, kaa.python, Вы писали:
KP>Так же чувак и набежавшая школота приводит Rust в качестве альтернативы забывая о том, что в нем разных НЁХ-ов как бы не меньше и он просто еще не успел с ними столкнуться. Вообще гениальный пример на нём, и это, типа, проще?! Тот кто не осилил рэйнджи, осилит вот это? KP> KP>
V>do-нотации только для полного счастья не хватает
Во! Время от времени подумываю одну штуку свою перенести на C++. Там будут монады и стрелки через шаблоны. Прототип есть, и есть работающий аналогичный код на Rust.
Как думаете, плюсисты заклюют? Обещаю в документации никого не травмировать и ни слова не писать о страшных монадах и стрелках!
Я вон в C++20 увидел незаконченную монаду в future::then. Подозреваю, что она не закончена по той простой причине, что в C++ нет полноценных значений у типа void. Из-за чего возникли бы нестыковки при использовании, будь там полноценная монадическая связка, но это мое личное предположение.
Здравствуйте, Nikе, Вы писали:
N>Давайте лучше юнити покритикуем :))
Автор пишет:
Я работаю, возможно, над самым популярным в мире игровым движком, которым пользуются миллионы, и часть из них любит говорить, прямо или непрямо, насколько он отвратительный.
Всё так. Я вхожу в те миллионы, которые пользуются этим «самым популярным в мире игровым движком». И да, я также вхожу в ту часть, которая «любит говорить... насколько он отвратительный».
Здравствуйте, Qbit86, Вы писали:
Q>Всё так. Я вхожу в те миллионы, которые пользуются этим «самым популярным в мире игровым движком». И да, я также вхожу в ту часть, которая «любит говорить... насколько он отвратительный».
Здравствуйте, LaptevVV, Вы писали:
LVV>Ни один язык программирования не способен заставить меня чувствовать себя тупым...
+100500
Просто часто самовыражение разработчика в жизни воплощается в сложные языковые конструкции.
LVV>Потом вместо простого решения (которое написано на С) пишут какую-то хрень — НАФИГА.
ИМХО это желание как-то проявиться, желание показать себя.
LVV>Когда вполне можно написать на С++ так же как на С.
Зачастую, если правильно применять язык, код на С++ должен получаться проще, значительно проще (чем на С).
По крайней мере, именно это и способствовало внедрению и распространению языка С++.