LINUX.ORG.RU

Rust 0.7

 ,


1

5

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

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

  • Изменения в языке:
    • квалификатор видимости больше неприменим к 'impl', только к методам;
    • переписан borrow checker, исправлено множество ошибок;
    • параметр 'self' больше не равен неявно `&'self self` и для него может быть явно определено время жизни;
    • перегружаемые составные операторы ('+=' и пр.) были временно удалены из-за ошибок;
    • циклы 'for' теперь требуют 'for'-итераторов, чтобы вернуть 'bool';
    • 'Durable' trait был заменен `'static`;
    • структуры с атрибутом '#[packed]' выравниваются по байтовой границе;
    • параметры типов, привязываемые посредством 'Copy', должны быть явно скопированы с ключевым словом 'copy';
    • 'Option<~T>' сейчас представляется как nullable-указатель;
    • '@mut' делает динамические borrow checks корректно;
    • функция main теперь ищется только на верхнем уровне. Атрибут '#[main]' валиден в любом месте;
    • поля структур больше не могут быть мутабельными, вместо этого используется унаследованная мутабельность;
    • удалены атрибуты '#[no_send]', '#[no_freeze]';
    • неограниченная рекурсия прерывается при достижении лимита, определенного переменной окружения 'RUST_MAX_STACK' (1gb по умолчанию);
    • удален режим 'vecs_implicitly_copyable', векторы никогда не копируются неявно;
    • атрибут '#[static_assert]' выдает assert'ы о статических булевых переменных во время компиляции;
    • 'argument modes' больше не существует;
    • редко используемая инструкция `use mod` удалена.
  • Расширения синтаксиса:
    • 'fail!' и 'assert!' принимают списки аргументов '~str', '&'static str' или 'fmt!';
    • `Encodable`, `Decodable`, `Ord`, `TotalOrd`, `TotalEq`, `DeepClone`, `Rand`, `Zero` и `ToStr` могут быть автоматически выведены посредством директивы `#[deriving(...)]`;
    • макрос `bytes!` возвращает вектор байтов для string, u8, char и численных литералов.
  • Библиотеки:
    • `core` crate был переименован в `std`;
    • `std` crate был переименован в `extra`;
    • расширена и улучшена документация;
    • добавлен модуль std: `iterator` для внешних итераторов (external iterator objects);
    • std: многие итераторы, написанные в старом стиле, были заменены на реализацию 'Iterator';
    • std: многие внутренние векторы и строковые итераторы (включая 'any', 'all и пр.) удалены;
    • std: prelude теперь не реэкспортирует любые модули, только типы и трейты;
    • std: дополнения в Prelude: `print`, `println`, `FromStr`, `ApproxEq`, `Equiv`, `Iterator`, `IteratorUtil`.

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

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

А что разъяснять? Мне не нравится, и все тут

Ну, здесь и правда нечего разъяснять.

Если они позиционируют Rust как язык для системного программирования, зачем, зачем столько разных готовых типов управления памятью?

«Столько» - это 2; и я уже дал ссылку, по которой всё разъясняется.

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

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

А как ее от просто пустой строчки отличить? Дополнительный булевский параметр, да?

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

Как мне сдедать опциональный параметр в виде ссылки?

1. Но зачем? Ссылки тем и хороши, что их проверять не нужно.

2. std::optional (boost::optional).

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

во многих современных языках

Java, Си++ D

сам то понял что сказал, лолка?

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

Круто, но

Ну да. (:

Но eсть буст (а там оно с 2003 года). Да и велосипед свой написать можно, если так уж хочется.

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

Но зачем? Ссылки тем и хороши, что их проверять не нужно.

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

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

во многих современных языках
Java, Си++ D

сам то понял что сказал, лолка?

Да. А ты какое слово не понял?

tailgunner ★★★★★ ()
Ответ на: комментарий от Absurd
#include <iostream>

template<class T>
class maybe_ref {
    T _u;
    T &_t;

public:
    maybe_ref (T &t)
    : _t(t),  is_null(false)
    { /* Just T  */
    }

    maybe_ref (const T &t)
    : _u(t), _t(_u),  is_null(false)
    { /* Just T  */
    }

    maybe_ref ()
    : _t(_u), is_null(true)
    { /* Nothing */
    }

    T& operator()()
    { if (is_null) throw "LOLTWF!"; return _t;
    }

    const bool is_null;
};


void foo (maybe_ref<std::string> s = maybe_ref<std::string>())
{
    if (!s.is_null) {
        s() = "HELLO LOR! LOL!";
    } else {
        std::cout << "NO WAY!" << std::endl;
    }
}

int main (int argc, char *argv[])
{
    std::string s;
    foo ();
    foo (maybe_ref<std::string> (s));
    foo (maybe_ref<std::string> ("Pew pew"));
    std::cout << "And after that: " << s << std::endl;
    return 0;
}

Интереса ради, налабал на коленках. Вроде требованиям удовлетворяет. Лицензия WTFPL. Иксперты доработают, если что.

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

А при помощи какого механизма можно организовать опциональные параметры

В моём сообщении, на которое ты отвечаешь, был и второй пунт. Чем не устраивает?

Ну и начинка стринга всё равно динамическая, значит можно и так:

unique_ptr<string *> foo();
И память вручную удалять не придётся и признак отсутствия результата вернуть можно. Не нравится «новый» unique_ptr - есть auto_ptr и другие варианты.

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

Интереса ради, налабал на коленках. Вроде требованиям удовлетворяет. Лицензия WTFPL. Иксперты доработают, если что.

«Я ожидал что мне порекоммендуют какой-нибудь костыль. Весь ваш CL это один большой костыль» (ц) анонимус про анафорическую лямбду

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

«Я ожидал что мне порекоммендуют какой-нибудь костыль

Дык, стандарные средства ты игнорируешь.

Весь ваш CL это один большой костыль» (ц) анонимус про анафорическую лямбду

А тут разве кто-то на твой (?) CL наезжает?

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

Ну и раз тут всё равно lisp всплыл, то жаль, что макросы нормальные они приделывать не хотят (вроде).

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

Дык, стандарные средства ты игнорируешь.

Мне, если честно, пофигу на подобные мелочи уже лет 10. Есть просто желание лишний раз полить язык который не нравится, и все.

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

Есть просто желание лишний раз полить язык который не нравится, и все.

Ну и чем ты лучше «анонимуса с анафорическими лямбдами»?

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

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

Ну и чем ты лучше «анонимуса с анафорическими лямбдами»?

У него есть ник, который легко запомнить.

tailgunner ★★★★★ ()
-циклы 'for' теперь требуют 'for'-итераторов чтобы вернуть 'bool';
-циклы 'for' теперь требуют, чтобы 'for'-итераторы возвращали 'bool';
sjinks ★★★ ()

Тяжелое наследие С (сделать язык понятным С программистам) еще долго будет отражаться на языках программирования.

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

Есть просто желание лишний раз полить язык который не нравится, и все.

Ну и чем ты лучше «анонимуса с анафорическими лямбдами»?

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

Тот хотя бы смешной.

Ура! Я ее достиг.

Absurd ★★★ ()

Как много всего! И, похоже, они продолжат наращивать количество «фич» в следующих версиях. Не получится ли в итоге как с плюсами, когда каждый использует свои 20% языка? Воистину, less is more.

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

Си был примитивен даже для своего времени, а по сегодняшним меркам он просто убог

тебе должно быть стыдно

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

Си был примитивен даже для своего времени, а по сегодняшним меркам он просто убог

тебе должно быть стыдно

«Правду говорить легко и приятно» (ц)

tailgunner ★★★★★ ()

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

GblGbl ★★★★★ ()

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

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

/me жаждет смерти С. И С++.

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

Мозилла браузерный движок пилит.

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

попробуй снова, ты слишком толст для своих лет.

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

Если они позиционируют Rust как язык для системного программирования, зачем, зачем столько разных готовых типов управления памятью?

потому, что все они удобны и нужны, а дальше их будет еще больше

Мне не нравится, и все тут.

ты на чем пишешь — на gc языках, или на чистом си?

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

Не получится ли в итоге как с плюсами, когда каждый использует свои 20% языка? Воистину, less is more.

то, что в плюсах «каждый использует свои 20% языка» не представляет никакой проблемы (если ты считаешь иначе, напиши)

проблему в плюсах представляет совсем другое — «так не пишите, потому что это опасно, и вот так не пишите, потому что это стиль си, и плохо сочетается с stl, и вот так не пишите вот в этом случае, но именно так пишите в том случае, и ...»

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

Есть просто желание лишний раз полить язык который не нравится, и все.

гы-гы

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

ну например:

int some_function(int i, std::string? optional_parameter) {
  if( optional_parameter ) { // ok
    if( optional_parameter == "foo" ) // ok
      ... 
    if( optional_parameter == "bar" ) // ok
      ... 
  }
  if( optional_parameter == "baz" ) /// не пропускается компилятором
    ...
  ...
}
www_linux_org_ru ★★★★★ ()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от www_linux_org_ru

Есть просто желание лишний раз полить язык который не нравится, и все.

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

Он же ясно сказал - ему не нужен толк, ему нужно излить давнюю фрустрацию.

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

И опять же, фичи на фичах фичами погоняют.

по сравнению с монструозной скалой — вполне приличный язык

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

Он же ясно сказал - ему не нужен толк, ему нужно излить давнюю фрустрацию.

полить (грязью) и излить фрустрацию — это две разных вещи; я считаю, что пока не приведен рисунок «даже так и то лучше, чем в с++», задача «полить грязью с++» не выполнена

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

полить (грязью) и излить фрустрацию — это две разных вещи

Ну как же... при изливании фрустрации что-то изливается, и персонаж старается, чтобы это «что-то» вылилось на Си++.

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

при изливании фрустрации что-то изливается, и персонаж старается, чтобы это «что-то» вылилось на Си++

совершенно верно, поэтому не исключен вариант, когда это «что-то» вылилось, но вылилось *мимо* с++ и бесследно растворилось в окружающей среде; поскольку персонаж хотел «полить» именно «язык который не нравится», а не окружающую среду, то я пытаюсь помочь ему в его намерении, подсказывая конкретный способ повышения точности поливания, вот!

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

То-то я смотрю, фф на всех платформах снова стал жутко тормозить и жрать память.

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

То-то я смотрю, фф на всех платформах снова стал жутко тормозить и жрать память.

В этом, конечно, виноват Rust!!11

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

при изливании фрустрации что-то изливается, и персонаж старается, чтобы это «что-то» вылилось на Си++.

А с какой целью некоторые просиживают штаны на ЛОРе изображая из себя строгого но справедливого школьного учителя средних лет из советского кино или премудрого Гэндальфа с бородой, подовляющего разных неразумных истеричек?

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

подсказывая конкретный способ повышения точности поливания, вот!

Обычно проблемы бывают не со своим кодом, а с тем с которым надо интегрироваться. Дали вот например задание интегрировать систуму мониторинга здоровья несущих конструкций здания с какой-то скадой у которой есть некое API. А оно при ближайшем рассмотрении оказывается смесью MFC, ATL и STL и boost. Естественно, этот код на гипотетический «более лучший» С++ никто переписывать не станет. А если станет, то к списку задействованных технологий прибавится еще и рантайм этого нового языка. Так и живем.

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

подовляющего разных неразумных истеричек?

Тебя подавишь, как же. Но потроллить можно %)

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

В этом, конечно, виноват Rust головного мозга

:)

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

