LINUX.ORG.RU

Rust 0.9

 ,


2

7

Сегодня было объявлено о выходе очередной версии Rust — языка программирования, разрабатываемого Mozilla.

Основные изменения:

  • Язык:
    • удален тип float, для чисел с плавающей точкой используются типы f32, f64;
    • добавлена возможность включения экспериментальных фич (feature gating) на уровне crate'ов (атрибут '#[feature(foo)]');
    • managed boxes (@) теперь включаются с помощью атрибута '#[feature(managed_boxes)]' и в будущем будут удалены. Вместо них используются типы Gc и Rc;
    • '@mut' удален, вместо него используется тип 'std::cell::{Cell, RefCell}';
    • для возврата в начало цикла используется ключевое слово 'continue' вместо 'loop';
    • запрещено изменение строк через индексацию;
    • новый синтаксис для создания raw-строк ('r"foo"'). Также можно создать raw-строку с помощью совпадающих хэш-разделителей 'r###«foo»###';
    • тип '~fn' теперь пишется как 'proc (args) -> retval { ... }' и может вызываться только однажды;
    • тип '&fn' теперь пишется как '|args| -> ret';
    • тип '@fn' удален;
    • ключевое слово 'do' теперь работает только с procs-лямбдами;
    • одноэлементные tuple-like структуры больше не могут быть разыменованы для получения внутреннего значения. Более полное решение для перегрузки оператора разыменования будет предоставлено в будущем;
    • атрибут '#[link(...)]' был заменен атрибутом '#[crate_id = «name#vers»]';
    • пустые реализации (impl) должны прерываться пустыми фигурными скобками, использование ';' для этого запрещено;
    • ключевые слова больше не могут использоваться как lifetime-имена, 'self'-lifetime больше не имеет особого смысла;
    • удален макрос 'fmt!';
    • удалены макросы 'printf!' и 'printfln!', вместо них используются 'print!' и 'println!';
    • pattern matching поддерживает 'mut' ('let (mut x, y) = (1, 2);'
    • вместо синтаксиса 'extern mod foo (name = «bar»)' теперь следует использовать 'extern mod foo = «bar»';
    • новые зарезервированные слова 'alignof', 'offsetof', 'sizeof';
    • макросы могут иметь атрибуты;
    • макрос 'asm!' теперь включается feature-gated атрибутом '#[feature(asm)]';
    • комментарии могут быть вложенными;
    • значения неявно преобразуются к типам trait'ов которые они реализуют (раньше необходимо было явно использовать 'as');
  • Библиотеки:
    • std: API для 'option' и 'result' был переработан для того чтобы сделать его более простым, консистентным и композабельным;
    • std: Полностью заменен модуль 'std::io', включая планировщик. Полностью реализованы File, TCP, UDP, Unix сокеты, именованные каналы и таймеры;
    • std: в модуль 'io::util' добавлены полезные реализации типов 'Reader' и 'Writer', включая 'NullReader', 'NullWriter', 'ZeroReader', 'TeeReader';
    • std: Тип 'extra::rc' перемещен в std;
    • std: Тип 'Gc' в модуле 'gc' заменит тип '@';
    • std: Удален тип 'Either';
    • std: 'fmt::Default' может быть реализован для любого типа с помощью синтаксиса 'format!(«{}», myfoo)';
  • Инструментарий:
    • команды 'rust' и 'rusti' были удалены из-за отсутствия поддержки;
    • 'rustdoc' был полностью переписан;
    • 'rustdoc' может тестировать примеры кода из документации;
    • 'rustpkg' может тестировать пакеты с аргументом 'test';
    • 'rustpkg' поддерживает произвольные зависимости, включая библиотеки на C;
    • улучшен механизм генерации отладочной информации в 'rustc';
    • улучшены сообщения об ошибках для несбалансированных разделителей в 'rustc';
    • удалена поддержка JIT в 'rustc';
    • исполнимые файлы и статические библиотеки могут быть собраны с LTO (ключ '-Z lto');
    • в 'rustc' добавлен флаг '--dep-info' для вывода сообщения зависимостей инструментам сборки.

Детальный обзор изменений с примерами

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

★★★★★

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

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

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

4.2

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

главное чтобы эта проверка корректности — не увеличивала бы сам код :) ..

