LINUX.ORG.RU

Rust 1.88.0

 

Rust 1.88.0

0

4

Опубликован следующий стабильный релиз компилятора и стандарта языка Rust.

В этой версии добавлены следующие возможности:

  1. Синтаксис для описания функций без пролога и эпилога. Тело таких функций обязано состоять из naked_asm! блока :
#[unsafe(naked)]
pub unsafe extern "sysv64" fn wrapping_add(a: u64, b: u64) -> u64 {
    // Equivalent to `a.wrapping_add(b)`.
    core::arch::naked_asm!(
        "lea rax, [rdi + rsi]",
        "ret"
    );
}
  1. Возможность объявлять две и более переменных в условных выражениях if / while:
if let Channel::Stable(v) = release_info()
    && let Semver { major, minor, .. } = v
    && major == 1
    && minor == 88
{
    println!("`let_chains` was stabilized in this version");
}
  1. В DSL для условной компиляции cfg добавлены константы true и false, которые так же стали доступны в макросе cfg!.

  2. Добавлено предупреждение о попытке обращения к нулевому указателю для функций, чьи инварианты корректной работы требуют не нулевых адресов. К примеру попытка сконструировать объект std::slice по нулевому адресу:

// Undefined behavior
unsafe { std::slice::from_raw_parts(ptr::null(), 1); }

приведёт к выдаче сообщения. По умолчанию это предупреждение имеет уровень deny-by-default, то есть будет рассмотрено компилятором как ошибка.

Все нововведения перечислены в списке изменений.

>>> Announcing Rust 1.88.0

★★★★★

Проверено: dataman ()
Последнее исправление: dataman (всего исправлений: 3)

& let Semver { major, minor, .. } = v
&& major == 1
&& minor == 88

Прям чувствуется как человек хотел дописать цифру, но не смог

shalom_ ★★
()

Только после добавления лого подсчитал зубцы у шестерёнки, их 32. Пора менять на 64, ход будет плавнее.

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

Пора менять на 64, ход будет плавнее.

там всё уже заржавело, на свалку пора

seiken ★★★★★
()

Возможность объявлять две и более переменных в условных выражениях if / while

Возможность сопоставлять с образцом два и более раз в условных выражениях if let / while let.

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

подсчитал зубцы у шестерёнки, их 32. Пора менять на 64, ход будет плавнее.

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

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

Синтаксис для описания функций без пролога и эпилога.

Т.е. в нормальных ситуациях нужен и пролог, и эпилог, и краткое содержание предыдущих серий?

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

Имеется в виду сохранение на стек указателя возврата, push/pop клобберных регистров. Но да, из текста новости несведующему человеку неясно. Ребята просто спёрли из C атрибут:

__attribute__((naked)) void my_function() {
    __asm__ __volatile__ (
        "nop\n\t"
        "bx lr\n\t"
    );
}
PPP328 ★★★★★
()
Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от PPP328

просто спёрли из C атрибут:

Минуточку! В сишечке я могу писать тело функции и без всякого asm.

LamerOk ★★★★★
() автор топика
Ответ на: удаленный комментарий

C аттрибутом naked - не можете.

Ещё как могу:

__declspec ( naked ) int main() {
   int i;
   int j;

   __asm {      /* prolog */
      push     ebp
      mov      ebp, esp
      sub      esp, __LOCAL_SIZE
      }

   /* Function body */


   __asm {   /* epilog */
      mov      esp, ebp
      pop      ebp
      ret
      }
}

Компилятор не сможет самостоятельно понять

Ему и не надо, его просили этого не делать.

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

Разумеется. Гугли ABI.

Это дело такое, рисковое. Так можно невзначай и на расте начать писать.

Smacker ★★★★★
()
Ответ на: удаленный комментарий

Со строками видать проще - скармливаешь внешнему ассемблеру и не паришься.

WatchCat ★★★★★
()

Пример для naked_asm! взят из раста x86_64-pc-windows-msvc? У меня несколько вопросов есть. Недавно обсуждали с бывшим коллегой, который активно интересуется новыми технологиями, конкуренцию C/C++ и сабжа, что корпорации его продвигают. Он сказал что фишки безопасности и надежности будут добавляться в новые стандарты С++ тоже, хотя не факт что в том же виде, так что пока что можно не торопиться изучать сабж. Что об этом думают комрады тут? Второй вопрос, я вот сейчас поеду в деревню, где возможно не будет интернета (у меня в городе мобильный интенет работает плохо и не везде сейчас) что мне качнуть x86_64-unknown-linux-gnu или x86_64-unknown-linux-musl?

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

Он сказал что фишки безопасности и надежности будут добавляться в новые стандарты С++ тоже

