LINUX.ORG.RU

Rust 1.19

 


3

8

Команда Rust рада объявить о последней версии Rust, 1.19.0. Rust это системный язык программирования, сфокусированный на безопасности, скорости и конкурентном выполнении.

Если у вас установлена предыдущая версия Rust, то получите Rust 1.19, выполнив команду:

$ rustup update stable

В противном случае, вы можете получить rustup с соответствующей страницы на нашем вебсайте и проверить детальные примечания к выпуску для 1.19.0 на Github.

Что нового в 1.19.0 stable

Rust 1.19.0 получил некоторые долгожданные возможности, но для начала примечание для наших пользователей Windows. На Windows Rust полагается на link.exe для линковки, который вы можете получить из “Microsoft Visual C++ Build Tools.” С последним выпуском Visual Studio 2017, структура каталогов для этих инструментов изменилась. Таким образом, чтобы использовать Rust, вы должны придерживаться инструментов 2015 или использовать обходной путь (такой как запуск vcvars.bat). В 1.19.0 rustc теперь знает, как найти инструменты 2017, и они работают без использования обходных путей.

А теперь к новым возможностям! Rust 1.19.0 это первый выпуск, который поддерживает объединения (unions):

union MyUnion {
    f1: u32,
    f2: f32,
}

Объединения это вид перечислений (enums), но в отличие от последних они «непомечены» («untagged»). Перечисления имеют «пометку», которая хранит информацию, какой вариант является правильным в рантайме; объединения игнорируют эту пометку.

Так как мы можем интерпретировать данные, хранящиеся в объединении, используя неправильный вариант, и Rust не может проверить это для нас, это означает, что чтение или запись поля объединения является unsafe:

let u = MyUnion { f1: 1 };

unsafe { u.f1 = 5 };

let value = unsafe { u.f1 };

Сопоставление с образцом также работает:

fn f(u: MyUnion) {
    unsafe {
        match u {
            MyUnion { f1: 10 } => { println!("ten"); }
            MyUnion { f2 } => { println!("{}", f2); }
        }
    }
}

Когда полезны объединения? Одним из основных случаев использования является интероперабельность с Си. C API могут использовать объединения, и во многих областях часто это делают, и с появлением объединений в Rust написание оберток для API подобных библиотек становится значительно проще. Дополнительно, из этого же RFC:

Нативный механизм объединений также упрощает Rust реализации компактных или кэш-эффективных структур, опираясь на представление значения как объединений размерности машинного слова, используя младшие значимые биты выровненных указателей, чтобы различать случаи.

Эту возможность уже давно ждали, и еще больше улучшений на подходе. Сейчас объединения могут только содержать Copy типы и не могут реализовывать Drop. Мы ожидаем снятия этих ограничений в будущем.

Также циклы loop теперь имеют возможность возвращать значение при выходе с break:

// old code
let x;

loop {
    x = 7;
    break;
}

// new code
let x = loop { break 7; };

Rust традиционно позиционируется как «язык, ориентированный на выражения», в котором большинство вещей являются выражениями, вычисляющимися в значения, а не директивами. Раньше loop странно выделялся, так как был директивой.

Что насчет других форм циклов? Здесь еще не всё ясно. Посмотрите этот RFC для ознакомления с некоторыми дискуссиями вокруг открытых вопросов.

Замыкания, которые не захватывают окружение, теперь могут быть приведены к указателю на функцию:

let f: fn(i32) -> i32 = |x| x + 1;


Теперь мы создаем тарболы, сжатые xz, и предоставляем их по умолчанию, уменьшая расход сетевого траффика и тем самым ускоряя процесс загрузки. Тарболы, сжатые gzip, также доступны в случае, например, если вы не можете использовать xz по некоторым соображениям.

Стабилизация стандартной библиотеки

Наибольшей новой библиотечной возможностью являются макросы eprint! и eprintln!. Они работают так же, как и print! и println!, но пишут в стандартный поток ошибок, а не в стандартный поток вывода.

Другие нововведения:

.

И некоторые недавно стабилизированные API:

Смотрите детальные примечания к выпуску для получения более подробной информации.

Cargo

Cargo в основном получил небольшие, но значимые улучшения в данном выпуске. Так, Cargo больше не проверяет локальный рабочий каталог для индекса crates.io. Это должно обеспечить меньший размер файла для реестра и улучшить время клонирования, особенно на машинах Windows.

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

Смотрите детальные примечания к выпуску для получения более подробной информации.

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

