Почему rust стоит вашего внимания

45
Почему Rust стоит вашего внимания Панков Михаил 14 мая 2015 г. Панков Михаил Почему Rust стоит вашего внимания

Upload: michael-pankov

Post on 10-Aug-2015

118 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Почему Rust стоит вашего внимания

Почему Rust стоит вашего внимания

Панков Михаил

14 мая 2015 г

Панков Михаил Почему Rust стоит вашего внимания

Что такое Rust

Безопасность работы с памятьюБезопасные Java C Python RubyОпасные C C++

Среда исполнения и эффективностьБайт-код большая среда и сборщик мусора Java C Машинный код маленькая среда ручное управлениепамятью C C++

RustБезопасный при этом компилируется в машинный код

Проще встраиватьПроще профилироватьСтатически гарантирует безопасность работы с памятью

Панков Михаил Почему Rust стоит вашего внимания

Что такое Rust (продолжение)

Rust mdash системный язык программирования который быстроработает предотвращает почти все падения и устраняет гонкипо данным

Панков Михаил Почему Rust стоит вашего внимания

Hello World

1 fn main() 2 println(Привет мир)3

Панков Михаил Почему Rust стоит вашего внимания

Детсадовский калькулятор

1 fn main() 2 let program = + + - 3 let mut accumulator = 04 for token in programchars() 5 match token 6 rsquo+rsquo =gt accumulator += 17 rsquo-rsquo =gt accumulator -= 18 rsquorsquo =gt accumulator = 29 rsquorsquo =gt accumulator = 2

10 _ =gt игнорируем всё остальное 11 12 13 println(Программа вычислила значение 14 program accumulator)15

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию

1 let v = vec[1 2 3]2

3 let v2 = v4

5 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию (продолжение)

1 fn take(v Veclti32gt) 2 что здесь происходит - неважно3 4

5 let v = vec[1 2 3]6

7 take(v)8

9 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память

1 void allocate_new_buffer(size_t number)2 3 return malloc(number sizeof (int))4 5 int main(int argc char argv[])6 7 int numbers = allocate_new_buffer(10)8 for (int i = 0 i lt 10 ++ i) 9 numbers[i] = i

10 11 12 free(numbers)13 14

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память (продолжение)

1 void allocate_new_buffer(size_t number) 2 int main(int argc char argv[])3 4 int numbers = allocate_new_buffer(10)5 for (int i = 0 i lt 10 ++ i) 6 numbers[i] = i7 8 9 free(numbers)

10 11 for (int i = 0 i lt 10 ++ i) 12 printf(d numbers[i])13 14

Панков Михаил Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 2: Почему Rust стоит вашего внимания

Что такое Rust

Безопасность работы с памятьюБезопасные Java C Python RubyОпасные C C++

Среда исполнения и эффективностьБайт-код большая среда и сборщик мусора Java C Машинный код маленькая среда ручное управлениепамятью C C++

RustБезопасный при этом компилируется в машинный код

Проще встраиватьПроще профилироватьСтатически гарантирует безопасность работы с памятью

Панков Михаил Почему Rust стоит вашего внимания

Что такое Rust (продолжение)

Rust mdash системный язык программирования который быстроработает предотвращает почти все падения и устраняет гонкипо данным

Панков Михаил Почему Rust стоит вашего внимания

Hello World

1 fn main() 2 println(Привет мир)3

Панков Михаил Почему Rust стоит вашего внимания

Детсадовский калькулятор

1 fn main() 2 let program = + + - 3 let mut accumulator = 04 for token in programchars() 5 match token 6 rsquo+rsquo =gt accumulator += 17 rsquo-rsquo =gt accumulator -= 18 rsquorsquo =gt accumulator = 29 rsquorsquo =gt accumulator = 2

10 _ =gt игнорируем всё остальное 11 12 13 println(Программа вычислила значение 14 program accumulator)15

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию

1 let v = vec[1 2 3]2

3 let v2 = v4

5 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию (продолжение)

1 fn take(v Veclti32gt) 2 что здесь происходит - неважно3 4

5 let v = vec[1 2 3]6

7 take(v)8

9 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память

