LINUX.ORG.RU

Rust 1.12

 


1

6

Команда разработчиков Rust рада представить релиз Rust 1.12 — системного языка программирования, нацеленного на безопасную работу с памятью, скорость и параллельное выполнение кода. В этот релиз вошёл 1361 патч.

Новое в 1.12

По словам разработчиков, релиз 1.12 является, возможно, самым значительным с момента выпуска релиза 1.0. Самое заметное для пользователей изменение в версии 1.12 — это новый формат ошибок, выдаваемых rustc. Сообществом была проделана многочасовая работа по переводу вывода ошибок на новый формат. Кроме того, для лучшей интеграции и взаимодействия со средой разработки и другим инструментарием ошибки теперь можно выводить в формате JSON при помощи специального флага --error-format=json.

Самое большое внутреннее изменение — это переход на новый формат внутреннего представления программы MIR. Незаметное сегодня, это изменение открывает путь к череде будущих оптимизаций компилятора, и для некоторых кодовых баз оно уже показывает улучшения времени компиляции и уменьшение размера кода. Переход на MIR открывает ранее сложнодоступные возможности анализа и оптимизации. Первое из многочисленных грядущих изменений — переписывание прохода, генерирующего промежуточное представление LLVM, того, что rustc называет «трансляцией». После многомесячных усилий новый бэкенд, основанный на MIR, доказал, что готов к реальной работе. MIR содержит точную информацию о потоке управления программы, поэтому компилятор точно знает, перемещены типы или нет. Это значит, что он статически получает информацию о том, нужно ли выполнять деструктор значения. В случаях, когда значение может быть перемещено или не перемещено в конце области действия, компилятор просто использует флаг из одного бита на стеке, что, в свою очередь, проще для оптимизации проходов в LLVM. Конечный результат — уменьшенный объем работы компилятора и менее раздутый код во время исполнения.

Другие улучшения:

  • Множество мелких улучшений документации.
  • rustc теперь поддерживает три новые цели MUSL на платформе ARM: arm-unknown-linux-musleabi, arm-unknown-linux-musleabihf и armv7-unknown-linux-musleabihf. Эти цели поддерживают статически скомпонованные бинарные файлы. Однако, в собранном виде они пока не распространяются.
  • Повышена читабельность описаний ошибок в ссылках и неизвестных числовых типах.
  • Компилятор теперь может быть собран с LLVM 3.9.
  • Тестовые бинарные файлы теперь поддерживают аргумент --test-threads для указания количества потоков для запуска тестов, который действует точно так же, как переменная окружения RUST_TEST_THREADS.
  • В случае продолжительности выполнения тестов больше минуты показывается предупреждение.
  • Вместе с выпусками Rust теперь доступны пакеты с исходными кодами, которые можно установить при помощи rustup через команду % rustup component add rust-src. Исходные коды могут быть использованы для интеграции и взаимодействия со средой разработки и другим инструментарием.
  • Ускорено обновление индекса реестра.
  • cargo new получил флаг --lib.
  • Добавлен вывод профиля сборки (release/debug) после компиляции.
  • cargo publish получил флаг --dry-run.
  • Сокеты на Linux в подпроцессах теперь закрываются правильно через вызов SOCK_CLOEXEC.
  • Определения Unicode обновлены до 9.0.

Стабилизация библиотек:

  • Cell::as_ptr и RefCell::as_ptr.
  • IpAddr, Ivp4Addr и Ipv6Addr получили несколько новых методов.
  • LinkedList и VecDeque теперь имеют новый метод contains.
  • iter::Product и iter::Sum.
  • Option реализует From для содержащегося в нём типа.
  • Cell, RefCell и UnsafeCell реализует From для содержащихся в них типах.
  • Cow<str> реализует FromIterator для char, &str и String.
  • String реализует AddAssign.

Возможности Cargo

Самая большая возможность, добавленная в Cargo в этом цикле — «рабочие области». Описанные в RFC 1525, рабочие области позволяют группе пакетов разделять один общий файл Cargo.lock. Это позволяет намного легче придерживаться единственной версии общих зависимостей при наличии у вас проекта, который делится на несколько пакетов. Для включения этой возможности в большинстве мультипакетных проектов достаточно добавить одну единственную строчку [workspace] в Cargo.toml верхнего уровня, более сложным установкам может потребоваться дополнительная настройка.

Другая существенная возможность — переопределение источника пакета. При помощи инструментов cargo-vendor и cargo-local-registry можно переопределять зависимости локально (vendoring). Со временем это станет фундаментом для построения инфраструктуры зеркал crates.io.

>>> Подробный список изменений

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

★★★★★

Проверено: Falcon-peregrinus ()
Последнее исправление: Falcon-peregrinus (всего исправлений: 10)
Ответ на: комментарий от anonymous

А так же это синтаксически буквально в 10 раз более убогий язык.

