пʼятницю, 23 березня 2018 р.

Книги по C++ -- список літератури

Завдяки Українському Католицькому Університету маю можливість розповідати про сучасний С++ дуже хорошим слухачам -- нашим студентам, представникам компаній тощо. Написаний раніше, в 2013-му, якраз для таких розповідей, список літератури: "Книги по C++ -- деякі конкретні рекомендації", встиг помітно застаріти. З того часу відбулося багато змін в С++ та відповідній екосистемі: вийшло ще два стандарти С++14 і С++17, а С++11/С++14 нарешті ввійшов у (широку) практику. Та й мої погляди на вибір літератури з того часу теж трохи змінилися. Тому вирішив написати новий.
Суміжний текст, "Загальні міркування", (крім природного врахування нових стандартів), залишається актуальним.
В принципі, всі згадані книжки можна знайти  в Інтернеті. Але посилань не наводитиму. Якщо дуже критично -- пишіть.

Українських перекладів жодної із них не існує, або я не зміг знайти... На російськомовні варіанти книг часто даю посилання із магазину "Гіада" у Львові. Я з ними ніяк не афілійований (ну, крім того, що іноді книжки там купляю), але цей магазин мені подобається, крім того, єдиний у своєму класі у Львові -- не хотілося б, щоб його спіткала доля аналогічного у 5-му корпусі Політехнічного.

Англомовні -- або на авторську сторінку, або на Амазон чи іншого видавця.
Мушу зізнатися, не всі із цих джерел -- книг, посилань, я прочитав акуратно, від початку до кінці. Тому могли затесатися неоднозначні, які мені цю неоднозначність не встигли показати. Про можливість такого наголошуватиму в описі джерела. Також, є ряд джерел, про які мені точно відомо -- у них є виражені негативні елементи, однак є і щось варте уваги -- про це теж писатиме.

Карта С++17 від Алена С++. Клікабельно!

Підручники


На жаль, поганих підручників по С++ -- значно більше, ніж хороших. Але хороших -- теж досить. Розглянемо деякі із них.
Якось ця частина попереднього тексту особливо вразливою до критики була. Завжди є проблема вибору, якою частиною строгості викладу ми готові жертвувати заради полегшення сприйняття непідготовленим читачем. Тому що коректний та акуратний приклад буде занадто складним -- початківець втоне в подробицях, а спрощений даватиме неприємний ефект: людина забула щось, людина дивиться в улюблений підручник, людина відтворює неприйнятні в більшому проекті практики. Fail.

Bjarne Stroustrup, "Programming -- Principles and Practice Using C++", 2nd edition


Найчастіше рекомендують підручник від автора С++:  "Programming -- Principles and Practice Using C++". Друге видання охоплює С++11 та краєчком зачіпає С++14. Увага! Не плутайте із іншою його відомою книгою,  "The C++ Programming Language", яка є швидше анотованим довідником -- про неї ми поговоримо нижче.

Вона досить велика, детальна та доступна -- навіть початківцям, якщо вони будуть уважними. Ну, для тих хто із стилем Страуструпа здатні співіснувати. З іншого боку, якщо ви з ним не співіснуєте -- не факт, чи й із С++ вдаться подружитися. :-) 

Крім чистого С++, зачіпає GUI на базі (доволі симпатичного, хоч і мінімалістичного та з дивною історією) FLTK Toolkit.



Stanley Lippman, Josée Lajoie and Barbara Moo, "C++ Primer", 5th Edition

Якщо із Страуструпом стосунки таки не складаються, популярною альтернативою є "C++ Primer" (Stanley Lippman, Josée Lajoie and Barbara Moo). Вона трішки старіша (мова про 5-те видання), але С++11 охоплює.



Сам я її ретельно не читав, але С++-спільнота, в цілому, відгукується позитивно.

Існує російський переклад: Стенли Б. Липпман, Жози Лажойе, Барбара Э. Му "Язык программирования C++. Базовый курс" (5-те видання)

На жаль, порекомендувати ще якісь достатньо актуальні підручники для початківців тут мені важко. Див. хіба секцію онлайн-джерел...


Bjarne Stroustrup, "A Tour of C++"

"A Tour of C++", 2014, від Страуструпа. В принципі, це теж -- свого роду підручник. Тільки для тих, хто вже знає С++, і хочуть "навчитися" нового -- після 2011-го року, С++. Не для початківців, але особливо складною не є.

Фактично -- розширений варіант глав 2-5 із четвертого видання "The C++ Programming Language".

Існує російський переклад: "Язык программирования С++. Cтандарт C++11. Краткий курс"


Онлайн-джерела


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

Фундаментальні джерела

  • cppreference.com -- найбільш повний та детальний онлайн-довідник. Зручне форматування (не ідеальне, але таки зручніше ніж зустрічав у інших місцях), актуальна та чітко посортована по стандартах інформація, багато прикладів, нормальний пошук, (частковий) переклад відмінними від англійської мови. Абсолютний must have.
  • Не вичерпне, але хороше джерело адекватних відгуків на книги: ACCU
  • Офіційні FAQ С++: https://isocpp.org/wiki/faq. На жаль, вже якийсь час (десь так з 2014/15 року) не оновлюються. З іншого боку, сам сайт isocpp містить багато новин стосовно С++, чернетки стандартів тощо.
  • C++ Core Guidelines -- ініціатива від Страуструпа, Саттера та компанії, по створенню підходів до ефективного та безпечного використання С++. MSVC та clang-tidy потроху починають його підтримувати, а відповідну бібліотеку підтримки GSL -- можна використовувати і з GCC. (Збиває мене ця назва -- півтора десятки років для мене GSL це GNU Scientific Library...)
  • "Lessons on the development of 64-bit C/C++ applications" -- уроки портування С++ програм на x86-64 від розробників PVS Studio. Дуже хороше джерело, та й на інструмент їхній вартує звернути увагу! Існує російський варіант. Також, у них на сайті величезна кількість статей із розбором типових помилок у С++ програмах (знайдених їх аналізатором, але всі б так рекламу своїм продуктам робили :-) та "42 совета по С++ -- Главный вопрос программирования, рефакторинга и всего такого" -- нічого особливого, але прочитати можна.
  • Boost -- бібліотека "субстандартних" бібліотек С++. Код якісний (хоч часто і жахливо складний -- люблять шаблонну магію), документація -- доступна та проста, завжди знайдеться щось цікаве. З часом багато які із них потрапляють в стандарт.
  • Boost book --дуже хороший підручник по використанню boost.
  • Agner Fog -- людина, яка підтримує п'ятитомник по оптимізації під сучасні x86-сумісні процесори. Поміж тих томів є присвячені оптимізації на С++ та угодам про виклики. Книги зовсім низькорівневі, але сила С++ якраз в можливості одночасно мати переваги низькорівневого доступу до апаратного забезпечення та контролю над всіма процесами в коді, неможливого із більшості інших мов та можливість будувати як завгодно високорівневі абстракції.

Тематичні блоги

С++ переживає зараз період великого відродження (все ж, пауза між С++98 і С++11 дуже нагадувала стагнацію, в якійсь мірі й була нею). Тому з'явилося ряд нових активних авторів. Не намагаючись бути вичерпним, ось деякі із них:
(Посилання на сайти та блоги авторів книжок нижче даються у відповідних розділах).

Стиль коду

  • Google Code Guidelines -- я б сказав, найконсервативніші із адекватних рекомендації по використанню С++. Складається із списку рекомендацій, у кожній із яких описано про який інструмент чи засіб мова, які є аргументи за та проти його використання, висновок.
  • High Integrity C++ Coding Standard (HiCPP) -- навпаки, найбільш ліберальний із адекватних, дозволяє використовувати все, що є сенс використовувати, забороняючи погані та відверто ризиковані практики. Загальна структура така ж, як і в Google Code Guidelines, доступний безкоштовно, після реєстрації.
  • AUTOSAR Guidelines for the use of the C++14 language in critical and safety-related system -- аналогічно, ліберальний стандарт для вбудовуваних та інших критичних систем. Є розширенням MISRA C++:2008. Вільно доступний (однак, вимагає доступу до платного MISRA C++:2008).
  • MISRA C++:2008 -- ще один суворий стандарт на вбудовувані системи. Обмежує все, що можна обмежити, аж по заборону динамічної пам'яті. Використовувати із обережністю. :-) Купити можна тут. Див. також їхній стандарт на С.
  • Хоча це зовсім інша мова, думаю, Дзен Пітона варто теж почитати!

