LINUX.ORG.RU

Посоветуйте толковые книги на русском/английском по Си++ (Cxx11)

 , ,


13

11

Посоветуйте толковые книги на русском/английском по Си++.
Чтобы был нормальный перевод и содержание.
У меня где-то лежит каталог с O'Reilly, надо бы посмотреть среди них. Ещё что-то брал по акции «книга за 1 рубль» в books.ru

В двух словах - я старпёр, который изучал Си/Си++ в 1996-1997 году по книжкам:
* В.В.Подбельский Язык Си++ (Финансы и статистика)
* Беляков М.И., Рабовер Ю.И., Фридман А.Л. Мобильная операционная система
* немного смотрел русский перевод Керниган-Ритчи в бумажном виде в библиотеке когда интернетов не было, а свою книгу купить - стипендия не позволяла
* в 2004-2005 году читал книгу Страуструп Б. Дизайн и эволюция С++

Все эти книги читал в бумажном варианте.

По работе писал только на Си с классами и на Паскале с классами (+Делфи). Сейчас хотел бы по-изучать Си++, чтобы понимать современный код. Какие книги посоветуете? Интересует компактное изложение фундаментальных основ, желательно - на русском языке. Или что-то не очень тяжёлое на английском (чтобы не надо было переводить каждое слово со словариком). Надеюсь, понятно объяснил. Спасибо.

Просто я встретил на днях код вида

A::B::C::D ...
, и понял, что пора догонять поезд. На университетских знаниях 20-летней давности сейчас делать почти нечего. Хочу перестать заниматься быдлокодерством, и начать осваивать современные знания.

Ещё - есть ли краткая табличка с основными различиями в стандартах (Comparison table/list)? Или лучше просто прочитать для начала Wikipidia:C++11, и составлять такую таблицу самому?

За что браться не следует однозначно новичку, что освоить для быстрого JFF-эффекта, если хорошо знал в своё время Си с классами? Нравится концепция namespaces. Ещё хотелось бы впоследствии плавный переход на какую-то функциональщину, чтобы знания по современному Си++ пригодились. Какие концепции/подходы есть общие?

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

Шаблоны позволяют делать практически всё, что генерики (или даже совсем всё).

Так, да не так. Из-за деревьев шаблонов ты не увидишь всего леса. Ограничения важны так же, как и свобода.

Короче говоря, генерики в Rust очень сильно напоминают полиморфизм в Haskell. Можно определять очень похожие constraints по типам аргументов. Мало того, что компилятор проверит, что все constraints соблюдаются, так эти constraints еще документируют код.

Вот, на документировании я бы и хотел заострить внимание. Без этого использование тех же итераторов и futures-rs было бы подобно хождению по минному полю. А так, все четко видно, что где к чему применяется.

Как понимаю, в C++ пока ничего подобного нет для шаблонов. Или что-то сварганили за последний год-два? Просто я уже не слежу за развитием этого языка и пару лет ничего не писал на нем.

И на 100% уверен, что обычный сиплюсплюсник не сможет использовать монадический интерфейс на шаблонах в C++ без мата и ругательств, а вот на Rust используют итераторы и Future только в путь!

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

Просто я уже не слежу за развитием этого языка и пару лет ничего не писал на нем.

Сильно напоминает «Пастернака не читал, но осуждаю».

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

Вот, на документировании я бы и хотел заострить внимание. Без этого использование тех же итераторов и futures-rs было бы подобно хождению по минному полю. А так, все четко видно, что где к чему применяется.

Как понимаю, в C++ пока ничего подобного нет для шаблонов. Или что-то сварганили за последний год-два?

Концепты вроде должны быть в C++20 (в этот раз точно, ага). Но я тоже не слежу за развитием стандарта, а сам пишу на устаревшем варианте C++11.

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

TIMTOWTDI

В расте та же срань.

Например? Если не считать 3-х способов задать ограничение на тип (<T: Trait>, where T: Trait, impl Trait).

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

TIMTOWTDI

В расте та же срань.

Например?

// rustc-nightly needed
#![feature(type_ascription)]

