Позиция C++ среди популярных ЯП и его изучение
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.07.24 12:48
Оценка: 26 (8)
Тут периодически поминают А.В. Столярова, известного своими ортодоксальными взглядами, ненавистью к Комитету и т.п. Почитав дискуссии с его участием, однозначно вижу, что во многом он перегибает палку, но многое становится понятным, если учесть, что он преподаватель, и много лет проработал на кафедре ВМК МГУ — одном из немногих мест в России, где еще более-менее умеют адекватно учить программированию.

У меня в архиве давно валялась его книга "Введение в язык C++", но я даже не пытался ее читать, поскольку основная масса таких книг, написанных за последние двадцать лет, выглядит довольно уныло. А вчера, чисто интереса ради, открыл, и прямо с введения затащился от того, насколько хорошо дядька понимает суть программирования, как профессии (собственно, у него во всех книгах акцент на профессии, как таковой, а не на конкретных языках/системах). Он пишет о многом из того, что я тут регулярно поминаю уже много лет — а ведь мы с ним, судя по всему, вообще никак не общались, даже косвенно.

Он совершенно прав в том, что C/C++ — уникальные языки, по меньшей мере среди известных:

Автору этих строк представляется очевидным, что язык Си (чистый Си) смог стать тем, чем он стал, и занять его нынешнюю нишу благодаря двум своим очевидным свойствам: во-первых, жесткой и очевидной границе между самим языком и его библиотекой, сколь бы "стандартной" она ни была, и, во-вторых, достижимости "zero runtime", т.е. возможности использования созданных компилятором объектных модулей без поддержки со стороны поставляемых с компилятором библиотек. В отсутствие любого из этих свойств язык программирования оказывается неприменим для программирования на "голом железе" (т.е. для ядер операционных систем и для прошивок микроконтроллеров) и, как следствие, не может претендовать на универсальность. Тем удивительнее, сколь упорно создатели "стандартов" пытаются изничтожить оба этих свойства, причем как в Си++, так и в чистом Си".

Подавляющее большинство «современных программистов» реально не видят принципиальной разницы между Си++ и, к примеру, тем же Питоном или Джавой, a все «новые технологии» (включая и новые «стандарты») предпочитают встречать с каким-то нездоровым восторгом, полностью отключив свои способности к критическому мышлению.


Большинство нынешних программистов не мыслит использования Си++ в отрыве от стандартной библиотеки шаблонов (STL)


исходно Си++ представлял собой интереснейшее явление в мире программирования — единственный в своём роде язык произвольного уровня, то есть такой, который позволял заниматься как низкоуровневым (почти ассемблерным), так и сколь угодно высокоуровневым программированием, причём все нужные здесь и сейчас абстракции высокого уровня можно было тут же и создать, не полагаясь на «доброго дядю». Логику построения языка (в той его версии) нельзя было назвать совсем безупречной, но она хотя бы существовала, и, более того, на все её недочёты можно было не обращать внимания как нечто не слишком важное. В «современном» Си++ всего этого уже давно не видно под горой семантического хлама. Следует подчеркнуть, что изначальный Си++ никуда не делся, его возможности по-прежнему используются (хоть в реализации той же пресловутой стандартной библиотеки) — но уловить существовавшую когда-то концептуальную структуру практически невозможно, слишком много чужеродных возможностей этому мешает.


Основной признак уникальности C и "традиционного C++" в том, что на них можно примерно с одинаковой степенью комфорта написать практически весь софт "общего плана", начиная с прошивок самых мелких устройств, ядра и его драйверов, и заканчивая сложными системами с гуем, обработкой текстов/изображений/звука, многопоточностью, распределенными вычислениями и прочим. При этом, если писать на C, то с ростом сложности и объема трудоемкость растет экспоненциально, а C++ позволяет достаточно долго удерживать ее почти линейной. И все это без проблем может совмещать один человек — многие параллельно делают на C/C++ и прошивки к самым мелким МК, и весьма навороченный софт для "большого" компьютера, к которому этот МК подключается.

Поначалу, переход от C к C++ вообще никак не затронул нижней границы применимости, но очень серьезно поднял верхнюю границу. Но с течением времени Комитет упорно двигает C++ к такому состоянию, в котором нижняя граница поднимается качественно (систем, в которых можно реализовать хотя бы такое подмножество, без которого большинство программистов попросту неспособно пользоваться языком, все меньше и меньше), а верхняя — лишь количественно (что-то писать становится чуть короче, что-то — чуть безопаснее, но принципиально ничто не меняется). При этом и буква, и дух стандартов и литературы по C++ неуклонно движутся от "зависит от реализации, применять с осторожностью, учитывая особенности" к "запрещено, недопустимо, может повлечь катастрофические последствия".

