Top.Mail.Ru
Ответы

Стоит ли учить Rust как дополнение к C++ ?

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

Дополнен

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

По дате
По рейтингу
Аватар пользователя
Новичок
8мес

Если ты не готов к аду из документации несмотря на существование docs.rs, borrow check'еру, лайтаймами а так же к запрету компайл-тайма - нет. Rust довольно строгий язык и может помочь развить хорошие привычки в программировании, но обладает КРАЙНЕ кривой обучения. Ты будешь биться башкой о borrow checker, бороться с lifetime'ами и постоянно переписывать код, чтобы угодить компилятору. Это все хорошо...

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

Начнем с того, что Rust заставляет тебя думать о многих вещах, которые в C++ можно было бы отложить на потом (например, владение памятью). Это может затормозить тебя на начальных этапах. Там где лайфтаймы и высвобождение ресурсов в плюсах по большей части управляются компилятором и языком через идиомы вроде RAII (для гарантии освобождения ресурсов при выходе из области видимости объекта, и в Rust оно тоже есть, но более строгое), в Rust от тебя это требуется делать вручную, хоть и компилятор даст тебе подсрачник за отсутствие, к примеру, указания параметра жизни (impl<'a>... struct<'a> и т.д). Да, это хорошо: но и тут снова есть и обратная сторона медали.

Rust - язык, как я уже сказал, довольно строгий. Тебе нужно хорошо понимать как работает память, как данные передаются между функциями. Если в плюсиках можно иногда "схалтурить" и понадеяться на удачу, то Rust тебя за это накажет. Компилятор будет ругаться, пока ты не сделаешь всё "по феншую". Для новичка это может стать настоящей пыткой. Представь, ты только начал писать код, а Rust тебе говорит: "ERROR YOU DUMMY: moved value here, borrowed value after move". И ты такой: "да куда где что почему". В итоге, вместо того, чтобы решать задачу, ты полдня разбираешься с ошибками компиляции.

Здесь нет огромного количества техник с плюсов. К примеру, ты не можешь выполнять ту же самую шаблонную параметризацию в компайл-тайме (подстановка типов). Дженерики, что тут представлены как шаблоны, исполняются в рантайме и их реализация идет через мономорфизацию (генерация кода для каждого типа). Думаю стоит даже уточнить:

12345678
 fn identity<T>(x: T) -> T { 
    x 
} 
 
fn main() { 
    let x: i32 = identity(5);  
    let y: &str = identity("hello");  
} 

Что происходит при мономорфизации:

Компилятор Rust видит, что функция identity вызывается с двумя разными типами: i32 и &str. Вместо того, чтобы использовать одну общую функцию для всех типов, он генерирует две отдельные версии функции identity:

123456789
 // сгенерированная версия для i32 
fn identity_i32(x: i32) -> i32 { 
    x 
} 
 
// сгенерированная версия для &str 
fn identity_str(x: &str) -> &str { 
    x 
} 

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

Еще может быть путаница из-за отсутствия concept (C++20) или SFINAE. Параметры типов в трейте можно ограничивать через баунды (trait bounds). Дополню в комментах.

Аватар пользователя
Мастер
8мес

Ну знаешь если бессмертный без вопросов, но если нет цели и задачи, то кресты будут гибче раста.

Аватар пользователя
Просветленный
8мес

Лучше The Forest учить