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)

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

Really what you’d want is each class to implement a ton of tiny interfaces for each aspect of its behaviour. Most of the time you’d just implement all the interfaces from scratch. Occasionally though, you really do want to just override some tiny part, and you would do so through delegation, not inheritance. You’d keep the “base class” as a member, implement all the interfaces you care about (ideally a small subset of the “base class” interfaces), but forward some of them directly to the “base”. Clearly a language could benefit from supporting this kind of delegation strategy directly, to avoid tedious typing

Раст умеет форвардить нереализованные «интерфейсы» к «базовому классу»?

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

Раст умеет форвардить нереализованные «интерфейсы» к «базовому классу»?

Afaik, пока не умеет. https://github.com/contactomorph/rfcs/blob/delegation/text/0000-delegation-of...

И да, с моей колокольни, этого сахара очень не хватает.

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

Есть довольно-таки интересный бенчмарк http-фреймворков. Разработчики Rust написали новую супер-пупер-библиотеку futures, которой от силы 2-3 месяца, на базе которой, в качестве PoC, написали http-фреймворк, который назвали minihttp. Для сравнения взяли другие детища из других платформ и языков, среди которых:

  • rapidoid — на Java, якобы, считается самым быстрым фреймворком
  • Стандартная библиотека http на Go
  • fasthttp — самая быстрая реализация на Go
  • node.js

Результаты можно посмотреть здесь: https://aturon.github.io/blog/2016/08/11/futures/

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

бенчмарк http-фреймворков

«Магистро велемуро штангенциркуль членомеро» проще говоря. Этих «фреймворков» уже 100500 понаписано и все один другого быстрее.

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

Где рефакторинг, отладка, проверка ошибок на лету и т.д?

Рефакторинга, ЕМНИП, ещё нигде нету, а что не так с остальным?

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

Это вообще про любой бенчмарк можно написать.

anonymous
()

Так как я уже понял, что HKT в ближайшие лет 5 ждать не стоит, в этом треде поною про процедурные макросы, non-lexical lifetimes и оператор ?.

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

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

Есть такой прекрасный язык - D. У него издревле был форум, на котором чуть ли не ежедневно выливалась тыща хотелок. Потом всё привели в нормальный вид, DIP, отдельные списки «сделать в этом году» и всё такое. Так вот - DIP-ы висят по 3 года, список «сделать в этом году» кочует уже столько же почти без изменений. Понятно на что я намекаю?

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

Понятно на что я намекаю?

Да, что D никому не нужен.

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

http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=rust&lang2=go

Golang с GC потребляет меньше памяти чем Rust.
Код на Go короче и легче читается.
Оптимизация кода в Go слабее так как не LLVM или GCC.
Rust компилируется намного медленнее даже без оптимизаций.

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

Golang с GC потребляет меньше памяти чем Rust.

Отключаем встроенный jemalloc и получаем почти сишное потребление памяти.

Оптимизация кода в Go слабее так как не LLVM или GCC.
Rust компилируется намного медленнее даже без оптимизаций.

А так же это синтаксически буквально в 10 раз более убогий язык. Можно сравнить например скорость компиляции явы со скалой, как думаешь, в чём там подвох?

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

Красота, а где можно глянуть какие RFC приняты, какие нет, количество голосов итд?
Было бы неплохо иметь такой сахар

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

Красота, а где можно глянуть какие RFC приняты, какие нет

https://github.com/rust-lang/rfcs/pulls

Кроме того, разработчики языка активно общаются на https://internals.rust-lang.org

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

Есть наш православный Си! Зачем все остальное?

Недовбросил. Поди подбери и попробуй еще разок.

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

Где рефакторинг, отладка, проверка ошибок на лету и т.д?

Возьми Vim и обмажь плагинами по вкусу

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

Гунь, ты бы хоть посмотрел, кто это пишет, и откуда ноги растут: http://www.hashmismatch.net/pragmatic-bare-metal-rust/

Проект, - баян, к тому же это обертка над FreeRTOS для рустеров, а не переписывание последней на этом вашем «безопасном».

С таким же успехом можно завернуть вам немножко бугурта через FFI.

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

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

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

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

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

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

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

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

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

Такой вопрос. Какое есть адекватное решение сделать дефолтную реализацию некоторых методов для трейта. Хотелось бы получить нечто похожее на абстрактные классы из c++

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

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

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

node.js

Он тормоз по умолчанию. Ничего удивительного.

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

Ну хз, мне хватает обычного редактора для rust (внезапно VSCode, много что перепробовал).
Есть даже отладка более-менее вменяемая, но не особо удобная по причине неумения в растовскую специфику вроде ZDT.
Но она нужна реально очень редко — все косяки, к которым реально нужен дебаггер статически отлавливаются еще на этапе компиляции, остальные вычитываются / дебажатся «алертами».
Последний раз юзал, когда писал свои реализации коллекций с ансейфом

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

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

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

Какой объем проекта? Сколько внешних зависимостей? Дополнение крейтов из зависимостей - самая большая боль.

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

Какой объем проекта?

< 5000 SLOC

Сколько внешних зависимостей?

diesel-rs

Дополнение крейтов из зависимостей - самая большая боль.

Натравил racer на ~/.cargo, нормально перемалывает (после первой сборки и резолва зависимостей, конечно)

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

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

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

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

5000 SLOC

У меня ~14. Без нормальной IDE уже тяжеловато.

Модерн с обмазыванием C++14 STL или с ручным управлением памятью?

При чём тут C++? Тем не менее? я пишу на С++11/Qt с QSharedDataPointer. STL не перевариваю.

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

Я к тому что C++ бывает разный и разница в шансе поломать память неверным движением руки. А там дебаггер уже обычно нужен

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

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

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

А дебаггер сильно спасает когда нужно написать что-то использующее хотя бы пару потоков?

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

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

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

Энтузиазм угас, походу. Учитывая, что писало пару человек.

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

Ну вот там как раз пара человек, несмотря на то, что это «collaborative effort». Не спас их раст.

The kernel code was getting increasingly messy to the point where only the original writer would be able to find and fix bugs. Fortunately, the kernel of Redox is relatively small and such a project is estimated to take only a few months.

Написали кривое поделие, теперь переписывают))

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

Их с таким подходом не спас бы вообще ни один язык.

anonymous
()
Ответ на: комментарий от 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)
Ответ на: комментарий от tailgunner

Пока что у меня создается впечатление, что rust не слишком подходит для написания чего-то сложнее небольшой специализированной библиотечки. Из-за отсутствия полноценной (а не для галочки) поддержки ООП. При этом, даже без такой полноценной поддержки, он уже становится монструозен...

Ну а что касается системного программирования, то, видимо, преимущества Rust по сравнению с C по большей части мнимые.

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

Пока что у меня создается впечатление, что rust не слишком подходит для написания чего-то сложнее небольшой специализированной библиотечки.

Создается впечатление, что ты мало знаешь о Rust.

Из-за отсутствия полноценной (а не для галочки) поддержки ООП

Да? Странно, что отсутствие «полноценной (а не для галочки) поддержки ООП» не помешало Си.

Ну а что касается системного программирования, то, видимо, преимущества Rust по сравнению с C по большей части мнимые.

Это заключение сделано на основании... чего?

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

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

не слишком подходит для написания чего-то сложнее небольшой специализированной библиотечки

?

преимущества Rust по сравнению с C по большей части мнимые

Лол.

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