Помню в стандарт С++ добавили garbage collector. Как добавили, так потом и убрали.

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

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

Даже если туда что-то такое и попытаются добавить, то для этого придётся неслабо так плюсы перетряхнуть, но они на это никогда не пойдут.

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

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

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

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

Смысл для плюсов? Не проиграть конкуренцию, я думаю.

Ни разу не замечал заботы по этому поводу. Замечал, что новые фичи направлены на то, чтобы делать С++ библиотеки header-only. Что по-моему своего рода вендор-лок. Огораживание своей экосистемы.

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

Даже если туда что-то такое и попытаются добавить, то для этого придётся неслабо так плюсы перетряхнуть, но они на это никогда не пойдут.

Можно добавить #safe или safetry и там например проверять целочисленные переполнения, выход индекса за пределы массива, генерировать исключения, и прочее для начала. Не думаю что мои соображения по этому поводу для кого-то интересны тут, rust то я не знаю пока. Я могу например думать что нет ничего что можно было бы сделать на rust и нельзя на плюсах, а люди которые платят зарплату могут рассуждать иначе… Поставил rust с дефолтными настройками и уже непривычные моменты, все в хомяке. С одной стороны рут не нужен для манипуляций, с другой я иногда логинюсь под другим пользователем.

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

Вот в чём проблема подобные конструкции продумать изначально? Теперь из-за сахарка всем опять придётся СРОЧНО ОБНОВЛЯТЬ КОМПИЛЯТОР
Это кстати основная причина по которой я избегаю rust и js - постоянное добавление сахара в основной синтаксис

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

Со строками проще в том плане, что в парсер языка не надо встраивать парсер ассемблера. Но Rust не просто скармливает эти строки внешнему ассемблеру в общем случае. В ассемблере можно использовать имена локальных переменных и тд, которые компилятор будет заменять на нужные значения. Пример кода для понимания (не проверял, но примерно так):

pub unsafe fn add_u32(a: u32, b: u32) -> u32 {
    let mut result = a;
    asm!(
        "add {0:e}, {1:e}",
        inout(reg) result,
        in(reg)  b,
        options(pure, nomem, nostack)
    );
    result
}
vbr ★★★★★
()
Ответ на: комментарий от perl5_guy

Наоборот же, проще – зубцы станут острее.

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

Это кстати основная причина по которой я избегаю rust и js - постоянное добавление сахара в основной синтаксис

Так любой язык развивается. Даже Кобол. Какого языка ты не избегаешь-то? Вот в C23 добавили двоичные литералы (0b0000100), разделители цифр (16'777'216). Захочешь скомпилировать такой код - придётся СРОЧНО ОБНОВЛЯТЬ КОМПИЛЯТОР.

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

что корпорации его продвигают.

И чё? Корпорации сейчас всё продвигают, например, вот линукс. Какой-то намёк на проблемы был если бы только одна корпорация продвигала, но у раста давно фаундейшен

Он сказал что фишки безопасности и надежности будут добавляться в новые стандарты С++ тоже,

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

хотя не факт что в том же виде, так что пока что можно не торопиться изучать сабж.

Надо торопиться, если не раст то что-то похожее будет следующим флагманом в системщине, в смысле, не сляпанное на коленке и как попало(сишка и её потомки), а с какой-нибудь хитрой системой типов из CS, прогресс неумолим.

zurg
()
Последнее исправление: zurg (всего исправлений: 3)
Ответ на: комментарий от vbr

asm!( «add {0:e}, {1:e}», inout(reg) result, in(reg) b, options(pure, nomem, nostack) );

Это что за ассемблер такой? Ни на GNU, ни на intel/msvc не похож. Это что-то из llvm?

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

Я думаю, что пока в С++ подобное добавят, на пенсию успеешь выйти. А пока эти изменения дойдут до мейнстрима - помереть успеешь. А безопасный код писать люди хотят «здесь и сейчас». Поэтому в этом отношении Rust предпочтительней.

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

А безопасный код писать люди хотят «здесь и сейчас». Поэтому в этом отношении Rust предпочтительней.

Можно на Swift писать уже сейчас давно.

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

Только вот бинарные литералы - уже давно существующее расширение, добавленное в стандарт:
https://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html
Разделители, надеюсь, использовать активно не будут. Это какой-то бэкпорт из c++, да и весьма редко нужно. Но это как раз тот случай синтаксического сахара, который стоит избегать

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

Я понял, это шаблоны в асме, до этого как и до встроенного асма не скоро дойду, если вообще дойду (25 лет жил без него, просто любопытно стало.)

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

