[#] Rust 1.10
Новостной_робот(mira, 1) — All
2016-07-08 01:00:06


Анонсирована очередная версия языка программирования Rust 1.10, разрабатываемого Mozilla совместно с сообществом.Улучшения компилятора: [ Добавлен ]( https://github.com/rust-lang/rust/pull/33553 ) новый тип крейта 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; [ Снижено ]( https://github.com/rust-lang/rust/pull/33425 ) потребление памяти на ~100МБ при проверке типов; [ Ускорена ]( https://github.com/rust-lang/rust/pull/33138 ) проверка T: [ Sized ]( https://doc.rust-lang.org/std/marker/trait.Sized.html ) на 15%; [ Улучшена ]( https://github.com/rust-lang/rust/pull/31414 ) кодогенерация при #[derive(Copy, Clone)]. Изменения в стандартной библиотеке: [ Повышена ]( https://github.com/rust-lang/rust/pull/33318 ) скорость создания [ HashMap ]( https://doc.rust-lang.org/stable/std/collections/struct.HashMap.html ) путем кеширования случайных ключей, используемых для инициализации [ RandomState ]( https://doc.rust-lang.org/stable/std/collections/hash_map/struct.RandomState.html ) . [ В случае неудачной инициализации ]( https://github.com/rust-lang/rust/pull/33086 ) при использовании системного вызова getrandom в линуксе случайные значения будут браться из /dev/urandom; [ iter::Chain::find ]( https://doc.rust-lang.org/stable/std/iter/struct.Chain.html ) [ ускорен ]( https://github.com/rust-lang/rust/pull/33289 ) в 2 раза; Методы [ f32.abs_sub() ]( https://doc.rust-lang.org/nightly/std/primitive.f32.html#method.abs_sub ) и [ f64.abs_sub() ]( https://doc.rust-lang.org/nightly/std/primitive.f64.html#method.abs_sub ) помечены как deprecated; Реализовано: [ Default ]( https://doc.rust-lang.org/nightly/std/default/trait.Default.html ) для [ cell::UnsafeCell ]( https://doc.rust-lang.org/nightly/std/cell/struct.UnsafeCell.html ) , [ fmt::Error ]( https://doc.rust-lang.org/nightly/std/fmt/struct.Error.html ) , [ sync::Condvar ]( https://doc.rust-lang.org/nightly/std/sync/struct.Condvar.html ) , [ sync::Mutex ]( https://doc.rust-lang.org/nightly/std/sync/struct.Mutex.html ) , [ sync::RwLock ]( https://doc.rust-lang.org/nightly/std/sync/struct.RwLock.html ) , [ ffi::CString ]( https://doc.rust-lang.org/nightly/std/ffi/struct.CString.html ) , [ ffi::CStr ]( https://doc.rust-lang.org/nightly/std/ffi/struct.CStr.html ) , [ path::Path ]( https://doc.rust-lang.org/nightly/std/path/struct.Path.html ) ; [ Clone ]( https://doc.rust-lang.org/nightly/std/clone/trait.Clone.html ) для [ collections::binary_heap::IntoIter ]( https://doc.rust-lang.org/nightly/std/collections/binary_heap/struct.IntoIter.html ) ; [ Display ]( https://doc.rust-lang.org/nightly/std/fmt/trait.Display.html ) , [ Hash ]( https://doc.rust-lang.org/nightly/std/hash/trait.Hash.html ) и [ ops::Neg ]( https://doc.rust-lang.org/nightly/std/ops/trait.Neg.html ) для [ num::Wrapping ]( https://doc.rust-lang.org/nightly/std/num/struct.Wrapping.html ) ; [ From ]( https://doc.rust-lang.org/nightly/std/convert/trait.From.html ) [ Into ]( https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html"Vec/aT> и <a href="https://doc.rust-lang.org/nightly/std/convert/trait.Into.html ) [ VecDeque ]( https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html"Vec/aT> для <a href="https://doc.rust-lang.org/nightly/std/collections/struct.VecDeque.html ) ; [ cmp::Ord ]( https://doc.rust-lang.org/nightly/std/cmp/trait.Ord.html ) и [ cmp::PartialOrd ]( https://doc.rust-lang.org/nightly/std/cmp/trait.PartialOrd.html ) для [ cell::Cell ]( https://doc.rust-lang.org/nightly/std/cell/struct.Cell.html ) и [ cell::RefCell ]( https://doc.rust-lang.org/nightly/std/cell/struct.RefCell.html ) . Стабилизировано: [ unix-сокеты ]( https://doc.rust-lang.org/std/os/unix/net/index.html ) ; [ ::binary_search_by_key ]( https://doc.rust-lang.org/beta/std/primitive.slice.html#method.binary_search_by_key ) ; [ fs::Metadata::modified ]( https://doc.rust-lang.org/std/fs/struct.Metadata.html#method.modified ) , [ fs::Metadata::accessed ]( https://doc.rust-lang.org/std/fs/struct.Metadata.html#method.accessed ) , [ fs::Metadata::created ]( https://doc.rust-lang.org/std/fs/struct.Metadata.html#method.created ) ; [ panic::set_hook ]( https://doc.rust-lang.org/std/panic/fn.set_hook.html ) , [ panic::take_hook ]( https://doc.rust-lang.org/std/panic/fn.take_hook.html ) , [ panic::PanicInfo ]( https://doc.rust-lang.org/std/panic/struct.PanicInfo.html ) , [ panic::PanicInfo::payload ]( https://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.payload ) , [ panic::PanicInfo::location ]( https://doc.rust-lang.org/std/panic/struct.PanicInfo.html#method.location ) , [ panic::Location ]( https://doc.rust-lang.org/std/panic/struct.Location.html ) , [ panic::Location::file ]( https://doc.rust-lang.org/std/panic/struct.Location.html#method.file ) , [ panic::Location::line ]( https://doc.rust-lang.org/std/panic/struct.Location.html#method.line ) ; [ ffi::CStr::from_bytes_with_nul ]( https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul ) , [ ffi::CStr::from_bytes_with_nul_unchecked ]( https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul_unchecked ) ; [ collections::BtreeMap::values_mut ]( https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.values_mut ) , [ collections::HashMap::values_mut ]( https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.values_mut ) . Добавлены конструкторы для weak-указателей у [ Rc ]( https://doc.rust-lang.org/nightly/std/rc/struct.Weak.html#method.new ) и [ Arc ]( https://doc.rust-lang.org/nightly/std/sync/struct.Weak.html ) ; На unix-платформах вместо [ intrinsics::abort ]( https://doc.rust-lang.org/nightly/std/intrinsics/fn.abort.html ) [ используется ]( https://github.com/rust-lang/rust/pull/31457 ) [ libc::abort ]( https://doc.rust-lang.org/nightly/libc/fn.abort.html ) . Breaking changes! [ AtomicBool ]( https://doc.rust-lang.org/nightly/std/sync/atomic/struct.AtomicBool.html ) теперь преобразуется в bool, а не isize. Демонстрация: use std::sync::atomic::AtomicBool; use std::mem::transmute; fn main() { let foo: bool = unsafe { transmute(AtomicBool::new(true)) }; } На старых версиях компилятора будет ошибка; [ time::Duration::new ]( https://doc.rust-lang.org/nightly/std/time/struct.Duration.html#method.new ) теперь [ будет паниковать ]( https://github.com/rust-lang/rust/pull/33072 ) при переполнении; [ String::truncate ]( https://doc.rust-lang.org/nightly/std/string/struct.String.html#method.truncate ) теперь [ будет паниковать ]( https://github.com/rust-lang/rust/pull/32977 ) чуть меньше; [ Небольшое изменение ]( https://github.com/rust-lang/rust/pull/32945 ) поведения макросов на этапе их парсинга: из :ty и :path следует :block; [ Исправлен ]( https://github.com/rust-lang/rust/pull/32923 ) баг, связанный с гигиеной макросов. Следующий код будет валидным в устаревших версиях компилятора: fn main() { let x = true; macro_rules! foo { () => { let x = 0; macro_rules! bar { () => {x} } let _: bool = bar!(); //^ `bar!()` использует первый `x` (который bool), //| а должен использовать второй `x` (который i32). }} foo! {}; } [ Переименование платформ ]( https://github.com/rust-lang/rust/pull/33403 ) :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 ]( https://doc.rust-lang.org/reference.html#conditional-compilation ) . Изменения в менеджере зависимостей Cargo: Добавлен флаг --force, -f для подкоманды cargo install, предназначенной для загрузки исходных текстов из [ crates.io ]( https://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!() ]( https://doc.rust-lang.org/stable/std/macro.panic!.html ) будет завершать приложение: unwind (по умолчанию) или abort; Добавлен флаг cargo --explain FOO, поведение которого идентично rustc --explain FOO: показывает документацию по [ номеру ошибки ]( https://doc.rust-lang.org/error-index.html ) ; В черный список имен крейтов [ добавлены ]( https://github.com/rust-lang/cargo/pull/2707 ) [ ключевые слова раста ]( https://doc.rust-lang.org/grammar.html#keywords ) , такие как fn, unsafe, let и прочее.
Ссылка: http://www.linux.org.ru/news/mozilla/12725798