LINUX.ORG.RU

[C++?] Серьезный вопрос.


3

2

Просьба ответит серьезно, желательно с аргументами за или против.

Предистория:
Когда то давным давно (я тогда еще только закончил 9-ый класс) я увидел в газете объявление о наборе в летнюю группу по изучению классического программирования. В тот момент я был с компьютером на ты и "очень" хорошо в них разбирался (переустанавливал Windows каждый месяц, хаял Microsoft просто потому, что после моих настроек W приходилось постоянно переустанавливать). Группа по классическому программированию так и не набралась, но набралось 1 человек на Visual Basik for Applications. Я соглсился быть вторым и начались занятия.
Все, что мне там объясняли я схватывал быстро. Меня пригласили продолжить обучение в сентябре на курсе "моделирование".
Там уже был Pascal, который я тогда совсем не знал. Сам курс был очень разношорстный: мы изучали и использование мыши через прерывание, готовились к различным олимпиадам. Параллельно я изучил Pascal.
Потом был Delphi. К концу 10-го класса я уже неплохо владел приемами программирования и вовсю клепал бесполезные программулины. Потом поступил в универ на программиста. Там тоже был Delphi, и я особо не напрягаясь писал все лабы (к моменту поступления я уже был знаком с логикой указателей, самописные стеки и графы, etc).
На 2-ом курсе в гостях у знакомого я разобщался с человеком, который уже насколько лет работал в нерезиновой программистом. Он мне и открыл глаза на мир: "Delphi здох. Его уже похоронили и забыли. Сейчас необходимо знание C++, C#. Необходимо занание паттернов проектирование". Вобщем много чего он мне наговорил. Книжек умных насоветовал, подкинул MSVS 2008, кучу электронных книжек. Я изучил C# по книжке Шилдта. Читал "Идеальный кол" (автора уже не помню). Потом купил(!) себе книжку Шилдта про С++. Мне понравился язык. Тем более что мне казалось, что именно он и есть общепринятый стандарт. Наиболее удобный язык для программиста.

А недавно в соседней теме за упоминание это С++ меня чуть было не съели со всем чем можно. Так-то.

Собственно вопрос: Так стоит ли изучать дальше С++ (а я уже достаточно углубился в книжку Страуструпа, подробно изучая все подводные течения)? Какой язык стоит изучать? Какие из них более востребованны?

Спасибо всем, кто осилил это многобукаф.

★★★★★

Ответ на: комментарий от Reset

> Если вместо стандартной портянки с форами на экран текста будет хитрожопая рекурсия, разбитая на несколько функций, то это ничем не лучше, а то и хуже фортрановской goto-лапши в стиле 60х-70х годов.

Т.е. будет по классике. На этом, я думаю, разговор можно завершить.

> Оно не всегда нужно

Мужик! Ты не поверишь! Умные указатели, RAII et cetera тоже не всегда нужны!

kemm
()
Ответ на: комментарий от Reset

>Дать то я дам, но только я сомневаюсь, что ты библиотеки найдешь :)

ну вот и попробуем ;)

>Стучись завтра

добавил в ростер, пропинговал, завтра постучусь за задачкой. заранее спасибо

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>вообще-то тот, который однострочник, это не quicksort. ни разу

А что, qsort[] = [] обязательно отдельной строкой идти должен?

Кстати, копирований это не отменяет.

linuxfan
()
Ответ на: комментарий от linuxfan

>Наверное, настало время задать вопрос, что же ты понимаешь под "ФП стилем"?

ФВП, комбинаторы, персистентные типы данных. в ту же кучу - ADT, паттерн-матчинг и ленивые вычисления - не обязательно из ФП, но встречаются в основном там

>как он мог ставить диагноз по аватаркам, если тогда аватарок не было?

а я что, утверждал что ставил? я, вроде как, наоборот:

>диагнозов по фотографиям (и аватаркам) даже он не ставил

а фотографии вроде уже были, так что потенциально - мог

jtootf ★★★★★
()
Ответ на: комментарий от linuxfan

>А что, qsort[] = [] обязательно отдельной строкой идти должен?

сортировка Хоара - она in-place, хороший пример алгоритма, который на ФП ну никак не ложится; почему его так любят кругом показывать - вот уж понятия не имею

