Olej писал(а):
1. Иногда спрашивают: "С чего начать C++?".
Вот с этого и начните.
Я от себя добавлю вот такое замечание ... которое не решается опубликовать ни один ресурс по программированию C или C++:
1. Вся кухня с языками программирования начиналась с теории компиляции, компиляторов, компилирующих языков программирования: Algol, FORTRAN, COBOL, PASAL, Modula 2/3 и т.д.
Но на сегодня из более 2-х десятков языков программирования, используемых в
практических проектах, осталась фактически одна
линия развития компилирующих языков: C - C++ - Go.
Все остальные используемые современные ЯП в той или иной степени интерпретирующие (или интерпретирующие исходный код, или некоторый промежуточный байт-код): Java, Python, Ruby, ... и т.д. - "имя им - легион".
2. Поэтому для
глубокого понимания особо интересно
сравнивать реализации механизмов в языках этой линии развития: C - C++ - Go.
Учитывая годы появления каждого из них на арене: C - 1970г., C++ - 1985г., Go - 2009г.
Очень интересно проследить как трансформировались со временем понятия "что языку не хватает" и "что в нём лишнее".
Особенно учитывая, с C++ Страуструп начинал как прямую эволюцию C, а Go начинали разрабатывать (на уровне закладывания идеологии) те же люди, которые по молодости создавали язык C ... прям по А.Дюма: "40 лет спустя" или "как бы мы это сделали сегодня".
3. Адепты C++ сиьно отмахиваются от C. Но C++ это как-раз именно
надмножество языка C. Об этом пишет не раз и Страуструп, и говорит тот факт, что очень редкую программу (специально для того написанную) на C нельзя скомпилировать (вызовет ошибки) компилятором g++.
Кроме того, из кода C++ можно использовать
все библиотечные вызовы стандартной библиотеки C (POSIX).
Меня, кроме того, сильно удивляет, что многие профессиональные разработчики C++
не знают такой простой вещи:
- компилированная программа C++ при выполнении использует не только свою собственную разделяемую библиотеку (разные в зависимости от компиляторов GCC или Clang), но и
стандартную библиотеку C (libc.so) - программа компонуется с ней;
- весь интерфейс к системным вызовам Linux осуществляет именно libc.so - библиотеки C++ ничего не знают о системных вызовах ОС;
- при отсутствии стандартную библиотеки C (по доступным путям поиска) программа C++ просто не будет выполняться, будет завершаться аварийно.
4. Это я написал для того, чтобы
предположить, что те компоненты, которые C++ наследует из C (типы скалярных данных, операторы, указатели, структур), лучше
детально изучать именно по литературе по C. Вопрос - как? (его часто задают и обсуждают ... "можно ли изучать C++ не зная C?").
Наверное, лучший способ:
быстро пробежать наследуемые из C возможности, и переходить к специфике C++ (классы, наследование, виртуализация, полиморфизм, темплейты, ...).
А потом
позже вернуться к описаниям C, чтобы детально уточниться с его наследием.
5. И
очень интересно хотя бы пробежать описания языка Go ... даже если не собираться его использовать.
Посмотреть как другими способами покрываются
громоздкие и небезопасные возможности C++ в новой пересмотренной идеологии:
- множественные присвоения и возвраты из функций;
- полный отказ от асинхронной обработки исключений и событий (catch, try, ... etc.);
- и мн. другое.