fn main() {
    let x: u8 = 0;
    let x = 0u8;
    let x = 0_u8;
    let x = 0: u8;
}
Virtuos86 ★★★★★ ()
Ответ на: комментарий от tailgunner

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

anonymous ()

Коммент Царя удалили, поэтому отвечаю ему в корневую ветку

Я слышал кукареки уровня «фу, дырявый опенссл. На расте он запилится в 10раз быстрее и безопаснее, и будет работать быстрее»

Пусть эти слова комментируют их авторы. А то, что реализации *SSL дырявы, и в них находят уязвимости — это объективный факт.

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

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

Дооо. А еще Гугл купил одну ОС у чувака, и из нее родился Android. Такие вот методы у Гугла, что тут скажешь. Проектом посонов из KDE хоть пользоваться можно было на момент прихода в разработку людей из Гугла? А то так можно посадить один саженец в парке, а потом бить себя пяткой в грудь, что озеленял Расею-матушку.

Где твой броузер? 10лет прошло? Серво обдристался даже с примитивным рендерингом.

Ну не получилось, с кем не бывает. Это изначально исследовательский проект на ЯП, который параллельно разрабатывается. Тебе кто-то обещал, что ты сможешь срать на ЛОР'е через Servo? Спрашивай с этих людей. Я прямо сейчас пишу из браузера, в котором работает новый CSS движок на Rust. Это реальность.

У руста так же нет конкурентов, балабол. Раст-адепты утверждают, что раст лучше крестов и кресты им не конкурент. Кресты это легаси дерьмо.

Узнаваемый гоп-стайл царишки сишки. Смешал в кучу свой бред и объективные факты.

Все написанное на C++ потребовало многие тысячи человекочасов. Далеко не всё ПО можно эффективно разрабатывать JFF. Найдутся люди, готовые оплачивать разработку на Rust каких-то заметных проектов, тогда и можно будет судить о том, лучше ли Раст для разработки. Пока что большинство сравнений носят синтетический характер: есть уникальная фича => значит чуть лучше. И только болезные могут отрицать, что Rust во многом поприятнее C++, хотя и у того есть сильные стороны.

Потому что LLVM и предназначен для таких задач? Или надо было создать с нуля компилятор, потом найти 100500 лямов на разработку аналога LLVM, а потом переписать компилятор на него?)) Совсем поехал уже?)

Неверно. Полная ахинея. Смысл в том, что никакой раст и никакие его адепты никогда llvm не напишут. Это аксиома. На ллвм не выделялись никакие 100500лямов - это всё было после.

Может и не напишут. А может, и напишут. Кто бы предположил, что кому-то придет в голову стряпать clang, например, когда есть gcc?

Virtuos86 ★★★★★ ()

Смысл в том, что никакой раст и никакие его адепты никогда llvm не напишут. Это аксиома. На ллвм не выделялись никакие 100500лямов - это всё было после.

Может и не напишут. А может, и напишут.

Аналог LLVM, каким он был до вливания миллионов Ябла, уже пишут: https://github.com/cretonne/cretonne

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

Столяров, конечно.

А-аа! Я наконец вгляделся, что за хордовое изображено на обложке.

Бьюсь в рыданиях.

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

Тоже долго ржал.

Что, щуку с крыльями никогда не видели что ли?

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

Не-а, но тут еще удачно в тему попала! (когда-то писал на C++ за деньги, если что)

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

тут еще удачно в тему попала! (когда-то писал на C++ за деньги, если что)

Про тему я совсем не понял. Или это намёк на лебедя, рака и щуку?

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

Типа того. Интересно, как будут восприниматься Си++, скажем, лет через 50

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

Интересно, как будут восприниматься Си++, скажем, лет через 50

Думаю, что через 50 лет их не будет (в лучшем случае останется название, которое будет обозначать что-то совсем непохожее). А на смену крестам для высокоуровневых приложений придёт что-то более безопасное (но, конечно же, не раст), а для низкоуровневых останется си, может появится новый си с классами, но не этот монстр, который на системный язык уже не тянет, а на статус безопасного высокоуровнего языка не может тянуть по определению, потому что создавался как надстройка над си.

