Re: Критика современного С++
От: rg45 СССР  
Дата: 05.02.19 13:03
Оценка: 1 (1) +8
Здравствуйте, Nuzhny, Вы писали:

N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.


Оценивать язык по какому-то примеру сомнительного качества — так можно обосрать что угодно.

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

Так что от всей этой "критики", как обычно попахивает депрессией и комплексами неполноценности. Простой вопрос: если вы нашли свой язык программирования, который вас полностью устраивает, зачем вам нужно кого-то и что-то критиковать? Казалось бы, наслаждайтесь любимым языком, будьте счастливы... Так нет же.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 05.02.2019 13:13 rg45 . Предыдущая версия .
Re: Критика современного С++
От: Voivoid Россия  
Дата: 05.02.19 19:38
Оценка: 49 (7) +1
Здравствуйте, 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++ становится практически так же приятно, как и на функциональных языках ( хоть и увы, код конечно не такой лаконичный получается )
Отредактировано 05.02.2019 19:42 Voivoid . Предыдущая версия .
Критика современного С++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 05.02.19 10:09
Оценка: 15 (2) +4
От разработчиков Unity.
Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык.
Отчасти можно согласиться после простотра примера про Пифагоровы тройки.
Re: Критика современного С++
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 05.02.19 13:07
Оценка: 3 (2) +4
Здравствуйте, Nuzhny, Вы писали:

N>От разработчиков Unity.

N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык.
N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.

Довольно необоснованные претензии. Во-первых, код с пифагоровыми тройками на рэйнджах довольно легко читается, просто для начала надо потратить 20 минут и понять что такое рэйнджи. Можно возразить что "но это же время", что вроде верно, если забыть что интервал между C++17 и C++20, т.е. 3 года, не шибко маленький и уж найти 20 минут на то, чтобы разобраться можно. Во-вторых, наличие RANGES_FOR намекает на то, что текущее решение построено на макросах и будет заменено неким встроенным синтаксическим сахаром и уж наверняка будет оптимизировано. Это в свою очередь делает текущие стенания на тему скорости компиляции не очень обоснованными. В-третьих, проблема с производительностью имеет те же корни что и со скоростью сборки — экспериментальная реализация.

Ну а вот это вообще инфантилизм какой-то:

Некоторые из ответов вида «весь фидбек будет проигнорирован, если он не оформлен в виде документа, представленного на собрании комитета C++», которые я видел в последнее время не кажутся мне продуктивным подходом


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

Так же чувак и набежавшая школота приводит Rust в качестве альтернативы забывая о том, что в нем разных НЁХ-ов как бы не меньше и он просто еще не успел с ними столкнуться. Вообще гениальный пример на нём, и это, типа, проще?! Тот кто не осилил рэйнджи, осилит вот это?

fn triples(n: u32) -> impl Iterator<Item = (u32, u32, u32)> {
    (0..n).flat_map(move |z| 
        (1..z).flat_map(move |x| 
            (x..z).map(move |y| 
                (x, y, z)
            )
        )
    )
    .filter(|(x, y, z)| x*x + y*y == z*z)
}


Ну и последнее, у гейм-девелоперов очень особый мир и видение прекрасного с сильнейшим NIH синдромом, часто на ровном месте. Если свое — значит лучше, даже без тестовых замеров вполне себе типичная ситуация. BOOST — говно, STL — говно, давайте велосипедить, при этом уровень у велосипедистов даже рэйнджи не позволяет осилить.

Тьфу, короче.
Отредактировано 06.02.2019 1:14 kaa.python . Предыдущая версия . Еще …
Отредактировано 05.02.2019 13:17 kaa.python . Предыдущая версия .
Отредактировано 05.02.2019 13:16 kaa.python . Предыдущая версия .
Отредактировано 05.02.2019 13:14 kaa.python . Предыдущая версия .
Отредактировано 05.02.2019 13:13 kaa.python . Предыдущая версия .
Отредактировано 05.02.2019 13:13 kaa.python . Предыдущая версия .
Отредактировано 05.02.2019 13:08 kaa.python . Предыдущая версия .
Re: Критика современного С++
От: LaptevVV Россия  
Дата: 05.02.19 11:39
Оценка: 9 (1) +2
N>От разработчиков Unity.
N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности.
N>Типа пихают в С++ всё подряд, переусложняя язык.

