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)

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

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

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

В рдавчине функции не ленивые. Логические операторы это особый случай ленивости в таких языках - потому они и операторы, а не просто функции. А вот побитовые операции - это просто синтаксический сахар для, по сути, обычных функий.

Тут же ключевой вопрос в ленивости. Никому, думаю, не было бы нужно, что бы bitor был ленивым.

Я чего-то не понимаю?

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

Это в вас говорит инертность мышления, они не должны быть взаимозаменяемы они и есть

вы совсем упоролись головой.

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

|| - ленивый логический оператор, | - битовый. Почему они должны быть взаимозаменяемыми?

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

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

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

Ядро или драйвер устройства на нем будет сложно реализовать.

Почему? Если что, многозадачный рантайм - это библиотечная фича, он полностью отключаемый.

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

Всюду придётся использовать raw указатели. Например, для двусвязанных списков, очень нужная в вещь в «низкоуровщене». Иначе же их не сделать?

Что там с динамически подгружаемыми .so (.ko) и ABI в целом (vtable, интерфейсы, стек)? Вроде всего этого нет, т.е. реализация будет делать как ей удобно и хз как именно.

Можно ли сделать кастомные аллокаторы под объекты? Типа SLAB, пулы или своя кастомная реализация кучи. Не видно ручек для этого.

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

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

Всюду придётся использовать raw указатели. Например, для двусвязанных списков, очень нужная в вещь в «низкоуровщене».

Всюду? Не придется. В библиотечном типе List - может быть.

Что там с динамически подгружаемыми .so (.ko)

В наличии.

ABI в целом (vtable, интерфейсы, стек)?

vtable определен (естественно), стек сишный, сишный ABI в наличии, про интерфейсы не понял.

реализация будет делать как ей удобно и хз как именно.

В ближайшие несколько лет реализация будет ровно одна, и до появления других реализаций поведение устаканится (или будет тупо стандартизовано текущее поведение).

Можно ли сделать кастомные аллокаторы под объекты? Типа SLAB, пулы или своя кастомная реализация кучи.

Можно, но зачем? Вызывай уже готовые сишные.

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

Детские болезни, не более.

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

Всюду? Не придется. В библиотечном типе List - может быть.

Это скорее как пример был. Есть же ещё множество других структур, всякие там вариации intrusive LL, в тех же деревьях оптимизации в виде ссылок на родительские узлы (да, бывает что очень нужно). Прочие «несистемные» конейнеры-уродцы.

В ближайшие несколько лет реализация будет ровно одна, и до появления других реализаций поведение устаканится (или будет тупо стандартизовано текущее поведение).

Нужно чтобы не поведение устаканилось, а было ABI. Т.е. чтобы другие реализации хотя бы на одной платформе были между собой совместимы. с++, например, так и не дорос до такого состояния. Это к вопросу «детскости».

Можно, но зачем? Вызывай уже готовые сишные.

Готовые «сишные» нужно сначала сделать. Это типа вполне обычные и любымые занятия «системщиков». Не самодостаточное средство на этом поприще мало кому нужно.

Детские болезни, не более.

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

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

Всюду? Не придется. В библиотечном типе List - может быть.

Это скорее как пример был.

А ответ был на всё. Сырые указатели используются в фиксированном числе небольших unsafe-секций для построения статически проверяемых абстракций, вся остальная программа использует построенные абстракции. Это идеология Rust.

Нужно чтобы не поведение устаканилось, а было ABI.

Я уже сказал - ABI есть (минимум 2). Если что, у Rust под капотом LLVM.

Готовые «сишные» нужно сначала сделать.

Мы говорим о написании драйверов, а не ОС. В готовой ОС всё уже сделано, к нему нужно просто получить доступ. И, если нужно, ты можешь сделать всё на Rust... но я уже сказал об этом.

Мозилловцам всё это не нужно, у них задачи прикладные чтобы не писали на счёт ниши rust'а

Мозилловцы в этом помогают. И на Rust уже сделаны proof-of-concept модули для Linux и OS X.

Кроме них навряд ли кто-то будет впрягаться для лечения болезней языка с совсем иной идиоматикой с точки зрения Cи'шного разработчика.

Просто для протокола: они уже впрягаются, и довольно многим это интересно.

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

И можно реализацию тоже подмешать (не только интерфейсы)?

Я не понимаю руби-спик. Трейт может содержать дефолтные реализации операций.

В т.ч. в цепочке наследования?

В Rust нет наследования в смысле ООП.

P.S. http://pcwalton.github.io/blog/2012/08/08/a-gentle-introduction-to-traits-in-... и http://www.rustforrubyists.com/

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

Трейт может содержать дефолтные реализации операций.

Если трейт наследует трейт(ы), которые содержат дефолтную реализацию, то эта реализация так же наследуется?

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

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

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

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

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

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

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

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

про ограничения impl не находил

Одно из них описано по первой ссылке.

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

патамушта так сказале тролли на ЛОР!111

tailgunner ★★★★★
()

Эта Ржавчина. Она же выглядит мягко говоря странно если не сказать уе… Много букв печатать надо.

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

Одно из них описано по первой ссылке.

хм.. точно

impl declarations can appear anywhere in the module that declared the type.

так сказале

Я же вижу чейнджлог..

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

Я же вижу чейнджлог..

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

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

Система типов была совсем другой (синтаксис, кстати, тоже заметно отличался). Где можно найти ранние описания - не знаю (да и интересно это только историкам); немного есть здесь (ключевое слово - typestate): http://bluishcoder.co.nz/2011/03/31/a-quick-look-at-the-rust-programming-lang...

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

Не стоило мне писать глупо вышло в стиле - тред, ссылки не читай сразу отвечай. Меня что смутилов в описании фич например : Concurrency lightweight tasks with message passing, no shared memory

Тот же mmap в коде ядра и драйверов совсем не редкость. Понятно что можно и из rust вызвать его или функции для работы с примитивами синхронизации. На самом деле правильнее сказать что существующие ядра, драйверы никто переделывать на rust не станет. И да я совсем не против языка, просто считаю что как язык для прикладного софта он нужнее и перспективнее (на С ведь тоже куча прикладухи написана), но тут время покажет.

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

Это было бы аргументом если бы можно было написать либо

if (x != 0 || y != 0) { ...
либо
if (x != 0 | y != 0) { ...
И тогда это было бы афигенно, потому что «ленивость» не всегда полезна и является «сахаром» чистой воды.

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

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

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

чересчур простая идеология, я бы даже сказал убогая

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от A-234

либо if (x != 0 | y != 0) { ...

я лично за возможность такой записи, но людям все равно потребуется также и ленивый ||, чтобы была возможность записать if (x != 0 || --y != 0) { ...

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

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

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

чересчур простая идеология, я бы даже сказал убогая

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

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

и еще: ленивый оператор || должен уметь лениво работать не только с boolean, но и с их массивом, т.е. код

uint a = f() ;
uint b = g() ;
uint c = a || h(b) ;
должен быть эквивалентен коду
uint a = f() ;
uint b = g() ;
uint c = (a==0xFFFFFFFF) ? 0xFFFFFFFF : h(b) ;

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

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

че, правда не знаешь?

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

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

правда не знаешь?

Правда.

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

Чего ради? Впрочем, здесь всё есть: http://smallcultfollowing.com/babysteps/

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

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

что касается меня, то я знаю, зачем нужны эти закорючки перед указателями, но, кхм, все же эстетически они мне не нравятся, примерно так же, как и тем, кто тут отписался

(а между тем joe duffy в ms фигачит расширение си-шарп, которое кое-что знает про уникальные (точнее изолированные) указатели, но обходится без лишних закорючек; правда я не могу сказать, что оно умеет все, что и Rust — скорее всего, оно будет послабее Rust-а)

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

joe duffy в ms фигачит расширение си-шарп, которое кое-что знает про уникальные (точнее изолированные) указатели, но обходится без лишних закорючек

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

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

Чего ради?

как чего? чтобы в случае успеха обоснованно сказать «и ты *тоже* ничего не понимаешь», а в случае неудачи задуматься

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

чтобы в случае успеха обоснованно сказать «и ты *тоже* ничего не понимаешь»

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

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

Так и думал. Добра тебе, старый быдлокодер

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

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

есть пейпер, видимо про который джо говорит, что он в языке развил идеи из пейпера http://research.microsoft.com/pubs/170528/msr-tr-2012-79.pdf , и посты в другом блоге https://plus.google.com/ AleksBromfield/posts/SnwtcXUdoyZ

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

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

да, еще есть интервью http://www.infoq.com/articles/Joe-Duffy-Safe-Parallelism, где джо говорит, что unsafe он оставил для себя любимого, и для любимой корпорации:

We have our own equivalent of unsafePerformIO, however we do not allow 3rd parties to use it. Instead, we build safe abstractions like memorization and caches and encapsulate the unsafety.

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

Скажи наконец, что же в этом офигенного.

ну может не совсем офигенно, но вот такой код if( f(x) | g(y) ) потребует синтаксического оверхеда в размере 1 или даже 2 переменных, если у нас имеется только ленивое «или», а функции f и g обладают сайд-эффектами:

auto tmp=g(y);
if( f(x) || tmp )
или даже
auto tmp1=f(x);
auto tmp2=g(y);
if( tmp1 || tmp2 )

1 или 2 зависит от того, будет ли «|» вычислять свои аргументы слева направо, или как попало

www_linux_org_ru ★★★★★
()

Что это за синтаксис в котором задействованы практически все спецсимволы. Намешали худших конструкций из всех языков.

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

Что это за синтаксис в котором задействованы практически все спецсимволы. Намешали худших конструкций из всех языков.

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

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