Синтаксис не количественная величина, а качественная. В Golang всё отлично с этим.

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

В Golang всё отлично с этим.

Смею несогласиться с тем, что копипаста, кодогенерация и тонны лапши, как следствие, полное несоответствие DRY и вытекающие из этого проблемы — отлично.

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

Это первый качественный, а не количественный ответ гофера на этот арнумент. Но у Go тем не менее синтаксис богаче не становится.

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

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

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

меня от %langname% отпугивает тот факт, что написанное на этом языке можно переиспользовать только в этом языке. Скажем, нааисал я клевую либу на %langname%, а что если завтра полюблю %otherlangname%? Переписывать эту либу на %otherlangname%? Какое бездарное повышение энтропии вселенной!

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

Не стыдно такое про %langname% писать?

Откуда Вы все беретесь? Поколение реддита, блджад.

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

Специально для нас придумали Vala и gobject-intospection.

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

копипаста, кодогенерация и тонны лапши, как следствие, полное несоответствие DRY и вытекающие из этого проблемы — отлично.

Так generics и templates это кодогенерация в виде тонн лапши.
Генерация контейнеров по типам данных?
В Go встроенный тип Map:

map[string]int // массив чисел, индексация строками
map[*T]struct{ x, y float64 } // массив структур, индекс указатель на T
map[string]interface{} // массив любых типов(пустой интерфейс), индекс строками

Функции наверно лучше обобщать интерфейсами(duck typing).
Код Go производит впечатление обратное «лапше».

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

меня от го отпугивает тот факт, что написанное на этом языке можно переиспользовать только в этом языке.

Уже больше года как эта возможность появилась. Go 1.5 Release Notes (19.08.2015):

Linker

[...]

There are several other changes. The most significant is the addition of a -buildmode option that expands the style of linking; it now supports situations such as building shared libraries and allowing other languages to call into Go libraries. Some of these were outlined in a design document.

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

Так generics и templates это кодогенерация в виде тонн лапши.

Дык, эта лапша останется под капотом, в отличии от генерённой.

В Go встроенный тип Map:

А если захочется чего-то другого?

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

...и верно это для всех языков, кроме C...

не, серьёзно. до сих пор что-то никто не понимает, что крутизна C-либ не только в том, что быстрое, а ещё в том, что напишут к ним 20 биндингов и всё, оно везде, на всех языках. ради чего и небезопасность терпят...

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

до сих пор что-то никто не понимает, что крутизна C-либ

В самом Си нет крутизны - устаревший убогий язычок.

напишут к ним 20 биндингов и всё, оно везде, на всех языках. ради чего и небезопасность терпят...

А говорить, что либы на Си круты потому, что у них относительно простой ABI - это оскорбление авторам либ.

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

В туевой хуче компилируемых языков можно экспортировать си-совместимый API. Даже в Go.
И хоть обмажься биндингами.

P.S. А если писать на Vala, они еще и сами сгенерятся

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

я к тому, что на какой-нить яве это хрен сделаешь...

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

а где сама туева хуча компилируемых языков-то? Vala, D, Rust, Go... из этих вроде Go более-менее популярный... а что-то менее экзотическое есть? так чтобы на нём реально писали.

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

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

а то именно так и получается, что из всех компилируемых языков всё равно пишут только на C и C++, и в порядке эксперимента на других...

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

А чего ты ждал? Что все ломанутся переписывать 30-летнее легаси на Rust и Go просто так, лол?
Ты говорил про крутость си в написании библиотек в плане простоты прикручивания биндингов. Я тебе ответил, что этим преимуществом обладает почти любой из компилируемых языков.
При чем тут кто на чем пишет энтерпрайз?

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

дык «почти любой из туевой кучи». а где куча-то? если в итоге пишут только на C и C++. куча это когда много популярных...

да и 30-летнее легаси-то ладно. но хоть бы новьё какое-то писали. не мешает же никакое легаси в вебе существовать зоопарку всяких руби и питонов и ещё новым появляться

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

«почти любой из туевой кучи». а где куча-то?

То есть ты все таки согласен, что биндинги — не уберфича Си?

если в итоге пишут только на C и C++

Кто?

куча это когда много популярных...

Все, что ты перечислил, включая Rust и Go — популярные языки.

но хоть бы новьё какое-то писали

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

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

да конечно согласен (хотя... если выбирать из популярных - то хз), правда что в go можно c abi делать, не знал (там прозрачно? а C-шные либы прозрачно можно юзать? без написания биндингов?)

гм. ну крупные/популярные проекты есть на этих языках? на Go видел. на Vala по идее какие-то Gtk'шные проекты должны быть, другое дело что тоже что из этого крупного? на Rust пока только Servo вроде из известного, для него и сделан. а на D? что-то есть вообще?

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

короче чо-то попиливают, но дикой популярностью не пахнет

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