Re[5]: Исповедь C++ника
От: alzt  
Дата: 29.04.20 21:11
Оценка: :))) :)
Здравствуйте, Poopy Joe, Вы писали:

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


У спагетти-кода есть большое преимущество — его легко поддерживать даже джуниору.
А С++ код может превратиться во что-то ещё более гадкое, чем спагетти-код, но чтобы его поддержать, придётся искать очень опытного С++ желающего во всём этом копаться.
Re[4]: Исповедь C++ника
От: CreatorCray  
Дата: 29.04.20 21:39
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Автор сообщения имеет в виду тот факт, что при определенном знании и опыте на ассемблере можно сделать всё, что угодно.

Ну дык Turing complete жеж.
На любом полном языке в итоге можно будет сделать всё что угодно если все остальные нюансы вынести за скобки.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[6]: Исповедь C++ника
От: CreatorCray  
Дата: 29.04.20 22:50
Оценка: +4
Здравствуйте, alzt, Вы писали:

A>У спагетти-кода есть большое преимущество — его легко поддерживать даже джуниору.

Шта?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[8]: Исповедь C++ника
От: LaptevVV Россия  
Дата: 30.04.20 06:48
Оценка:
LVV>>Да потому, что Вирт уже давно все написал. А комитет в ту сторону даже не смотрит. Более 10 лет не могут модули из Модулы-2 взять — ЭТО ПЯТЬ!
PM>Вы правда думаете, что это такая свежая мысль "А давайте возьмем модули из Модула-2 и вкорячим их в С++" ? Некий Daveed Vandevoorde начал с этого в 2004 году: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1736.pdf
PM>Можете погуглить сколько ревизий прошло это предложение и как оно менялось.
Спасибо. Понятно, что обратная совместимость ну просто бич для современного С++.
Давно пора от нее отказаться.
PM>Насколько я помню, Модула-2 обратно не совместима с Паскалем. Т.е. Вирт не стал улучшать Паскаль, и не отягощая себя обратной совместимостью сделал Паскаль 2.0, в который добавил модули. Только вот проектов, реализовнных на Модула-2 не видно, как и вакансий.
1. Вирт много языков сделал. И никогда не был озабочен обратной совместимостью. Это — ученый, а не бизнесмен.
У него и Оберон — паскалеподобный, но совсем другой язык.
2. Вы не там ищете. У нас в космической промышленности применяют диалекты ТОЛЬКО виртовских языков.
В силу большей надежности.
PM>Может быть, вы сможете привести пример не учебного, промышленно используемого языка, который пережил революцию из версии N в версию N + 1 ? Я таких не знаю, ну может быть, Питону почти удалось, но это скорее эволюция.
Я давно с фортраном дело не имел. Вполне может быть он.
Там ядерщики некоторое время назад решили отказаться от фортрана в пользу С++. Через некоторое время физики, которым пришлось осваивать С++, попровили вернуть все в зад.
Ибо они из физиков превратились в программистов.
И вместо решения своих физических задач гораздо больше времени стали тратить на отладку программ.
LVV>>>>Сделали свой язык для обучения и его учим. А потом переводим в С++, чтоб народ не отставал от тенденций.
PM>Спасибо за информацию! Неплохо вы придумали — начинать учить первокурсников некоему слэнгу, известному только в одном университете
Учим НЕ языку, а ПРОГРАММИРОВАНИЮ.
Разницу — понимать надо.
Сначала должны понятия усвоить, а потом нотацию.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: Исповедь C++ника
От: LaptevVV Россия  
Дата: 30.04.20 06:49
Оценка:
LVV>>Да мы проще поступили.
LVV>>Сделали свой язык для обучения и его учим. А потом переводим в С++, чтоб народ не отставал от тенденций.
AN>А зачем свой язык сделали вместо того, что бы взять какой-нибудь из существующих? И где можно код на нём посмотреть?
Ответ PMу посмотри.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[9]: Исповедь C++ника
От: pagid Россия  
Дата: 30.04.20 06:54
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>У него и Оберон — паскалеподобный, но совсем другой язык.

LVV>2. Вы не там ищете. У нас в космической промышленности применяют диалекты ТОЛЬКО виртовских языков.
Как это нужно понимать? У нас в космической промышленности применяют диалекты виртовские языкы? Это очевидно не соответствует действительности. Из всех паскалеподобных языков у нас используют только авторские диалекты от Вирта? тоже сомнительное утверждение. Тут в первую очередь нужно бы узнать, а насколько в целом паскалеобразные языки используют. И например, если их используют, то почему бы не пользоваться Дельфи или каким-нибудь ФриПаскалем, хотя бы не для бортового оборудования, а для наземных систем.
Re[8]: Исповедь C++ника
От: Zhendos  
Дата: 30.04.20 09:49
Оценка: +1
Здравствуйте, PM, Вы писали:

PM>>>Вы не могли бы привести пример, когда в С++03 было проще, а в С++11 стало сложнее? Ну или от С++11 к С++14?


Z>>Сколько синтаксических способов создать объект в C++03, а сколько в C++11?

PM>Не помню, кажется больше 20.

Вообще-то это были риторические вопросы...

Z>>А эти прекрасные rvalue/glvalue/prvalue/lvalue/xvalue это ведь конечно

Z>>чудесное упрощение относительно C++03?
PM>Если вам нужен этот новый механизм, тут уж ничего не поделать — придется разбираться как оно работает. Собственно, как и с остальными частями языка, которые вы хотите использовать. Но возможность писать в стиле С++03 никуда не делась, вы по прежнему можете иметь базовое представление о lvalue/rvalue и копировать объекты вместо перемещения.

Вообще-то эти "чудесные" возможности были и в c++03, неужели вы думаете что до C++11 все были
настолько тупые что копировали объекты на каждый чих и только по приходу гениев из комитета,
все прозрели и осознали что можно оказывается не копировать объекты?

PM>Может быть вы бы могли бы привести пример кода, который в С++03 выглядит проще и понятнее, а в С++11 стал сложнее? Ну или от С++11 к С++14, С++17?


Так я же привел кучу примеров.
И по-моему очевидно что я прав и C++ с каждым стандартом становиться сложнее,
а как иначе если сохраняется обратная совместимость и новые конструкции только
прибавляются?

Но если вы так настаиваете давайте конкретику. Обличим мои риторические вопросы
в конкретный код.
Возьмем код состоящий из реализации аналога std::vector, назовем его V.
и строчки кода "двигающей" один экзампляр V в другой.

В C++03: это было реализация: V и строчка типа:

a.swap(b);

b потом выходит из области видимости

В C++11 прибавилось:

1. V(V&&), V& operator=(V&&)
2. Появилось две возможности на выбор:
a = std::move(b);

или старый вариант:
a.swap(b);



Итого кода стало больше, то есть программа сложнее, плюс одно и тоже действие
можно записать двумя способами, это ли не усложнение?
Re[7]: Исповедь C++ника
От: $$ Австралия жж
Дата: 30.04.20 10:07
Оценка:
Здравствуйте, CreatorCray, Вы писали:

A>>У спагетти-кода есть большое преимущество — его легко поддерживать даже джуниору.

CC>Шта?

Ну не одному джуниору. Команде молодых, развивающихся джуниоров развивать спагетти в ещё больше строчек спагетти, больше if-else, больше копи-pasta.
Re[9]: Исповедь C++ника
От: smeeld  
Дата: 30.04.20 11:37
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Итого кода стало больше, то есть программа сложнее, плюс одно и тоже действие

Z>можно записать двумя способами, это ли не усложнение?

Плюс гемор с расставлениями noexcept, иначе это move не заработает.
Re[9]: Исповедь C++ника
От: ViTech  
Дата: 30.04.20 11:52
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>В C++11 прибавилось:


Z>1. V(V&&), V& operator=(V&&)

Z>2. Появилось две возможности на выбор:
Z>
Z>a = std::move(b);
Z>

Z>или старый вариант:
Z>
Z>a.swap(b);
Z>


Z>Итого кода стало больше, то есть программа сложнее, плюс одно и тоже действие

Z>можно записать двумя способами, это ли не усложнение?

V a = std::move(b);


Как такое действие через swap записать?
Пока сам не сделаешь...
Re[10]: Исповедь C++ника
От: Zhendos  
Дата: 30.04.20 12:19
Оценка:
Здравствуйте, ViTech, Вы писали:

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


VT>
VT>V a = std::move(b);
VT>


VT>Как такое действие через swap записать?


Я же написал:

a.swap(b);


При этом b выходит из области видимости

иными словами скоро вызовется деструктор b
Re[11]: Исповедь C++ника
От: ViTech  
Дата: 30.04.20 12:44
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Я же написал:


Z>
Z>a.swap(b);
Z>


Z>При этом b выходит из области видимости


Z>иными словами скоро вызовется деструктор b


Хорошо, напишу чуть по другому:
V a{std::move(b)};


Разницу чувствуете?
Пока сам не сделаешь...
Re[9]: Исповедь C++ника
От: AleksandrN Россия  
Дата: 30.04.20 15:03
Оценка:
Здравствуйте, LaptevVV, Вы писали:

PM>>Спасибо за информацию! Неплохо вы придумали — начинать учить первокурсников некоему слэнгу, известному только в одном университете

LVV>Учим НЕ языку, а ПРОГРАММИРОВАНИЮ.
LVV>Разницу — понимать надо.
LVV>Сначала должны понятия усвоить, а потом нотацию.

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

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