★★★★★

Проверено: Shaman007 ()
Последнее исправление: Virtuos86 (всего исправлений: 3)

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

Чем выше уровень языка, тем меньше нужно делать, чтоб добится нужного.

Мне вот, например, нужно что-то посчитать за минимальное время с минимальным расходом памяти. Чтобы бы взять мммм...наговнокодить однострочник на питоне/пыхе/перле? Или начать освоение более прогрессивных технологий с nodejs?
У меня вот тут скрипт был на баше, он ищет слова в исходной строке, если находит заменяет их и выводит все варианты строки с заменой + исходную. Файл на 30к строк + словари на ~1к слов он обрабатывал 4 часа. Баш достаточно высокоуровневый язык, делает то, что мне нужно в 3 цикла, скрипт я наговнякал за 20 минут, но что-то в этой истории мозолит глаз, не так ли?

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

Оптимизировать кусок скриптоты.

Ну, если идти от скриптоты вниз, то конечно проще брать то, у чего получше с абстракциями, но если надо еще ниже?

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

У меня вот тут скрипт был на баше, он ищет слова в исходной строке, если находит заменяет их и выводит все варианты строки с заменой + исходную. Файл на 30к строк + словари на ~1к слов он обрабатывал 4 часа. Баш достаточно высокоуровневый язык, делает то, что мне нужно в 3 цикла, скрипт я наговнякал за 20 минут, но что-то в этой истории мозолит глаз, не так ли?

Как минимум «скрипт я наговнякал за 20 минут». Если правила замены просты(заменять всегда, регулярок нет), файл словарей и файл данных влезают в память с запасом, то можно взять тот же самый rust и реализовать за достаточно малое время, без записи на диск и прочее.

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

Или начать освоение более прогрессивных технологий с nodejs?

Теперь всё понятно - ты сумашедший!

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

Опять же неверно. Я воспеваю не BASIC, хотя современный FreeBASIC действительно куда адекватнее и быстрее многих комплируемых в JIT монстров - я просто сообщаю, констатирую факт того, что в языке BASIC подумали над человекочитаемым синтаксисом, а большинство современных языков писали фрики и нерды, не способные в принципе общаться иначе как на своём птичьем. В BASIC нет никаких операторных скобок типа begin...end - там вообще одни закрывающие скобки без открывающих, и что наиболее важно, закрывающие скобки соответствуют своему оператору, выполняющему блок кода. Если это For - его закроет Next, если Do - то Loop, если Select - то End Select, а не просто «end». Просто end - это когда всё, конец, и такой оператор в BASIC есть, а делает он именно то, что и должен - завершает выполнение программы.

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

Несложно написать препроцессор, который делает из

для i от 10 вниздо 1 цикл
    печать i, " косяков лежало на столе"
конец для

for i in (1...10).rev() {
    prinln!("{i} косяков лежало на столе", i=i);
}

И наслаждаться человекочитаемым синтаксисом.

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

но если надо еще ниже?

Почему нет? что мешает?

Например прошивка для msp430 с таймером и светодиодом на расте занимает 200 байт. Разве это не достаточно низкоуровнево?

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

хотя современный FreeBASIC действительно куда адекватнее и быстрее многих комплируемых в JIT монстров

Это вообще нечто! С одной стороны там вроде не нужно управлять памятью(подсчёт ссылок? gc? примитивное решение как в плюсах(скорее всего)), с другой стороны там вполне себе есть указатели с ручным управлением памятью. Там есть ооп, но при этом весьма странный подход - в классе объявляется только сигнатура метода, тело объявляется уже под классом вне его тела. Там есть макропроцессор с заголовочными файлами. Когда я впервые на него наткнулся - я понял что это по сути тот же c++(или же лучше сказать ++c), но с синтаксисом basic. Зачем это нужно - большой вопрос.

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

Молодец. Так и надо: доказывать свои слова примерами, а достоинства rust'а - отлично работающими программами.

А насчет течки, разумеется и про старуху бывает порнуха, но явление таки редкое. А на твоем примере видно, что редкие и сложные вещи чаще всего реализуются с ошибками (знаю-знаю, и во фряхе есть вложенные джейлы, но я их не видел и не знаю людей, кто видел их).

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

У меня вот тут скрипт был на баше, он ищет слова в исходной строке, если находит заменяет их и выводит все варианты строки с заменой + исходную

ddТак верстают только му

Не делай так больше! Если жизнь заставляет такие вещи делать периодически - тебе надо выучить perl.

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