1 void allocate_new_buffer(size_t number)2 3 return malloc(number sizeof (int))4 5 int main(int argc char argv[])6 7 int numbers = allocate_new_buffer(10)8 for (int i = 0 i lt 10 ++ i) 9 numbers[i] = i

10 11 12 free(numbers)13 14

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память (продолжение)

1 void allocate_new_buffer(size_t number) 2 int main(int argc char argv[])3 4 int numbers = allocate_new_buffer(10)5 for (int i = 0 i lt 10 ++ i) 6 numbers[i] = i7 8 9 free(numbers)

10 11 for (int i = 0 i lt 10 ++ i) 12 printf(d numbers[i])13 14

Панков Михаил Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 3: Почему Rust стоит вашего внимания

Что такое Rust (продолжение)

Rust mdash системный язык программирования который быстроработает предотвращает почти все падения и устраняет гонкипо данным

Панков Михаил Почему Rust стоит вашего внимания

Hello World

1 fn main() 2 println(Привет мир)3

Панков Михаил Почему Rust стоит вашего внимания

Детсадовский калькулятор

1 fn main() 2 let program = + + - 3 let mut accumulator = 04 for token in programchars() 5 match token 6 rsquo+rsquo =gt accumulator += 17 rsquo-rsquo =gt accumulator -= 18 rsquorsquo =gt accumulator = 29 rsquorsquo =gt accumulator = 2

10 _ =gt игнорируем всё остальное 11 12 13 println(Программа вычислила значение 14 program accumulator)15

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию

1 let v = vec[1 2 3]2

3 let v2 = v4

5 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию (продолжение)

1 fn take(v Veclti32gt) 2 что здесь происходит - неважно3 4

5 let v = vec[1 2 3]6

7 take(v)8

9 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память

1 void allocate_new_buffer(size_t number)2 3 return malloc(number sizeof (int))4 5 int main(int argc char argv[])6 7 int numbers = allocate_new_buffer(10)8 for (int i = 0 i lt 10 ++ i) 9 numbers[i] = i

10 11 12 free(numbers)13 14

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память (продолжение)

1 void allocate_new_buffer(size_t number) 2 int main(int argc char argv[])3 4 int numbers = allocate_new_buffer(10)5 for (int i = 0 i lt 10 ++ i) 6 numbers[i] = i7 8 9 free(numbers)

10 11 for (int i = 0 i lt 10 ++ i) 12 printf(d numbers[i])13 14

Панков Михаил Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 4: Почему Rust стоит вашего внимания

Hello World

1 fn main() 2 println(Привет мир)3

Панков Михаил Почему Rust стоит вашего внимания

Детсадовский калькулятор

1 fn main() 2 let program = + + - 3 let mut accumulator = 04 for token in programchars() 5 match token 6 rsquo+rsquo =gt accumulator += 17 rsquo-rsquo =gt accumulator -= 18 rsquorsquo =gt accumulator = 29 rsquorsquo =gt accumulator = 2

10 _ =gt игнорируем всё остальное 11 12 13 println(Программа вычислила значение 14 program accumulator)15

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию

1 let v = vec[1 2 3]2

3 let v2 = v4

5 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию (продолжение)

1 fn take(v Veclti32gt) 2 что здесь происходит - неважно3 4

5 let v = vec[1 2 3]6

7 take(v)8

9 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память

1 void allocate_new_buffer(size_t number)2 3 return malloc(number sizeof (int))4 5 int main(int argc char argv[])6 7 int numbers = allocate_new_buffer(10)8 for (int i = 0 i lt 10 ++ i) 9 numbers[i] = i

10 11 12 free(numbers)13 14

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память (продолжение)

1 void allocate_new_buffer(size_t number) 2 int main(int argc char argv[])3 4 int numbers = allocate_new_buffer(10)5 for (int i = 0 i lt 10 ++ i) 6 numbers[i] = i7 8 9 free(numbers)

10 11 for (int i = 0 i lt 10 ++ i) 12 printf(d numbers[i])13 14

Панков Михаил Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 5: Почему Rust стоит вашего внимания

Детсадовский калькулятор

1 fn main() 2 let program = + + - 3 let mut accumulator = 04 for token in programchars() 5 match token 6 rsquo+rsquo =gt accumulator += 17 rsquo-rsquo =gt accumulator -= 18 rsquorsquo =gt accumulator = 29 rsquorsquo =gt accumulator = 2

