Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Язык C++ разрабатывался для людей, занимающихся программированием всерьез, то есть, для профессионалов своего дела.
C++ по своей сути не предназначен для решения задач средней сложности, с нестрогими требованиями к производительности и надежности программы, равно как он не предназначен для использования не очень опытными программистами со средненькими навыками разработки.
(ну и игрушки всё-таки пока ещё, да)
Вы считаете что аллокация (реализация new) не обязана знать, как реализуется освобождение?
Сборщик мусора может не только удалить объект, но и переместить его в более подходящее место. При этом он должен скорректировать все ссылки на этот объект.
Накладные расходы счетчика ссылок не надо недооценивать. Инкремент-декримент надо делать при каждом присваивании, в том числе при передачи ссылки в качестве параметра. Кроме того, при изменении счетчика велика вероятность промаха в кеше или странице виртуальной памяти.
delete из одного алгоритма будет некорректно работать с объектом, полученным new другого алгоритма.
Go никак не может быть убийцей C++.Почему нет? Практически всё понятно: Go привлекает скорее любителей python'а и ruby, чем любителей C++, но теоретически — он мог бы быть «убийцей C++».
Еще в Rust радует, что бэкенд по умолчанию — LLVM.И, собственно, уже поэтому он не может быть «убийцей C++». Также как и Java не может быть «убийцей C++». Ибо одним из центральных свойств языков BCPL, C, теперь C++ — то, что это «ядерные языки». То есть даже не языки, на которых можно написать ядро OS (хотя это тоже показатель), а то, что «с них всё начинается»: компилятор C написан на C, компилятор C++ написан на C++, все (ну хорошо… почти все) библиотеки в системе так или иначе завязаны на библиотеки соотвествующих языков, etc.
а то, что «с них всё начинается»: компилятор C написан на C, компилятор C++ написан на C++И как компилировать компилятор Си, написанный на Си? Точно таким же образом можно реализовать и интерпретатор LLVM-кода.
Go привлекает скорее любителей python'а и ruby, чем любителей C++, но теоретически — он мог бы быть «убийцей C++».
И, собственно, уже поэтому он не может быть «убийцей C++». Также как и Java не может быть «убийцей C++». Ибо одним из центральных свойств языков BCPL, C, теперь C++ — то, что это «ядерные языки». То есть даже не языки, на которых можно написать ядро OS (хотя это тоже показатель), а то, что «с них всё начинается»: компилятор C написан на C, компилятор C++ написан на C++, все (ну хорошо… почти все) библиотеки в системе так или иначе завязаны на библиотеки соотвествующих языков, etc.
Rust на это вроде как не претендует, так какой из него, нафиг, «убийца C++»?
«с них всё начинается»: компилятор C написан на C, компилятор C++ написан на C++
Нижеследующие примеры являются рабочими при сборке с помощью компилятора Rust от 6 мая 2013. В то же время, с учётом того, что язык находится в стадии активной разработки, код может не работать в более поздних версиях.
Hello world:
extern mod std;
fn main() {
let args = os::args();
io::println(fmt!(«hello world from '%s'!», args[0]));
}
Пара примеров реализации функции поиска факториала, в рекурсивном и итеративном стилях:
/* The branches in this function exhibit Rust's optional implicit return values,
which can be utilized where a more «functional» style is preferred.
Unlike C++ and related languages, Rust's `if` construct is an expression
rather than a statement, and thus has a return value of its own. */
fn fac_recur(n: int) -> int {
if n <= 1 { 1 }
else { n * fac_recur(n-1) }
}
fn fac_iter(n: int) -> int {
// Variables must be declared with the `mut` keyword in order to be mutable.
let mut i = 1,
result = 1;
while i <= n {
result *= i;
i += 1;
}
return result; // An explicit return, in contrast to the above.
}
а в том, что синтаксис или имена методов стандартной библиотеки могли немного измениться
Авторы языка неформально обещают выпустить версию 1.0 в этом году, так что «готовить сани к лету» можно уже сейчас.
Memory safety no null or dangling pointers, no buffer overflows
Именно так, и нет никакого передёргивания, для продакшена и больших проектов это не применимо.
К тому же бессмысленно утверждать, что внутри всё реализовано как надо, и не содержит ошибок.
Эта модель прекрасна и удобна. вот только проблема в том, что железо, на котором работает машинный код, полученный из кода языка высокого уровня не поддерживает такую модель памяти, а это значит, что будут обязательные проверки на переполнение буфера в рантайме, избыточные инициализации и проверки указателей, и т.д, а посему рекомендовать такой язык для системного программирования просто не применим.
Посмотрите, что используют для системного программирования — там чаще всего голый С, а то и вообще С--, а местами вообще asm, и это не просто так.
к примеру безопасную генерацию кода, умные указатели, позволяющие получить полностью контролируемую, и при этом безопасную модель работы с памятью, и т.д.
Эта книга посвящена скорее истории развития C++, соображениям, которыми руководствовался Страуструп при реализации тех или иных характерных черт этого языка в целом
Профессионально программирую на С++ 15 лет, не профессионально — считай 20 лет. Язык мне нравится, всё устраивает.
Но вот что (IMHO) по настоящему интересно — это иметь программы, которые конвертируют один язык в другой. Знаешь ты например только С++, а тебе надо сделать что-то на C#: используешь преобразователь «С++ — C#».

И на самом деле быстроту и производительность даёт (или не даёт) по бОльшей части именно этот преобразователь из вашего любимого языка в машинный.Компиллятор тоже в некоторой степени ограничен
Реально, я не против плюсов, просто не видел случаев, где он нужен, и где нельзя обойтись другими средствами вместо. Если что, приведите пример задачи.
Amusingly, the history of the evolution of C++ over time can be described as a history of trying to plug the leaks in the string abstraction. Why they couldn't just add a native string class to the language itself eludes me at the moment /Joe Spolski/
Интересно, что историю развития C++ можно описать как историю затыкания дырок в абстракции строк. Уж не знаю, отчего бы не добавить к языку элементарный класс строчек /Джо Спольски/
Интервью с Бьерном Страуструпом о языке C++