Основные идеи:
1.В C++ очень важно время компиляции,
2.Производительность сборки без оптимизаций тоже важна,
3.Когнитивная нагрузка ещё важней. Вот по этому пункту особо распространяться не буду,
но если язык программирования заставляет меня чувствовать себя тупым, вряд ли я его буду использовать или тем более — любить. C++ делает это со мной постоянно.

По поводу пункта 3.
Это какой-то недопрограммист.
Комплекс неполноценности налицо.
Ни один язык программирования не способен заставить меня чувствовать себя тупым...
Потом вместо простого решения (которое написано на С) пишут какую-то хрень — НАФИГА.
Когда вполне можно написать на С++ так же как на С.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Критика современного С++
От: ilnar Россия  
Дата: 05.02.19 11:34
Оценка: +1 -1
Здравствуйте, Nuzhny, Вы писали:

N>От разработчиков Unity.

N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык.

а не надо тянуть в проект всё подряд, особенно boost, будет и быстрее собираться, и код станет понятнее.
и писать надо так, чтобы любой junior понимал.
Re[2]: Критика современного С++
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 05.02.19 12:14
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Потом вместо простого решения (которое написано на С) пишут какую-то хрень — НАФИГА.

LVV>Когда вполне можно написать на С++ так же как на С.

Пишут сложно, потому что могут. И это плохо, потому что разбираться в коде библиотек время от времени приходится. Я себя ощущаю примерно также, как и автор статьи: С++ знаю давно, но некоторый современный код вызывает у меня удивление: что же там написано? Плохо, когда логика работы программы исчезает за кодом.
Re[2]: Критика современного С++
От: smeeld  
Дата: 05.02.19 20:42
Оценка: +1 :)
Здравствуйте, Voivoid, Вы писали:

Ещё лет десять развития C++ в этом направлении, и C++ превратится в Lisp. А могли бы сразу все просто писать на Lisp и не парить моск.
Re[5]: Критика современного С++
От: Vamp Россия  
Дата: 06.02.19 10:28
Оценка: +1 :)
σ>>В лиспе нет RAII.

S>Добавляется одним макросом.


Это универсальное утверждение касательно Лисп.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Критика современного С++
От: AlexGin Беларусь  
Дата: 07.02.19 09:42
Оценка: +2
Здравствуйте, LaptevVV, Вы писали:

LVV>Ни один язык программирования не способен заставить меня чувствовать себя тупым...

+100500
Просто часто самовыражение разработчика в жизни воплощается в сложные языковые конструкции.

LVV>Потом вместо простого решения (которое написано на С) пишут какую-то хрень — НАФИГА.

ИМХО это желание как-то проявиться, желание показать себя.

LVV>Когда вполне можно написать на С++ так же как на С.

Зачастую, если правильно применять язык, код на С++ должен получаться проще, значительно проще (чем на С).
По крайней мере, именно это и способствовало внедрению и распространению языка С++.
Re[3]: Unity
От: Nikе Россия  
Дата: 06.02.19 22:30
Оценка: +1
Здравствуйте, Qbit86, Вы писали:

Q>Всё так. Я вхожу в те миллионы, которые пользуются этим «самым популярным в мире игровым движком». И да, я также вхожу в ту часть, которая «любит говорить... насколько он отвратительный».


Соболезную.
Нужно разобрать угил.
Re: Критика современного С++
От: Vamp Россия  
Дата: 05.02.19 17:04
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>От разработчиков Unity.

