Здравствуйте, Poopy Joe, Вы писали:
PJ>Есть код простой, а есть код примитивный. Так вот шаблоны позволяют писать код простой, когда читателю достаточно понимать и оперировать абстракциями. А не утруждающие себя рассуждениями пейсатели обычно фигачат код примитивный, где читателю приходится декодировать полет их мысли в километровых спагетти-простынях.
У спагетти-кода есть большое преимущество — его легко поддерживать даже джуниору.
А С++ код может превратиться во что-то ещё более гадкое, чем спагетти-код, но чтобы его поддержать, придётся искать очень опытного С++ желающего во всём этом копаться.
Здравствуйте, AlexGin, Вы писали:
AG>Автор сообщения имеет в виду тот факт, что при определенном знании и опыте на ассемблере можно сделать всё, что угодно.
Ну дык Turing complete жеж.
На любом полном языке в итоге можно будет сделать всё что угодно если все остальные нюансы вынести за скобки.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
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>Спасибо за информацию! Неплохо вы придумали — начинать учить первокурсников некоему слэнгу, известному только в одном университете
Учим НЕ языку, а ПРОГРАММИРОВАНИЮ.
Разницу — понимать надо.
Сначала должны понятия усвоить, а потом нотацию.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LVV>>Да мы проще поступили. LVV>>Сделали свой язык для обучения и его учим. А потом переводим в С++, чтоб народ не отставал от тенденций. AN>А зачем свой язык сделали вместо того, что бы взять какой-нибудь из существующих? И где можно код на нём посмотреть?
Ответ PMу посмотри.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>У него и Оберон — паскалеподобный, но совсем другой язык. LVV>2. Вы не там ищете. У нас в космической промышленности применяют диалекты ТОЛЬКО виртовских языков.
Как это нужно понимать? У нас в космической промышленности применяют диалекты виртовские языкы? Это очевидно не соответствует действительности. Из всех паскалеподобных языков у нас используют только авторские диалекты от Вирта? тоже сомнительное утверждение. Тут в первую очередь нужно бы узнать, а насколько в целом паскалеобразные языки используют. И например, если их используют, то почему бы не пользоваться Дельфи или каким-нибудь ФриПаскалем, хотя бы не для бортового оборудования, а для наземных систем.
Здравствуйте, 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);
Итого кода стало больше, то есть программа сложнее, плюс одно и тоже действие
можно записать двумя способами, это ли не усложнение?
Здравствуйте, Zhendos, Вы писали:
Z>Итого кода стало больше, то есть программа сложнее, плюс одно и тоже действие Z>можно записать двумя способами, это ли не усложнение?
Плюс гемор с расставлениями noexcept, иначе это move не заработает.
Здравствуйте, LaptevVV, Вы писали:
PM>>Спасибо за информацию! Неплохо вы придумали — начинать учить первокурсников некоему слэнгу, известному только в одном университете LVV>Учим НЕ языку, а ПРОГРАММИРОВАНИЮ. LVV>Разницу — понимать надо. LVV>Сначала должны понятия усвоить, а потом нотацию.
Конечно, при обучении программированию объяснить базовые принципы и алгоритмы важнее, чем особенности какого-либо языка. Когда я учился в институте, в первом семестре для этого использовали псевдокод, похожий на Учебный алгоритмический язык, и Паскаль.
Но при использовании любого языка, в том числе и разработанного специально для учебных целей, его нотацию учить всё равно придётся. Или придуманный язык похож на Scratch и конструкции из готовых блоков собираются?
В чём особенность языка, придуманного в Астраханском университете и почему он лучше подходит для первоначального обучения, чем другие языки? Примеры кода где можно посмотреть?
Здравствуйте, 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, проекта который обсчитывает коллайдер в Церне, так там тоже видно, что люди учёные писали.
Здравствуйте, 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
}
Здравствуйте, 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 находится в валидном но неспецифируемом состоянии. То-есть, он может быть каким угодно.
Здравствуйте, CreatorCray, Вы писали:
A>>У спагетти-кода есть большое преимущество — его легко поддерживать даже джуниору. CC>Шта?
Ищет конктерный кусок, исправляет. Задача выполнена. Всё. Не надо разбираться в паттернах, изучать архитектуру.
Вот, я когда освоил шаблоны С++, прочитал книжку Вандевурда, и минимизировал код, то следующему было сложно. Я вывел в компайл тайм всё, что смог. А я способный. Я думаю, что человек, который это поддерживал, многое бы отдал, чтобы это был просто спагетти код. Ему хотя бы шаблоны учить не пришлось. И разгребать было бы легче.
Здравствуйте, Poopy Joe, Вы писали:
PJ>Есть код простой, а есть код примитивный. Так вот шаблоны позволяют писать код простой, когда читателю достаточно понимать и оперировать абстракциями. А не утруждающие себя рассуждениями пейсатели обычно фигачат код примитивный, где читателю приходится декодировать полет их мысли в километровых спагетти-простынях.
У меня был случай. Нужно было обновить сервер, добавить немного фич, но исходники потеряли)) Протокол тоже не описан. Дали исходники клиента, тогда еще в svn. Задача описать протокол и реализовать. Фактически там было две версии клинта, да рефактринга (спагетти) и после (куча мелких абстракций). Помучался я с этим высоко-абстрактным кодом и за пару часов восстановил протокол по спагетии коду с одним гигантским свитчем и кучей ифов внутри.
A>>>У спагетти-кода есть большое преимущество — его легко поддерживать даже джуниору. CC>>Шта?
A>Ищет конктерный кусок, исправляет. Задача выполнена. Всё. Не надо разбираться в паттернах, изучать архитектуру. A>Вот, я когда освоил шаблоны С++, прочитал книжку Вандевурда, и минимизировал код, то следующему было сложно. Я вывел в компайл тайм всё, что смог. А я способный. Я думаю, что человек, который это поддерживал, многое бы отдал, чтобы это был просто спагетти код. Ему хотя бы шаблоны учить не пришлось. И разгребать было бы легче.
Ты неверно понимаешь термин "спагетти-код". На самом деле это не простыня кода в виде длинной функции (со свичем или делающей последовательность большого количества операций). Спагетти-код это код, который тронь в одном месте — последствия проявятся в другом совершенно непредсказуемом месте. Аналогия довольно мутная, но примерно такая: представь большую тарелку спагетти в которой одна спегеттина, но настолько длинная, что заполняет тарелку с горкой. Так вот, если ее потянуть в одном месте (любом), то зашевелится вся тарелка в неожиданных местах (потому что они все связаны, но как именно — не видно). Т.е. спагетти-код, это код, у которого много связей с другим кодом (причем, совершенно неожиданных) и если его тронуть, то всплывут ошибки в других частях программы. При этом функции, обычно, тоже длинные, но суть не в размере, а количестве и предсказуемости связей. Длинная простыня — это лишь один из признаков спагетти-кода.
Функция с большим свичем — это нормально. Если в фукнции много последовательных действий — тоже нормально, т.к. с ней можно работать (хотя если разбить ее на более мелкие функции — станет проще понять, что она делает). Аналогия со спагетти — положить ее на тарелку не кучей, а аккуратными витками или другой понятной структурой, чтобы наличие и направление связей прослеживались.
P.S. Кстати, даже спагетти-код это не приговор. Не так давно был ажиотаж по поводу статьи про разработку в Оракле. Там и функции длинные и аргументов у них много и другие антипаттерны в изобилии... Тогда это воспринимали как: "Фуу — бяка". Но на самом деле это про то, что тесты рулят. Потому что весь кода там покрывается огромным количеством тестов в результате чего после внесения любых изменений, добавления новых тестов и исправления ошибок в тестах или самих тестов, код продолжает работать как задумано и возможность дальнейшей разработки также не страдает.