В чём особенность языка, придуманного в Астраханском университете и почему он лучше подходит для первоначального обучения, чем другие языки? Примеры кода где можно посмотреть?
Re[9]: Исповедь C++ника
От: PM  
Дата: 30.04.20 17:27
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>>>Да потому, что Вирт уже давно все написал. А комитет в ту сторону даже не смотрит. Более 10 лет не могут модули из Модулы-2 взять — ЭТО ПЯТЬ!

PM>>Вы правда думаете, что это такая свежая мысль "А давайте возьмем модули из Модула-2 и вкорячим их в С++" ? Некий Daveed Vandevoorde начал с этого в 2004 году: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1736.pdf
PM>>Можете погуглить сколько ревизий прошло это предложение и как оно менялось.
LVV>Спасибо. Понятно, что обратная совместимость ну просто бич для современного С++.
LVV>Давно пора от нее отказаться.

Можно, и тогда это будет не С++, а какой-нибудь D. Не слежу за ним, не знаю, жив ли он ещё.
Думаю, никому не нравится наслоения костылей и новых фич в языке, но и решения, устраивающего всех пока не видно
Свежее предложение про эпохи с первой попытки не прошло, однако у автора есть ещё пара лет для продвижения.

PM>>Может быть, вы сможете привести пример не учебного, промышленно используемого языка, который пережил революцию из версии N в версию N + 1 ? Я таких не знаю, ну может быть, Питону почти удалось, но это скорее эволюция.

LVV>Я давно с фортраном дело не имел. Вполне может быть он.
LVV>Там ядерщики некоторое время назад решили отказаться от фортрана в пользу С++. Через некоторое время физики, которым пришлось осваивать С++, попровили вернуть все в зад.
LVV>Ибо они из физиков превратились в программистов.
LVV>И вместо решения своих физических задач гораздо больше времени стали тратить на отладку программ.

Ну это предсказуемо, программист на Фортране пишет фортран программы на любом языке. Да и вообще, обычно код от учёных — это ужас, с программистской точки зрения. Каждый должен заниматься своим делом. Я когда-то смотрел код ROOT, проекта который обсчитывает коллайдер в Церне, так там тоже видно, что люди учёные писали.
Re[9]: Исповедь C++ника
От: PM  
Дата: 30.04.20 17:57
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>>>А эти прекрасные rvalue/glvalue/prvalue/lvalue/xvalue это ведь конечно

Z>>>чудесное упрощение относительно C++03?
PM>>Если вам нужен этот новый механизм, тут уж ничего не поделать — придется разбираться как оно работает. Собственно, как и с остальными частями языка, которые вы хотите использовать. Но возможность писать в стиле С++03 никуда не делась, вы по прежнему можете иметь базовое представление о lvalue/rvalue и копировать объекты вместо перемещения.

Z>Вообще-то эти "чудесные" возможности были и в c++03, неужели вы думаете что до C++11 все были

Z>настолько тупые что копировали объекты на каждый чих и только по приходу гениев из комитета,
Z>все прозрели и осознали что можно оказывается не копировать объекты?

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

PM>>Может быть вы бы могли бы привести пример кода, который в С++03 выглядит проще и понятнее, а в С++11 стал сложнее? Ну или от С++11 к С++14, С++17?


Z>Так я же привел кучу примеров.

Z>И по-моему очевидно что я прав и C++ с каждым стандартом становиться сложнее,
Z>а как иначе если сохраняется обратная совместимость и новые конструкции только
Z>прибавляются?

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

Z>Но если вы так настаиваете давайте конкретику. Обличим мои риторические вопросы

Z>в конкретный код.
Z>Возьмем код состоящий из реализации аналога std::vector, назовем его V.
Z>и строчки кода "двигающей" один экзампляр V в другой.

Z>В C++03: это было реализация: V и строчка типа:


Z>
Z>a.swap(b);
Z>

Z>b потом выходит из области видимости

Z>В C++11 прибавилось:


Z>1. V(V&&), V& operator=(V&&)

Z>2. Появилось две возможности на выбор:
Z>
Z>a = std::move(b);
Z>

Z>или старый вариант:
Z>
Z>a.swap(b);
Z>



Z>Итого кода стало больше, то есть программа сложнее, плюс одно и тоже действие

Z>можно записать двумя способами, это ли не усложнение?

Это разные способы для разных целей. С введением семантики перемещения мы теперь имеем возможность перемещать некопируемые объекты, например дескрипторы файлов. Это не замена обмену. В С++03 трюк с обменом обычно использовался от бедности, для возврата из функции.
Было:
void fun(std::vector<LargeOrNonCopyableClass> &out)
{
   std::vector<LargeOrNonCopyableClass> result;
   //generate result
   out.swap(result); // exception safe way to return the result
}