10 _ =gt игнорируем всё остальное 11 12 13 println(Программа вычислила значение 14 program accumulator)15

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию

1 let v = vec[1 2 3]2

3 let v2 = v4

5 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию (продолжение)

1 fn take(v Veclti32gt) 2 что здесь происходит - неважно3 4

5 let v = vec[1 2 3]6

7 take(v)8

9 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память

1 void allocate_new_buffer(size_t number)2 3 return malloc(number sizeof (int))4 5 int main(int argc char argv[])6 7 int numbers = allocate_new_buffer(10)8 for (int i = 0 i lt 10 ++ i) 9 numbers[i] = i

10 11 12 free(numbers)13 14

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память (продолжение)

1 void allocate_new_buffer(size_t number) 2 int main(int argc char argv[])3 4 int numbers = allocate_new_buffer(10)5 for (int i = 0 i lt 10 ++ i) 6 numbers[i] = i7 8 9 free(numbers)

10 11 for (int i = 0 i lt 10 ++ i) 12 printf(d numbers[i])13 14

Панков Михаил Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 6: Почему Rust стоит вашего внимания

Перемещение по умолчанию

1 let v = vec[1 2 3]2

3 let v2 = v4

5 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Перемещение по умолчанию (продолжение)

1 fn take(v Veclti32gt) 2 что здесь происходит - неважно3 4

5 let v = vec[1 2 3]6

7 take(v)8

9 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память

1 void allocate_new_buffer(size_t number)2 3 return malloc(number sizeof (int))4 5 int main(int argc char argv[])6 7 int numbers = allocate_new_buffer(10)8 for (int i = 0 i lt 10 ++ i) 9 numbers[i] = i

10 11 12 free(numbers)13 14

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память (продолжение)

1 void allocate_new_buffer(size_t number) 2 int main(int argc char argv[])3 4 int numbers = allocate_new_buffer(10)5 for (int i = 0 i lt 10 ++ i) 6 numbers[i] = i7 8 9 free(numbers)

10 11 for (int i = 0 i lt 10 ++ i) 12 printf(d numbers[i])13 14

Панков Михаил Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 7: Почему Rust стоит вашего внимания

Перемещение по умолчанию (продолжение)

1 fn take(v Veclti32gt) 2 что здесь происходит - неважно3 4

5 let v = vec[1 2 3]6

7 take(v)8

9 println(v[0] is v[0])

error use of moved value lsquovlsquoprintln(v[0] is v[0])

^

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память

1 void allocate_new_buffer(size_t number)2 3 return malloc(number sizeof (int))4 5 int main(int argc char argv[])6 7 int numbers = allocate_new_buffer(10)8 for (int i = 0 i lt 10 ++ i) 9 numbers[i] = i

10 11 12 free(numbers)13 14

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память (продолжение)

1 void allocate_new_buffer(size_t number) 2 int main(int argc char argv[])3 4 int numbers = allocate_new_buffer(10)5 for (int i = 0 i lt 10 ++ i) 6 numbers[i] = i7 8 9 free(numbers)

10 11 for (int i = 0 i lt 10 ++ i) 12 printf(d numbers[i])13 14

Панков Михаил Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 8: Почему Rust стоит вашего внимания

Как использовать освобождённую память

1 void allocate_new_buffer(size_t number)2 3 return malloc(number sizeof (int))4 5 int main(int argc char argv[])6 7 int numbers = allocate_new_buffer(10)8 for (int i = 0 i lt 10 ++ i) 9 numbers[i] = i

10 11 12 free(numbers)13 14

Панков Михаил Почему Rust стоит вашего внимания

Как использовать освобождённую память (продолжение)

1 void allocate_new_buffer(size_t number) 2 int main(int argc char argv[])3 4 int numbers = allocate_new_buffer(10)5 for (int i = 0 i lt 10 ++ i) 6 numbers[i] = i7 8 9 free(numbers)

10 11 for (int i = 0 i lt 10 ++ i) 12 printf(d numbers[i])13 14

Панков Михаил Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 9: Почему Rust стоит вашего внимания

Как использовать освобождённую память (продолжение)