>Кстати, копирований это не отменяет.

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

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>JS 2.0 обещают уже не функциональным (во вском случае - куда менее функциональным), так что пример не канает

Если 2.0, то это о ECMA Script. Javascript'ом назвали вроде как для придания попсовости, тогда же Java была в моде.

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

То есть я сознательно не щемлю себе яйца дверью с воплями. Зачем мне лямбды, если у меня императивщина разрешена?

linuxfan
()
Ответ на: комментарий от jtootf

>> что же ты понимаешь под "ФП стилем"?

> ФВП, комбинаторы, персистентные типы данных. в ту же кучу - ADT, паттерн-матчинг и ленивые вычисления

Хм. Это _всё_ было и без ФП. Так что "ФП стиль" - это таки отсуствие побочных эффектов :)

P.S. персистентные типы - это persistent types, типы, объекты которых сохраняются во внешней памяти?

tailgunner ★★★★★
()
Ответ на: комментарий от jtootf

>я понимаю, что ты далёк от всяких там левых и растляющих технологий, но хоть педивикию почитай, что ли,- а то общаться элементарно тяжело :(

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

linuxfan
()
Ответ на: комментарий от linuxfan

>Зачем мне лямбды, если у меня императивщина разрешена?

а какая связь, извини, между анонимными функциями и "разрешением императивщины"?

>Если 2.0, то это о ECMA Script

буквоед. это что, на что-то влияет?

>То есть я сознательно не щемлю себе яйца дверью с воплями

слушай, тебя в детстве функциональщики не били? откуда такие фобии хотя бы посмотреть что оно такое? просто-таки психологический казус, если ещё не психиатрический

больше всего это напоминает верующих, которые отказываются читать "бесовские книги", слушать о других религиях, и изучать науки

jtootf ★★★★★
()
Ответ на: комментарий от kemm

>Я-то как раз считаю, что С++ в любом случае остаётся С++, а не отбрасывает плюсики прямо посреди файла, как у тебя.

Напоминаю: кусок кода Reset'а с for'ами ты классифицируешь как сишный, потому что не видишь каких-либо специфических плюсовых примочек, в связи с чем вопишь о "лаврах C", которые нагло крадет плюсовка.

linuxfan
()
Ответ на: комментарий от linuxfan

>Я уже упоминал, что в сортах монад не разбираюсь и хаскель осуждаю?

в хаскеле нет мультиметодов, вот в чём беда - так что я не совсем понимаю, что именно ты принялся осуждать на этот раз

jtootf ★★★★★
()
Ответ на: комментарий от tailgunner

>Хм. Это _всё_ было и без ФП

да. просто в ФП-языках это всё приятно реализовано, вот и всех делов

>"ФП стиль" - это таки отсуствие побочных эффектов :)

ну, там лично меня спрашивали, вот я за себя и ответил

>персистентные типы - это persistent types, типы, объекты которых сохраняются во внешней памяти?

да. значения, хранящие историю изменений

jtootf ★★★★★
()
Ответ на: комментарий от kemm

>Мужик! Ты не поверишь! Умные указатели, RAII et cetera тоже не всегда нужны!

Для этого Господь Бог^W^W Страуструп изначально населил язык тупыми указателями и привнес явное управление временем жизни динамических объектов.

linuxfan
()
Ответ на: комментарий от linuxfan

> Напоминаю: кусок кода Reset'а с for'ами ты классифицируешь как сишный, потому что не видишь каких-либо специфических плюсовых примочек, в связи с чем вопишь о "лаврах C", которые нагло крадет плюсовка.

Ссылку.

kemm
()
Ответ на: комментарий от linuxfan

> Для этого Господь Бог^W^W Страуструп изначально населил язык тупыми указателями и привнес явное управление временем жизни динамических объектов.

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

kemm
()
Ответ на: комментарий от jtootf

>а я что, утверждал что ставил? я, вроде как, наоборот

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

linuxfan
()
Ответ на: комментарий от jtootf

>сортировка Хоара - она in-place, хороший пример алгоритма, который на ФП ну никак не ложится;

Пузырек с шеллом, как я понимаю, на ФП тоже хреново ложится?

>в данном случае ФП нафиг не нужно, и ни один нормальный человек его там применять не будет

То есть как только надо отсортировать результаты какой-либо выборки -- это не к нам? Ну и язык.