Стало:
std::vector<LargeOrNonCopyableClass> fun()
{
   std::vector<LargeOrNonCopyableClass> result;
   //generate result
   return result;
}
Re[9]: Исповедь C++ника
От: _Artem_ Россия  
Дата: 30.04.20 18:04
Оценка: +1
Здравствуйте, Zhendos, Вы писали:

Z>В C++11 прибавилось:


Z>1. V(V&&), V& operator=(V&&)

Z>2. Появилось две возможности на выбор:
Z>
Z>a = std::move(b);
Z>

Z>или старый вариант:
Z>
Z>a.swap(b);
Z>



Z>Итого кода стало больше, то есть программа сложнее, плюс одно и тоже действие

Z>можно записать двумя способами, это ли не усложнение?

Это нифига не эквивалентный код. Объект подвергшийся операции std::move находится в валидном но неспецифируемом состоянии. То-есть, он может быть каким угодно.
Re[7]: Исповедь C++ника
От: alzt  
Дата: 30.04.20 20:06
Оценка: +1
Здравствуйте, CreatorCray, Вы писали:

A>>У спагетти-кода есть большое преимущество — его легко поддерживать даже джуниору.

CC>Шта?

Ищет конктерный кусок, исправляет. Задача выполнена. Всё. Не надо разбираться в паттернах, изучать архитектуру.
Вот, я когда освоил шаблоны С++, прочитал книжку Вандевурда, и минимизировал код, то следующему было сложно. Я вывел в компайл тайм всё, что смог. А я способный. Я думаю, что человек, который это поддерживал, многое бы отдал, чтобы это был просто спагетти код. Ему хотя бы шаблоны учить не пришлось. И разгребать было бы легче.
Re[5]: Исповедь C++ника
От: prog123 Европа  
Дата: 30.04.20 20:43
Оценка:
Здравствуйте, Poopy Joe, Вы писали:

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


У меня был случай. Нужно было обновить сервер, добавить немного фич, но исходники потеряли)) Протокол тоже не описан. Дали исходники клиента, тогда еще в svn. Задача описать протокол и реализовать. Фактически там было две версии клинта, да рефактринга (спагетти) и после (куча мелких абстракций). Помучался я с этим высоко-абстрактным кодом и за пару часов восстановил протокол по спагетии коду с одним гигантским свитчем и кучей ифов внутри.
Отредактировано 30.04.2020 20:44 prog123 . Предыдущая версия .
Re[8]: Исповедь C++ника
От: Reset  
Дата: 30.04.20 21:27
Оценка: 2 (1) +1
A>>>У спагетти-кода есть большое преимущество — его легко поддерживать даже джуниору.
CC>>Шта?

A>Ищет конктерный кусок, исправляет. Задача выполнена. Всё. Не надо разбираться в паттернах, изучать архитектуру.

A>Вот, я когда освоил шаблоны С++, прочитал книжку Вандевурда, и минимизировал код, то следующему было сложно. Я вывел в компайл тайм всё, что смог. А я способный. Я думаю, что человек, который это поддерживал, многое бы отдал, чтобы это был просто спагетти код. Ему хотя бы шаблоны учить не пришлось. И разгребать было бы легче.

Ты неверно понимаешь термин "спагетти-код". На самом деле это не простыня кода в виде длинной функции (со свичем или делающей последовательность большого количества операций). Спагетти-код это код, который тронь в одном месте — последствия проявятся в другом совершенно непредсказуемом месте. Аналогия довольно мутная, но примерно такая: представь большую тарелку спагетти в которой одна спегеттина, но настолько длинная, что заполняет тарелку с горкой. Так вот, если ее потянуть в одном месте (любом), то зашевелится вся тарелка в неожиданных местах (потому что они все связаны, но как именно — не видно). Т.е. спагетти-код, это код, у которого много связей с другим кодом (причем, совершенно неожиданных) и если его тронуть, то всплывут ошибки в других частях программы. При этом функции, обычно, тоже длинные, но суть не в размере, а количестве и предсказуемости связей. Длинная простыня — это лишь один из признаков спагетти-кода.

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

P.S. Кстати, даже спагетти-код это не приговор. Не так давно был ажиотаж по поводу статьи про разработку в Оракле. Там и функции длинные и аргументов у них много и другие антипаттерны в изобилии... Тогда это воспринимали как: "Фуу — бяка". Но на самом деле это про то, что тесты рулят. Потому что весь кода там покрывается огромным количеством тестов в результате чего после внесения любых изменений, добавления новых тестов и исправления ошибок в тестах или самих тестов, код продолжает работать как задумано и возможность дальнейшей разработки также не страдает.
Re[2]: Исповедь C++ника
От: σ  
Дата: 30.04.20 22:37
Оценка:
vsb>Просто С++ приманивает некий определённый тип программистов, которых я называю метапрограммистами

Ещё language lawyer-ов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.