1 void allocate_new_buffer(size_t number) 2 int main(int argc char argv[])3 4 int numbers = allocate_new_buffer(10)5 for (int i = 0 i lt 10 ++ i) 6 numbers[i] = i7 8 9 free(numbers)

10 11 for (int i = 0 i lt 10 ++ i) 12 printf(d numbers[i])13 14

Панков Михаил Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 10: Почему Rust стоит вашего внимания

Как обратиться к освобождённой памяти в Rust

1 fn allocate_new_buffer(number usize) -gt Vecltisizegt 2 return Vecwith_capacity(number)3 4 fn main() 5 let mut numbers = allocate_new_buffer(10)6 numbersextend(010)7 8 drop(numbers)9

10 println( numbers)11 ^^^^^^^12 error use of moved value13

Панков Михаил Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 11: Почему Rust стоит вашего внимания

Идиоматичный код на Rust

1 fn main() 2 let numbers Veclt_gt = (010)collect()3 4 println( numbers)5 [0 1 2 3 4 5 6 7 8 9]6 неявный вызов drop(numbers)7

Панков Михаил Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 12: Почему Rust стоит вашего внимания

Заимствование

1 fn main() 2 let mut x = 423 let y = ampmut x4 y = 435 x = 446

511 error cannot assign to lsquoxlsquo because it is borrowedx = 44^~~~~~

319 note borrow of lsquoxlsquo occurs herelet y = ampmut x

^error aborting due to previous error

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 13: Почему Rust стоит вашего внимания

Изменяемость

1 void process(stdstring input)2 3 for (auto i = inputbegin() i = inputend() ++ i) 4 if (i == rsquoorsquo) 5 inputpush_back(rsquozrsquo)6 7 8 stdcout ltlt input9

10 int main(int argc char argv[])11 12 auto string = Hello world13 process(string)14 return 015

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 14: Почему Rust стоит вашего внимания

Изменяемость в Rust

1 fn process(input String) 2 for c in inputchars() 3 if c == rsquoorsquo 4 inputpush(rsquozrsquo)5 ^^6 Cannot borrow immutable local variable7 as mutable8 9

10 11

12 fn main() 13 let string = Hello worldto_string()14 process(string)15

Панков Михаил Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 15: Почему Rust стоит вашего внимания

Изменяемость в Rust (продолжение)

1 fn process(mut input String) 2 for c in inputchars() 3 ^^^^^4 previous borrow occurs here5 if c == rsquoorsquo 6 inputpush(rsquozrsquo)7 ^^8 Cannot borrow lsquoinputlsquo as mutable9 because itrsquos also borrowed as immutable

10 11 12 13 fn main() 14 let string = Hello worldto_string()15 process(string)16

Панков Михаил Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 16: Почему Rust стоит вашего внимания

Время жизни

1 struct Fooltrsquoagt 2 x amprsquoa i323 4 fn main() 5 let x -+ x оживает6 |7 |8 let y = amp5 ---+ y оживает9 let f = Foo x y ---+ f оживает

10 x = ampfx | | здесь ошибка11 ---+ f и y умирают12 |13 println( x) |14 -+ x умирает

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 17: Почему Rust стоит вашего внимания

Обобщённое программирование Типажи

1 struct Circle 2 x f643 y f644 radius f645 6 trait HasArea 7 fn area(ampself) -gt f648 9 impl HasArea for Circle

10 fn area(ampself) -gt f64 11 stdf64constsPI (selfradius selfradius)12 13

Панков Михаил Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 18: Почему Rust стоит вашего внимания

Обобщённое программирование Ограничения

1 fn print_arealtTgt(shape T) 2 println(Площадь фигуры shapearea())3 4 error type lsquoTlsquo does not implement any method in scope5 named lsquoarealsquo6

7 fn print_arealtT HasAreagt(shape T) 8 println(Площадь фигуры shapearea())9

10 ok

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 19: Почему Rust стоит вашего внимания

RAII в Rust

1 pub struct Fd 2 raw_fd c95_tc_int3 4 impl Fd 5 pub fn open(path ampstr) -gt ResultltFd i32gt 6 let c_path = CStringnew(path)unwrap()7 let fd = unsafe 8 posix88_ffcntlopen(c_pathas_ptr()9 posix88_cO_RDONLY 0)