linuxfan
()
Ответ на: комментарий от linuxfan

>картинка, которая на твой взгляд является клевой и характеризует какую-либо твою сильную сторону или увлечение.

ты ставил несколько другой диагноз, вообще-то. напомнить?

jtootf ★★★★★
()
Ответ на: комментарий от linuxfan

>Пузырек с шеллом, как я понимаю, на ФП тоже хреново ложится?

лучше, чем qsort

>То есть как только надо отсортировать результаты какой-либо выборки -- это не к нам?

нет, это было бы слишком хорошо для тебя :)

>Ну и язык.

вообще-то, Haskell среди прочего - "лучший императивный язык в мире" (с) SPJ. и тот же qsort из стандартной библиотеки сделан очень эффективно (хоть и не в одну строчку)

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>а какая связь, извини, между анонимными функциями и "разрешением императивщины"?

Весьма очевидная: гнусная императивщина прекрасно живет без map и reduce, заменяя все это одним могучим for (эстеты могут еще использовать while), а в функциональщине лямбды нужны, потому как есть потребность в большом количестве одноразовых простеньких функций.

>буквоед. это что, на что-то влияет?

Нет. Разве что я сомневаюсь, что выкинут нафиг все замыкания (поломка обратной совместимости). Просто добавят немного объектщины, о чем мечтает куча жабаскриптеров.

>слушай, тебя в детстве функциональщики не били?

В детстве я был здоровым развитым ребенком и сам мог накостылять чахлым функциональщикам.

>откуда такие фобии хотя бы посмотреть что оно такое?

Ты о хаскелле? Смотрел, блевал. Большее отвращение у меня только встроенный язык 1С вызывает.

linuxfan
()
Ответ на: комментарий от kemm

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

Если ты не видишь, что RAII в C++ не исключает ручного управления временм жизни объекта, то дислексия как раз у тебя.

linuxfan
()
Ответ на: комментарий от jtootf

>в хаскеле нет мультиметодов, вот в чём беда - так что я не совсем понимаю, что именно ты принялся осуждать на этот раз

Я подумал, что параметрический полиморфизм -- это вызов различных функций для различных типов аргументов. То есть "разные параметры" - "разные функции". А это вроде как в миру мультиметодами называются, основной задачей которых является классификация космического мусора.

linuxfan
()
Ответ на: комментарий от jtootf

>ты ставил несколько другой диагноз, вообще-то. напомнить?

Что ты восторгаешься хаскеллем. А что, обычно увлекаются не тем, что нравится?

linuxfan
()
Ответ на: комментарий от linuxfan

> Если ты не видишь, что RAII в C++ не исключает ручного управления временм жизни объекта, то дислексия как раз у тебя.

Господи, за что мне это трололо? Ты сам-то хоть понимаешь, о чём бредишь, и как соотносится это с темой разговора?

kemm
()
Ответ на: комментарий от linuxfan

>Весьма очевидная: гнусная императивщина прекрасно живет без map и reduce, заменяя все это одним могучим for (эстеты могут еще использовать while), а в функциональщине лямбды нужны, потому как есть потребность в большом количестве одноразовых простеньких функций.

беда в том, что в С++ есть STL; и С++ без STL - это уже не С++

>Ты о хаскелле? Смотрел, блевал

судя по тому, что терминов оттуда ты не понимаешь, и код не читаешь, это "смотрел" означает "открыл haskell.org и закрыл обратно". так?

jtootf ★★★★★
()
Ответ на: комментарий от linuxfan

>Я подумал, что параметрический полиморфизм -- это вызов различных функций для различных типов аргументов

это перегрузка функций, а не параметрический полиморфизм. есть в С++, нет в C, нет в Haskell

jtootf ★★★★★
()
Ответ на: комментарий от linuxfan

>Что ты восторгаешься хаскеллем

вообще-то, функциональщину головного мозга ты мне определил

>А что, обычно увлекаются не тем, что нравится?

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

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>лучше, чем qsort

Да неужели? Я тут нагуглил haskell bubble sort и там такая мерзость... iterate! Это же богомерзкая императивщина!

>вообще-то, Haskell среди прочего - "лучший императивный язык в мире"

Глядя на do, dolist, throw, return-from и прочую мерзость лиспа, я сомневаюсь в правдивости приведенного тобой тезиса.

