LINUX.ORG.RU

Rust 1.91.0

 ,


0

5

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

Список изменений:

  • aarch64-pc-windows-msvc теперь является платфомой первого уровня поддержки (ранее было второго уровня). По сравнению со вторым уровнем поддержки, первый уровень подразумевает обязательное успешное прохождения всех тестовых наборов на платформе.

  • Добавлена проверка линтера при возвращении из функции «висячего» указателя. Встроенный в компилятор Borrow Checker уже имеет проверку на тот случай, когда возвращается «висячая» ссылка, но это не работало при использовании сырых указателей. Теперь будет сгенерировано предупреждение:

fn f() -> *const u8 {
    let x = 0;
    &x
}
warning: a dangling pointer will be produced because the local variable `x` will be dropped
 --> src/lib.rs:3:5
  |
1 | fn f() -> *const u8 {
  |           --------- return type of the function is `*const u8`
2 |     let x = 0;
  |         - `x` is part the function and will be dropped at the end of the function
3 |     &x
  |     ^^
  |
  = note: pointers do not have a lifetime; after returning, the `u8` will be deallocated
    at the end of the function because nothing is referencing it as far as the type system is
    concerned
  = note: `#[warn(dangling_pointers_from_locals)]` on by default

В разряд стабильного API было переведено:

  • Path::file_prefix
  • AtomicPtr::fetch_ptr_add
  • AtomicPtr::fetch_ptr_sub
  • AtomicPtr::fetch_byte_add
  • AtomicPtr::fetch_byte_sub
  • AtomicPtr::fetch_or
  • AtomicPtr::fetch_and
  • AtomicPtr::fetch_xor
  • {integer}::strict_add
  • {integer}::strict_sub
  • {integer}::strict_mul
  • {integer}::strict_div
  • {integer}::strict_div_euclid
  • {integer}::strict_rem
  • {integer}::strict_rem_euclid
  • {integer}::strict_neg
  • {integer}::strict_shl
  • {integer}::strict_shr
  • {integer}::strict_pow
  • i{N}::strict_add_unsigned
  • i{N}::strict_sub_unsigned
  • i{N}::strict_abs
  • u{N}::strict_add_signed
  • u{N}::strict_sub_signed
  • PanicHookInfo::payload_as_str
  • core::iter::chain
  • u{N}::checked_signed_diff
  • core::array::repeat
  • PathBuf::add_extension
  • PathBuf::with_added_extension
  • Duration::from_mins
  • Duration::from_hours
  • impl PartialEq<str> for PathBuf
  • impl PartialEq<String> for PathBuf
  • impl PartialEq<str> for Path
  • impl PartialEq<String> for Path
  • impl PartialEq<PathBuf> for String
  • impl PartialEq<Path> for String
  • impl PartialEq<PathBuf> for str
  • impl PartialEq<Path> for str
  • Ipv4Addr::from_octets
  • Ipv6Addr::from_octets
  • Ipv6Addr::from_segments
  • impl<T> Default for Pin<Box<T>> where Box<T>: Default, T: ?Sized
  • impl<T> Default for Pin<Rc<T>> where Rc<T>: Default, T: ?Sized
  • impl<T> Default for Pin<Arc<T>> where Arc<T>: Default, T: ?Sized
  • Cell::as_array_of_cells
  • u{N}::carrying_add
  • u{N}::borrowing_sub
  • u{N}::carrying_mul
  • u{N}::carrying_mul_add
  • BTreeMap::extract_if
  • BTreeSet::extract_if
  • impl Debug for windows::ffi::EncodeWide<'_>
  • str::ceil_char_boundary
  • str::floor_char_boundary
  • impl Sum for Saturating<u{N}>
  • impl Sum<&Self> for Saturating<u{N}>
  • impl Product for Saturating<u{N}>
  • impl Product<&Self> for Saturating<u{N}>

Признак const добавлен к следующим функциям:

  • <[T; N]>::each_ref
  • <[T; N]>::each_mut
  • OsString::new
  • PathBuf::new
  • TypeId::of
  • ptr::with_exposed_provenance
  • ptr::with_exposed_provenance_mut

>>> Подробнее

★★★

Проверено: hobbit ()
Последнее исправление: Wizard_ (всего исправлений: 2)
Ответ на: комментарий от yvv1

Что значит не популярный? Честное 10-е место. Там ему и место пока что.

Точно, на целый пукт опережает АДУ! Которая рвется вверх.

P.S. Думаю нужно бы еще в инете пошарить, вдруг он в каком то рейтинге аж на 9 месте будет !

mx__ ★★★★★
()
Последнее исправление: mx__ (всего исправлений: 1)

Непонятно, почему сишники кривятся от растового синтаксиса? Те же скобочки, те же каменты, те же ссылки и указатели, дот нотэйшн, массивы с нуля и т.д. В расте просто есть вещи, которых в сях нет, типа дженерики, лайфтаймы, трейты и т.д., так для них понятное дело нужен дополнительный синтаксис. Что тут нелогичного?

yvv1
()
Последнее исправление: yvv1 (всего исправлений: 1)
Ответ на: комментарий от mx__

Думаю нужно бы еще в инете пошарить, вдруг он в каком то рейтинге аж на 9 месте будет !

Год назад раст был на 15-м месте. Даже так, назвать его непопулярным это сильно. Тогда куча любимых в энтерпрайзе языков тоже непопулярны, typescript, kotlin, lua и т.д.

yvv1
()
Ответ на: комментарий от yvv1

Ну, например, я пишу однопоток, на утечки память насрать, потому что это десктопная утилита командной строки, и всё что явно течёт я уже валгриндом увидел и поправил. Зато у меня прямая линковка (ну почти) с сишным кодом. Это я про C++.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 2)
Ответ на: комментарий от yvv1

