Autor Wątek: Rust  (Przeczytany 602 razy)

Offline ekicam2

  • Użytkownik

# Lipiec 07, 2017, 03:45:18
Hej, ostatnio dorwałem się do książki: https://www.packtpub.com/application-development/rust-essentials i muszę przyznać, że całkiem ciekawie to wygląda. W ogóle jest jeden zapaleniec: https://twitter.com/tomaka17. Zrobił dwa bindingi opengl'a i teraz zabrał się za vulkana.

Co myślicie o technologii, kolejna "niby konkurencja" dla c++ czy realny gracz? ;P

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Mergul

  • Użytkownik

# Lipiec 07, 2017, 08:29:59
Ciężko mówić o jakimś języku "konkurencja dla C++", bo C/C++ jest najlepszy tylko w pewnym zakresie oprogramowania. Są różne języki pod różne zastosowania. Chyba że chodzi Ci o następce C++ w jego najlepszych "terytoriach" :D
Rust ponoć jest szybki, i naprawdę bezpieczny, do tego ma sporo bajerów. Chyba najbardziej brakuje teraz w C++ wygody, język jest szybki, ale w wielu miejscach przestarzały (chociaż trzeba przyznać, że nie jest on podstawą do generowania najlepszego asma, są różne inne podejścia co do działania wielu rzeczy).
Ja jeszcze kojarze Dlang (bo sam w nim teraz kodze), i też jest niejako konkurencją dla C++ w jego zastosowaniach (chociaż póki co małą, jeżeli chodzi o zainteresowanie programistów, ale z roku na rok wiekszą). D ma dużo rzeczy których brakuje w C++, ale mimo podobieństw (bardzo podobna składnia) w niektórych sprawach ma inne podejscie. Ogromnym plusem są niesamowicie rozbudowane i proste template-y, szybkosc kompilacji, importy (to akurat tylko wygoda), slices, ranges itd. W każdym razie, w większosci zapewnia to szybsze programowanie (bez utraty wydajności), mniej błędów (język lepiej wykrywa i informuje o błędach aplikacji), większe bezpieczeństwo.
Rust ma wiele rzeczy podobnych do D, ma całkiem inną składnie co może być dla niektórych problemem, ale ponoć też jest bardzo szybki i w wielu rzeczach lepszy niż C++, chociaz sam osobiście go nie używałem to nie mogę o tym zapewnić. Ale w pewnym gronie ludzi i w pewnych zastosowaniach może być używany pomyślnie zamiast C++.

Offline Frondeus

  • Użytkownik

  • +1
# Lipiec 07, 2017, 12:39:15
Polecam poczytać https://doc.rust-lang.org/book/second-edition/ - oficjalna dokumentacja. Całkiem zgrabnie opisana.

Jeśli chodzi o Rust to jego głównym atutem jest na pewno Borrow Checker - czyli jeden z etapów kompilacji gdzie kompilator analizuje czy dana referencja w danym momencie może wskazywać na wartość.
W dużym skrócie w jednym momencie możliwa jest jedna i tylko jedna z dwóch opcji:
* Istnieje tylko jedna i tylko jedna referencja modyfikująca dane (mutable)
* Istnieje wiele referencji na tą samą wartość, lecz są one read-only.

Oprócz tego Rust duży nacisk kładzie na zero cost abstractions - czyli wszelkiego rodzaju twory, które nie dają dodatkowego narzutu w trakcie działania programu. Przykładem mogą być futures - https://github.com/alexcrichton/futures-rs

Rust wspiera również unit testy:
#[test]
fn pop() {
    //Arrange
    let mut stack = VMStack { stack: vec![Value::Nil] };

    //Act
    let result = stack.pop();

    //Assert
    assert_eq!(result, Value::Nil);
}

Algebraiczne typy danych (np. tagged union):
pub enum Value {
    Nil,
    Cons(address),
    I32(i32),

    InternalProgramCounter(usize),
    InternalFramePointer(usize),
    InternalArgc(usize),
}

Pattern Matching:
let foo = Some(1);

match foo {
    Some(i) => println!("Foo has value: {}", i),
    None => println!("Foo has no value")
}

Traity zamiast dziedziczenia:
pub trait Stack {
    fn push(&mut self, value: Value);
    fn pop(&mut self) -> Value;

    fn get(&self, address: usize) -> &Value;
    fn len(&self) -> usize;

    fn pop_many(&mut self, size: usize) {
        for _ in 0..size {
            self.pop();
        }
    }
}

pub struct VMStack {
    stack: Vec<Value>,
}

impl Stack for VMStack {
    fn push(&mut self, value: Value) {
        self.stack.push(value);
    }

    fn pop(&mut self) -> Value {
        self.stack.pop().unwrap()
    }

    fn get(&self, address: usize) -> &Value {
        &self.stack[address]
    }

    fn len(&self) -> usize {
        self.stack.len()
    }
}

Rust bierze garściami z języków funkcyjnych (http://xion.io/post/programming/rust-into-haskell.html#rust-into-haskell).

Czy Rust jest jednak idealny do gamedev? Ciężko powiedzieć. Z jednej strony mamy http://arewegameyet.com - czyli ludzie w tym kierunku idą.

Z drugiej strony wspomniany przez @OP Tomaka wypisał listę "grzechów" - https://users.rust-lang.org/t/my-gamedever-wishlist-for-rust/2859 (choć jest ona już nieco zdeaktualizowana).

Na pewno jednak polecam zapoznać się z tym językiem. Myślę też że @Xion będzie mógł coś więcej powiedzieć na ten temat ;)

PS. To jest bardziej język systemowy - ludzie piszą w nim systemy operacyjne (https://github.com/redox-os/redox), moduły kernela, silniki przeglądarki (np. projekt Servo Mozilli).

Przykładowy kod wziąłem z mojej VM do mojego języka ;)
« Ostatnia zmiana: Lipiec 07, 2017, 12:43:42 wysłana przez Frondeus »