LINUX.ORG.RU

Выпуск языка программирования Rust 1.47

 ,


2

8

Опубликован релиз 1.47 языка системного программирования Rust, основанного проектом Mozilla. Язык сфокусирован на безопасной работе с памятью, обеспечивает автоматическое управление памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).

Автоматическое управление памятью в Rust избавляет разработчика от ошибок при манипулировании указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.

Основные новшества:

  • Реализована поддержка типажей для массивов произвольного размера. Ранее, из-за невозможности определить generic-функции для всех целых значений, стандартная библиотека предоставляла встроенную поддержку типажей только для массивов, размер которых не превышал 32 элемента (типажи для каждого размера были определены статически). Благодаря созданию функциональности константных дженериков («const generics») появилась возможность определения generic-функций для любых размеров массива, но они пока не включены в состав стабильных возможностей языка, хотя реализованы в компиляторе и теперь задействованы в стандартной библиотеке для типажей массивов любого размера. Например, следующая конструкция в Rust 1.47 приведёт к выводу содержимого массива, хотя раньше привела бы к ошибке:
    fn main() {
        let xs = [0; 34];
        println!("{:?}", xs);
    }
  • Обеспечен вывод более коротких трассировок (backtrace), выводимых при внештатных ситуациях. Из трассировки исключены элементы, не представляющие интереса в большинстве ситуаций, но захламляющие вывод и отвлекающие внимание от первичных причин проблемы. Для возвращения полной трассировки можно использовать переменную окружения «RUST_BACKTRACE=full». Например, для кода
    fn main() {
        panic!();
    }

раньше выводилась трассировка в 23 этапа, а теперь она будет сведена к 3 этапам, позволяющим сразу уловить суть:

thread 'main' panicked at 'explicit panic', src/main.rs:2:5
    stack backtrace:
       0: std::panicking::begin_panic
                 at /rustc/d...d75a/library/std/src/panicking.rs:497
       1: playground::main
                 at ./src/main.rs:2
       2: core::ops::function::FnOnce::call_once
                 at /rustc/d...d75a/library/core/src/ops/function.rs:227
  • Компилятор rustc обновлён до сборки с использованием LLVM 11 (Rust использует LLVM в качестве бэкенда для генерации кода). При этом сохранена возможность сборки со старыми LLVM, вплоть до версии 8, но по умолчанию (в rust-lang/llvm-project) теперь используется LLVM 11. Релиз LLVM 11 ожидается в ближайшие дни.
  • На платформе Windows в компиляторе rustc обеспечена поддержка включения проверок целостности потока выполнения (Control Flow Guard), активируемых при помощи флага «-C control-flow-guard». На других платформах данный флаг пока игнорируется.
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы Ident::new_raw, Range::is_empty, RangeInclusive::is_empty, Result::as_deref, Result::as_deref_mut, Vec::leak, pointer::offset_from, f32::TAU и f64::TAU.
  • Признак «const», определяющий возможность использования в любом контексте вместо констант, применён в методах:
    • new для всех целых, отличных от нуля;
    • checked_add, checked_sub, checked_mul,checked_neg, checked_shl, checked_shr, saturating_add, saturating_sub и saturating_mul для всех целых;
    • is_ascii_alphabetic, is_ascii_uppercase, is_ascii_lowercase, is_ascii_alphanumeric, is_ascii_digit, is_ascii_hexdigit, is_ascii_punctuation, is_ascii_graphic, is_ascii_whitespace и is_ascii_control для типов char и u8.
  • Для FreeBSD задействован инструментарий из FreeBSD 11.4 (FreeBSD 10 не поддерживает LLVM 11).

Взято с opennet.ru

>>> Подробности

★★

Проверено: Shaman007 ()
Последнее исправление: CYB3R (всего исправлений: 2)

Ответ на: комментарий от fsb4000

Человек с опенета старался, делал новость — зачем нивелировать чужой труд, наоборот надо «зараспространить среди жильцов».

MaxPower ★★
() автор топика

таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п.

Это все таки каким загнанным манагерами и дедлайнами нужно быть чтобы совершать такие ошибки. Я тут не сколько про Раст а просто не понимаю, вот пишу на ++ уже 3й год, до этого на Си писал, ну бывает во время разработки ошибки - но именно перечисленные это прям редкость чтобы именно так ошибаться в своём коде (или чужом, но когда используешь чужой код как клиент, то тоже все же по интерфейсам понятно, и если код (либа) протестена - то как можно ошибиться с этим типом ошибок как клиент - не понятно), и уж точно такие азбучные ошибки как разыменование нула, обращение после освобождения в продакшене не реальны. А ведь даже Майкрософт и Гугол, где программеры вероятно получше меня - говорят что это одни из самых частых ошибок. Что я делаю «не так» хз. Вероятно мне просто везет с менеджментом, и я даже забыл что такое дедлайн, поэтому есть время делать внимательно. Поэтому азбучных грубых ошибок как описано выше не бывает, в основном бывают логические ошибки, которые потом конечно вычищаешь в отладке - но Руст от таких вряд ли помогает :)

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

языка системного программирования

Может, чтобы называть язык системным, на нём должно быть написано что-то посерьёзней чем клоны coreutils и grep со вкусом смузи? Пока это скорее язык трейдеров криптовалютой, судя по вакансиям.