смотря что ты понимаешь под «увеличение кода», для меня, к примеру, спецификатор const или override - это документация, которую так же понимает и использует компилятор, аналогично интерфейсы, public, private и т.д., убрав это все ты теряешь знания о коде и о том, что хотел сделать автор или ты сам

ато пока декларируешь все эти абстрации-через-абстракции-унаследованные-от-абстракций — появляется куча кода, в котором хорошо бы тоже не ошибиться :-)

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

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

Я не эксперт, я юзер. Я хочу, чтобы б%#@! браузер переходил по стрелочке «назад» НАЗАД а не куда захочет. (нажми на линк «комментарий» и попробуй перейти обратно.

Нажал на «комментарий», нажал в браузере «Назад» - вернулся сюда. P.S. Opera 10.63.

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

строками с поддержкой юникода не через жопу

Ты так говоришь, будто безальтернативный UTF-32 с его оверхедом для [подавляющего] большинства языков — это что-то хорошее.

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

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

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

Так пусть присутствующие в треде любители сабжа определятся наконец

Это не зависит от «присутствующих в треде любителей». Rust проверяет типы на этапе компиляции, а те, кто утверждает обратное - обычные лжецы.

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

в сабже типизация тоже статическая,
делают это в рантайме

Чего ты, блядь, несешь-то вообще? Ты же поехавший.

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

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

А не мог бы наш образованный анонимус рассказать, какие именно ограничения, генерируемые при статической типизации, легче решать в рантайме. Ну и, естественно, что rust решает про типы в run-time.

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

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

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

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

Не совсем понял. LLVM в натив ведь компилит

Да, поэтому расту и не нужен свой велосипед.

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

Судя по более адекватному чарту php каким-то раком даже не первом месте(!) среди сайтов/сервисов сделанных на фреймворках, не беря в рассчет цмс.

Хотя тут вопрос адекватного детектинга бекенд технологии, довольно легко можно понять, что сайт сделан на пэхапэ фреймворке или цмс, в остальных случаях не уверен.

umren ★★★★★
()

Один из жирных минусов еще этого вашего Rust это Compile Time, на больших проектах поведение будет схожим с С++, что является очередным минусом для Rust и плюсом для Go (он компилится в тыщу раз быстрее)

so slow: http://huonw.github.io/isrustfastyet/buildbot/

Regardless of all that, yes, the Rust compiler *is* slower than the Go compiler. Not a factor 25, when you make a fair comparison, but still quite a lot slower. This has two reasons. Firstly, the Go language has partially been designed with compiler speed in mind. It is a simple language,compared to Rust, and thus the compiler simply has to do less work. Secondly, Rob Pike has probably implemented more compilers than all of the Rust team combined, so there's the issue of the Rust compiler simply not being written as cleverly as the Go compiler. This second factor can, and will, be mitigated in the future as the language stabilizes and the compiler gets streamlined further. The first issue means that Rust will probably never compile quite as quickly as Go, because it trades developer ergonomics for compilation time.

so damn slow: https://mail.mozilla.org/pipermail/rust-dev/2012-October/002465.html

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

Go (он компилится в стопицот раз быстрее)

fixed

Кстати, компилятор PHP еще быстрее.

tailgunner ★★★★★
()

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

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

Один из жирных минусов еще этого вашего Rust это Compile Time

Это совершенно бесполезная хар-ка компилятороа, если финальный код работает значительно быстрее.

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

Это совершенно бесполезная хар-ка компилятороа

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

если финальный код работает значительно быстрее.

самое смешное, что он не быстрее, делайте выводы.

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

компилить с утра до обеда

Ты выдаешь свои фобии за реальность.

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

Хедеры, в ржавчине нет хедеров. Там отличная система модулей. Такого ада со скоростью сборки больших проектов, как в С++ с бустом и еще каким говном не будет.

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

Такого ада со скоростью сборки больших проектов, как в С++ с бустом и еще каким говном не будет.

Будут точно так же использоваться generic'и и макросы во все места, будет похожий «ад».

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

Будут точно так же использоваться generic'и и макросы во все места, будет похожий «ад».

Точно так же - не будут. Кроме того, дженерики хранятся уже в виде AST.

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