typescript, kotlin, lua и т.д.

Да но на них не переписывают существующий софт и не вопят про это на каждом углу.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

Да но на них не переписывают существующий софт и не вопят про это на каждом углу.

Да ладно. И переписывают, и вопят. И какое это имеет отношение к популярности?

yvv1
()
Ответ на: комментарий от iron

Кажется что смысла в этом сравнении не очень много: в одном случае атомарная операция, в другом два сискола.

tinykey
()
Ответ на: комментарий от yvv1

И какое это имеет отношение к популярности?

Я про это и пишу, не я же тыкаю в котлин.

mx__ ★★★★★
()
Ответ на: комментарий от Bad_ptr

Это те самые знаменитые растовские понятные сообщения об ошибках, которые сами подсказывают тебе как исправить код?

У него просто пример неудачный. std::thread::spawn требует чтобы замыкание было с временем жизни 'static.

pub fn spawn<F, T>(f: F) -> JoinHandle<T>
where
    F: FnOnce() -> T + Send + 'static,
    T: Send + 'static,

О чём компилятор явно и говорит:

argument requires that `counter` is borrowed for `'static`

Если взять std::thread::scope, который не требует 'static, то ошибка будет более наглядной.

use std::thread;

const N: usize = 4;

fn main() {
    let mut counter = 0;
    thread::scope(|s| {
        for _ in 0..N {
            s.spawn(|| counter += 1);
        }
    });
}
error[E0499]: cannot borrow `counter` as mutable more than once at a time
 --> src/main.rs:9:21
  |