Онлайн-підручники

  • "C++ Annotations Version", Frank B. Brokken, (також https://github.com/fbb-git/cppannotations) -- онлайн-підручник С++ для тих, хто вже знає іншу С-подібну мову. Останні (на момент написання) версії зачіпають С++17. Ретельно я його не читав, але виглядає цікаво.
  • "The Rook's Guide to C++" (див. також тут) -- книга, доступна онлайн, написана викладачем і його студентами. Ретельно не вчитувався, зізнаюся. 
  • "Fundamentals of Programming" by Richard L. Halterman (див. також приклади тут) -- ще одна онлайн книга, теж виглядає цікавою, хоча ретельно не читав.
  • Сайт для вивчення С++: http://www.learncpp.com/. Не вивчав його (сайт ;-) ретельно, до певної межі цікавий, хоча дещо і насторожувало. 
На жаль, із відео-уроками я не дружу зовсім. Просто не здатен сприймати таку (абстрактну, зауважте!) інформацію не у вигляді  тексту, а в формі розповіді та через настільки повільний канал передачі, як слух. :-) Тому буду вдячний за рекомендації -- постараюся включити й адекватні відеоуроки.

Онлайн-компілятори

До чого дійшов прогрес... Тепер розробкою із використанням С++ можна займатися і онлайн! :-)

Ось список таких компіляторів, та його оновлюваний варіант.

Окремо згадаю лише один: https://godbolt.org/ -- тут  ви можете побачити асемблерне представлення вашої програми у виконанні багатьох різних компіляторів із довільними опціями. Дуже повчально, якщо хотіти таки розібратися, як воно все працює всередині -- що компілятор витворяє із вашим кодом.

Книги

За час існування С++ з'явилося багато хороших книг. З розвитком мови частина із них свою актуальність втрачають. Однак, хороша книга про С++, написана в якомусь там 1999, по С++98, все ще залишатиметься актуальною і зараз. Хіба що якась частина розглянутих у ній проблем зараз матиме більш прямолінійні, зручніші рішення, або сама проблема не існує в сучасному С++. Такі книжки я в цей список все рівно включаю -- якщо немає прямого "нащадка", більш сучасного видання.
Є ще окремий клас книг, які пишуть про конкретні напрямки -- чисельне програмування, програмування мікроконтролерів тощо, із використанням С++. Так як любимо ми їх за інше, використання в них такого собі стилю С++, що трапляється часто -- не привід їх не читати! Однак, для початківця в С++, вони все рівно можуть бути небезпечними -- можуть зіпсувати стиль, від початку навчивши поганим практикам, яких потім важко позбутися. При чому, позбутися поганої звички, про яку знаєш, ще відносно просто, але можна не знати, що щось давно звичне -- погана ідея.

Для прикладу, вільний, але близький до тексту переказ цитата з однієї книги по AVR8: "Програмуючи мікроконтролери я так звик використовувати глобальні змінні, що тепер постійно використовую їх і в програмах для PC". Як у відомому анекдоті, "Знайшла дурепа, чим хвалитися!"... Але про роботу із AVR у ній гарно написано.

Книжки зручніше перераховувати по авторах --- у кожного із них свій стиль, своя "спеціалізація", однак професіоналу в C++ слід ознайомитися із більшістю із цих книг! А краще із всіма.

Б'ярн Страуструп (Bjarne Stroustrup)

Творець С++. Без нього нічого б не було. ;-)

Сайт автора: http://www.stroustrup.com/. Зокрема, кілька цікавих інтерв'ю, статей, посилань, списків помилок в книгах (errata). Варто окремо відзначити FAQ: "Bjarne Stroustrup's FAQ", "Bjarne Stroustrup's C++ Style and Technique FAQ" (тут, зокрема, є відповіді на питання, чому немає конструкції finally чи єдиного спільного предка Object), і "C++11 - the new ISO C++ standard". Авторську вимову прізвища можна послухати тут.

"The C++ Programming Language", 4th Edition