Ты что, совсем отбитый фанбой? Суть рассказа в том, что удобно, это не значит хорошо и чем круче у тебя абстракции, тем больше чего-то там скрывается внизу.
И, что меня всегда умиляет, так это то, что кроме объекта надрачивания пропадают любые другие инструменты, так тот же скрипт можно делать на perl/python (по вкусу) и получить приемлемый результат, нет, мы будет пихать промышленный язык туда, где он нахрен не нужен.

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

Не делай так больше!

Дык, это ясно, что делать такую задачу лучше на чём угодно другом.

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

Оптимизировать кусок скриптоты проще на rust

Какой скриптоты? Если только совсем что-то простое, какую-нибудь orm завязанную на фишках управляемых яп в принципе геморно переписывать.

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

Ага. Сделайте adt в виде либы.

Не вижу проблем. Язык просто должен иметь инструменты для такого, а не «Привет народ! Мы тут кодили одну штуку и решили, что в новой версии нашего яп не плохо бы запилить следующие фичи: ...». Так он просто обрастёт до read-only.

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

Дык. Это же опенсурс. Мозилла - не Майкрософт, чтобы финансировать портирование на все распространённые платформы. Если основная команда разработчиков не добралась до портирования на нужную платформу - портируй сам.

red75prim ★★★
()

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

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

Но нахрена это делать, если есть компиляторы си под кучу платформ и это вообще первое, что делают, когда платформу создают. Объясните мне, нахрена? Си старый и не модный, давайте сделаем модный молодёжный раст, чтобы не криворукие кодеры не отстреливали себе ноги? Не проще ли тупо сделать интерпретатор в си, со всякими строками, безопасными указателями, красивыми абстракциями и что там вам еще надо? Смысл делать что-то на расте через unsafe и/или танцами с портированием его куда-то, если тоже самое делается на си?

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

Погодите, вы на прошлой странице ругали раст за то, что это говно с GC, а теперь вот предлагаете заменить его какой-нибудь интерпретируемой динамическитипизированной скриптотой с тем же GC или подсчётом ссылок?

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

Очень много негатива, отец. Тебе жалко что ли? Хай развивается Rust. Может что-то новенькое внесёт, чуть-чуть продвинет ремесло программиста вперёд.

anonymous
()

Дабы не плодить лишних тем. Подскажите, будте так добры. Зачем дважды писать <T> в определении impl<T> Point<T> {} ?

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

Зачем дважды писать <T> в определении impl<T> Point<T> {} ?

Вот поэтому:

impl<T1, T2> Point<T2, T1> {}

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

Потому, что первый T - это параметр реализации, второй T - это параметр трейта. Реализация может быть не универсальной (то есть просто impl Point<i32> for MyType), а так же можно использовать параметр как тип, для которого реализуется трейт (то есть, например impl<T> Point<i32> for T). Насчет синтаксиса не 100% уверен.

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

Ты что, совсем отбитый фанбой? Суть рассказа в том, что удобно, это не значит хорошо и чем круче у тебя абстракции, тем больше чего-то там скрывается внизу.

Скрипт в студию. А то наверняка выяснится что в конечном итоге вызывается сишная программа.

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

Не проще ли тупо сделать интерпретатор в си, со всякими строками, безопасными указателями, красивыми абстракциями и что там вам еще надо?

python, lua, js, ruby, ... уже и без тебя существуют.

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

Никак лол. Я обычно делаю так.

typedef struct {
    int union_flag;
    union {
        ...
    } data_field
} SomeStruct;
Ну или какой-то иной способ контекстного различия. Не слишком удобно, но в Си union-ы не для удобства, а для оптимизации.

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

Смысл делать что-то на расте через unsafe и/или танцами с портированием его куда-то, если тоже самое делается на си?

По той же причине по которой делают на C то, что вполне можно сделать на ассемблере. Удобнее.

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

подумали над человекочитаемым синтаксисом

Ну а над всем остальным не подумали. Ноутбуки ты тоже выбираешь по цвету как девочка?

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

А что, нужно сидеть на жеппе и ничего не делать, потому что все уже сделали в gcc? Между прочим большинство фиксов из того треда ушли в LLVM, так что clang их тоже получил, а не только раст.

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

