Как стать автором
Поиск
Написать публикацию
Обновить

Rust 1.84: новый релиз отличного языка программирования. Еще лучше, еще эффективнее, как всегда

Время на прочтение6 мин
Количество просмотров13K
Всего голосов 52: ↑50 и ↓2+62
Комментарии22

Комментарии 22

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

А это во всех языках так со временем происходит. И какие-то крупные релизы обычно с появлением новых подходов, либо популяризации старых. Например в JS классы не сразу завезли, потому что сообщество начало требовать сильно позже, и забавно что сейчас наоборот откат от этого, а классы стали структурами по сути. В Ruby иммутабельность немного завезли, потому что популярно стало. Dart убрал поддержку null потому что сейчас считается что правильно без него жить. Ну и Rust не сразу асинхронность принял, хоть и было заложено, не обязательная штука, но для веба это ключевой подход. На фоне раста, вероятно, где-нибудь тоже добавят времена жизни и буст скорости, для части кода. Но пока из прям грандиозных вещей как раз и было изобретение времен жизни, ну и в функциональное программирование перекос произошел. Сложно за всех конечно говорить, может где-то что-то фундаментально крутое появилось, но что-то не очень слышно, так что, похоже, нечего супер крутого особо нести в язык. Не придумали новенького ещё.

С++ до сих пор бурлит, хотя гораздо старше чем Rust:) Рефлексия к примеру.

Бурлит не потому ли, что догоняет другие языки? Как догонит, так сразу тоже начнёт застаиваться.

Не то чтобы бурлит - так, побулькивает. Ту же рефлексию с 2017 года ждут.

1997

С++ до сих пор бурлит

Отличный повод держаться от него подальше 😀

Dart убрал поддержку null

Что под этим подразумевается? В dart null присутсвует в виде null-safety

Почти наверняка null coalesсing, когда значение неявно (а может и явно) превращается в опционал и в месте использования разворачивается через элвис оператор. А если забыть, то оно тебе ругнётся на несовместимые типы. Хотя не знаю как обстоят дела со строгостью типов в Dart.

В dart переменная должна явно объявляться с типом null, либо совместимым с ним (dynamic). Без этого в неё null-значение положить не получится.

String one  = 'two'; // инициализация обязательна
String? two; // можно сделать потом
String three;
...
three = two; // нельзя
...
// в обоих случаях ниже компилятор без проверки типов не даст возможности присвоить null в не-null
two = one ?? 'empty'
three = two
...
if (two != null) {
  three = two
}

По сути это те же самые опциональные типы.

Есть ещё late, который позволяет объявить переменную без null и без инициализации и инициализировать её позже. Ну и падение в рантайме, если это не сделать. Вот это уже и правда довольно спорное решение в языковом дизайней.

Ну, то есть тот же самый null(ish) coalescing, что и в JS/TS, разве что синтаксис маленько разный.

По сути это те же самые опциональные типы.

Как бы да, но нет. С помощью опциональных типов можно выразить, например Option<Option<T>>, а вот с помощью явного null так сделать нельзя.

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

На выходе - просто можно выражать немного другие идеи.
Первое что в голову пришло - можно выразить:

  1. Пользователь не установил значение

  2. Пользователь указал значение

  3. Пользователь указал явно null

При парсинге ещё может быть полезно для случаев, когда нужно указать, что что-то не удалось спарсить (None) или спарсился null (Some(None). Или чтобы различать ситуации, когда поля в json нет и когда оно явно обозначено как null без ухода в DOM API.

Да. Допустим, у нас в данных уже есть опциональное поле, и эти данные нужно уметь выборочно патчить. В таком случае приходится каждое поле делать, э-э-э, ещё более опциональным чем было.

Иными словами:

  • Some(Some(foo)) - команда "установи атрибут в значение foo"

  • Some(None) - команда "сотри атрибут"

  • None - команда "ничего не делай с атрибутом"

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

В целом Rust старается релизить изменения постепенно, в идеале крупные ещё и по частям (т.к. они часто друг от друга зависит)

сначала проект переводится в Mini-C, где исключены операции с указателями

А в чём смысл? В какой вселенной существует С-программа или библиотека без операций с указателями???

P.S. Нашёл в более точном переводе:

Си-проект в представление на Mini-C, в котором не допускаются арифметические операции с указателями

Но всё равно, нет ни какой разницы что неявно использовать арифметику указателей через arr[-4], что через arr-4.

Поясните, пожалуйста, новичку. И если не затруднит, дайте ссылку на этот самый Mini-C

https://arxiv.org/abs/2412.15042

Взял ссылку отсюда:

https://www.opennet.ru/opennews/art.shtml?num=62550

А статья opennet, видимо, перепост вот этой:

https://www.securitylab.ru/news/555706.php

А так, еще в 2016 году пытались уже транслятор сделать из С в Rust:

https://www.linux.org.ru/news/opensource/12988948?ysclid=m68102ifjl314958842

Зарегистрируйтесь на Хабре, чтобы оставить комментарий