>и тот же qsort из стандартной библиотеки сделан очень эффективно (хоть и не в одну строчку)

То есть чистый и функциональный на проверку оказался не таким уж и чистым. Какая гадость! Какое разочарование!

А я-то уж было поверил в оплот непорочной функциональности.

linuxfan
()
Ответ на: комментарий от kemm

>Ты сам-то хоть понимаешь, о чём бредишь, и как соотносится это с темой разговора?

Среднестатистический человек способен одновременно удерживать до 7 объектов в своей "оперативной" памяти. Так вот, убери все, что тебе мешает и попытайся вспомнить, что ты говорил двадцать минут назад.

Если тебе все еще трудно, то я напомню: ты сетовал на то, что RAII и смарт-поинтеры не всегда уместны, на что я тебе намекнул, что все эти вещи не мешают тебе поработать ручками для достижения эффекта, не совместимыми с этими понятиями.

linuxfan
()
Ответ на: комментарий от linuxfan

Ты сделал мой день. Такого незамутнённого образца я давно не видывал.

kemm
()
Ответ на: комментарий от jtootf

>беда в том, что в С++ есть STL; и С++ без STL - это уже не С++

Вообще-то STL -- это не беда. Беда -- это boost. В любом случае, я не понял твоей метафоры, ибо вне зависимости от наличия или отсутствия STL, в C++ присутствуют шаблоны, действует RAII. По мне, так именно эти две вещи делают плюсы плюсами. Перегрузка операторов -- это так, мелочь, чтобы взорвать мозг непосвященным.

linuxfan
()
Ответ на: комментарий от jtootf

>это "смотрел" означает "открыл haskell.org и закрыл обратно". так?

Это значит, я открыл tutorial, пролистал пару страничек и в ужасе закрыл.

linuxfan
()
Ответ на: комментарий от jtootf

>это перегрузка функций, а не параметрический полиморфизм.

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

linuxfan
()
Ответ на: комментарий от jtootf

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

Ага, никчемные полутородневные язычки! С возрастом пройдет, я уверен. Тем более, что количество этой гадости (язычков-однодневок) год от года растет экспоненциально.

linuxfan
()
Ответ на: комментарий от tailgunner

>> Ты не поверишь, но NPE в серверной части на практике обычно не приводит ни к чему серьезному. Так, отваливается одна транзакция из нескольких тысяч

>Не поверю :) Это те последствия, которые вы _замечали_.

Если бы сервер тупо и внезапно грохался было бы хуже. А так мы просто получаем неожиданный стектрейс в логах через несколько месяцев эксплуатации.

>Впрочем, вспоминая твои слова "все программы написаны через жопу" %)

Именно так. Поэтому надо делать так чтобы ошибки были локальными и не приводили к фатальным отказам.

>> В клиентской части, гуйне то есть, NPE почти всегда приводит к тому что "при нажатии на кнопку ничего не происходит".

>Какая мелочь - подумаешь, программа не работает.

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

Absurd ★★★
()
Ответ на: комментарий от linuxfan

Я тебе помогу, трололо. Вот ссылка. С цитатой тебя, тостенького.

http://www.linux.org.ru/jump-message.jsp?msgid=4088836&cid=4091593

Так кто там что именовал кодом на С?

Я тебе даже тут эту цитатку приведу, троллюшко:

>> а вот числодробилки на C аж публиковались в исходных кодах.

Кто автор цитатки, напомнить, толстенький? 8))

kemm
()
Ответ на: комментарий от Absurd

> Если бы сервер тупо и внезапно грохался было бы хуже.

А он и грохнулся, неужели ты этого не понимаешь? Просто вы его быстро перезапустили.

> надо делать так чтобы ошибки были локальными и не приводили к фатальным отказам.

Аминь. Непонятно только, причем здесь SIGSEGV-vs-NPE.

>>> В клиентской части, гуйне то есть, NPE почти всегда приводит к тому что "при нажатии на кнопку ничего не происходит".

>> Какая мелочь - подумаешь, программа не работает.

> Если бы программа тупо грохалась и пользователь терял свои данные было бы хуже. А так просто не работает одна кнопочка.

Не работает кнопочка "Сохранить", какая фигня.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>> Если бы сервер тупо и внезапно грохался было бы хуже.

