4. Модули. Программирование на Rust (весна 2019)

แชร์
ฝัง
  • เผยแพร่เมื่อ 28 ก.ย. 2024
  • Четвертая лекция курса «Программирование на Rust» (весна 2019).
    Преподаватель - Алексей Александрович Кладов.
    Страница лекции на сайте CSC: tinyurl.com/cs...
    Ссылка на материалы: github.com/mat...
    Все лекции курса: bit.ly/2QfWama

ความคิดเห็น • 61

  • @TheUnitto
    @TheUnitto 5 ปีที่แล้ว +43

    Спасибо больше за курс! Очень странно что так мало подписчиков и просмотров. Ты куда лучше расскаызваешь чем какой то блогер. Единственное что, не всегда хватает бекграунда что бы тебя понять)

    • @Tutankhamen77
      @Tutankhamen77 3 ปีที่แล้ว +11

      По-моему, как раз небольшое кол-во просмотров и подписчиков очень легко объяснить сложностью предмета. Лекции по той же Scala тоже, кмк, будут менее популярны лекций по Java.

  • @roman6572
    @roman6572 ปีที่แล้ว +1

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

  • @qsyatmcode7806
    @qsyatmcode7806 6 หลายเดือนก่อน +4

    Таймкоды от Я.Б.:
    00:00 Система модулей в Rust
    03:57 Импорт и использование модулей
    07:50 Разделение кода на файлы и модули
    12:41 Стандартная библиотека Rust
    14:39 Модули и их использование
    21:35 Использование модификаторов доступа
    25:34 Иерархия модулей и их использование
    29:31 Глобальное пространство имен и стабильность
    33:25 Модель компиляции и стабильность
    41:18 Директивы и оптимизация
    43:16 Использование crate в Rust
    47:13 Взаимодействие между пакетами
    50:04 Обновление версий пакетов
    52:58 Взаимодействие между пакетами и их версиями
    54:56 Автоматическое обновление пакетов
    56:48 Проблемы с импортом и экспортом
    58:47 Локальные и глобальные правила
    01:02:42 Использование версий и стабильность
    01:05:29 Ломающие изменения и совместимость
    01:12:09 Динамические и статические библиотеки
    01:21:54 Взаимодействие языков программирования Си и Rust
    01:26:42 Создание динамической библиотеки на Rust
    01:30:38 Работа с библиотеками и их использование
    01:35:31 Обработка ошибок и завершение работы

  • @Tutankhamen77
    @Tutankhamen77 3 ปีที่แล้ว +2

    Спасибо автору за лекции!

  • @владимирсенцов-р1ю
    @владимирсенцов-р1ю 5 ปีที่แล้ว +1

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

  • @Name-t5b
    @Name-t5b 4 หลายเดือนก่อน

    На 11:34 вместо `--create-type` нужно `--crate-type`

  • @bubblesort6368
    @bubblesort6368 2 ปีที่แล้ว +2

    Вот все классно в Rust, но все эти могущественные трейты и имплы уж вольно напоминают манки патчинг из Ruby, где порой не поймешь откуда это пришло или то.

    • @nanoqsh
      @nanoqsh 2 ปีที่แล้ว

      Не знаю Ruby, но насколько я знаю манки патчинг работает по другому.
      Как минимум разница в том, что поиск метода осуществляется в рантайме. А в расте он либо осуществляется статически, и сложно ошибиться с вызовом нужного метода, так как нельзя создать неоднозначность, за исключением случая когда вместо метода трейта вызывается метод типа (Ассоциированная функция). Либо же метод ищется в рантайме через dyn объект, но тут тоже однозначно ясно какой именно вызывается метод

    • @bubblesort6368
      @bubblesort6368 2 ปีที่แล้ว

      @@nanoqsh вы правы. Сугубо технически это не манкипатчинг. Но в руби механизм манкипатчинга реализован в виде мержа деклараций. То есть вы можете в системе объявить два класса с одним названием и тогда инстанс будет суммой этих деклараций. Так и в rust. Можно сделать неисчислимое количество имплов для одной структуры плюс дерайвы и прочие макросы и в результате сложно будет понять откуда и у чего ноги растут и код сложно поддерживать.

    • @nanoqsh
      @nanoqsh 2 ปีที่แล้ว

      @@bubblesort6368 поэтому в расте нельзя просто вызвать метод трейта у объекта. Сначала нужно импортировать имя трейта через use, либо явно прописывать из какого трейта нужно вызвать метод. То есть на самом типе не будет висеть куча методов, они будут "скрыты" по умолчанию, так что это не будет вызывать никаких проблем

    • @bubblesort6368
      @bubblesort6368 2 ปีที่แล้ว

      @@nanoqsh мне не нравиться то, что в коде вижу юзы которые явно не используются, а косвенно апгрейдят структуры в файле. В руби тоже если ты не подключить файл с манкипатчем он не заработает)

    • @nanoqsh
      @nanoqsh 2 ปีที่แล้ว

      @@bubblesort6368 в том то и дело что сами структуры от добавления реализации трейта никак не апдейтятся. Метод типа, это просто функция, которая принимает self в качестве первого аргумента и лежит она отдельно, в своём месте исполняемого файла. В самих объектах никакой информации о трейтах нет, за одним исключением, когда мы хотим добиться динамической диспетчеризации. Но тогда методы будут содержаться в указатели на этот объект, даже не в самом объекте, и таблица виртуальных методов будет только одной иерархии трейтов, а не вообще всех реализованных

  • @vyorkin
    @vyorkin 3 ปีที่แล้ว +15

    каждую лекцию новая кружка)

  • @alogic75
    @alogic75 2 ปีที่แล้ว +7

    43:58 Алексей внёс вклад в разработку Cargo. Уважаю.

    • @Shwed1982
      @Shwed1982 ปีที่แล้ว +12

      так алексей в карго как раз среди контрибьюторов по коммитам на 5 месте, а вот в самом компиляторе раста уже на первом) а rust-analyzer он вообще чуть ли не в одно лицо сам написал. сам только недавно это узнал, очень порадовался. талантище!

    • @PaulGanarara
      @PaulGanarara ปีที่แล้ว

      @@Shwed1982 вот это уровень

  • @oriontvv
    @oriontvv 3 ปีที่แล้ว +3

    8:22 разве вместо one.rs и nested.rs не должны быть mod.rs?

    • @alekseykladov1144
      @alekseykladov1144 2 ปีที่แล้ว +4

      Ох нет. Тут история такая -- изначально были только mod.rs. Потом, в районе Rust 2018, добавили альтернативный способ, без mod.rs, как раз то, что я на слайде показываю. Изначально был план задепрецировать mod.rs, но это как-то не срослось, и в итоге в Rust есть и "новая", и "старая" версия. Я в лекциях специально только про новую рассказываю, чтобы мозги не существенной информацией не пудрить.

  • @KirillLykov
    @KirillLykov 2 ปีที่แล้ว +1

    слово "могущественно" особо доставляет, видимо как перевод с mighty

  • @KirillLykov
    @KirillLykov 2 ปีที่แล้ว

    Помимо коробочной системы сборки (вместо make/cmake/bjam/basel/... C++), я бы сказал про наличие встроенного менеджера пакетов (в с++ это мог быть dpkg, Conan, etc)

  • @atommixz
    @atommixz 5 ปีที่แล้ว +2

    Народ, пошарьте все ДЗ, ну как без ДЗ то, ничо не понятно

    • @flashmozzg
      @flashmozzg 5 ปีที่แล้ว +1

      Там задания более-менее следуют "Ray Tracing in One Weekend" (pdf гуглится), правда с rust-овой спецификой. Пошарить задания наверное стоит просить авторов курса, т.к. это их труд.

    • @atommixz
      @atommixz 5 ปีที่แล้ว +1

      @@flashmozzg да мне уже ответили в чате в телеграмме, еслиб они сразу написали что делайте ДЗ по этой книжке - ну вопросы бы отпали

  • @владимирсенцов-р1ю
    @владимирсенцов-р1ю 5 ปีที่แล้ว

    Надо писать компилятор rust под jvm или уже есть?

    • @rumadware
      @rumadware 5 ปีที่แล้ว +2

      Как вы это представляете себе? В JVM все объекты ссылочные и rust там не будет работать никак.
      В любом случае, с кодом на rust должно быть возможно взаимодействовать через JNI так же как и с кодом на C/C++

    • @владимирсенцов-р1ю
      @владимирсенцов-р1ю 5 ปีที่แล้ว

      @@rumadware Ну примитивные типы есть. Массивы примитивных типов хотя и создаются в куче все равно представляют обычную последовательность байт.

    • @Mike_x64
      @Mike_x64 5 ปีที่แล้ว

      github.com/oracle/graal/tree/master/sulong

  • @bonafilmo
    @bonafilmo 5 ปีที่แล้ว

    Существует ли в Rust какая-то своя более-менее стандартная библиотека для работы с большими числами произвольного размера и арифметики произвольной точности?
    Как именно там реализована работа с памятью (выделение памяти, переносы, косвенная адресация, переполнения и т.п.)?
    Как определяются типы, типажи и вся растовская специфика?
    Как задаётся знаковость/беззнаковость?
    Какие подводные камни в реализации и использовании?
    Нельзя же просто взять и подключать C++'ные библиотеки и использовать всё в растовском стиле?

    • @KaraMaslyatam
      @KaraMaslyatam 5 ปีที่แล้ว +1

      C++ библиотеки (использующие специфичные механизмы языка) можно использовать только в C++ (неожиданно), только поэтому С++ до сих используется. Необходимо писать обёртку на C (если нет С++ хреноты наружу, можно сгенерировать) или найти уже готовую. Rust декларации для C либы генерируются без проблем. И всё-равно потребуется писать unsafe блоки, поэтому лучше написать safe обёртку на Rust. Например (github): ocornut/imgui (C++) -> cimgui/cimgui (C) -> Gekkio/imgui-rs (Rust).

    • @KaraMaslyatam
      @KaraMaslyatam 5 ปีที่แล้ว

      Если для чего-то есть C библиотека, то в Rust это автоматически есть. Для чисел есть обертки "rug" и "rust-gmp", также есть "ramp". И вообще вот - crates.io/search?q=arithmetic&sort=downloads . Что значит "стандартная библиотека" я не понял и какая разница? Главное, что cargo всё скачает и соберёт, даже не поймёшь, что там внутри - Rust, C или ASM. С этим никаких страданий как в C++ нет - если пакет есть, то он чаще всего легко подключается и собирается.

    • @KaraMaslyatam
      @KaraMaslyatam 5 ปีที่แล้ว +1

      Никаких проблем с памятью, это же Rust. Он даёт гарантии, что если ты не будешь явно указывать unsafe, то выстрелить в ногу (overflow, use after free, double free и т.д.) компилятор просто не даст. От логических ошибок и дэдлоков Rust конечно не спасёт. Смотрите первую лекцию.

    • @KaraMaslyatam
      @KaraMaslyatam 5 ปีที่แล้ว

      Остальные ответы найдёте в уже вышедших лекциях Алексея, посмотрите их хотя бы для общего развития.

    • @KaraMaslyatam
      @KaraMaslyatam 5 ปีที่แล้ว +1

      Какие-то подводные камни тяжело вспомнить, Rust близок к идеалу. Сначала непонятно, потом неприятно и бесит, а потом разбираешься и кайф. Ну разве что молодость языка и недопиленность каких-то вещей, например async/await всё ещё не стабилизировали, но уже совсем недолго осталось (в nightly конечно уже использую по полной).

  • @ВладимирГ-о6ч
    @ВладимирГ-о6ч 4 ปีที่แล้ว +1

    Лекции очень классные. Немытая доска на фоне - как нечищенные ботинки (не к Алексею, а организаторам).

    • @adsick_ua
      @adsick_ua 4 ปีที่แล้ว +11

      а мне доска нравится

    • @PaulGanarara
      @PaulGanarara ปีที่แล้ว +1

      кому вообще какое дело до чистоты моих ботинок? мы что, в Москва слезам не верит?

  • @alexgorodecky1661
    @alexgorodecky1661 5 ปีที่แล้ว +2

    Система модулей Rust сделана извращенцами для извращенцев? Столько фичей, и они действительно все нужны? Лучше бы взяли Python за baseline и пофиксили проблемки

    • @Pavel.Zhigulin
      @Pavel.Zhigulin 5 ปีที่แล้ว +8

      Если бы вы пописали на С++ что-то очень большое (у чего хотя бы 50-60 библиотек зависимостей), то поняли бы, что все эти вещи - не то что нужны, а просто жизненно необходимы. Это просто глоток свежего воздуха и избавление от огромной головоной боли под названием dependency hell.

    • @alexgorodecky1661
      @alexgorodecky1661 5 ปีที่แล้ว +1

      @@Pavel.Zhigulin если бы вы пописали на Java, то поняли бы, что все эти вещи не нужны

    • @Pavel.Zhigulin
      @Pavel.Zhigulin 5 ปีที่แล้ว +6

      @@alexgorodecky1661 сам Java устроен совершенно по-другому. В нём нет мономорфизации как таковой, что позволяет совершенно по-другому делать изоляцию в модулях.

    • @alexgorodecky1661
      @alexgorodecky1661 5 ปีที่แล้ว +1

      @@Pavel.Zhigulin , мономорфизация это детали реализации дженериков / темплейтов. Никакого отношения к языку не имеет, особенно учитывая что либы на rust поставляются в source коде, либо в rlib, и я уверен что там ast

    • @Pavel.Zhigulin
      @Pavel.Zhigulin 5 ปีที่แล้ว +2

      @@alexgorodecky1661 эти детали, как ни странно, сильно ограничивают модульность. Ты не можешь просто так "запечатать" код внутрь модуля, ты вынужден импортировать содержимое прямо в тот бинарь, где инстанцируется экземпляр дженерика. В связи с этим решить конфликт зависимостей становится не так уж и просто, потому что в одном месте инстанцируется символ из одной версии, в другом - из другой, но у символов одинаковые имена, что породит просто кучу проблем.
      То, что Rust поставляется в исходниках, означает лишь, что ABI еще не стандартизирован. Когда это сделают, все изменится, однако проблемы с версионированием и именами символов решили уже сейчас.

  • @theden111111
    @theden111111 5 ปีที่แล้ว +3

    А мне не понравился ведущий, бубнит для себя, как будто просто сам повторяет что знает

    • @desprit
      @desprit 3 ปีที่แล้ว +11

      И зачем тогда смотрели? Ваш комментарий аналогичного содержания и под лекцией #3 был.

    • @xshady2967
      @xshady2967 ปีที่แล้ว

      :/

  • @ilyadruzh
    @ilyadruzh 3 ปีที่แล้ว +1

    Что ему мешает говорить на русском языке? Сложно слушать этот россиянский язык помесь английского и русского. Уж лучше б на английском говорил.

    • @nanoqsh
      @nanoqsh 2 ปีที่แล้ว +9

      Называется программистский

    • @xshady2967
      @xshady2967 ปีที่แล้ว

      аахахахах