10 as i3211 if fd gt -1000 ampamp fd lt 0 12 return Err(-fd)13 14 Ok(Fd raw_fd fd )15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 20: Почему Rust стоит вашего внимания

RAII в Rust (продолжение)

1 pub fn raw(ampself) -gt c95_tc_int 2 selfraw_fd3 4 pub fn get_size(ampself) -gt Resultlti64 i32gt 5 6 Ok(file_infost_size)7 8 9 impl Drop for Fd

10 fn drop(ampmut self) 11 unsafe 12 posix88_funistdclose(selfraw_fd)13 14 15

Панков Михаил Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 21: Почему Rust стоит вашего внимания

RAII в Rust (использование)

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd fdFd4 match maybe_fd 5 Ok(f) =gt fd = f6 Err(errno) =gt 7 print_error(8 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))9 return Err(())

10 11 12 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 22: Почему Rust стоит вашего внимания

Обрабатываем ошибки идиоматично

1 fn read_print_file(path ampstr) -gt Resultlt() ()gt 2 let maybe_fd = fdFdopen(path)3 let fd = match maybe_fd 4 Ok(f) =gt f5 Err(errno) =gt 6 print_error(7 ampformat(Couldnrsquot open file c_helpersstrerror(errno)))8 return Err(())9

10 11 let mut remaining_file_size = fdget_size()unwrap()

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 23: Почему Rust стоит вашего внимания

Ложь и бенчмарки

$ ls -l bootmemtest86+elf-rw-r--r-- 1 root root 178176 марта 12 2014 bootmemtest86+elf$ time hd bootmemtest86+elfhd bootmemtest86+elf 011s user 006s system8 cpu 1929 total$ time hexdumphexdump bootmemtest86+elfhexdumphexdump bootmemtest86+elf 006s user 007s system6 cpu 2031 total$ time rexdumprexdump bootmemtest86+elfrexdump bootmemtest86+elf 014s user 007s system10 cpu 2056 total$

Панков Михаил Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 24: Почему Rust стоит вашего внимания

Ложь и бенчмарки (продолжение)

C mdash BSD C mdash моя Rust mdash моя0

02

04

06

08

1

09

отно

ситель

ноебы

стродействие

Панков Михаил Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 25: Почему Rust стоит вашего внимания

Как устроить гонку по данным

1 THREADS = 102 COUNT = 503 $x = 14 THREADStimesmap |t|5 Threadnew 6 COUNTtimes |c|7 a = $x + 18 sleep 00019 puts Thread t wrote a