>А он и грохнулся, неужели ты этого не понимаешь? Просто вы его быстро перезапустили.

Брехня - процесс не умер, все другие треды работают в штатном режиме.

>> надо делать так чтобы ошибки были локальными и не приводили к фатальным отказам.

>Аминь. Непонятно только, причем здесь SIGSEGV-vs-NPE.

После SIGSEGV процессу однозначно каюк, NPE же долетает до цикла обработки сообщений где благополучно убивается Swing-ом c руганью в stderr. В случае сервера оно долетает до класса наподобие Servlet который его убивает и возвращает пользователю ошибку наподобие 500.

>> Если бы программа тупо грохалась и пользователь терял свои данные было бы хуже. А так просто не работает одна кнопочка.

>Не работает кнопочка "Сохранить", какая фигня.

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

Absurd ★★★
()
Ответ на: комментарий от Absurd

>>> Если бы сервер тупо и внезапно грохался было бы хуже.

>> А он и грохнулся, неужели ты этого не понимаешь? Просто вы его быстро перезапустили.

> Брехня - процесс не умер, все другие треды работают в штатном режиме.

Сделай многопроцессный сервер, если не уверен в своих силах. Сделай восстановление с контрольной точки. Что вообще за инфантильная позиция - "процесс умир, всему капец"? :)

> После SIGSEGV процессу однозначно каюк, NPE же долетает до цикла обработки сообщений где благополучно убивается Swing-ом

Перехвати SIGSEGV и не умирай.

> В случае неработы кнопки "сохранить" разницы между тупым гроханием и подавлением экзепшена нет никакой.

Ну хоть с чем-то ты согласен.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>> Брехня - процесс не умер, все другие треды работают в штатном режиме.

>Сделай многопроцессный сервер, если не уверен в своих силах.

Можно сделать что угодно. Но, например, если сделать через epoll (EPollSelector в java.nio) то суть не изменится - экзепшен долетит до селектора где можно убить коннекшен. Т.к обработчик скорее всего не имеет доступа к объектам других сессий (поскольку он их не создавал) и не имел возможности их повредить, то можно нормально продолжать работу.

>> После SIGSEGV процессу однозначно каюк, NPE же долетает до цикла обработки сообщений где благополучно убивается Swing-ом

>Перехвати SIGSEGV и не умирай.

Структура памяти повреждена, починке не подлежит. В жабе же можно сломать только свой локальный объект, поэтому-то NPE обычно безвреден.

Absurd ★★★
()
Ответ на: комментарий от Absurd

>>Сделай многопроцессный сервер, если не уверен в своих силах.

>Можно сделать что угодно. Но, например, если сделать через epoll (EPollSelector в java.nio) то суть не изменится - экзепшен долетит до селектора где можно убить коннекшен.

Опять ты начал бредить. Причем тут java.nio? Напомню, речь о многопроцессном сервер в стиле раннего Апача.

> Структура памяти повреждена, починке не подлежит

Или не повреждена.

> В жабе же можно сломать только свой локальный объект

В Яве тоже бывают глобальные данные.

tailgunner ★★★★★
()
Ответ на: комментарий от kemm

Никогда не думал, что стану защищать Reset'а... Но, ты, браток, завираешься.

Сам перешел в текущем проекте с фортрана на C++. Зачем?

На C++ удобно конструировать пользовательские типы. Фактически, чего мне не хватало в фортране. Чистого C мне тоже не хватает -- одно то, что все функции сидят в глобальном пространстве имен уже здорово парит в некоторых случаях. Я попробовал C++ и нашел, что многое на нем удобно реализуется -- в частности, я реализовал себе массивы в стиле Фортрана -- удобный и естественный с точки зрения математика синтаксис + мощь библиотек GSL (писанных на C) и LAPACK (для фортрана).

annoynimous ★★★★★
()
Ответ на: комментарий от tailgunner

>"Devil is a domain-specific language for specifying the functional interface of a device"?

он самый. "чуть более хороший C" для задачи реализации драйверов

jtootf ★★★★★
()
Ответ на: комментарий от linuxfan

>А я-то уж было поверил в оплот непорочной функциональности.

с непорочной функциональностью - это не ко мне, я в серебрянные пули не верю

jtootf ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.