Rust 1.10

Анонсирована очередная версия языка программирования Rust 1.10, разрабатываемого Mozilla совместно с сообществом.

Улучшения компилятора:

  • Добавлен новый тип крейта cdylib, предназначенный для экспорта C API. Основные отличия от dylib:
    • Отсутствие метаданных;
    • Разрешено LTO;
    • Все библиотеки должны быть статически слинкованы;
    • Экспортируются лишь те символы, которые помечены как extern. Например:
      pub fn foo() {} // не экспортируется
      #[no_mangle] pub extern fn bar() {} // экспортируется
    Для сравнения: «hello world» cdylib занимает 7.2КБ, а dylib — 2.4МБ.
  • Добавлена поддержка платформ i586-unknown-linux-gnu, i686-unknown-linux-musl, и armv7-linux-androideabi;
  • Снижено потребление памяти на ~100МБ при проверке типов;
  • Ускорена проверка T: Sized на 15%;
  • Улучшена кодогенерация при #[derive (Copy, Clone)].

Изменения в стандартной библиотеке:

  • Повышена скорость создания HashMap путем кеширования случайных ключей, используемых для инициализации RandomState. В случае неудачной инициализации при использовании системного вызова getrandom в линуксе случайные значения будут браться из /dev/urandom;
  • iter: Chain: find ускорен в 2 раза;
  • Методы f32.abs_sub () и f64.abs_sub () помечены как deprecated;
  • Реализовано:
    • Default для cell: UnsafeCell, fmt: Error, sync: Condvar, sync: Mutex, sync: RwLock, ffi: CString, ffi: CStr, path: Path;
    • Clone для collections: binary_heap: IntoIter;
    • Display, Hash и ops: Neg для num: Wrapping;
    • From и Into для VecDeque;
    • cmp: Ord и cmp: PartialOrd для cell: Cell и cell: RefCell.
  • Стабилизировано:
    • unix сокеты;
    • <[_]>:: binary_search_by_key;
    • fs: Metadata: modified, fs: Metadata: accessed, fs: Metadata: created;
    • panic: set_hook, panic: take_hook, panic: PanicInfo, panic: PanicInfo: payload, panic: PanicInfo: location, panic: Location, panic: Location: file, panic: Location: line;
    • ffi: CStr: from_bytes_with_nul, ffi: CStr: from_bytes_with_nul_unchecked;
    • collections: BtreeMap: values_mut, collections: HashMap: values_mut.
  • Добавлены конструкторы для weak указателей у Rc и Arc;
  • На unix платформах вместо intrinsics: abort используется libc: abort.

Breaking changes!

  • AtomicBool теперь преобразуется в bool, а не isize. Демонстрация:
    use std::sync::atomic::AtomicBool;
    use std::mem::transmute;
    
    fn main() {
        let foo: bool = unsafe { transmute(AtomicBool::new(true)) };
    }
    
    На старых версиях компилятора будет ошибка;
  • time: Duration: new теперь будет паниковать при переполнении;
  • String: truncate теперь будет паниковать чуть меньше;
  • Небольшое изменение поведения макросов на этапе их парсинга: из : ty и : path следует : block;
  • Исправлен баг, связанный с гигиеной макросов. Следующий код будет валидным в устаревших версиях компилятора:
    fn main() {
        let x = true;
        macro_rules! foo { () => {
            let x = 0;
            macro_rules! bar { () => {x} }
            let _: bool = bar!();
            //^ `bar!()` использует первый `x` (который bool),
            //| а должен использовать второй `x` (который i32).
        }}
        foo! {};
    }
  • Переименование платформ:
    • arm-unknown-linux-gnueabi => arm-unknown-linux-gnu;
    • arm-unknown-linux-gnueabihf => arm-unknown-linux-gnu;
    • armv7-unknown-linux-gnueabihf => armv7-unknown-linux-gnu.
    Другими словами, изменены target_env, применяемые в conditional compilation.

Изменения в менеджере зависимостей Cargo:

  • Добавлен флаг --force, -f для подкоманды cargo install, предназначенной для загрузки исходных текстов из crates.io, их компиляции и установки в каталог ~/.cargo/bin. Это нововведение теперь позволит писать:
    cargo install FOO -f
    вместо:
    cargo uninstall FOO
    cargo install FOO
    Однако всё еще невозможно узнать, а требуется ли обновление вообще?
  • Диагностические сообщения теперь отправляются в stderr, а не в stdout;
  • С помощью флагов cargo doc --bin и cargo doc --lib можно выбрать: генерировать html документацию для проекта-приложения src/main.rs или проекта-библиотеки src/lib.rs;
  • В конфигурационном файле Cargo.toml, который можно встретить в корневом каталоге каждого проекта, теперь можно указать, каким образом макрос panic!() будет завершать приложение: unwind (по умолчанию) или abort;
  • Добавлен флаг cargo --explain FOO, поведение которого идентично rustc --explain FOO: показывает документацию по номеру ошибки;
  • В черный список имен крейтов добавлены ключевые слова раста, такие как fn, unsafe, let и прочее.

 mozilla, rust

©  Linux.org.ru