Найти в Дзене

Король на стероидах. История и проблемы сложнейшего языка программирования

Оглавление
Иллюстрация сгенерирована в ChatGPT
Иллюстрация сгенерирована в ChatGPT

Введение

Всем привет! Я очень рад вашим комментариям под прошлым видео о языках Zig и Rust, вы попали прямо в точку: C++ действительно не хочет никуда уходить, и на нем все так же продолжают разрабатывать программы любой сложности. Хорошо ли это? Честно говоря, я думаю, что нет. В этом факте скрыто сразу множество проблем мира IT.

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

Предшественник

Язык C (читается как "Си"), предок C++, создавался как язык для программистов. Вам это может показаться странным: разве не все языки являлись таковыми? Но дело было в далеком 1972 году, программистов тогда не выделяли в отдельную специальность, наоборот, считалось, что программированием должны заниматься математики.

Хорошим примером являлся язык Fortran (сокращенно от Formula translator - "формальный транслятор") 1957 года, созданный для более удобной работы с математическими вычислениями. Проблем в том, что он не очень хорошо подходил для более общих задач программистов.

Кен Томпсон во время создания Unix
Кен Томпсон во время создания Unix

Приступили к работе Деннис Ритчи и Кен Томпсон. Важный момент: новый язык создавался для новой же операционной системы - Unix. Позже она стала настоящей революцией и стандартом де-факто для многозадачных операционных систем.

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

Именно таким и стал язык C. Ручная работа с памятью, немногословный синтаксис и очень высокая скорость. Цена за эту скорость и малый объем программ в очень простой возможности, как говорят программисты, "выстрелить себе в ногу", то есть просто человеческий фактор и возможность допустить ошибку, ведь, язык никак не сможет проверить наличие утечек памяти или обращение к несуществующим данным.

Становление короля

Уже в 1979 году Бьерн Страуструп попытался улучшить C, добавив в него больше возможностей, но сохранив возможность писать быстрые и потребляющие мало памяти программы. Задача крайне амбициозная! Первые версии языка формально назывались "C с классами" (C with classes), потому что в языке C не было современных средств объектно ориентированного программирования (ООП), которые включают в себя, да, те самые классы для описания больших объектов, а также их наследование, чтобы не писать много повторяющегося кода, и много чего еще!

Бьерн Страуструп
Бьерн Страуструп

Официально же язык появился в 1985 году. Синтаксис нового языка оказался совместим с C почти полностью. Даже примера кода из C в большинстве случаев будут давать аналогичный результат в С++! Звучит здорово, ведь это должно привлечь старых разработчиков, ведь так? Не совсем. Сложность языка заметно возросла, по-сути, перейдя за ту самую грань промежуточного языка между "машинным" и "человеческим". Многие адепты "чистого" C до сих пор идеологически критикуют идеи языка C++ и его сложность.

Однако, это было только начало. C++ стремительно обрастал новыми возможностями, которые и не снились создателям C.

Полный контроль

Концепция ручного управления памятью из C была расширена новыми возможностями, а некоторые функции теперь можно пометить как встраиваемые, чтобы компилятор не тратил время на их вызов, а просто подставлял их содержимое в месте вызова.

Чтобы достичь максимальной скорости выполнения программы, разработчик волен переложить часть вычислений на компилятор (проще говоря, это та самая программа, которая собирает исходный код в исполняемый файл), и таких возможностей в C++ уйма! Ценой стало долгое время этой самой компиляции, за что C++ тоже часто критикуют, хотя, как по мне это не критично. Сама же возможность проводить вычисления еще ДО запуска программы поражает воображение!

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

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

Заключение

Чтобы понимать, на каком фоне возникали языки, лишенные тяжелого бэкграунда C и C++, нужно учесть, что это не просто языки с большой историей, но и языки, в которых очень легко сделать ошибку. Концепции ручного управления памятью с тех времен перетерпели эволюцию: теперь это не бесконтрольное выделение памяти под данные по прихоти программиста или обращение по произвольному адресу в памяти, нет, сейчас активно предлагаются новые концепции, вроде того же владения и заимствования из Rust.

Но в нашем мире важны интересы бизнеса, поэтому поддерживать старый код всегда будет привлекательнее, чем переписать его на чем-то более безопасном. Справедливости ради, разработчики C++ тоже пытаются сделать язык безопаснее, но и они скованы суровыми требования бизнеса и не могут "выкинуть" старый код, чтобы обеспечивать совместимость, поэтому язык разрастается еще больше.