7 |     thread::scope(|s| {
  |                    - has type `&'1 Scope<'1, '_>`
8 |         for _ in 0..N {
9 |             s.spawn(|| counter += 1);
  |             --------^^--------------
  |             |       |  |
  |             |       |  borrows occur due to use of `counter` in closure
  |             |       `counter` was mutably borrowed here in the previous iteration of the loop
  |             argument requires that `counter` is borrowed for `'1`

Если пользователь попробует использовать Cell или RefCell чтобы попытаться это обойти:

use std::{cell::Cell, thread};

const N: usize = 4;

fn main() {
    let counter = Cell::new(0);
    thread::scope(|s| {
        for _ in 0..N {
            s.spawn(|| counter.update(|i| i + 1));
        }
    });
}

То компилятор подскажет использовать атомики или блокирующие примитивы:

error[E0277]: `Cell<i32>` cannot be shared between threads safely
   --> src/main.rs:9:21
    |
  9 |             s.spawn(|| counter.update(|i| i + 1));
    |               ----- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Cell<i32>` cannot be shared between threads safely
    |               |
    |               required by a bound introduced by this call
    |
    = help: the trait `Sync` is not implemented for `Cell<i32>`
    = note: if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI32` instead
    = note: required for `&Cell<i32>` to implement `Send`

Видимо он ещё только изучает Rust и под впечатлением. Я бы не прислушивался к его мнению. :)

numas13
()
Ответ на: комментарий от Bad_ptr

Это те самые знаменитые растовские понятные сообщения об ошибках, которые сами подсказывают тебе как исправить код?

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

tinykey
()
Ответ на: комментарий от LongLiveUbuntu

Была философия «код работает корректно, пока не доказано обратное». Даже того, что сейчас считается стандартной практикой (тестирование на граничные значения переменных), не проводилось.

seiken ★★★★★
()
Ответ на: комментарий от usi_svobodi

Наоборот, теперь фанатики что нибудь ещё поломают

ckotctvo
()
Ответ на: комментарий от seiken

Любопытно почитать критику классиков (Вирт, Дийкстра, Хоар) языка Ада. Что-то есть в русскоязычной Википедии. И действительно, язык оказался достаточно сложный, чтобы разрабы НАСА облажались с ним. Но, впрочем, такая же критика у них была бы в отношение Раста, мол столько всяких механизмов, что будет много багов в компиляторе.

seiken ★★★★★
()
Ответ на: комментарий от yvv1

А что учитывается в этих рейтингах? Подозреваю, что от части количество проектов на Расте? А ято если в это количество входят все эти сириады растопакетов, на каждый чих, как у Питона? Есть где-то статистика по проектам использующим Раст для конечного продукта, а не для написания растосодуля для растомодуля?

PcheloBiaka
()
Ответ на: комментарий от sanyo1234

И как обстоят дела с другими альтернативными безопасными плюсиками?

https://fil-c.org
https://github.com/pizlonator/fil-c:

Fil-C: completely compatible memory safety for C and C++

Fil-C is a fanatically compatible memory-safe implementation of C and C++. Lots of software compiles and runs with Fil-C with zero or minimal changes. All memory safety errors are caught as Fil-C panics. Fil-C achieves this using a combination of concurrent garbage collection and invisible capabilities (each pointer in memory has a corresponding capability, not visible to the C address space). Every fundamental C operation (as seen in LLVM IR) is checked against the capability. Fil-C has no unsafe statement and only limited FFI to unsafe code.

Fil-C is special because:

  • Fil-C achieves full safety with no escape hatches. There is no unsafe keyword in Fil-C that could be used to turn off protections. Linking to unsafe code is severely restricted.
  • Fil-C’s capability-based approach achieves a similar level of safety to hardware capabilities like CHERI, except that it runs on stock hardware (X86_64, currently).
  • Fil-C is engineered to prevent memory safety bugs from being used for exploitation rather than just simply flagging them often enough to find bugs. This makes Fil-C different from AddressSanitizer, HWAsan, or MTE, which can all be bypassed by attackers. The key difference that makes this possible is that Fil-C is capability based (so each pointer knows what range of memory it may access, and how it may access it) rather than tag based (where pointer accesses are allowed if they hit valid memory).
  • From a language user standpoint, Fil-C is just C and C++ with GCC/clang extensions. It’s more likely than not that your favorite C or C++ program or library compiles in Fil-C with zero changes. The Fil-C compiler is based on clang 20.1.8, so it supports C17 and C++20.
dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от PcheloBiaka

А что учитывается в этих рейтингах?

У каждого рейтинга свои метрики, какие именно, есть в описании к рейтингам. Эти метрики одинаковы для всех сравниваемых языков, и это в принципе всё что нужно знать.

yvv1
()
Ответ на: комментарий от dataman

Fil-C achieves this using a combination of concurrent garbage collection

Да никто в здравом уме не будет использовать велосипед, в котором непонятно, какого качества эти GC и проч. И что толку с этих паник? Это всего лишь упростит в какой-то степени отладку.

seiken ★★★★★
()
Ответ на: комментарий от dataman

Думаю, что скачивают на посмотреть, протыкать палкой и выкинуть.

seiken ★★★★★
()
Ответ на: комментарий от foror

Предлагаю немного абстрагироваться от ЯП и прочитать еще раз

Т.е. если мне нужно намерено получится поведение как в примере на A, я просто не смогу скомпилить программу на B?

Под A и B можно попробовать поставить разные языки. Во-первых, в каждом ЯП есть свои идеоматичные подходы, которые где-то пересекаются, а где-то расходятся. Во-вторых, а вам точно нужно воспроизводить неправильное поведение сишной программы? Просто если надо добиться правильного решения, то и в C и в Rust появятся примитивы синхронизации.

snake266 ★★★
() автор топика
Ответ на: комментарий от foror

А кидаться субстанциями, с криками: «У вас не так как в С(++)!!!1!» – гораздо лучше, да?

Тут аксиома Эскобара, где с одной стороны сишники и плюсовики, а с другой стороны РАСТовчане – оба «хороши» в чем то своем.

snake266 ★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Согласен. Тут ему понадобились только дополнительные сишные инструменты.

Я доустановил то, что ему хотелось и дальше он таки скачал llvm и начал что-то там компилять.

-- Build files have been written to: /root/rust/build/x86_64-unknown-linux-gnu/llvm/build
running: cd "/root/rust/build/x86_64-unknown-linux-gnu/llvm/build" && DESTDIR="" LC_ALL="C" "cmake" "--build" "/root/rust/build/x86_64-unknown-linux-gnu/llvm/build" "--target" "install" "--config" "Release" "--" "-j" "16"

shell-script ★★★★★
()
Последнее исправление: shell-script (всего исправлений: 1)
Ответ на: комментарий от yvv1

Я думаю для рейтинга взлетающих языков это важно. В смысле, для понимания истинного положения дел. Вот взять буст какойнить - там куча всего. Один проект. И возьмём питонолибу-однострочник, как они любят это делать. С точки зрения статистики они равнозначны. Понимаешь о чём я? Стопиццот либочек питона делают меньше, чем один буст, но на статистику очень хорошо влияют. Но на Питоне и реальных проектов выше крыши. Также и с растом, только реальных проектов на нём ПОКА не так много. Я бы скептически смотрел на статистику.

PcheloBiaka
()
Ответ на: комментарий от iron

У вас debug для ржавого включен. И у меня на атомиках ржавой быстрее на 20%:

use std::sync::{
    Arc,
    atomic::{AtomicUsize, Ordering},
};
use std::thread;

fn main() {
    let counter = Arc::new(AtomicUsize::new(0));
    let mut handles = Vec::new();

    for _ in 0..4 {
        let c = Arc::clone(&counter);
        handles.push(thread::spawn(move || {
            for _ in 0..1_000_000 {
                c.fetch_add(1, Ordering::Relaxed);
            }
        }));
    }

    for h in handles { h.join().unwrap(); }

    println!("counter = {}", counter.load(Ordering::Relaxed));
}
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"


[package]
name = "atomics-rust"
version = "0.1.0"
edition = "2021"

[dependencies]

40 ms против 50 ms.

А ещё размер таким образом нечестно сравнивать. У него свой std.

steemandlinux ★★★★★
()
Последнее исправление: steemandlinux (всего исправлений: 4)
Ответ на: комментарий от dataman

Прочитал https://fil-c.org/invisicaps_by_example

Первые несколько десятков примеров - супер.

А потом столкнулся с местом, где они кажется очень сильно перебдели, вроде хранить уазатель в uintptr_t «хоть вечно» вполне нормальная практика:

But this only works if the cast from int-to-ptr and ptr-to-int casts are local to one another and the compiler can unambiguously pick the original pointer’s capability. For example, this doesn’t work:

#include <stdio.h>
#include <inttypes.h>

uintptr_t x;

int main()
{
    const char* str = "hello";
    x = (uintptr_t)str;
    asm volatile("" : : : "memory");
    printf("%s\n", (const char*)x);
    return 0;
}

Here, we’ve made sure that the compiler cannot see the int-to-ptr cast as having any relationship to the ptr-to-int cast, since x is a global variable (so anyone could muck with it) and we have prevented any kind of load elimination (thanks to the compiler fence). So, this gets:

filc safety error: cannot read pointer with null object.
    pointer: 0x60ac4d7f1cf0,<null>
    expected 1 bytes.
semantic origin:
    src/string/strlen.c:8:9: strlen
check scheduled at:
    src/string/strlen.c:8:9: strlen
    src/stdio/fputs.c:6:13: fputs
    src/stdio/puts.c:7:8: puts
    test28.c:11:5: main
    src/env/__libc_start_main.c:79:7: __libc_start_main
    <runtime>: start_program
[722598] filc panic: thwarted a futile attempt to violate memory safety.
Trace/breakpoint trap (core dumped)
GPFault ★★★
()
Последнее исправление: GPFault (всего исправлений: 1)
Ответ на: комментарий от unC0Rr

Не придется, выше написали как все то же самое сделать на атомиках.

tinykey
()
Ответ на: комментарий от tinykey

Не в этом дело, у него толстое приложения из-за debug сборки получилось, плюс сишка жестко залинкована на glibc, а ржавой использует только необходимые для linux функции из неё, поэтому времени на запуск тратит больше. Честно сравнивать это static vs static.

steemandlinux ★★★★★
()

За реакцию «нинужно» отдельное спасибо! Буквы тратить не надо.

gns ★★★★★
()
Ответ на: комментарий от steemandlinux

Возможно, но разница измеряемая:

$ hyperfine --warmup 20 --runs 50 /tmp/relaxed /tmp/seqcst
Benchmark 1: /tmp/relaxed
  Time (mean ± σ):     118.1 ms ±  13.6 ms    [User: 430.7 ms, System: 2.1 ms]
  Range (min … max):    96.2 ms … 137.5 ms    50 runs
 
Benchmark 2: /tmp/seqcst
  Time (mean ± σ):     123.6 ms ±  10.5 ms    [User: 452.4 ms, System: 2.5 ms]
  Range (min … max):    97.3 ms … 141.9 ms    50 runs
 
Summary
  /tmp/relaxed ran
    1.05 ± 0.15 times faster than /tmp/seqcst

Хотя и в пределах погрещности конечно. Но оно в принципе все такое. Надо сишную версию с musl слинковать и сравнить.

tinykey
()
Ответ на: комментарий от yvv1

Не понял, а чего срч такой вялый? Даже в этом лор деградировал…

Дык стремно об униженного и оскорбленно Раста еще и ноги вытирать, пусть хоть на скриптиках он существует, аля баш)))))))