я смотрю, фф на всех платформах снова стал жутко тормозить и жрать память.

В этом, конечно, виноват Rust головного мозга

:)

Кстати, похоже на правду.

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

Кстати, похоже на правду.

я rust воспринимаю как формализацию практик, фактически имеющих место в си, скажем «вот этот указатель у нас уникальный, поэтому давайте про это скажем компилятору, да заодно пусть компилятор сам сделает free этому указателю, когда выйдем из его скоупа»

отчего здесь вдруг жор памяти и тормоза — неясно совсем

ну и вот сравнение с не-simd си: http://pcwalton.github.io/blog/2013/04/18/performance-of-sequential-rust-prog...

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

А оно при ближайшем рассмотрении оказывается смесью MFC, ATL и STL и boost. Естественно, этот код на гипотетический «более лучший» С++ никто переписывать не станет. А если станет,

а еще есть COM-интерфейсы, которые на «более лучший» С++ точно-точно-совсем-вообще переписывать не станут

т.е. сейчас проблема действительно именно интероперабельность разных диалектов, а не сферический Brand New Language в вакууме

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

rust воспринимаю как формализацию практик, фактически имеющих место в си, скажем «вот этот указатель у нас уникальный

Даже не знаю, где в Си ты нашел такие практики. В Rust от Си только фигурные скобки.