10 $x = a11 12 13 each(ampjoin)14 puts Got $x = $x

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 26: Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 0

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 stdthreadspawn(|| 7 for _ in 0count 8 let a = x + 1 error closure borrows x9 stdthreadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 27: Почему Rust стоит вашего внимания

Что говорит компилятор

data-racers628 1210 error closure may outlive thecurrent function but it borrows lsquoxlsquowhich is owned by the current function [E0373]

data-racers6 stdthreadspawn(|| data-racers7 for _ in 0count data-racers8 let a = x + 1data-racers9 stdthreadsleep_ms(1)data-racers10 x = adata-racers11

data-racers825 826 note lsquoxlsquo is borrowed heredata-racers8 let a = x + 1

^

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 28: Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 1

1 fn main() 2 let threads = 103 let count = 504 let mut x = 15 for _ in 0threads 6 threadscoped(|| warning thread will be7 for _ in 0count immideately joined8 let a = x + 19 threadsleep_ms(1)

10 x = a11 12 )13 14 println(The result is x)15

Панков Михаил Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 29: Почему Rust стоит вашего внимания

Потокобезопасный код на Rust попытка 2

1 2 let mut guards VecltJoinGuardlt()gtgt = Vecnew()3 for _ in 0threads 4 let g JoinGuardlt()gt =5 threadscoped(|| 6 for _ in 0count 7 let a = x + 1 error cannot borrow lsquoxlsquo8 threadsleep_ms(1) mutably borrowed9 x = a

10 11 )12 guardspush(g)13 14 drop(guards)15 println(The result is x)

Панков Михаил Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 30: Почему Rust стоит вашего внимания

Рабочий потокобезопасный код на Rust

1 fn main() 2 let threads = 103 let count = 504 let x = ampAtomicUsizenew(1)5 let _ Veclt_gt = (0threads)map(|_| 6 threadscoped(move || 7 for _ in 0count 8 threadsleep_ms(1)9 xfetch_add(1 OrderingSeqCst)

10 11 )12 )collect()13 println(The result is xload(OrderingSeqCst))14

Панков Михаил Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 31: Почему Rust стоит вашего внимания

Тестирование

1 [test]2 fn it_works() 3 assert_eq(4 add_two(2))4

$ cargo testCompiling adder v001 (filehomeyouprojectsadder)

Running targetadder-91b3e234d4ed382arunning 1 testtest it_works oktest result ok 1 passed 0 failed 0 ignored 0 measured

Doc-tests adderrunning 0 teststest result ok 0 passed 0 failed 0 ignored 0 measured

Панков Михаил Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 32: Почему Rust стоит вашего внимания

Бенчмарки

1 [bench]2 fn bench_add_two(b ampmut Bencher) 3 biter(|| add_two(2))4

$ cargo benchCompiling adder v001 (filehomestevetmpadder)

Running targetreleaseadder-91b3e234d4ed382a

running 2 teststest testsit_works ignoredtest testsbench_add_two bench 1 nsiter (+- 0)

test result ok 0 passed 0 failed 1 ignored 1 measured

Панков Михаил Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 33: Почему Rust стоит вашего внимания

Стабильность

master A - B - C - - G - H - I - J - K

beta - Krsquo

stable - Irsquo - Jrsquo - Krsquo | |

100 - Ersquo - Grsquo | || | |

101 - Irsquo | || |

110 ||

111

Панков Михаил Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 34: Почему Rust стоит вашего внимания

Инструменты

Автодополнение с RacerНавигация по коду rusty-tagsПроверка кода в реальном времени flycheck-rust syntastic

Панков Михаил Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 35: Почему Rust стоит вашего внимания

Инфраструктура

Cratesio mdash 2000 контейнеровРазработка языка на GitHubИзменения через RFC из основной команды илисообщества

Панков Михаил Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 36: Почему Rust стоит вашего внимания

Cargo

СборкаЗависимости

CratesiogitCargolockcargo update

ДокументацияТесты бенчмаркиЗаливка на Cratesio

cargo publish

Панков Михаил Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 37: Почему Rust стоит вашего внимания

IDE mdash RustDT

httpsgithubcomRustDTRustDT

Поддерка CargoАвтодополнение и поиск определенийОтладка

Панков Михаил Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 38: Почему Rust стоит вашего внимания

RustDT Редактор

Панков Михаил Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 39: Почему Rust стоит вашего внимания

RustDT Автодополнение

Панков Михаил Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 40: Почему Rust стоит вашего внимания

RustDT Отладка

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 41: Почему Rust стоит вашего внимания

Кто уже использует Rust

Servo400 тысяч строк кода4-х поточная версия отрисовывает Reddit в 5 раз быстрееGecko (55 против 250 миллисекунд)Pistonhematite mdash клон MinecraftIron84 тысячи запросов в секунду для простейшего сервера

Панков Михаил Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 42: Почему Rust стоит вашего внимания

84 тысячи запросов в секунду

httpwwwyesodwebcomblog201103preliminary-warp-cross-language-benchmarks

Панков Михаил Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 43: Почему Rust стоит вашего внимания

Кто уже использует Rust (продолжение)

OpenDNSSkylightMaidSafe

Панков Михаил Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 44: Почему Rust стоит вашего внимания

Ресурсы

Книга laquoЯзык программирования Rustraquohttpsgithubcomkgvrust_book_ru

IRC канал на русскомhttpclient00chatmibbitcomserver=ircmozillaorgampchannel=23rust-ru

Русский StackOverflow mdash тег Rusthttprustackoverflowcomquestionstaggedrust

Лента событий на Timepadhttpsrust-v-moskvetimepadru

Веб-интерфейс к компиляторуhttpplayrust-langorg

Домашняя страница со ссылками на англоязычныересурсыhttpwwwrust-langorg

Панков Михаил Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания

Page 45: Почему Rust стоит вашего внимания

Где найти этот доклад

httpmichaelpankovcomwhy-rust-matterspdf

Панков Михаил Почему Rust стоит вашего внимания