Sm0ke85
()
Ответ на: комментарий от hateyoufeel

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

shell-script ★★★★★
()
Ответ на: комментарий от seiken

А разве rust при переполнении не кинет panic, навернув всю систему? В alvr при конвертации float в int именно так было в какой-то версии, какой-то несчастный невлезший в диапозон float ронял весь процесс

mittorn ★★★★★
()
Ответ на: комментарий от ox55ff

есть огромный минус подсчёта ссылок: каждое обращение к объекту - потенциальный бранч в деструктор. Если деструктор сложный - будет забивать кэш ненужным мусором.
GC существует не просто так
А ещё бывают циклические ссылки...

mittorn ★★★★★
()
Ответ на: комментарий от IPR

Для этого нужно убрать cargo, а его разрабов заставить тягать грузы в карго компаниях вместо того, чтобы заниматься этим бесполезным карго-культом
rust без cargo бы не собрал столько хейта, даже несмотря на другие странности языка

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)
Ответ на: комментарий от mittorn

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

tinykey
()
Ответ на: комментарий от Somebody

«Как трудно жить!»... © :))))

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

mittorn ★★★★★
()
Ответ на: комментарий от tinykey

Все языки с пакетными менеджерами превращаются в неконтроллируемую блоатварь.
npm, cargo, pip - везде одна и та же проблема.
У питона вообще в стандартой библиотеке столько всего, что он просто не имеет права иметь пакетный менеджер

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

ведь раньше без rust как-то жили

Да я и сейчас живу... :))

Вот пообщался тут, почитал тут и «там», и решил, что для своих МК таки C выберу, а не новомодные Rust и Zig...

Somebody ★★★
()
Ответ на: комментарий от yvv1

Потому что за недавнее время было 2-3 активных срача на тему раста, лор чуть подвыдохся в этом плане

mittorn ★★★★★
()
Ответ на: комментарий от steemandlinux

Как минимум, все существуюие проекты кроме разве что ядерного кода используют cargo. Впрочем, никто не запрещает использовать cargo, но зависимости им не тянуть, только вот так тоже не делают.
А вообще, у rustc стабильный командный интерфейс?

mittorn ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.