• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    SPIRALIRust - Programovací jazyk

    A language empowering everyone to build reliable and efficient software.

    The Rust Programming Language - The Rust Programming Language
    The book of Rust
    Idiomatic rust
    GitHub - usagi/rust-memory-container-cs: Rust Memory Container Cheat-sheet
    Memory container cheat sheet
    rozbalit záhlaví
    MARASAN
    MARASAN --- ---
    Nedelal jste nekdo WebServices klienta? Potreboval bych sice jednoduchyho WS klienta, ale potreboval bych jej se vsim tim korporatnim nanosem typu WS-Security, certifikaty, sifrovani, podpisy. Nenachazim crate, jestli nemate zkusenost?
    B42
    B42 --- ---
    GIOMIKY
    GIOMIKY --- ---
    GitHub - warpdotdev/Warp at news.itsfoss.com
    https://github.com/warpdotdev/Warp?ref=news.itsfoss.com
    BONEFLUTE
    BONEFLUTE --- ---
    RESURRECTION:

    Děkuji.

    Zatím jsem pochopil, že RefCell je od toho, že nemá vylejzat z objektu ven.

    Překopal jsem to všechno na &mut self, ale nakonec mě "něco" přinutilo, že jsem tam byl nucen dát self: &Rc. Ale také jsem celkově překopal architekturu.

    Možná ještě časem dozraju k dalšímu zjednodušení.
    VELDRANE
    VELDRANE --- ---
    RESURRECTION:
    BONEFLUTE:
    THEON:

    super thread! Diky kluci, docvaklo mi par veci :)
    SPIKE411
    SPIKE411 --- ---
    LUDWIG_: Aha, já před pár dny četl jen titulek tohoto a (aniž bych to otevíral) mi to vyznělo jako že budou přepisovat nějaké „jádro“ C# (části .NET?), a ono jde o M365.

    Microsoft seeks Rust developers to rewrite core C# code • The Register
    https://www.theregister.com/2024/01/31/microsoft_seeks_rust_developers/
    LUDWIG_
    LUDWIG_ --- ---
    Microsoft forms "new team" to adopt Rust into MS365's Substrate App Platform - MSPoweruser
    https://mspoweruser.com/microsoft-forms-new-team-to-help-rewrite-core-windows-components-into-rust-from-c-c/

    Search Jobs | Microsoft Careers
    https://jobs.careers.microsoft.com/global/en/job/1633482/Principal-Software-Architect

    Zajimava pozice v MS v Praze
    BONEFLUTE
    BONEFLUTE --- ---
    RESURRECTION: Díky, přežvejkám.
    RESURRECTION
    RESURRECTION --- ---
    THEON: Rc ti kompilator vetsinou zcela eliminuje, jen ne vzdy. Narozdil treba od Arcu, ktery z principu nemuze, protoze nema jak thready staticky analyzovat. Takze ano, neni to zero overhead, ale v praxi vetsinou ano. Daleko vetsi problem je ten RefCell, ktery bude mit runtime overhead vzdy, byt to taky nebude nejak dramaticke.
    THEON
    THEON --- ---
    RESURRECTION: Rc je zero abstraction? Já myslel, že má taky za běhu nenulový (byť nepatrný) overhead, ty reference se odvíjí od chodu programu - a nebo to jsou ty jiné reference counting kontejnery jako Arc a Rc je magie? :)
    RESURRECTION
    RESURRECTION --- ---
    RESURRECTION: A jenom doplnim, ze multithreaded varianta nepouzije `Rc`, ale `Arc` (ten lock ma read() a write() misto borrow() a borrow_mut()), ale jinak to bude stejny.
    RESURRECTION
    RESURRECTION --- ---
    BONEFLUTE: Hlavni problem je implementace `App`, nevidim moc duvod pro `self: &Rc`, proc ne `&self`? `Rc` je typicky to co pouziva klientsky/uzivatelsky kod, ne implementace. `Rc` je immutable single-threaded reference counted pointer. `RefCell` je pak runtime borrow checker. `Rc` je zero abstraciton, `RefCell` ma overhead (dela borrow checking v runtimeu). Pro to co chces mas vice moznosti:

    1. Uzivatel si bude resit borrowing v compile tam. Nepotrebujes ani `Rc`, proste signatury v impl budou:

    pub fn new(on_startup: ...) -> Self { /* */}
    pub fn run(&self) { /* */}
    pub fn add_something(&mut self, x: ...) { /* */ }

    2. Uzivatel si bude resit ten borrowing v runtimeu:

    // stejne signatury jako v 1.
    let app = Rc::new(RefCell::new(App::new()));
    app.borrow().run();
    app.borrow_mut().add_something(x);

    3. Hidnes implementaci a ten runtime borrowing budes delat sam stejne jako ve 2 (hledej "interior mutability"), kde budou trochu jine ty signatiry:

    #[derive(Clone)]
    struct App {
        callback: Rc<RefCell<Callback>>
    }
    
    pub fn new(on_startup: ...) -> Self { Self { callback: Rc::new(RefCell::new(on_startup)) } }
    pub fn run(&self) { self.callback.borrow()... } // predpoklad je, ze callback je `Fn` nebo obdoba
    pub fn add_something(&self, x: ...) { self.callback.borrow_mut()... } // <-- povsimni si, ze toto taky bere &self a ne `&mut self`

    Samozrejme nejlepsi je 1. Ty ostatni maji runtime overhead (borrow checking pri runtime). Zejmena jelikoz to mas single-threaded, tak neni moc duvod resit reference counting, pokud `App` nekde neskladujes jako member promennou. V kazdem pripade nejlepsi performance (za cenu nejake ergonomie) m a i v takovem pripade nasledujici pattern:

    struct App { pub callback: ... }
    type Callabck = ...;
    
    impl App {
        pub fn run(callback: &Callback)
        pub fn add_something: &mut Callback, x: ...);
    }
    
    fn main() {
        let app = App { callback: ... };
        App::run(&app.callback);
        App::add_something(&mut app.callback, x);
    }

    Tahle varianta presouva ten borrow checking zpet do compile time a je vhodna tam, kde ten ownership neni uplne jasny a kde to chces volat z ruznych mist. Takhle se vlatne pise cecko (minus prave ten borrow checking).
    BONEFLUTE
    BONEFLUTE --- ---
    Ahoj.

    Prosím poraďte, nebo mi vysvětlete, že to nejde.

    V kostce:
    Jde převést
    Rc<App>
    na
    Rc<RefCell<App>>
    ?

    Kontext:
    Mám strukturu App, nějak takto:
    struct App {
        callback: ...
    }
    impl App {
    	pub fn new(on_startup: ...) -> Rc<Self> {}
    	pub fn run(self: &Rc<Self>) {
    		... volání callbacku
    	}
    	pub fn add_something(mut self: &Rc<Self>, x: ...) {
    		let _1: &Rc<ApplicationView> = self;
    		let appview: Rc<RefCell<ApplicationView>> = ???;
    	}
    }
    Následně vytvořím instanci této struktury:

    let app = App::new(move |this| {
    	let _: Rc<RefCell<App>> = this;
    	this.add_something(obj);
    });
    Ta lambda se uloží do vlastnosti struktury a zavolá se následně při zavolání metody run():
    app.run();

    Jak je doufám z kódu vidět, potřebuji převést
    Rc<App>
    na
    Rc<RefCell<App>>
    .

    (GPT mi radí různé způsoby, které žádné nefungují. Jak známo, když problematice nerozumíš, je GPT dost naprd.)

    Je samozřejmě možné, že toto nejde, a budu to muset udělat jinak. Ale rád bych si nechal vynadat a vysvětlit, že to mám dělat jinak a ideálně proč :-)

    Děkuji za nasměrování.
    SPIKE411
    SPIKE411 --- ---
    Where Does the Time Go? Rust's Problem with Slow Compiles - The New Stack
    https://thenewstack.io/where-does-the-time-go-rusts-problem-with-slow-compiles/
    SPIKE411
    SPIKE411 --- ---
    SPIKE411
    SPIKE411 --- ---
    Rust is the latest open source project to face burnout • The Register
    https://www.theregister.com/2024/01/22/rust_project_burnout/
    SATAI
    SATAI --- ---
    Coool

    Welcome - cargo-mutants
    https://mutants.rs/
    SPIRALI
    SPIRALI --- ---
    Budete dnes nekdo na meetupu?
    SPIRALI
    SPIRALI --- ---
    Rust meetup pristi tyden v Praze:
    Rust Meetup Reloaded 2024, Wed, Jan 17, 2024, 6:00 PM | Meetup
    https://www.meetup.com/rust-prague/events/298005196/
    Kliknutím sem můžete změnit nastavení reklam