отчего здесь вдруг жор памяти и тормоза — неясно совсем

Где «здесь»? Rust не имеет никакого отношения к FF, buddhist как обычно бредит.

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

Даже не знаю, где в Си ты нашел такие практики.

а как иначе можно?

вот скажем нужно посчитать какое-то число (пусть double), для чего нужен массив статически неизвестной длины n, который после подсчета выбрасывается (и пусть длина может быть достаточно велика, чтобы не юзать vla на стеке)

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

И причем тут unique pointers из Rust?

емнип с точки зрения http://pcwalton.github.io/ прямое, он где-то прямо писал о том, что ~ это замена malloc+free, и даже можно вот так:

{
    // an integer allocated on the heap
    let y = ~10;
}
// the destructor frees the heap memory as soon as `y` goes out of scope

но вот я не знаю, можно ли как-то так:

fn f(n: int) -> int {
  let v: ~[int*n];
  ....
  return ....;
}

или так:

fn f(n: int) -> int {
  let v: ~[int] = ~[int*n];
  ....
  return ....;
}
www_linux_org_ru ★★★★★ ()
Ответ на: комментарий от www_linux_org_ru

Еще раз

www_linux_org_ru> формализацию практик, фактически имеющих место в си

Каких еще практик? Освобождения памяти, когда она не нужна?

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

Каких еще практик? Освобождения памяти, когда она не нужна?

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

естественно, тут надо формализовать, что значит «достаточно очевидным образом», вот они в rust-е этим и занимаются — но это уже моя точка зрения

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