Власне, "The C++ Programming Language", 4th Edition -- це опис того, що ж таке С++. Стандарт можна розглядати як ''юридичну кодифікацію'' описаного в ній. На жаль, вона все ще не перекладена українською чи російською. Купити можна на Амазоні. Кажуть, в книзі відносно багато опечаток.
Вчитися програмувати за її допомогою не те щоб не реально, але важко -- на роль першої книги із програмування, чи й -- з С++, вона, певне, не дуже підходить. Однак, для програміста на С++ -- необхідна настільна книга. На жаль, поки нічого не чув про плани автора надрукувати наступну редакцію, яка знає про (остаточний варіант) С++14/17.


"The Design and Evolution of C++", 1994, ("Дизайн и эволюция C++", 2000)

Ще одна цікава його книга:  


Розповідь про те, чому C++ є таким, яким він є, зокрема, пояснення деяких рішень, які нам можуть видаватися дивними. Нового видання поки не планується -- автор вважає, що потреби в ньому немає.


Ніколай Джоcаттіс (іноді вживають Джос'ютіс, Nicolai Josuttis)

Один із помітних С++-фахівців. Учасник "бібліотечного" підрозділу комітету стандартизації C++.

Сайт: http://www.josuttis.com/. На сайті, крім інформації про нього --- корисні статті, посилання, інформація про книги, приклади до них, виправлення помилок, тощо.

Щодо вимови прізвища -- див. тут, внизу.

"The C++ Standard Library - A Tutorial and Reference", 2nd Edition




Хоча Страуструп у своєму монструозному труді пише про стандартну бібліотеку, але дуже вже коротко. Що природно -- книга і так величезна. Тому тут потрібні додаткові джерела. Книга Джосаттіса -- якраз ідеальне таке джерело. Можна сказати -- довідник по стандартній бібліотеці. Однак, дуже розгорнутий довідник -- із поясненнями, прикладами, описом "кращих практик". Стандартна бібліотека розглянута майже повністю -- опущено лише деякі зовсім спеціалізовані чи мутні теми, але навіть про таку не популярну поміж авторів тему, як локалі, написано багато. Паралельному програмуванню присвячено може трохи менше уваги, ніж воно вартує, але, з іншого боку -- тут ще одну книгу довелося б  писати.

Існує переклад російською (в тому числі -- другого видання).

C++17 - The Complete Guide



Коли писав цей текст, виявив у нього ще одну книжку: "C++17 - The Complete Guide". Не можу поки про неї нічого сказати, але обов'язково подивлюся -- автор однозначно викликає довіру, та й на ISOCPP є позитивний відгук.


Scott Meyers  (Скот Мейєрс)

Ще одна видатна людина в світі С++. Написав багато важливих книг. На жаль, із ними є трішки плутанини, особливо з їх перекладами. Хто заплутався у їх виданнях та версіях, див. попередню версію цього тексту, там детальніше написано про його старіші книги. Тут зупинюся лише на, як на мене, актуальних.

На жаль, після виходу своєї останньої книжки, "Effective Modern C++", автор оголосив, що більше не писатиме про С++. Будемо сподіватися, передумає. :-)

Сайт автора: http://www.aristeia.com/.

Зокрема, там є посилання на errata до його книжок.


"Effective C++: 55 Specific Ways to Improve Your Programs and Designs" (3rd Edition, 2005)

"Эффективное использование C++. 55 рекомендаций по улучшению ваших программ и проектов"

 

В цій книзі слабо зачіпається тема шаблоні чи стандартної бібліотеки (друге видання взагалі оминало шаблони). Але керування пам'яттю "C++-way", робота із не-шаблонними об'єктами --- проектування, очікування, перевантаження операторів, ООП, і т.д. і т.п. розглянуто дуже детально. Так як вийшла в 2005, нічого не знає про новіші стандарти С++. Але для цього автор випустив нову книгу.

Існує російський переклад,  як мінімум -- другого видання.

Errata -- тут.

"Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++", 2014

"Эффективный и современный С++: 42 рекомендации по использованию" C++11 и C++14


Книга, по суті, є продовженням попередньої -- так само детально та просто розповідається про новий С++ -- а після 11 стандарту мова ця таки сильно змінилася. Зокрема, автор запропонував поняття ''універсальне посилання'', яке дозволяє спрости розмову про нетривіальну, але важливу тему -- переміщення та rvalue reference, розповідає про perfect forwarding та багато інших речей, яким С++98-прогармісту таки треба навчитися. Дуже рекомендую!
  
Існує російський переклад.

Errata -- тут.

"Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library", 2001

