Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust за практичния програмист

Rust за практичния програмист

Накратко за Rust и основните му фийчъри. Изходен код: https://github.com/ignisf/plovdivconf-presentation-2013

Petko Bordjukov

July 06, 2013
Tweet

Other Decks in Programming

Transcript

  1. Въведение Rust? TDD Памет ООП Заключение За лектора Петко занимава

    се с Ruby и Rails @ignisf http://gplus.to/ignisf https://github.com/ignisf
  2. Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust

    Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla
  3. Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust

    Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla Mozilla се включва през 2009 г.
  4. Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust

    Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla Mozilla се включва през 2009 г. Първа алфа на компилатора през януари 2012 г.
  5. Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust

    Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla Mozilla се включва през 2009 г. Първа алфа на компилатора през януари 2012 г. Версия 0.7 – преди няколко дни
  6. Въведение Rust? TDD Памет ООП Заключение Кратката история на Rust

    Започнат през 2006 г. като личен проект на Грейдън Хауър, служител на Mozilla Mozilla се включва през 2009 г. Първа алфа на компилатора през януари 2012 г. Версия 0.7 – преди няколко дни Стабилна версия – до края на годината
  7. Въведение Rust? TDD Памет ООП Заключение Парадигми Компилируем Функционален (горе-долу)

    Конкурентен (по модела на актьорите) Императивно-процедурен
  8. Въведение Rust? TDD Памет ООП Заключение Парадигми Компилируем Функционален (горе-долу)

    Конкурентен (по модела на актьорите) Императивно-процедурен Обектно ориентиран
  9. Въведение Rust? TDD Памет ООП Заключение Практична функционалност от по-високо

    ниво Type inferrence Safe task-based concurrency Функции от по-висок ред
  10. Въведение Rust? TDD Памет ООП Заключение Практична функционалност от по-високо

    ниво Type inferrence Safe task-based concurrency Функции от по-висок ред Полиморфизъм
  11. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е кофти в Ruby? Конкурентността
  12. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1
  13. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1 Гаранциите за сигурност
  14. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1 Гаранциите за сигурност Много променливи състояния
  15. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1 Гаранциите за сигурност Много променливи състояния Бавен е
  16. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е кофти в Ruby? Конкурентността Конкурентността!!1 Гаранциите за сигурност Много променливи състояния Бавен е Сложен е (семантиката на Smalltalk се събира на листче)
  17. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален
  18. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален Синтаксисът е горе-долу лесен
  19. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален Синтаксисът е горе-долу лесен Прави разработчиците щастливи.
  20. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален Синтаксисът е горе-долу лесен Прави разработчиците щастливи. Програмира се бързо с него
  21. Въведение Rust? TDD Памет ООП Заключение Защо да се интересуваме

    от Rust? Какво е яко в Ruby? Блоковете Тове, че е функционален Синтаксисът е горе-долу лесен Прави разработчиците щастливи. Програмира се бързо с него Динамично типизиран е
  22. Въведение Rust? TDD Памет ООП Заключение Популярният пример Hello World

    fn main () { println("hello?"); } Прилича ли ви на нещо познато?
  23. Въведение Rust? TDD Памет ООП Заключение Още познати неща Parallel

    Hello World fn main ( ) { for 1 0 . t i m e s { do spawn { l e t greeting_message = " Hello ? " ; p r i n t l n ( greeting_message ) ; } } }
  24. Въведение Rust? TDD Памет ООП Заключение Още познати неща Parallel

    Hello World fn main ( ) { for 1 0 . t i m e s { do spawn { l e t greeting_message = " Hello ? " ; p r i n t l n ( greeting_message ) ; } } } Познато? 1 0 . t i m e s do Thread . new do greeting_message = " Hello ? " puts greeting_message end end
  25. Въведение Rust? TDD Памет ООП Заключение Приличия между Ruby и

    Rust Променливите са в snake_case Имаме блокове, които използват {}
  26. Въведение Rust? TDD Памет ООП Заключение Приличия между Ruby и

    Rust Променливите са в snake_case Имаме блокове, които използват {} Въпреки че промеливите са статични типизирани, имаме type inferrence, така че няма нужда да декларираме типове
  27. Въведение Rust? TDD Памет ООП Заключение Приличия между Ruby и

    Rust Променливите са в snake_case Имаме блокове, които използват {} Въпреки че промеливите са статични типизирани, имаме type inferrence, така че няма нужда да декларираме типове Ще видим още прилики по-нататък
  28. Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и

    Rust ; (почти) навсякъде Нямаме блокове, които използват do и end
  29. Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и

    Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def
  30. Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и

    Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде
  31. Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и

    Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим
  32. Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и

    Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим При писане на Rust трябва да се следва PEP8 Style Guide
  33. Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и

    Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим При писане на Rust трябва да се следва PEP8 Style Guide ВСИЧКО е immutable по подразбиране.
  34. Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и

    Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим При писане на Rust трябва да се следва PEP8 Style Guide ВСИЧКО е immutable по подразбиране.
  35. Въведение Rust? TDD Памет ООП Заключение Различия между Ruby и

    Rust ; (почти) навсякъде Нямаме блокове, които използват do и end Малко по-различен синтаксис за дефиниране на функция: fn вместо def Понеже нямаме do и end, използваме {} навсякъде Компилаторът ни се кара повече, ако сгрешим При писане на Rust трябва да се следва PEP8 Style Guide ВСИЧКО е immutable по подразбиране. Да, дори променливите
  36. Въведение Rust? TDD Памет ООП Заключение Фреймуърк за тестване В

    Rust има вграден прост фреймуърк за писане на unit тестове.
  37. Въведение Rust? TDD Памет ООП Заключение Фреймуърк за тестване В

    Rust има вграден прост фреймуърк за писане на unit тестове. Не е RSpec, но хайде да не бъдем претенциозни...
  38. Въведение Rust? TDD Памет ООП Заключение Фреймуърк за тестване В

    Rust има вграден прост фреймуърк за писане на unit тестове. Не е RSpec, но хайде да не бъдем претенциозни... testing.rs #[test] fn this_tests_code () { println("") }
  39. Въведение Rust? TDD Памет ООП Заключение След това компилираме тестовете

    и ги пускаме с командата $ rustc --test testing.rs $ ./ testing
  40. Въведение Rust? TDD Памет ООП Заключение След това компилираме тестовете

    и ги пускаме с командата $ rustc --test testing.rs $ ./ testing На екрана ще се изведе нещо такова: $ ./ testing running 1 test test this_tests_code ... ok result: ok. 1 passed; 0 failed; 0 ignored $
  41. Въведение Rust? TDD Памет ООП Заключение Управление на паметта Спорно

    най-голямото преимущество на Rust Както и най-сложното за овладяване
  42. Въведение Rust? TDD Памет ООП Заключение Управление на паметта Спорно

    най-голямото преимущество на Rust Както и най-сложното за овладяване Rust e garbage collected
  43. Въведение Rust? TDD Памет ООП Заключение Управление на паметта Спорно

    най-голямото преимущество на Rust Както и най-сложното за овладяване Rust e garbage collected Aко искаме да е
  44. Въведение Rust? TDD Памет ООП Заключение Инструменти за управление на

    паметта Три вида указатели Управлявани кутии (Managed boxes): let x = @10;
  45. Въведение Rust? TDD Памет ООП Заключение Инструменти за управление на

    паметта Три вида указатели Управлявани кутии (Managed boxes): let x = @10; Собствени кутии (Owned boxes): let x = ∼ 10;
  46. Въведение Rust? TDD Памет ООП Заключение Инструменти за управление на

    паметта Три вида указатели Управлявани кутии (Managed boxes): let x = @10; Собствени кутии (Owned boxes): let x = ∼ 10; Указатели на заем (Borrowed pointers): Означават се с &
  47. Въведение Rust? TDD Памет ООП Заключение Инструменти за управление на

    паметта Три вида указатели Управлявани кутии (Managed boxes): let x = @10; Собствени кутии (Owned boxes): let x = ∼ 10; Указатели на заем (Borrowed pointers): Означават се с & Небезопасни блокове и функции
  48. Въведение Rust? TDD Памет ООП Заключение Структури Структурите се използват

    за ” пакетиране“ на стойности: Структура struct Monster { health: int , attack: int } fn main () { let m = Monster { health: 10, attack: 20 }; println(int:: to_str(m.health )); println(int:: to_str(m.attack )); }
  49. Въведение Rust? TDD Памет ООП Заключение Когато компилираме и изпълним

    предния код, на екранът ще се изведе: $ rust run dwemthysarray.rs 10 20 $
  50. Въведение Rust? TDD Памет ООП Заключение Когато компилираме и изпълним

    предния код, на екранът ще се изведе: $ rust run dwemthysarray.rs 10 20 $ Ако пък подадем структурата на fmt!, използвайки формата %?:
  51. Въведение Rust? TDD Памет ООП Заключение Когато компилираме и изпълним

    предния код, на екранът ще се изведе: $ rust run dwemthysarray.rs 10 20 $ Ако пък подадем структурата на fmt!, използвайки формата %?: $ rust run dwemthysarray.rs {health: 10, attack: 20} $
  52. Въведение Rust? TDD Памет ООП Заключение Когато компилираме и изпълним

    предния код, на екранът ще се изведе: $ rust run dwemthysarray.rs 10 20 $ Ако пък подадем структурата на fmt!, използвайки формата %?: $ rust run dwemthysarray.rs {health: 10, attack: 20} $ Яко!
  53. Въведение Rust? TDD Памет ООП Заключение Методи Методите, са функции,

    които приемат първи аргумент с име self. Python anyone?
  54. Въведение Rust? TDD Памет ООП Заключение Методи Методите, са функции,

    които приемат първи аргумент с име self. Python anyone? Имплементация на метод struct Monster { h e a l t h : int , a t t a c k : int } impl Monster { fn a t t a c k (& s e l f ) { p r i n t l n ( fmt ! ( " The ␣ m o n s t e r ␣ a t t a c k s ␣ for ␣ % d ␣ damage . " , s e l f . a t t a c k ) ) ; } } fn main ( ) { l e t m = Monster { h e a l t h : 10 , a t t a c k : 20 } ; m. a t t a c k ( ) ; }
  55. Въведение Rust? TDD Памет ООП Заключение Методи Това ще ни

    върне $ rust run dwemthysarray.rs The monster attacks for 20 damage. $
  56. Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Аналог на

    класовите методи в Ruby и статичните методи в Ява.
  57. Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Аналог на

    класовите методи в Ruby и статичните методи в Ява. Дефинираме ги като метод, само че без self за първи аргумент.
  58. Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Аналог на

    класовите методи в Ruby и статичните методи в Ява. Дефинираме ги като метод, само че без self за първи аргумент.
  59. Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Аналог на

    класовите методи в Ruby и статичните методи в Ява. Дефинираме ги като метод, само че без self за първи аргумент. Асоциирана функция impl Monster { fn count () { println("There␣are␣lots␣of␣monsters."); } }
  60. Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Асоциираните функции

    намират приложение при имплементирането на конструктор в Rust.
  61. Въведение Rust? TDD Памет ООП Заключение Асоциирани функции Асоциираните функции

    намират приложение при имплементирането на конструктор в Rust. Конструктор struct Monster { h e a l t h : int , a t t a c k : int } impl Monster { fn a t t a c k (& s e l f ) { p r i n t l n ( fmt ! ( " The ␣ m o n s t e r ␣ a t t a c k s ␣ for ␣ % d ␣ damage . " , s e l f . a t t a c k ) ) ; } fn new ( h e a l t h : int , a t t a c k : int ) −> Monster { Monster { h e a l t h : h e a l t h , a t t a c k : a t t a c k } } } fn main ( ) { Monster : : new (20 , 4 0 ) . a t t a c k ( ) ; }
  62. Въведение Rust? TDD Памет ООП Заключение Типажи и обобщения (Traits

    & Generics) Нещо средно между миксин и интерфейс.
  63. Въведение Rust? TDD Памет ООП Заключение Типажи и обобщения (Traits

    & Generics) Нещо средно между миксин и интерфейс. Абстрактен клас?
  64. Въведение Rust? TDD Памет ООП Заключение Типажи и обобщения (Traits

    & Generics) Нещо средно между миксин и интерфейс. Абстрактен клас? Чрез тях се постига полиморфизъм в Rust
  65. Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на

    списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby
  66. Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на

    списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby Immutable по подразбиране като всичко останало
  67. Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на

    списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby Immutable по подразбиране като всичко останало Дефинирани са им алгебрични оператори като в Ruby
  68. Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на

    списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby Immutable по подразбиране като всичко останало Дефинирани са им алгебрични оператори като в Ruby
  69. Въведение Rust? TDD Памет ООП Заключение Лирическо отклонение Аналогът на

    списъците в Ruby в Rust са векторите. Не са хетерогенни като в Ruby Immutable по подразбиране като всичко останало Дефинирани са им алгебрични оператори като в Ruby Вектори fn main () { l e t your_numbers = @[ 1 , 2 , 3 ] ; l e t my_numbers = @[ 4 , 5 , 6 ] ; l e t our_numbers = your_numbers + my_numbers ; p r i n t l n ( fmt ! ( "The␣third␣number␣is␣%d." , our_numbers [ 2 ] ) ) }
  70. Въведение Rust? TDD Памет ООП Заключение Trait fn print_vec <T:

    ToStr >(v: &[T]) { for v.each |&i| { println(i.to_str ()) } } fn main () { let vec = [1 ,2 ,3]; print_vec(vec); let str_vec = [~"hey", ~"there", ~"yo"]; print_vec(str_vec ); }
  71. Въведение Rust? TDD Памет ООП Заключение Operator Overloading Едно време

    ми се наложи да рисувам ето тази красота:
  72. Въведение Rust? TDD Памет ООП Заключение Operator Overloading Едно време

    ми се наложи да рисувам ето тази красота:
  73. Въведение Rust? TDD Памет ООП Заключение Operator Overloading Едно време

    ми се наложи да рисувам ето тази красота: Нарича се ” Аполониева гарнитура“ и е фрактал.
  74. Въведение Rust? TDD Памет ООП Заключение Сега няма да се

    плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт.
  75. Въведение Rust? TDD Памет ООП Заключение Сега няма да се

    плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт. Нека центъра на окръжност zj е комплексно число (т.е. zj = xj + i yj ).
  76. Въведение Rust? TDD Памет ООП Заключение Сега няма да се

    плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт. Нека центъра на окръжност zj е комплексно число (т.е. zj = xj + i yj ). Нека кривата kj е реципрочното число на дължината на радиуса на окръжността.
  77. Въведение Rust? TDD Памет ООП Заключение Сега няма да се

    плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт. Нека центъра на окръжност zj е комплексно число (т.е. zj = xj + i yj ). Нека кривата kj е реципрочното число на дължината на радиуса на окръжността.
  78. Въведение Rust? TDD Памет ООП Заключение Сега няма да се

    плашите. Центровете и радиусите на окръжностите се изчисляват с теоремата на Декарт. Нека центъра на окръжност zj е комплексно число (т.е. zj = xj + i yj ). Нека кривата kj е реципрочното число на дължината на радиуса на окръжността. Тогава центъра на допираща се до четири други окръжности окръжност намираме така: Следствие от комплексната декартова теорема z4 = 2(zmkm + z2k2 + z3k3) − z1k1 k4
  79. Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав

    и реших да имплементирам предната формула на Java.
  80. Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав

    и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад.
  81. Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав

    и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад. Ето какво се получи:
  82. Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав

    и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад. Ето какво се получи: Java public static Complex getDaughterCenter ( S o d d y C i r c l e m, S o d d y C i r c l e a1 , S o d d y C i r c l e a2 , S o d d y C i r c l e a3 , double k ){ Complex z = m. z ( ) . m u l t i p l y (m. k ) . add ( a2 . z ( ) . m u l t i p l y ( a2 . k ) ) . add ( a3 . z ( ) . m u l t i p l y ( a3 . k ) ) . m u l t i p l y ( 2 ) . s u b t r a c t ( a1 . z ( ) . m u l t i p l y ( a1 . k ) ) . d i v i d e ( new Complex ( k , 0 ) ) ; return z ; }
  83. Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав

    и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад. Ето какво се получи: Java public static Complex getDaughterCenter ( S o d d y C i r c l e m, S o d d y C i r c l e a1 , S o d d y C i r c l e a2 , S o d d y C i r c l e a3 , double k ){ Complex z = m. z ( ) . m u l t i p l y (m. k ) . add ( a2 . z ( ) . m u l t i p l y ( a2 . k ) ) . add ( a3 . z ( ) . m u l t i p l y ( a3 . k ) ) . m u l t i p l y ( 2 ) . s u b t r a c t ( a1 . z ( ) . m u l t i p l y ( a1 . k ) ) . d i v i d e ( new Complex ( k , 0 ) ) ; return z ; } Приоритетът на операциите е пълна боза.
  84. Въведение Rust? TDD Памет ООП Заключение Бях млад и глупав

    и реших да имплементирам предната формула на Java. Сега вече не съм толкова млад. Ето какво се получи: Java public static Complex getDaughterCenter ( S o d d y C i r c l e m, S o d d y C i r c l e a1 , S o d d y C i r c l e a2 , S o d d y C i r c l e a3 , double k ){ Complex z = m. z ( ) . m u l t i p l y (m. k ) . add ( a2 . z ( ) . m u l t i p l y ( a2 . k ) ) . add ( a3 . z ( ) . m u l t i p l y ( a3 . k ) ) . m u l t i p l y ( 2 ) . s u b t r a c t ( a1 . z ( ) . m u l t i p l y ( a1 . k ) ) . d i v i d e ( new Complex ( k , 0 ) ) ; return z ; } Приоритетът на операциите е пълна боза. Освен това... .add(), .multipy(), .divide()...
  85. Въведение Rust? TDD Памет ООП Заключение Ето как може да

    стане на Rust: Rust fn get_daughter_center (m: C i r c l e , a1 : C i r c l e , a2 : C i r c l e , a3 : C i r c l e , k : float ) −> Cmplx<float> { l e t ( p , q ) = (~Cmplx : : new ( 2 . 0 , 0 . 0 ) , ~Cmplx : : new ( k , 0 . 0 ) ) ; ( (m. z ∗ m. k + a2 . z ∗ a2 . k + a3 . z ∗ a3 . k ) ∗ ∗p − a1 . z ∗ a1 . k ) / ∗q }
  86. Въведение Rust? TDD Памет ООП Заключение Ето как може да

    стане на Rust: Rust fn get_daughter_center (m: C i r c l e , a1 : C i r c l e , a2 : C i r c l e , a3 : C i r c l e , k : float ) −> Cmplx<float> { l e t ( p , q ) = (~Cmplx : : new ( 2 . 0 , 0 . 0 ) , ~Cmplx : : new ( k , 0 . 0 ) ) ; ( (m. z ∗ m. k + a2 . z ∗ a2 . k + a3 . z ∗ a3 . k ) ∗ ∗p − a1 . z ∗ a1 . k ) / ∗q } Пак е рунтаво, но е далеч по-четимо и по-лесно за дебъг от предишното.