• Хайп вокруг ЯП Rust и C?

    vabka
    @vabka
    Токсичный шарпист
    По порядку:
    Насколько критичной проблемой для программиста является ручное управление памятью, которое называют недостатком языка Си?

    С неправильным управлением памятью связано очень много ошибок. Например в хроме вроде около половины CVE с этим связано. Ещё можно вспомнить HeartBleed в OpenSSL, который тоже связан с неправильным управлением памятью.

    (Дальше какое-то ужасно длинное предложение, которое я разбил на части)
    Новый язык программирования Раст, как заявляют, лишен этого недостатка

    Да
    разве общее число ошибок не перераспределяется на другие недостатки

    1. Самые сложные в исправлении ошибки - кривое управление памятью и многопоточность, обе их Rust Решает
    2. Нет, ошибки не перераспределяются, это же не тараканы.
    являются ли ошибки с памятью ошибками программиста

    Если управление памятью ручное, то это ошибки, которые допустил разработчик.
    Если управление памятью автоматическое (хоть через GC, хоть через Borrow checker), то это ошибка компилятора/рантайма/языка.

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

    Не обязательно.

    В целом вопрос очень абстрактный и является скорее поводом для дискуссий. Попробуйте дать более конкретный пример, где ошибка управления памятью превращается в какую-то другую ошибку.
    Ответ написан
    Комментировать
  • Как скачать Rust IDE JetBrains на ubuntu?

    vabka
    @vabka
    Токсичный шарпист
    Ставишь Jetbrains toolbox: https://www.jetbrains.com/toolbox-app/ - через него ставишь clion (платно, но зато есть дебаг) или intellij idea community (бесплатно, но без дебага)
    А потом плагин: https://intellij-rust.github.io/
    Ответ написан
    Комментировать
  • Какой выбрать язык для работы с 3D - Rust или C++?

    vabka
    @vabka
    Токсичный шарпист
    Про C++ не скажу, но у rust есть нюансы:
    1. Все эти приколы с borrow checker'ом, которые, я думаю, с 3д ещё чаще будут возникать из-за сложных структур данных.
    2. Может не хватить каких-то библиотек - могут оказаться только голые обёртки над си (а то и вообще придётся их генерить), что тоже не очень удобно.

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

    Для opengl, vulkan, directx, winapi уже есть удобные обёртки, и их можно найти на crates.io
    Ответ написан
    1 комментарий
  • Как вернуть значение из поля структуры в методе?

    vabka
    @vabka
    Токсичный шарпист
    попробуйте написать
    pub struct MimeType {
        extension: String,
        charset: String,
    }
    
    impl MimeType {
        pub fn new(extension: String, charset: String) -> MimeType {
            return MimeType { extension, charset };
        }
    
        pub fn extension(&self) -> &String {
            return &self.extension;
        }
    
        pub fn charset(&self) -> &String {
            return &self.charset;
        }
    }


    строкой владеет MimeType, так что нельзя просто так взять её - нужно либо брать ссылку, либо клонировать.
    Обратите ещё внимание на телеграм чаты сообщества - там гораздо проще и быстрее получить ответ на простой вопрос:
    https://t.me/rust_beginners_ru
    https://t.me/rustlang_ru
    Ответ написан
    2 комментария
  • Какое выбрать кресло для программиста?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Эргономичное посоветую. А в этой области за последние лет 10 ничего особенно не поменялось - Herman Miller Aeron.

    Дома уже лет 6 использую Duorest Alpha 80H. Не Аэрон конечно, но всё равно очень доволен.

    То, что у вас по ссылке - это не кресло для программиста, а просто кресло, причём уровня офисного ширпотреба.
    Ответ написан
    2 комментария
  • Как ограничить тип T примитивными типами f32 и f64?

    bingo347
    @bingo347
    Crazy on performance...
    Ограничить дженерик-тип можно только типажами (traits).
    Что Вы хотите сделать? Какие методы f32 и f64 Вам нужны?
    Возможно данные методы уже реализованы в типажах стандартной библиотеки - тогда нужно ограничивать их суммой.

    Другой вариант, сделать свой типаж, ограничить дженерик тип им, имплементировать этот типаж для f32 и f64
    Имплементация должна представлять обертки над нужными действиями

    UPD: если нужно ограничение дженерик, на использование метода exp у f32 и f64:
    Типаж-контракт на метод exp:
    trait Exp {
        fn exp(self) -> Self;
    }
    
    impl Exp for f32 {
        fn exp(self) -> Self {
            <f32>::exp(self)
        }
    }
    
    impl Exp for f64 {
        fn exp(self) -> Self {
            <f64>::exp(self)
        }
    }


    так же можно воспользоваться следующим крэйтом:
    https://crates.io/crates/num
    Ответ написан
    2 комментария
  • Вопрос про владение в Rust, что не так?

    keksmen
    @keksmen
    Just a programmer
    Дело в том, что, как и сказал компилятор, вы пытаетесь использовать значение после его перемещения.
    Рассмотрим участок кода.
    // умножаем  слой на предыдущую  матрицу
    buf = v.mat_mul(&buf);
    // результат записываем в вектор 
    result.push(buf);

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

    Отвечая на ваш второй вопрос: да, клонирование - то, что вам нужно использовать в данном случае.
    // умножаем  слой на предыдущую  матрицу
    buf = v.mat_mul(&buf);
    // результат записываем в вектор 
    result.push(buf.clone());


    Однако, клонирование - операция дорогая. Учитывая, что для умножения нужна всего-лишь иммутабельная ссылка на матрицу, мы можем переписать код следующим образом:
    // вектор, где будут хранится  произведения матриц
    let mut result = vec![];
    
    for v in layers {
    	// пытаемся достать предыдущую матрицу
    	let previous_matrix = match result.last() {
    		Some(last) => last,
    		// а если таковой нет - ей станет входная
    		None => &input,
    	};
    	// умножаем  слой на предыдущую (или входную) матрицу
    	let next_matrix = v.mat_mul(previous_matrix);
    	result.push(next_matrix);
    }


    Метод Vec::<T>::last возвращает Option<&T>, которая содержит ссылку на последний элемент ветора, если таковой существует. Его сложность O(1), поэтому по поводу ухудшения производительности можно не беспокоиться.
    Это именно то, для чего и создавалась переменная-буфер. Теперь нам не нужно производить лишнее клонирование.
    Ответ написан
    1 комментарий
  • Почему минимальный размер приложения такой большой?

    Tyranron
    @Tyranron
    Избитая тема, которая уже подымалась и изучалась не один раз. Достаточно сделать: https://www.google.com/search?q=rust+binary+size и сразу попадаем на статью Rustlog: Why is a Rust executable large?. Настоятельно рекомендую к прочтению, хоть она и слегка устарела (Rust больше не использует jemalloc по умолчанию), но вопрос там разобран крайне детально.

    Если коротко, то в Ваш бинарь попадают:
    1. Если собирали не в release mode, то debug-символы.
    2. Аллокатор, либо код-клей для системного аллокатора.
    3. Код для panic unwinding (в том числе и libbacktrace).
    4. Части libstd Rust'а, даже если Вы их не используете.

    Если стоит задача минимизировать бинарь Rust (под всякий embedded, к примеру), то обычно делают #![no_std], юзают мини-аллокаторы, делают panic = abort и идут на другие лишения.
    Ответ написан
    3 комментария
  • Правда ли, что в области высокопроизводительных приложений за Rust'ом будущее?

    @inv2004
    1) Правильнее сказать, что у Rust есть потенциал в далёком будущем заменить высокопроизводительный C++.

    2) Rust находится на приличном уровне производительности относительно плюсов, местами даже обгоняет, как пример "наколенных" тестов, можно посмотреть сюда: https://benchmarksgame-team.pages.debian.net/bench...

    3) Сможет ли он заменить - это сложный вопрос, может быть да, а может и нет, тут, ИМХО, несколько факторов.
    3.1) если говорить о максимальной оптимизации (что уже требует unsafe) - то именно в unsafe-коде преимуществ относительно C++ не видно.
    3.2) если сравнивать с популярными языками типа Java/C#/Go, то часто они не так сильно отстают от раста и даже плюсов чтобы переходить на более сложный язык.
    3.3) Язык частично определяет его популярность из-за многих факторов помимо производительности. У раста высокий порог вхождения и большая сложность написания, зато большая надёжность. Если он будет непопулярным, пусть даже быстрым, то возможно ниша останется за плюсами, если вдруг начнёт набирать популярность по каким-то причинам - то возможно и заменит.

    Как верно написали - лет через 10 посмотрим. Немного другой вопрос что надо делать сейчас чтобы шансы заменить выросли.
    Ответ написан
    1 комментарий
  • Как удалить первый элемент из вектора в Rust?

    0xD34F
    @0xD34F
    Есть же метод remove - просто указываете индекс, ну и всё.
    Ответ написан
    1 комментарий
  • Подойдёт ли Rust для 3D игр?

    vahe_2000
    @vahe_2000
    arewegameyet
    Rust потенциально является идеальным языком для разработки игр, но экосистема еще очень молода

    arewegameyet.com/#eco
    Ответ написан
    Комментировать
  • Кто может объяснить разницу между hyper и Tokio в Rust'е?

    hrls
    @hrls
    HTTP – протокол. Tokio – библиотека для написания сетевого кода, любого. Но парсить HTTP Tokio не умеет. Для этого есть Hyper – библиотека для написания HTTP серверов и клиентов. HTTP сервер на Hyper будет использовать Tokio для работы с соединениями, а парсить HTTP будет уже Hyper.
    В модели клиент-сервер очевидно есть клиент и сервер. HTTP клиент это все тот же сокет, только уже не серверный. Поэтому и тут Hyper может создавать запросы и парсить ответы. И также, возможно, для взаимодействия с сетью используя Tokio.
    Ответ написан
    Комментировать
  • Каков статус языка Rust в данный момент?

    @freecoder_xx
    Rust развивается стабильно, новые возможности и исправления вводятся с каждым релизом раз в 6 недель. Замеченные баги тоже исправляются оперативно в нерегулярных минорных релизах. Иногда такая динамика развития даже может служить препятствием: многие "живые" библиотеки требуют новой версии компилятора, но не всякая компания способна быстро обновлять его на своих проектах.

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

    Что касается веба - вот тут есть список актуальных компонентов: www.arewewebyet.org

    Какого-то единого сборника лучших практик использования Rust, насколько я знаю, пока нет. Много полезных советов есть в официальной документации (в так называемых Книгах), а также разбросано по разным отдельным статьям. Однако, существуют списки полезных статей, которые помогут найти среди них нужную. Например эти:
    https://github.com/ctjhoa/rust-learning
    https://github.com/brson/rust-anthology/blob/maste...

    В новых проектах Rust используется, и пока тенденция идет на расширение. Вот на этой странице вы можете посмотреть, какие компании используют Rust сейчас и для чего: https://www.rust-lang.org/en-US/friends.html

    Итак, если вы планируете использовать Rust в производстве, готовьтесь вот к чему:
    1. Довольно высокий порог входа в язык. Тут нет особой сложности, просто потребуется практика на языке и поначалу время на следование советам компилятора по устранению постоянно возникающих ошибок компиляции.
    2. Достаточно частые обновления компилятора по добавлению новых возможностей в язык. Это может приводить к тому, что нужная вам библиотека будет требовать свежую версию компилятора.
    3. Сыроватые библиотки. Вероятно, вам придется их слегка дорабатывать под себя.
    4. Rust упрощает сложное, но усложняет простое. Для совсем простых проектов, не требующих высокой производительности и серьезных доработок в будущем, возможно, Rust будет не лучшим выбором.
    Но что вы получите от использования Rust?
    1. Высокую производительность программ, автоматическое управление памятью без сборщика мусора.
    2. Высокую надежность и защищенность программ, устранение большого количества потенциальных проблем на этапе компиляции.
    3. Достаточно легкий и безопасный процесс рефакторинга и доработки программ, благодаря развитой системе типов.
    4. Развитую систему управления зависимостями проекта.
    5. Действительно хороший универсальный инструмент: Rust подойдет и для прототипирования, и для разработки, причем для любого типа программ (утилиты, настольные приложения, веб-приложения, мобильные приложения, встраиваемые системы). Хорошая поддержка пока еще есть не для всего, но на перспективу - это большой плюс.
    Ответ написан
    7 комментариев
  • Каков статус языка Rust в данный момент?

    @snuk182
    Rust развивается основательно. Не семимильными шагами, потому что каждый шаг согласовывается с сообществом и ресурсами на его воплощение, но достаточно быстро, и крупных жалоб пока нет (кроме кривой обучения, но это субъективно, главное понять принцип владения данными). Best Practices есть. Для новых коммерческих проектов его выбирают в основном в отрасли блокчейна и специальных вебсервисов с быстрым откликом. Веб фреймворков россыпь, пока лидируют Actix и Rocket. Десктопного гуя стабильного нет, пользуются биндами к gtk.
    Ответ написан
    5 комментариев
  • Странный дизайн Rust?

    Rust это не C++. Почему он должен брать термины из C++?

    В Java вон тоже ссылки - это указатели в терминологии C++.

    Более того, ссылка от указателя отличается лишь абстракцией. В памяти это будут одинаковые ячейки, содержащие адрес.
    Ответ написан
    Комментировать
  • Rust использует виртуальную машину?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Видимо, данный вопрос возник из-за того что код на Rust сначала компилируется в LLVM-байткод, а далее этот байт-код компилируется в машинный код для заданной системы. Примерно так работает LLVM: исходный код → фронтенд (компилятор языка) → LLVM → бэкенд (транслятор из LLVM-байткода в машкод целевой платформы) → бинарник в машкодах целевой системы.
    Таким образом, готовый бинарник является нативным кодом и не использует виртуальную машину или байт-код.

    P.S. Ну конечно когда мы компилируем в wasm, то получается код для виртуальной машины, потому что WebAssembly ею является, но для этой машины полученный код является нативным. Вот так всё просто и понятно!:)
    Ответ написан
    Комментировать
  • Подойдёт ли Rust для 3D игр?

    @snuk182
    Можно, но дописанных и стабильных движков нет, и все придется делать самому. Если интересно, как устроены игровые движки, то это даже плюс. Если цель получить в краткие сроки игру, не занимаясь велосипедостроением - вам не сюда ближайшее время.
    Из графики наиболее предсказуемым способом будет использование врапперов над OpenGl, которые закинуты с поддержкой, но свою работу выполняют. Упомянутый здесь gfx находится в активной разработке и в перспективе довольно привлекателен, но нестабилен. Если вы знакомы с джаваскриптовым three.js, есть родной аналог three.rs, тоже активно пилится. Также есть англоязычный ресурс Are We Game Yet? с описанием всех возможных библиотек для разработки игр на Rust. Еще есть сообщество в Gitter, где всегда можно спросить совет.
    Ответ написан
    Комментировать
  • Подойдёт ли Rust для 3D игр?

    BasmanovDaniil
    @BasmanovDaniil
    Геймдизайнер-телепат
    Если прям горите желанием, то можно, но готовьтесь к тому, что весь функционал придётся писать самому и тулчейн тоже. Ну и багов дофига. Рано ещё, подождите пару лет.
    Ответ написан
    Комментировать