Почему ненужно? C++ - окаменелое говно с кучей проблем, ад для разработчика, а альтернатив у него особо нет, даже всякие хачкели с лиспами чересчур высокоуровневы, я уж молчу про рантаймо-байткодные языки. Rust пилится именно для низкоуровневого программирования, при этом продуман, защищён от выстрелов в ногу и не тянет за собой древние костыли.

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

Точно так же - не будут. Кроме того, дженерики хранятся уже в виде AST.

Проблема макросов и generic'ов это кодогенерация с последующей оптимизацией под конкретное инстанцирование, а не этап их синтаксического разбота. Закостылить чтение .h можно даже в плюсах через какие-нибудь «precompiled headers», но это симльно погоды не меняет.

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

Проблема макросов и generic'ов это кодогенерация с последующей оптимизацией под конкретное инстанцирование

Это не проблема, а плата за возможности.

Закостылить чтение .h можно даже в плюсах через какие-нибудь «precompiled headers»

Вот именно - закостылить. С кучей неочевидных ограничений.

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

Это не проблема, а плата за возможности.

Ты куда-то уклоняешься в непонятную тему. Факт, что за это приёдтся платить значительно дольшим временем сборки. Существенно уйти от полюсов не получится при такой же степени использовании кодогенерации.

Вот именно - закостылить. С кучей неочевидных ограничений.

Тебе то, как пользователю, какая пичаль? Это проблема разработчиков помпилятора и системы сборки. Отсутствие хедеров ничего хорошего в общем случае не даёт.

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

Факт, что за это приёдтся платить значительно дольшим временем сборки.

Факт, что время компиляции будет бОльшим. Не факт, что намного большим. Особенно если учесть современные техники метапрограммирования на Си++, когда шаблоны используются в качестве языка программирования.

Вот именно - закостылить. С кучей неочевидных ограничений.

Тебе то, как пользователю, какая пичаль?

Неочевидные ограничения выливаются в то, что костыли работают отнюдь не всегда.

Это проблема разработчиков помпилятора и системы сборки.

Эту проблему невозможно решить в рамках Си++. См. статьи по новой модульной системе LLVM.

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

Но вот ведь незадача — в сабже типизация тоже статическая

кстате да. я думаю что это неочень :)

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

anonymous
()

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

GblGbl ★★★★★
()
Последнее исправление: GblGbl (всего исправлений: 2)

Судя по списку изменений, этот язык должен быть монстром похлеще си++.

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

C++ - окаменелое говно с кучей проблем....

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

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

Ещё есть managed pointers (@)

Их в будущем выпилят.

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

рельсы тоже ставят вобще-то, asp.net тоже если вы не в курсе как бы, насчет джанги хз, по другим технологиям точно не знаю.

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

Не ставят, но зато ставят <meta content=«authenticity_token» name=«csrf-param»> поэтому в большинстве случаев (ща глянул все крупные сайты на рельсах там это есть, на всех мелких тем более будет) можно понять, у asp.net тоже что-то там в таком духе.

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

Черт знает, кто там настрочил сотни статей про указатели.

По мне, работа с указателями в ржавчине не особо сложная. Все как в хорошем коде на С++, только компилятор еще проверяет, что ты не накосячил.

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

ozkriff
()

Итак, уважаемые дамы и господа, что мы из этого поняли ? А вот что - Си вечен и замены ему не будет никогда!11

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

Очередной какой-то велик изобрел чувак, то что где-то каналами решается, где-то акторами и прочими абстракциями — у него это решается через зоопарк указателей и каких-то функций в стиле ref/unref тотже malloc/free. Единственное — это заявленное отсутствие рантайма, но на сколько это будет удобно...
Ну и всегда можно написать unsafe{...}.

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

Очередной какой-то велик изобрел чувак, то что где-то каналами решается, где-то акторами и прочими абстракциями — у него это решается через зоопарк указателей и каких-то функций в стиле ref/unref тотже malloc/free.

Ты слишком толст. Тебя нужно меньше кормить, чтобы ты стал тоньше.

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

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

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

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

«каких-то функций в стиле ref/unref тотже malloc/free» - может я проглядел, ээто где там такое было?

«Ну и всегда можно написать unsafe{...}.» - в большой системе всегда будет код, который будет нарушать строгие правила по каким-то адекватным причинам. Его надо или писать как модуль на каком-то другом языке (том же си) или делать такие вот явные опасные блоки. Последнее, по мне, сильно удобнее за счет не сильного усложения языка.

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