Вышел rust 0.11.0


    Mozilla и сообщество Rust выпустили новый релиз Rust, версии 0.11.0.

    Несмотря на то, что язык находится в активной фазе разработки, работа была сфокусирована над улучшением системы типов и библиотек. Главная работа была проведена над имплементацией типов с динамическим размером (DST) и рефакторингом стандартной библиотеки.
    В этом релизе также удалили ~ и @ в угоду типам Box и Gc из стандартной библиотеки (компилятор пока знает о этих типах больше чем нужно, но вскоре эти типы станут самыми обычными типами Rust).


    DST, векторы и строки


    Для подготовки к введению типов с динамическим размером (DST, Dynamically sized types), ~str и ~[T] были удалены из языка. Их вернут в виде Box и Box<[T]>, но пока их нет. Их заменили на String и Vec соответственно.

    Vec


    Тип Vec заменяет старый тип ~[T] при этом его производительность улучшилась благодаря оптимизациям LLVM.
    Как и ~[T], Vec может менять размер используя изменяемый указатель. Из него легко получить &mut[T] и &[T]
    .

    String


    По сути это прямая замена ~str. Это тип owned строк по умолчанию, и поддерживает изменения через mut указатель. Этот тип использует Vec и в рантайме гарантирует наличие строки с правильной utf8 кодировкой. Получить &str с него можно используя метод as_slice().

    Тип String входит в prelude и живет в std::string.

    Удаление ~ и @


    Повсеместные указатели ~ и @ были удалены из языка и теперь находятся в библиотеках. Синтаксис вида ~T заменен на Box, и находится в std::owned, а синтаксис вида @T
    был заменен на Gc и находится в std::gc.

    Вместо ~expr
    тепер нужно писать box expr, а вместо @expr тепер box(GC) expr.

    Пока это всего лишь изменение в синтаксисе, но главной целью есть перенос многих фич из компилятора в библиотеки. В месте с этим мы получим упрощенную поддержку компилятора, более простую генерацию документации и более очевидное использование умных указателей Rc и Arc.
    После внедрения DST компилятору не нужно будет специально обрабатывать типы Box<> и Gc<>.

    Фасад "std"


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

    • libcore - ключевая библиотека для Rust. В теории максимально переносимая (у нее нет зависимостей), к примеру она не зависит от libc. Даная библотека хорошо подходит для использования в встроенных устройствах, разработке ядра, или для встраивания Rust в другой язык. libcore не умеет выделять память, поэтому в ней нет векторов и строк з изменяемым размером.
    • liblibc - обертка для libc.
    • liballoc - главный интерфейс для выделения памяти в Rust. В этой библиотеки находятся "умные указатели", такие как, Rc, Arc и Box. Также вся память для Rust выделяется этой библиотекой. Сейчас для этого используется аллокатор jemalloc. Библиотека зависит от liblibc и libcore.
      libcollections - Библиотека предоставляет типы коллекций, такие как vector, strings, maps, linked lists, и тд. Зависит от liballoc и libcore.
      librustrt - Главный компонент рантайма, предоставляет I/O интерфейсы, модель задач, и тд.
      libsync - Библиотека с примитивами синхронизации, и типами для работы с паралельными вычислениями.
      librand - Библиотека с интерфейсом генераторов случайных чисел.


      Явно указывать подключение даных модулей не нужно, стандартная библиотека реэкспортирует весь нужный функционал. К примеру, тепер в стандартной библиотеке есть такие модули:
      • std::collections
      • std::sync
      • std::comm
      • std::rand
      • std::rt
    • +34
    • 12,7k
    • 6
    Поделиться публикацией

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

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

      +5
      > вместо @expr тепер box(GC) expr

      И разработчики очень просят не писать так нигде, а использовать std::rc::Rc ;-)
        +15
        Неужеил такие сокращения как vec, fn, pub, impl, mut, expr, ptr, mem, str, iter, ... удобней привычных vector, string, iterator,…?
          +2
          Питонщики, например, не жалуются.
          –17
          Мертворожденный проект. С таким изуверским синтаксисом оно не взлетит. Будущее за Go и D.
            +11
            У каждого свой вкус на синтаксис. Кто-то звереет от принудительных отступов, кому-то нравится писать бесконечные квадратные или круглые скобки. Кто-то считает, что все методы объекта, статические или нет, нужно вызывать через ".", а кого-то "::" и "->" устраивает больше.

            Кто-то за fn a() -> int, а кто-то за int a();, а другие за function a(value), +(int) a. Синтаксис не решает, взлетит проект или нет. Решает его применимость в реальных условиях.
              +4
              По‐моему, нормальным программистам плевать на бо́льшую часть разниц в синтаксисах. Мне совершенно всё равно, используется ли для доступа к методам объекта точка, двоеточия, «стрелочка» или что‐то ещё — до тех пор, пока это можно быстро написать (если вы найдёте язык с CallMethod obj method (args), то он мне не понравится) и пока я понимаю, что означают эти двоеточия/стрелочки/… (в VimL d.f() может означать printf("%s%s", d, f()) или d['f']()). Явно не нравится могут только те возможности, что затрудняют понимание или тратят время.

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

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое