[Перевод] Анонс Rust 1.7
Мы рады объявить новую версию Rust, 1.7. Rust — системный язык программирования, нацеленный на безопасную работу с памятью, скорость и параллельное выполнение кода.
Как всегда, вы можете установить Rust 1.7 с соответствующей страницы официального сайта, а также посмотреть подробный список изменений для версии 1.7 на Github. Этот релиз включил в себя 1300 патчей.
Что вошло в стабильную версию 1.7
Этот релиз в основном нацелен на библиотеки. Хотя у нас есть несколько возможностей языка, которые мы готовим для будущих релизов, период, в который была разработана версия 1.7, включал праздники, поэтому люди меньше проводили время в комментариях на GitHub и вместо этого уделяли внимание близким.
Стабилизация библиотек
Примерно 40 библиотечных функций и методов стабилизировано в 1.7. Один из крупнейших стабилизированных API — поддержка пользовательских алгоритмов хэширования в стандартном HashMap
. Раньше все хэш-словари использовали SipHash в качестве алгоритма хэширования, что обеспечивало защиту от DoS-атак по умолчанию. Однако, SipHash не очень быстр при хэшировании маленьких ключей. Алгоритм FNV гораздо быстрее для таких аргументов. Это означает, что изменение алгоритма хэширования для типов вроде HashMap
может дать значительный прирост производительности, если вам
не нужна защита от DoS.
Чтобы увидеть это на примере, вы можете взять контейнер fnv на crates.io и создать HashMap
так:
extern crate fnv;
use std::collections::HashMap;
use std::hash::BuildHasherDefault;
use fnv::FnvHasher;
type MyHasher = BuildHasherDefault;
fn main() {
let mut map: HashMap<_, _, MyHasher> = HashMap::default();
map.insert(1, "Hello");
map.insert(2, ", world!");
println!("{:?}", map);
}
Заметьте, что большую часть времени вам не нужно даже указывать тип хэширующего алгоритма, т.к. сработает вывод типа. HashMap::default()
— всё, что вам нужно, чтобы получить хэширование, работающее в 2 раза быстрее. Также стоит заметить, что типаж Hash
безразличен к конкретному алгоритму хэширования, поэтому никаких изменений в типах, хранимых в HashMap
, не нужно!
Другие заметные улучшения включают:
<[T]>::clone_from_slice()
, эффективный способ копировать данные из одного среза в другой.- Различные методы на
Ipv4Addr
иIpv6Addr
для удобства, вродеis_loopback()
, который возвращаетtrue
илиfalse
в зависимости от того, является ли адрес петлевым (loopback address), как описано в RFC 6890. - Различные улучшения в типе
CString
, используемом в FFI. - Арифметические операции с проверками, с насыщением, или с переполнением. Они не учтены в тех сорока стабилизированных методах, которое мы привели выше. Их очень много, но они все делают одно и то же.
Подробнее смотрите замечания к выпуску.
Возможности Cargo
Сделано несколько небольших изменений в Cargo:
- Сборочные скрипты были [улучшены][improvement to build scripts], и теперь они могут точно информировать Cargo о зависимостях. Благодаря этому они выполняются заново только когда эти файлы изменяются.
- [Изменение подкоманды
cargo rustc
][modification to thecargo rustc
subcommand] позволяет указать профиль, согласно которому должны браться зависимости времени разработки (dev-dependencies) во время тестирования и т.д.
Участники версии 1.7
144 человека участвовало в разработке 1.7. Большое спасибо!
Список участников в 1.7