В общем, губят его комитеты по стандартизации, превращая в новый мультикс. И для реанимации нужна новая Белл Лабс с Томпсоном и Ритчи, которые выкинут всё ненужное, забив на комитеты с их стандартами, и из неподъёмного мультикса сделают лёгкий юникс.

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

В общем, губят его комитеты по стандартизации, превращая в новый мультикс

Дай я догадаюсь - ты профессионально на Си++ не писал никогда или писал свсем мало?

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

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

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

Ну, а с Си и Си++ я знаком очень давно, еще с тех пор, когда названия этих языков в литературе писались именно так: Си и Си++. По-моему даже перевод K&R издавали под таким названием, но я точно уже не помню. Тогда английские названия были не в моде.

dave ★★★★★ ()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Дай я догадаюсь - ты профессионально на Си++ не писал никогда или писал свсем мало?

Писал и на си, и на крестах. То, что чуть ли не каждый год для крестов принимают новый стандарт с кучей ненужностей, считаю злом. На этом форуме мне однажды дали прекрасную ссылку, иллюстрирующую это: http://files.rsdn.org/58130/cpp.jpg.

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

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

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

азвания этих языков в литературе писались именно так: Си и Си++. По-моему даже перевод K&R издавали под таким названием

Именно так. А когда в школы привозили американские пи-си'шки, учителя с гордостью говорили: к нам завезли новые компьютеры модели «один вэ-эм эр-эс». :-)

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

Дай я догадаюсь - ты профессионально на Си++ не писал никогда или писал свсем мало?

Писал и на си, и на крестах.

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

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

Дай я догадаюсь - ты профессионально на Си++ не писал никогда или писал свсем мало?

Писал и на си, и на крестах.

Ясно. Профессионально писал на Си++ ты в лучшем случае мало (а скорее всего, вообще не писал),

Ты спросил, — я ответил. Доказывать что-то с пеной у рта мне нет резона. Думай, что хочешь.

других языков не знаешь,

Другие языки действительно не очень знаю. Ассемблер когда-то изучал для себя, ещё для 16-битного реального режима. Bash знаю. На яве когда-то давно немного писал. О php имею представление. Ну и ещё кое-что по чуть-чуть, но не с большой буквы.

и это хорошо согласуется с твоим мнением о Си++.

Я говорю не о Си++ как таковом, а о том, куда он идёт. Точнее, в никуда он идёт. Никогда ещё перегрузка языка ненужными опциями не заканчивалась для него хорошо. Язык должен быть простым. Сложным может быть программирование, но не язык. В качестве аналогии можно привести примеры с естественными языками: сама по себе сложность какого-то языка не является достоинством. Но даже на простом языке не всякий напишет гениальное произведение. Кстати, сам я на роль гения не претендую.

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

Дай я догадаюсь - ты профессионально на Си++ не писал никогда или писал свсем мало?

Писал и на си, и на крестах.

Ясно.

Ты спросил, — я ответил.

Вообще-то нет, ты не ответил.

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

Вообще-то нет, ты не ответил.

В каком смысле? Если речь идёт о моём резюме, то я его здесь выкладывать не собираюсь. Я не ищу сейчас работу и ценю свою относительную анонимность.

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

новый стандарт с кучей ненужностей, считаю злом

Ну и что? Ты всегда можешь игнорировать новые фичи и продолжать писать на С с классами.

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

Ты всегда можешь игнорировать новые фичи

Это было бы возможно, если бы я был единственным в мире программистом.

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

Другие языки действительно не очень знаю

И как с таким бэкграундам можно рассуждать о будущем языков программирования и компиляторостроения?

Кстати, rust для вас непонятен скорее всего как раз из-за отсутствия опыта работы с другими ЯП.

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

Вообще-то нет, ты не ответил.

В каком смысле?

Посмотри, о чем я спрашивал, и что ты ответил.

Если [...]

Если что, ты имеешь полное право не отвечать.

tailgunner ★★★★★ ()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Увлекательная у вас конфронтация, пошел за попкорном. Меж тем, его позиция не лишена оснований, с учетом того, что с C++ он, видимо, знаком довольно давно, и у таких людей неизбежно возникает синдром сроднения с используемым инструментом при отсутствии критического восприятия. У некоторых этот синдром приобретает известную нам болезненную форму. А ты к C++ пришел не в 20 лет, тебе проще к нему относиться объективно, без «синдрома утёнка».

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

его позиция не лишена оснований, с учетом того, что с C++ он, видимо, знаком довольно давно

Те, кто знакомы с Си++ давно, помнят, что Си++ стал «мультиксом» до того, как за него взялся комитет.

А ты к C++ пришел не в 20 лет

Как ты догадался? Но да, мне было 18.

tailgunner ★★★★★ ()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Опять же, принятая ли это практика в реальных проектах, использование интерфейсов в пику наследованию реализации?

Конекретно в плюсах многие программеры «от сохи» внезапно обнаружили что развесистое наследование реализаций с запутанными иерархиями на практике зачастую стало не нужно примерно с появлением шаблонов и stl. Ну и раньше (особенно на «макроуровне») вообще никто не мешал не пользоваться наследованием, если ты в курсах за композицию/агрегацию. Ее еще кое-кто рекомендовал «предпочитать наследованию» (компонентные модели про это, и таки реальные большие проекты строятся на «подсистемах», «модулях» и «компонентах», а не иерархиях наследников). Хотя это «предпочитать», конечно, не следует понимать «мехнически» — исторически много гуевых фреймворков построено вокруг иерархий, и наследование там «это норма».

В некоторых встроенных «тоже языках» особенно «похожих на джаву» (ТМ) ООП-привычки усвоенные теми же джавистами скорее вредны: система например имеет жесткие ограничения на количество вызовов, время использования проца и объем памяти на транзакцию, а они городят иерархии или пытаются «абстрагироваться от слоя обращений к базе» — хотя никакого другого языка запросов кроме встроенного пристегнуть в принципе нельзя. Ну и в эмбеде не у всех встретило понимание появление обычных библиотек, скрывающих заученную магию наложения масок (хотя это другая крайность — бенчмарков про «оверхед!» никто не представил), — но там вообще не до каких-то там «иерархий классов».

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

И как с таким бэкграундам можно рассуждать о будущем языков программирования и компиляторостроения?

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

Кстати, rust для вас непонятен скорее всего как раз из-за отсутствия опыта работы с другими ЯП.

Вот о расте я действительно практически не имею представления. На основании того, что я о нём слышал и тех примеров кода, которые видел, у меня возникло ощущение, что это очередная попытка скрестить ужа с ежом. Но, не зная мат. части, я не лезу в растосрачи. Единственно, могу улыбнуться над непоколебимой верой растоманов в то, что за их языком будущее. Сколько уже было этих языков будущего, и кто о них помнит? Изредка позволяю себе улыбнуться вслух, как в этой ветке, но не влезая в растосрачи. А изучать раст не вижу смысла, раз от меня этого не требуют, а сам я в него не верю. Однако на всякий случай слежу за новостями. Вот тут недавно тему про прошивку камеры на расте удалили. К сожалению, никаких исходников, как и бенчмарков не было. Были только слова, что есть какая-то прошивка на расте. Но и это уже что-то, потому что про прошивку на бейсике я даже слов не слышал. Так что поживём — увидим.

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

Посмотри, о чем я спрашивал, и что ты ответил.

Ты спросил, писал ли я профессионально на крестах. Я ответил, что да.

Те, кто знакомы с Си++ давно, помнят, что Си++ стал «мультиксом» до того, как за него взялся комитет.

И ничего хорошего в том, что он стал мультиксом, нет.

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