N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык.
N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.
Разумеется, если не понимать, что такое диапазон (range), то пример с их использованием покажется излишне сложным. Написать в линеечку на С с классами проще. Если же это понимать, то код идиоматичен и прост.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Критика современного С++
От: Voivoid Россия  
Дата: 05.02.19 19:56
Оценка:
Здравствуйте, Voivoid, Вы писали:

Забыл отметить, что алгоритмы полученные путем композиции view'шек — ленивые. Они не аллоцируют память для промежуточных результатов и выполняют все вычисления только по мере запроса результатов ( хорошо видно на примере с view::cycle | view::take( 10 ) )
Re: Критика современного С++
От: Nikе Россия  
Дата: 05.02.19 19:59
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>От разработчиков Unity.

N>Критикуют ranges, boost, излишнюю сложность и нечитабельность в плюс к медленной компиляции и просевшей производительности. Типа пихают в С++ всё подряд, переусложняя язык.
N>Отчасти можно согласиться после простотра примера про Пифагоровы тройки.

Давайте лучше юнити покритикуем Мой любимый движок — народ пробует, плюётся и идёт ко мне.
Хотя, конечно вся школота наслышана, поэтому придётся к ним дописывать модули.
Нужно разобрать угил.
Re[2]: Критика современного С++
От: Vain Россия google.ru
Дата: 05.02.19 23:12
Оценка:
Здравствуйте, Voivoid, Вы писали:

V>Авторы статьи ничего не поняли, но поспешили пойти поплакаться. Правда справедливости ради стоит сказать, что и сам Eric Niebler привел весьма неудачный пример .

Прочитал по диагонали. Там упоминается падение производительности в 100 раз, это не считается?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: Критика современного С++
От: σ  
Дата: 06.02.19 05:55
Оценка:
S>Ещё лет десять развития C++ в этом направлении, и C++ превратится в Lisp. А могли бы сразу все просто писать на Lisp и не парить моск.

В лиспе нет RAII.
Re: Критика современного С++
От: Шахтер Интернет  
Дата: 06.02.19 05:56
Оценка:
Здравствуйте, 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.
Это недоделка в текущей версии языка.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Отредактировано 06.02.2019 6:39 Шахтер . Предыдущая версия .
Re[3]: Критика современного С++
От: Voivoid Россия  
Дата: 06.02.19 06:45
Оценка:
Здравствуйте, Vain, Вы писали:

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


V>>Авторы статьи ничего не поняли, но поспешили пойти поплакаться. Правда справедливости ради стоит сказать, что и сам Eric Niebler привел весьма неудачный пример .

V>Прочитал по диагонали. Там упоминается падение производительности в 100 раз, это не считается?
Да, есть такая проблема. Но зато время работы сборки с -O2 практически не отличается от plain C

поиск 3000 троек, clang++ -O2 comprehensions.cpp
код — https://github.com/ericniebler/range-v3/blob/master/example/comprehensions.cpp

2222ms // ranges v3
2205ms // 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 раз. Тоже конечно неприятно, но уже не так фатально.

Если такое падение оказывается критичным, то можно, ну например, попробовать вынести тяжелые вычисления в отдельную библиотеку, собирающуюся с оптимизаций. Ну или в худшем случае придется писать код как раньше
Re[2]: Критика современного С++
От: σ  
Дата: 06.02.19 08:06
Оценка:
Ш>3) Вот пример реальной проблемы языка. В современном C++ есть вывод параметров шаблонов из аргументов конструктора
Ш>Я, однако, не могу частично специализировать эти параметры

https://stackoverflow.com/a/41854832/9585016
Re[4]: Критика современного С++
От: smeeld  
Дата: 06.02.19 09:34
Оценка:
Здравствуйте, σ, Вы писали:

σ>В лиспе нет RAII.


Добавляется одним макросом.
Re[5]: Критика современного С++
От: σ  
Дата: 06.02.19 09:37
Оценка:
σ>>В лиспе нет RAII.
S>Добавляется одним макросом.
Дай угадаю. unwind-protect?
Re[6]: Критика современного С++
От: smeeld  
Дата: 06.02.19 09:52
Оценка:
Здравствуйте, σ, Вы писали:

σ>>>В лиспе нет RAII.

S>>Добавляется одним макросом.
σ>Дай угадаю. unwind-protect?

В CL можно и его юзать.
Re[7]: Критика современного С++
От: σ  
Дата: 06.02.19 11:10
Оценка:
σ>>>>В лиспе нет RAII.
S>>>Добавляется одним макросом.
σ>>Дай угадаю. unwind-protect?
S>В CL можно и его юзать.
Но ведь он не позволяет передачу ресурсов вызывающей стороне (для последующего освобождения).
Re[2]: Критика современного С++
От: dsorokin Россия  
Дата: 06.02.19 15:12
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Так же чувак и набежавшая школота приводит Rust в качестве альтернативы забывая о том, что в нем разных НЁХ-ов как бы не меньше и он просто еще не успел с ними столкнуться. Вообще гениальный пример на нём, и это, типа, проще?! Тот кто не осилил рэйнджи, осилит вот это?

KP>
KP>
fn triples(n: u32) -> impl Iterator<Item = (u32, u32, u32)> {
KP>    (0..n).flat_map(move |z| 
KP>        (1..z).flat_map(move |x| 
KP>            (x..z).map(move |y| 
KP>                (x, y, z)
KP>            )
KP>        )
KP>    )
KP>    .filter(|(x, y, z)| x*x + y*y == z*z)
KP>}
KP>


Кстати, читается элементарно для любого, кто знаком с Haskell и Rust. Это просто (один-в-один, если раскрыть list comprehension через монаду списка):

[(x, y, z) | z <- [0..n-1], x <- [1..z-1], y <- [x..z-1], x*x + y*y == z*z]
Re[3]: Критика современного С++
От: Voivoid Россия  
Дата: 06.02.19 15:55
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>Кстати, читается элементарно для любого, кто знаком с Haskell и Rust.


Кстати да, с range v3 можно писать почти как на haskell
auto triples = ints(1)      >>= [ ](int z) { return
               ints(1, z+1) >>= [=](int x) { return
               ints(x, z+1) >>= [=](int y) { return
   yield_if(x*x + y*y == z*z, std::make_tuple(x, y, z)); };}; };


do-нотации только для полного счастья не хватает
Отредактировано 06.02.2019 15:57 Voivoid . Предыдущая версия .
Re[4]: Критика современного С++
От: dsorokin Россия  
Дата: 06.02.19 17:49
Оценка:
Здравствуйте, Voivoid, Вы писали:

V>Кстати да, с range v3 можно писать почти как на haskell

V>
V>auto triples = ints(1)      >>= [ ](int z) { return
V>               ints(1, z+1) >>= [=](int x) { return
V>               ints(x, z+1) >>= [=](int y) { return
V>   yield_if(x*x + y*y == z*z, std::make_tuple(x, y, z)); };}; };
V>


V>do-нотации только для полного счастья не хватает


Во! Время от времени подумываю одну штуку свою перенести на C++. Там будут монады и стрелки через шаблоны. Прототип есть, и есть работающий аналогичный код на Rust.

Как думаете, плюсисты заклюют? Обещаю в документации никого не травмировать и ни слова не писать о страшных монадах и стрелках!

Я вон в C++20 увидел незаконченную монаду в future::then. Подозреваю, что она не закончена по той простой причине, что в C++ нет полноценных значений у типа void. Из-за чего возникли бы нестыковки при использовании, будь там полноценная монадическая связка, но это мое личное предположение.
Re[2]: Unity
От: Qbit86 Кипр
Дата: 06.02.19 22:14
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Давайте лучше юнити покритикуем :))


Автор пишет:

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


Всё так. Я вхожу в те миллионы, которые пользуются этим «самым популярным в мире игровым движком». И да, я также вхожу в ту часть, которая «любит говорить... насколько он отвратительный».
Глаза у меня добрые, но рубашка — смирительная!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.