Опять же неверно. Я воспеваю не BASIC, хотя современный FreeBASIC действительно куда адекватнее и быстрее многих комплируемых в JIT монстров - я просто сообщаю, констатирую факт того, что в языке BASIC подумали над человекочитаемым синтаксисом, а большинство современных языков писали фрики и нерды, не способные в принципе общаться иначе как на своём птичьем. В BASIC нет никаких операторных скобок типа begin...end - там вообще одни закрывающие скобки без открывающих, и что наиболее важно, закрывающие скобки соответствуют своему оператору, выполняющему блок кода. Если это For - его закроет Next, если Do - то Loop, если Select - то End Select, а не просто «end». Просто end - это когда всё, конец, и такой оператор в BASIC есть, а делает он именно то, что и должен - завершает выполнение программы.

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

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

Херню несешь ты, а тупой я?

Конечно, это же ЛОР =)

Ещё одной ветке приходит конец, да.

Да

Вообще, моё субъективное ощущение, что Cargo сделали, чтобы не было куевой тучи разных утилит и чтобы не было траха с установкой компонентов\либ. Он покрывает функции NuGet (пакетный менеджер VS), через него можно устанавливать приложения, например, racer, rustsym, rustfmt. Но можно через карго

  • cargo run - собирать\запускать проект
  • cargo check - проверить без сборки
  • cargo test - запускать тесты
  • cargo doc - создавать документацию
  • cargo banch - запускать встроенные бенчи
  • cargo count - собирать статистику по коду из проекта

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

Но вы считаете, что у меня фгм, раз я не называю карго просто менеджером пакетов, збс чё

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

А rust - это что? Компилируемый язык с gc и пятиколёсными велосипедами, чтобы не навернуться? Это можно все было приделать и в тех же плюсах через какие-нибудь либы.

Ваше мнение о Rust ошибочное, по этому Вы и не понимаете куда его можно впихнуть. Например Вы пишите

Компилируемый язык с gc и пятиколёсными велосипедами, чтобы не навернуться?

В Rust нет GC. Там есть RAII и Borrow Checker. Вот по сравнению с ними GC выглядит как пятиколёсный велосипед =) Благодаря отсутствию GC, Rust можно юзать на микроконтроллерах, пруф. Но пока официальной поддержки нет, так что всё бросать и брать Rust для AVR не рекомендую. Но в нашей конторе пилим проект для Linux ARM, полёт нормальный.

По поводу велосипедов укажите конкретно, думаю что их тоже нет.

Это можно все было приделать и в тех же плюсах через какие-нибудь либы.

Можно, 100% согласен. И даже нужно если плюсы Вы уже знаете. Но мне со знанием Delphi и Pure C было проще въехать в Rust, чем в С++. Да и коллеги, которые пишут на С++ утверждают, что Rust более изящен и более простой при тех же возможностях которые есть в С++. Так зачем использовать более сложную альтернативу?!

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

Зачем дважды писать <T> в определении impl<T> Point<T> {}

Затем же, зачем дважды писать имя переменной в цикле

for x in xs {
   foo(x);
}
В скобках после impl параметр объявляется, а в скобках после Point используется.

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

Нельзя реализовать borrow checker как либу на плюсах. Нужна поддержка в компиляторе.

Прошу простить за неточность, я с плюсами поверхностно знаком. Думал они поддерживают в той или иной степени все фишки Rust

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

Вообще-то уже. Цпп коре гайдлайнс + либа gsl + внешний тул для проверки. Куча тайпдефов типа borrow<t*> = t* и аннотации в квадратных скобках для лайфтаймов. Только зачем к и так задумчивому цпп ещё дополнительный проход борроучекера и уродливый синтаксис, если уже раст есть.

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

а теперь вот предлагаете заменить его

Я не предлагаю его замянять на что-то. Я спрашиваю зачем что-то на него заменять.

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

Скрипт в студию. А то наверняка выяснится что в конечном итоге вызывается сишная программа.

На доброй части яп в конечном итоге вызывается so'шка. Вопрос стоит в том, сколько лишней работы делается, чтобы посчитать 1+1.

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

По той же причине по которой делают на C то, что вполне можно сделать на ассемблере. Удобнее.

На асм мало что пишут, потому что компилятор в большинстве случаев лучше код сгенерит + переносимость и абстракция от аппаратной платформы. Си появился потому что асм много чего из этого не мог. Также и управляемый код появился, потому что нативный много чего принципиально не мог.

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

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

+ внешний тул для проверки.

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

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

А что, нужно сидеть на жеппе и ничего не делать, потому что все уже сделали в gcc?

Ну, побочный эффект от деятельности - тоже эффект, спору нет.

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