Я думаю, что рано или поздно появится какой-то человек или группа людей, а может небольшая фирма (но только небольшая, у большой по определению ничего не получится), которые отбросят всё лишнее легаси и оставят только нужное, может ещё кой-чего добавят, но хорошо перед этим подумав, а не абы как, и получится новый язык, на который постепенно все перейдут. Такие попытки уже предпринимались и предпринимаются (взять всё тот же rust). Ява в своё время была очень хорошо продумана, но, к сожалению, нацелена она была на максимальную безопасность и полную совместимость с любым железом за счёт всего остального. Если бы была поставлена задача создать действительно эффективную среду разработки, пусть и не 100% переносимую и безопасную, то с тем подходом, с которым архитекторы Sun подошли к проектированию этого языка, она уже давно могла бы вытеснить кресты.

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

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

Пока ничего лучше на замену C++ нет. А то, что плюсы ходячий труп, никаких сомнений. Вынесут их вместе с поколением матерых хакеров из 80-х уже в ближайшее десятилетие. Молодежь уже давно с этим ужасом связываться не желает.

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

Ты спросил, писал ли я профессионально на крестах. Я ответил, что да.

Ты ответил, что писал, писал ли профессионально - не сказал. А о том, что писал долго - не сказал и сейчас.

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

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

Никаких синдромов и никакого отсутствия критического восприятия нет. Например, я считаю Паскаль прекрасным языком, позволяющим писать относительно безопасные и эффективные программы, который был незаслуженно оттеснён на 2-й и даже 3-й план. При том, что сам на паскале никогда не писал.

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

Конекретно в плюсах многие программеры «от сохи» внезапно обнаружили что развесистое наследование реализаций с запутанными иерархиями на практике зачастую стало не нужно примерно с появлением шаблонов и stl.

Которые на практике порой запутаннее самых запутанных иерархий. Но при этом эффективнее, да.

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

Пока ничего лучше на замену C++ нет.

Что такое «пока»? Какие наши годы! :-)

Впрочем, как я сказал выше

поживём — увидим.

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

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

Никаких синдромов и никакого отсутствия критического восприятия нет. Например, я считаю Паскаль прекрасным языком, позволяющим писать относительно безопасные и эффективные программы, который был незаслуженно оттеснён на 2-й и даже 3-й план. При том, что сам на паскале никогда не писал.

Это потому что Паскаль современник C, поэтому у тебя и воспоминания о нем, как о тепло-ламповом. А вот Раст молодежь-хипсторы придумали, ну как им доверять?

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

о том, что писал долго - не сказал и сейчас.

По возможности предпочитаю чистый си. Но без фанатизма.

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

Это потому что Паскаль современник C, поэтому у тебя и воспоминания о нем, как о тепло-ламповом.

Возможно.

А вот Раст молодежь-хипсторы придумали, ну как им доверять?

Что ж, может действительно стоит познакомиться с ним поближе (не прямо сейчас, конечно), чтоб составить более обоснованное мнение.

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

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

Если бы вы вникли в Раст,то понимали бы, что сравнивать его со всякими D, которые реализовали старые идеи в новой обёртке, некорректно, ибо Rust - во многом первопроходец, тут и мощная система типов, и, что важнее, memory safety, и многопоточность без гонок по данным гарантированная статически.

Раст может и не стать «языком будущего», но его новшества наверняка повлияют на будущее императивных языков.

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

Раст может и не стать «языком будущего», но его новшества наверняка повлияют на будущее императивных языков.

Уже - Си++, Свифт.

tailgunner ★★★★★ ()

А что-же все-таки означает данная конструкция:

A::B::C::D ...

Вложенные namespace или классы? Или какая-то новая интересная фича современного C++?
А то я тоже старпер, изучавший Borland C++ по Тому Свану и Подбельскому.

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

Которые на практике порой запутаннее самых запутанных иерархий. Но при этом эффективнее, да.

Если это практика «смари чо могу» в духе Александрески — безусловно. Если просто «ехать» и под 50 конфигураций кот пересобирать не надо со 100500 генереных лексером спецификаций шаблона дельта-кодирования поточного фильтра (чтоб в итоге один файлик templates.cpp собирался три часа в 2009-м на c2d с 4Gb)  — тупо «предпочитаешь агрегацию» и все будет обозримо и понятно :) А то некоторые от шаблонов стл наследуются по привычке, а потом изумляются последствиям.

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