"Эффективное использование STL", 2003


В припущенні, що ви вже маєте уявлення, що таке STL, вмієте засипати жменю цілих чисел у вектор, а потім їх посортувати, ця книга допоможе вам навчитися використовувати STL повноцінно, в повну силу. Контейнери, ітератори, алгоритми, типові ідіоми, типові формулювання. Незамінна книга для освоєння STL.
Хоча, з появою С++11/14/17 використання STL стало помітно простішим (одні лямбда-функції чого варті!), однак вона аж ніяк не застаріла! Базові принципи -- майже ті ж (ну, хіба от чекаємо на Ranges :-), а проблеми, із якими зараз важче зіткнутися завдяки новим засобам мови, все ще можуть себе іноді проявляти.

Errata -- тут.

Крім того, варто відзначити ще декілька його робіт, можливо (вже зараз) не таких значущих. 

Presentation Materials: Effective C++ in an Embedded Environment

Матеріали лекцій про те, як ефективно програмувати мікроконтролери, використовуючи С++, маючи всі її переваги, але не отримуючи її мінусів. Купити електронну версію можна тут, за певних зусиль знаходиться в Інтернеті.
Принципи реалізації C++ (адже на мікроконтролерах багато яку Runtime-підтримку доведеться писати самому), правила того, що може бути в ROM, що ні, керування пам'яттю, зворотні виклики (callbacks), обробка переривань тощо. Все викладено загально, без прив'язки до конкретних контролерів. Цінний матеріал. Хоча, зараз, разом із відродженням та активізацією С++-спільноти, матеріалів по вбудовуваному С++ з'являється багато -- колись зроблю окрему підбірку.

"More Effective C++: 35 New Ways to Improve Your Programs and Designs", 1996

"Эффективное использование С++. 35 новых способов улучшить стиль программирования", 2006


Книжка вже достатньо давня, встигла трохи застаріти. Однак, все ще містить багато цікавого. Новачкам читати, певне, не варто -- деякі погляди з того часу змінилися. Але досвідчений програміст знайде для себе багато цікавого. Розповідає, зокрема, нюанси перевантаження операторів, включаючи таку нетривіальну тему, як перевантаження new i delete, міркування ефективності, і т.д. (А ось про виключення краще читати деінде). 


Herb Sutter (Герб Саттер)

Автор багатьох важливих статей та книг,  "повелитель" C++ в Microsoft. Його книги дещо складніші, ніж Мейєрса, розглядають більш високорівневі та серйозні проблеми. Автор серії задач по C++, Guru of the Week (GotW), на якій і базуються його книги

Сайт: http://www.gotw.ca/, зокрема задачі серії GotW, із розв'язками: http://www.gotw.ca/gotw/.

Він планував написати ще одну книжку, про сучасний С++11/14, викладав глави із неї в своєму блозі (зокрема, про ефективне використання auto і узагальнену ініціалізацію): http://herbsutter.com/category/c/gotw/. На жаль, (поки?), відмовився від цих планів, здається, щоб працювати над Cpp Core Guidelines і GSL.

Важлива його стаття: "The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software", на тему, що халяви більше немає -- процесори не стають потужніші, тепер їх просто стає більше, і тенденція не планує змінюватися, а значить, паралельне програмування -- must have для всіх.

"Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions"

"Решение сложных задач на С++"


Збірник парадоксальних, складних, але при тому, для більшості програмістів --- дуже знайомих задач. Деталі функціонування елементів C++, включаючи стандартну бібліотеку, безпека щодо виключень, нюанси використання класів С++ та динамічної пам'яті, (на жаль, розумних вказівників С++11 тоді ще не було) та інші типові задачі та типові граблі, що можуть вам трапитися.

Існує російський переклад.

"More Exceptional C++: : 40 New Engineering Puzzles, Programming Problems, and Solutions"

"Новые сложные задачи на С++"


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

Існує російський переклад.


Herb Sutter, Andrei Alexandrescu, "C++ Coding Standards: 101 Rules, Guidelines, and Best Practices", 2004

Саттер Г., Александреску А., "Стандарты программирования на С++"



Ще одна дуже важлива його книга, цього разу -- в співавторстві. Вона багато простіша від попередніх двох, але її таки повинен прочитати кожен розробник, що використовує С++!
Як і обіцяно у назві, більше сотні рекомендацій по розробці програм на С++, із детальним поясненням, чому треба робити саме так і коли можна робити по іншому.
Існує російський переклад.


David Vandevoorde (Дэвид Вандевурд)

Один із ключових розробників EDG, компанії, що розробляє фронтенд компіляторів (зокрема -- С++, зокрема  Intel C++, Microsoft Visual C++ (IntelliSense), SGI MIPSpro, The Portland Group, Comeau C++ -- це EDG). Що таке С++, знає добре! Можливо -- занадто добре. :-)

"C++ Templates: The Complete Guide", 2nd edition by David Vandevoorde and Nicolai M. Josuttis

Дэвид Вандевурд, Николай М. Джосаттис, "Шаблоны C++: справочник разработчика" (перше видання, 2008)

От за що я дуже сердився на цього автора, що він не випускав пост-С++11 видання! І в 2017-му він (вони) нарешті порадував! (Див. також домашню сторінку автора).
Чудове введення у використання шаблонів! Від основ, "прямолінійного" використання, до шаблонного метапрограмування. Книга, безперечно, для професіоналів, хоча і простіша та зрозуміліша, ніж "Современное проектирование на С++" Александреску, про яку далі. Охоплює С++11/14/17. Виклад матеріалу детальний, точний. Правда, автори постійно наголошують, що насправді все багато складніше. Може для розробника компілятора це і так... Але, фактично, ніколи не стикався із ситуацією, в якій наведена у ній інформація не була б достатньо глибокою.

Містить відомості, необхідні кожному програмісту, що використовує шаблони.

Andrei Alexandrescu (Андрій Александреску)

Ну, про цього автора складно щось сказати, крім того, що він один із передових маніяків С++ -- таке з С++ мало хто собі дозволяє витворяти. На жаль, зараз переключився на мову D

Andrei Alexandrescu "Modern C++ Design: Generic Programming and Design Patterns Applied"

"Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны проектирования"

 

Книга, свого роду, для гуру. Хтось жартував, що якщо ви зрозуміли цю книгу -- пора в психушку здаватися. Хоча, перечитував її недавно -- нічого аж такого складного...  :-)
Насправді, все не так страшно, однак, вона справді вимагає високого рівня володіння шаблонами та відповідними техніками проектування, на замін даючи вам можливість творити неймовірні, майже магічні, трюки, за допомогою С++. На жаль, написана в епоху до С++11 -- зараз багато що із того робити простіше. Але С++ й розвивалася, в значній мірі, в напрямку спрощення виконання таких трюків.

За мотивами бібліотеки також було написано бібліотеку Loki (ех, влучна назва!), певне не актуальну вже зараз -див. нові стандарти та boost, але цікаву педагогічно.

Jacek Galowicz

Раніше я із цим автором не стикався, але він був одним із перших, хто написав про С++17. Ще один його цікавий проект -- printf як в Python, при чому header-only.


"C++17 STL Cookbook: Discover the latest enhancements to functional programming and lambda expressions"



Уважно я її поки ще не прочитав, але виглядає дуже перспективною. Ось Вам відгук від одного фахівця: "C++17 STL Cookbook Book Review", який її теж дуже високо оцінює.

Розглянуто ефективне використання STL із новими засобами С++11/14/17, нові частини стандартної бібліотеки, трохи -- паралелізм та filesystem library.

Marius Bancila

Ще один новий для мене автор.

"Modern C++ Programming Cookbook: Recipes to explore data structure, multithreading, and networking in C++17"

Як і попередню, повністю я її ще не прочитав, але враження теж позитивні. І вона одна із перших, що стосуються нового стандарту. Тому зразу -- сторонній відгук "Modern C++ Programming Cookbook Review".
Набір корисних порад і фокусів, як вирішувати типові задачі, не соромлячись сучасних (включаючи С++17) засобів.
 
Update 2020: "Modern C++ Programming Cookbook - Second Edition", з включенням С++20.


Anthony Williams

Один із авторів бібліотеки підтримки потоків у C++11, директор Just Software Solutions Ltd, компанії, що розробляє комерційну паралельну бібліотеку Just::Thread, яка розширяє та доповнює стандартну бібліотеку. Зокрема, див. один із його недавніх виступів: "Concurrency, Parallelism and Coroutines - Anthony Williams [ACCU 2017]".

"C++ Concurrency in Action: Practical Multithreading"

Книга про підтримку паралельного програмування та багатопоточності в С++. Від автора цієї підтримки. Крім (відносно) простих речей, таких як потоки, м'ютекси, розглядаються питання узгодженості пам'яті (memory consistency), атомарних змінних та lock-free структур даних. Виклад дещо нерівномірний -- розглянуто як зовсім прості питання (місцями -- поверхнево), так складні та спеціалізовані -- скажімо так, дискусійно. На жаль, і книга і сама стандартна бібліотека С++ не дуже поспішають надавати готові блоки та абстракції для розробника, пропонуючи навзамін конструктор для їх створення. (Так, я вірю, що простий Thread pool можна написати в декілька десятків рядків, не розумію -- чому я це повинен кожного разу робити сам...). Однак, в цілому, книга однозначно вартує не просто уваги, а акуратного вивчення!

Див. також ще один відгук на неї. (Приєднуюся -- хоча і сам грішу дивними аналогіями, у автора вони якісь особливо "weird, and often unhelpful"...)
Вже існує друге видання, яке включає в розгляд С++17.


Інше  

 

З "ворожого" табору -- Java

С++ мені подобається значно більше, ніж Java. (Хоча я, звичайно, знаю, що Java -- потужний і важливий інструмент! Але, програмуючи нею, постійно маю відчуття, що розмовляю мовою нянь...) Однак, з точки зору просто взяти і використовувати, "з коробки", стандартна бібліотека Java ширша і зручніша, ніж в С++. Не те щоб в С++ це було проблемою -- Qt, boost, чи ряд інших бібліотек, в залежності від задачі, все вирішують. Однак, хотілося б мати під руками все і зразу! :-)

Отож, YMMV, але кращим поки оглядом проблем паралельного програмування із тих, що мені траплялися, виявилася наступна книга:

"Java Concurrency in Practice",  Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, Doug Lea


У ній послідовно та систематично розглядаються проблеми паралельного програмування, інструменти для їх вирішення. Викладено і відповідну теоретичну базу. При чому, розповідається не тільки про те, як користуватися примітивами мови, але й як проектувати програму, боротися із deadlock i livelock тощо. Також, більшість пунктів ілюстровано конкретними засобами із стандартної бібліотеки.

Правда, слід постійно тримати в голові, що програми Java виконуються завжди на одному і тому ж комп'ютері -- віртуальній машині Java, JVM. Тому, часто, там де книга про паралельне програмування в С++ чи іншій "нативній" мові, розповідатиме -- краще, чи гірше, про зоопарк варіантів поведінки платформи (залізо + операційна система + runtime компілятора), дана книга розповідає один варіант, правдивий для її середовища, впускаючи багато нюансів, з якими ви можете зіткнутися на практиці.

Як би там не було, дуже рекомендую! На офіційному сайті є також Errata.

Одним рядком

Є ряд книг, які б хотілося згадати, але детально про них розповідати із тих чи інших причин (наприклад -- високої спеціалізованості чи вразливості до критики) не хочеться:

Стандарт

Іноді, на жаль, доводиться заглядати і в стандарти. Зрозуміло, читати їх без потреби чи, не дай макаронний монстр, для задоволення, навряд чи варто. Але іноді доводиться.  Остаточні їх тексти доступні лише за гроші, однак останні робочі версії (які відрізняються від остаточних лише дрібними правками), доступні вільно:

Додаток

Важлива цитата із попереднього варіанту цього тексту:
Зокрема, вартує згадати такого автора, як Шилдт. Він явно має письменницький талант. Книжки його легко і приємно читаються, зрозумілі і все таке. Лише помилок і дурниць у них написано багато. Не беріть їх!

"Schildt's books have a reputation for being written in a clear style, at least at first glance.[9] Their technical accuracy has been challenged by reviewers, including ISO C committee members Peter Seebach[10] and Clive Feather,[11] C FAQ author Steve Summit,[12] and numerous C Vu reviewers from the ACCU.[13]"


Чужі списки 

Можуть містити всілякий треш поміж нормальних книг! Але, в цілому -- варті уваги.

До цієї теми я повернуся ще не раз, а на разі:

Дякую за увагу!

Немає коментарів:

Дописати коментар