Не выделываться бы и называть вещи своими именами — «язык общего назначения», системных языков в дикой природе сегодня два.

WitcherGeralt ★★
()

Ну, все. Докатились до копипасты с опеннета.

gill_beits ★★★★
()

наш избавитель от сишных дыр

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

Не удивлюсь, если и на джаваскрипте написали.

Вот когда Redux станет чем-то большим чем просто игрушечная операционка для запуска в виртуалке на 10 минут по фану, тогда посмотрим. Если ты про него. Но там микроядро вообще-то, и на расте вообще всё написано, а не только ядро.

На самом деле, в этом плане интересней Google Fuchsia, но ядро там на сабсете плюсов.

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

Его создали для движка браузера, а системщину на нём пишет примерно никто.

Давай его языком для фронтенда называть? А чо, есть же wasm.

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

Хороший язык. Одобряем-с.

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

Я примерно так же непонимаю фанатов nonnull. У меня в жаве нпе нет. А если и есть то по делу. А они готовы целый язык родить и потом бороться с системой типов. А мне и так норм.

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

Его создали для движка браузера

Пруфцы в студию

Давай его языком для фронтенда называть?

Ты ждешь моего разрешения? Великодушно разрешаю, не благодари.

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

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

Большинство вообще на питоне и JS пишут и не жужжат. А я в ста строках на питоне 10 ошибок делаю. Не могу я без статической типизации.

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

Не удивлюсь, если и на джаваскрипте написали.

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

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

А если ос в браузере?

Это не ОС, а в лучшем случае визуальное подражание. ОС должна работать на железе.

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

На JavaScript принципиально нельзя написать ОС

Не надо путать реализацию и сам язык Javascript ® Oracle

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

Не надо путать реализацию и сам язык Javascript ® Oracle

Как в «самом языке Javascript ®» обращаться к памяти по численному адресу, встраивать ассемблер и т.д.? На JavaScript даже его рантайм написать нельзя.

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

Как в «самом языке Javascript ®» обращаться к памяти, встраивать ассемблер и т.д.?

А как это делают в других языках? Через расширение языка.

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

А как это делают в других языках?

Си/C++ умеет обращаться по адресу и линковаться с исходниками на ассемблере без всяких расширений. Рантайм Си вполне можно написать на чистом Си.

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

Ты ошибаешься, для микроконтроллеров пишут же. Транспиляция как минимум.

Скорее всего там рантайм и виртуальная машина на Си.

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

А если реализовать API браущера в железе, лол?

Не поможет. Для работы JavaScript нужен рантайм, который невозможно написать на JavaScript. Да и на чём делать этот API? На Verilog/VHDL?

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

Си/C++ умеет обращаться по адресу

Обращение к памяти по численному адресу - это UB.

Рантайм Си вполне можно написать на чистом Си.

вполне можно

Есть одна неразрешимая проблема (курицы и яйца) - чтобы собрать компилятор нужен другой компилятор.

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

Обращение к памяти по численному адресу - это UB.

Ссылка на место в стандарте в студию.

Есть одна неразрешимая проблема (курицы и яйца) - чтобы собрать компилятор нужен другой компилятор.

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

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

Ты до формулировки докопался. Хз чего там изначальный автор хотел, а Мозилла его для Servo подхватила. Без этого никто бы о нём никогда не узнал.

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

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

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

Ну по этому критерию и борщелисп можно системным назвать.

Он в статический машинный код компилироваться умеет?

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

Он в статический машинный код компилироваться умеет?

всё что угодно умеет. Если даже Python может давать отдельный .exe файл без зависимостей. Чем другие языки хуже?

fsb4000 ★★★★★
()

Ясно.

Не нужное. Есть Сишечка, есть Гошечка, и Ада.

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

И поэтому его нельзя назвать системным? На нем нельзя писать драйвера и ядра просто потому что его Мозилла для какой-то сервы подхватила?

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

всё что угодно умеет.

Нет, не умеет.

Если даже Python может давать отдельный .exe файл без зависимостей.

…со встроенным рантаймом на Си.

Чем другие языки хуже?

Тем, что не умеют компилироваться в статический машинный код и обращаться по числовому адресу в памяти. C, C++, Pascal, Oberon, Go, Rust пригодны для системного программирования, а JavaScript, Python, Ruby, Perl, Bash - нет.

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

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

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

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

Есть PyPy.

The PyPy project has developed a toolchain that analyzes RPython code and translates it into a form of byte code, together with an interpreter written in the C programming language.

Fail.

X512 ★★★★★
()

Это первый язык на моей памяти, который из каждой щели вопит «системный». Туториалы, доки, новости, блоги — везде «системный». Если это не секта, то что такое секта?

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

На нем нельзя писать драйвера и ядра просто потому что его Мозилла для какой-то сервы подхватила?

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

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

Для си

6.3.2.3

An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.

Как минимум, это зависит от реализации. При этом практически любой шаг, отличный от получения этого адреса от созданного средствами языка объекта, - неопредленное поведение (неправильное выравнивание; обращение к объекту не того типа, что был записан и тд).

unsigned int* deadbeaf = 0xdeadbeaf;

Это запись не на языке СИ, а на конкретной реализации языка.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.