Swift это не безопасный язык. Безальтернативный счётчик ссылок, как решение управления памятью, подходит далеко не всем. Кроссплатформа у него тоже скорей в теории. Тут любят шпынять Rust аргументом - а что на нём написано. А что на Swift написано, из того, что может использовать лорчанин на своём арче? Я вот ripgrep на Rust использую из того, что знаю. В ядро Rust тянут, не удивлюсь, если в моём ядре уже он есть.

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

Я думаю, что пока в С++ подобное добавят, на пенсию успеешь выйти.

В С++ такого никогда не будет, а вот в компиляторах - пожалуйста:

static inline char * strcpy(char * dest,const char *src)
{
int d0, d1, d2;
__asm__ __volatile__(  "1:\tlodsb\n\t"
                       "stosb\n\t"
                       "testb %%al,%%al\n\t"
                       "jne 1b"
                     : "=&S" (d0), "=&D" (d1), "=&a" (d2)
                     : "0" (src),"1" (dest) 
                     : "memory");
return dest;
}
LamerOk ★★★★★
() автор топика
Ответ на: комментарий от FreeLiver

Ну да, я просто хочу сказать, что это не просто тупо строки передаются в gas, там логика посложней. Хотя возможно эта логика реализована в llvm, а не в самом компиляторе Rust, не знаю.

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

Я отвечал на «фишки безопасности и надежности будут добавляться в новые стандарты С++», наверное стоило мне это процитировать для ясности. Я так понимаю, речь про «наш ответ Rust» - создание гипотетического безопасного подмножества C++.

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

Конкретно этот сахар - самый естественный. Любой, кто использовал if let, пытался скомбинировать несколько let в условии, потому что естественно иметь такую возможность, но был огрызок, позволяющий только один let.

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

Swift это не безопасный язык.

Какие основные претензии к Си? Память и выход за границы?

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/memorysafety/

By default, Swift prevents unsafe behavior from happening in your code. For example, Swift ensures that variables are initialized before they’re used, memory isn’t accessed after it’s been deallocated, and array indices are checked for out-of-bounds errors.

А что на Swift написано, из того, что может использовать лорчанин на своём арче?

Для начала – https://www.swift.org/blog/introducing-swiftly_10. 🙂
Но на Арче я не проверял.

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

Я в принципе уже принял для себя решение познакомиться с Rust, есть в планах небольшой проект для собственных нужд, я же не теряю ничего. Тут были комментарии про Swift. Он конечно подкупает тем, что там транслятор сам делает то что разработчиков Rust заставляют делать руками, как раз для лентяев вроде меня…

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

Вот в C23 добавили двоичные литералы (0b0000100), разделители цифр (16’777’216).

Как-то это совсем не Ъ. Если я попаду в Вальгаллу, мои бородатые диды-предки со мной там даже срать рядом не сядут.

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

В Swift, насколько я знаю, нет формального разделения на safe и unsafe части. Там есть unsafe классы и любая функция их может использовать. Т.е. принципиального отличия от C++ нет. Вроде пишут, что планируют это доработать тут, но пока так.

Но всё же я бы с Rust не сравнивал, совсем разные подходы. ОС ты не будешь писать на Swift, а на Rust можно попробовать. В Rust принципиальный подход - zero cost abstractions. В Swift такого подхода нет. Счётчики ссылок это, очевидно, совсем не zero cost abstraction. Тут скорей с Go конкуренция.

Для начала – https://www.swift.org/blog/introducing-swiftly_10.

Ну я говорю - в теории. На практике - это как C#. Как-то не слишком популярно, хотя технически вроде и можно.

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

Со строками подсветки нет, и ошибка компиляции не показыватся нормально

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

У меня нет вопросов к самой конструкции. У меня вопрос, почему её добавляют спустя десять лет существования языка...

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

Проиграл, это ChatGPT головного мозга (у тебя). Убери свои кривые флаги из MSVC, и он все скомпилирует. Он не принимает gcc аргументы.

https://gcc.godbolt.org/z/9sj5M17bT

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
if let Channel::Stable(v) = release_info()
    && let Semver { major, minor, .. } = v
    && major == 1
    && minor == 88
{
    println!("`let_chains` was stabilized in this version");
}

Теперь я вижу отчетливо почему такое ярое неприятие в рядах рядовых разработчиков linux-ядра возникает.

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

Потому что отсталые сишники не хотят сахарочка для сокращения кода, и хотят и дальше писать свои портянки? Вот сравни просто:

if let Channel::Stable(v) = release_info()
    && let Semver { major, minor, .. } = v
    && major == 1
    && minor == 88
{
    println!("`let_chains` was stabilized in this version");
}
struct semver v = release_info();
if (info.major == 1 && info.minor == 88) 
  printf("c was stabilized");

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