Тем, кто знаком с электроникой, это напоминает идею "давайте забудем про транзисторы и принципы их работы, и все активные узлы будем делать в виде функциональных микросхем, внутреннее устройство которых непринципиально". Тем, кто разбирается в автомеханике — "водителю не нужно знать устройства трансмиссии и подвески, его дело — крутить руль и нажимать педали газа/тормоза".

Судя по всему, это происходит потому, что и в Комитете, и среди "активистов развития" все меньше и меньше людей, не только лично способных работать "снизу доверху", но и просто достаточно хорошо знакомых с работой вычислительной системы на всех уровнях. И само по себе это не плохо, если б речь шла об эволюции какого-нибудь нишевого языка, вроде Fortran или LISP. Но беда-то в том, что изначальная универсальность и широта применения C++ привела к тому, что он давно и прочно стал эталоном программирования, как профессии. Если когда-то "всемогущим" программистом считали только того, кто умеет в ассемблер, то сейчас им считают того, кто умеет в C++. Но умеющий в ассемблер, как правило, достаточно хорошо понимает, каким образом к нему сводятся все остальные языки. Когда-то и средний программист на C++, даже не зная ассемблера, неплохо понимал "кухню" вычислительной системы, и хотя бы примерно представлял, как в итоге будет организовано "на железе" выполнение программы, обработка данных, взаимодействие и т.п. А средний современный программист на C++ понимает все это не лучше, чем средний программист на той же Java. Он считает, что программирование — это просто запись алгоритма конструкциями языка, а достойный результат — это просто программа, которая работает в соответствии с ТЗ и не слишком выделяется на общем фоне по требованию к ресурсам.

Следствием такого подхода становится то, что C++ уверенно дрейфует с позиции уникального и универсального языка к позиции "просто еще одного ЯВУ". И если его приверженцы долгое время согласны были терпеть многие недостатки языка лишь ради этих самых уникальности/универсальности, то с каждой новой версией стандарта становилось понятно, что ряд этих недостатков, скорее всего, не будет устранен никогда — то, что с ними связано, удобнее объявить устаревшим, а взаимен предложить очередную идею, философия которой вроде бы изящна, а техническая реализация — уродлива. Это чем-то напоминает пожилую черную актрису в роли Белоснежки: с одной стороны — "сняты дискриминационные ограничение по возрасту и цвету кожи", а с другой — есть ощущение чего-то фундаментально неправильного.

Поскольку C++, как уже говорилось, намертво завязан и на понимание "программирования вообще", как профессии и отрасли целиком, и на обучение программированию, то еще не так давно, пока среди приверженцев C++ было много "специалистов широкого профиля", на одном C++ реально можно было обучить универсального специалиста, способного работать на любом уровне иерархии, где хоть как-то применимы алгоритмические языки. Это не к тому, чтоб один человек тащил всю разработку, а к тому, что хорошее знание единственного ЯП позволяет понимать, как работает все остальное — от микрокода до самого навороченного софта. Наличие в коллективе разношерстных программистов хотя бы одного такого специалиста практически гарантирует, что он в состоянии понять суть проблемы любого из них просто по общему описанию, даже без знания подробностей конкретного ЯП. Если такого специалиста нет, заменить его может только программист, одинаково хорошо владеющий и ЯВУ, и каким-нибудь ассемблером или C, а такие люди уже давно стали большой редкостью.

У того, кто понимает C++ не только со стороны идеологии/стандарта, но и со стороны реализации, крайне редко возникает ощущение, что на нем "невозможно" или "очень трудно" реализовать какую-либо задачу. У того, кто столь же хорошо понимает любой другой язык, такое ощущение возникает гораздо чаще. Программист, хорошо владеющий C++, четко понимает, что он в состоянии реализовать на нем любую парадигму, переписать на него программу с любого другого ЯВУ, пусть и не слишком легко и очевидно. Программист, сколь угодно хорошо владеющий другими языками, такой возможности не имеет — там границы применимости очерчены достаточно четко.

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

Это всё я не к тому, что всем нужно ограничиться только C++ или только английским. Но английский, став по факту "языком мировой науки и техники", ничуть не потерял в своем качестве. Специфические понятия из других языков, вроде zen, nirvana, ordnung или vodka, лишь расширяют его, никак не затрагивая основ — все сколько-нибудь базовые понятия по-прежнему легко и компактно выражаются на английском, не требуя привлечения другого языка лишь для того, чтобы описать понятие или явление. А включение в C++ идей и парадигм из других языков привело к тому, что "настоящим C++" стал считаться этот самый "современный диалект".

Чем-то это мне напоминает современную постмодернистскую культуру, в которой центральную роль играет отсылка к уже известному ("все важное уже создано до нас") и искусство тонкого намека. Умение формулировать мысль своими словами ценится все меньше и меньше, на первое место выходит умение вставить подходящую цитату, крылатое выражение, картинку/комикс, фрагмент из фильма. Это все, безусловно, очень ценно, но лишь в сочетании с умением создавать свое из простых элементов.

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