рдЬрдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд╛рд░ рд╕реНрдЯреАрд░рд┐рдпреЛрдЯрд╛рдЗрдк рдХрд╛ рдЦрдВрдбрди рдХрд░реЗрдВ


рд░рд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ , рдПрдХ рд╢реМрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реБрдИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдореЛрдЬрд╝рд┐рд▓рд╛ рдХреЙрд░реНрдкреЛрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд, рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рддреЗрдЬрд╝ рджреЛрдиреЛрдВ рд╕рд┐рд╕реНрдЯрдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд╕реЗ рднрд╛рд░реА рд▓реЛрдб рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рддрдХред


рдЕрдкрдиреЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╕рдордп рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП, рдпрд╣ рднрд╛рд╖рд╛ рдкрд╣рд▓реЗ рд╣реА рд░реВрдврд╝рд┐рдпреЛрдВ рдХреЛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЪрд╛рд░ рдореИрдВ рдиреАрдЪреЗ рдЦрдВрдбрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред


  1. рдЬрдВрдЧ рдПрдХ рдЬрдЯрд┐рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ
  2. рдЬрдВрдЧ рдПрдХ рдФрд░ C / C ++ рд╣рддреНрдпрд╛рд░рд╛ рд╣реИ
  3. Rust рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕рднреА рдЧрд╛рд░рдВрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрддрд╛ рд╣реИ
  4. рдЬрдВрдЧ рдХрднреА рднреА рдЧрддрд┐ рдореЗрдВ C / C ++ рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдЬрд╛рдПрдЧреА

1. рдЬрдВрдЧ - рдПрдХ рдЬрдЯрд┐рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛


рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИрдВред рдПрдХ рд╣рдбрд╝рддрд╛рд▓реА рдЙрджрд╛рд╣рд░рдг рд╕реА ++ рдФрд░ рд╕реА # рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рд╕реА ++ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╕реА # рдирд╣реАрдВ рд╣реИред рдЬрдВрдЧ рдмрд╣реБрдд рд╕реБрдВрджрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрддреАрдд рдХреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрдЦ рдХреЗ рд╕рд╛рде рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╕рднреА рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЛ рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдордЭреМрддреЗ рдХреЗ рдЕрдзреАрди рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред




рдЗрд╕ рд╕реНрдЯреАрд░рд┐рдпреЛрдЯрд╛рдЗрдк рдореЗрдВ рд▓рд┐рдВрдХ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдЕрдкрдиреА рдЬрдбрд╝реЗрдВ рд╣реИрдВ, рдЬреЛ рднрд╛рд╖рд╛ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕реНрддрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдХреА рд╡реИрдзрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓рд╛рдЗрдл-рдЯрд╛рдЗрдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╣рд▓реЗ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ:


struct R<'a>(&'a i32);
unsafe fn extend_lifetime<'b>(r: R<'b>) -> R<'static> {
    std::mem::transmute::<R<'b>, R<'static>>(r)
}

unsafe fn shorten_invariant_lifetime<'b, 'c>(r: &'b mut R<'static>)
                                             -> &'b mut R<'c> {
    std::mem::transmute::<&'b mut R<'static>, &'b mut R<'c>>(r)
}

тАФ , . 'static , .


" "? , , . , main() something , .. produce_something() :


int *produce_something(void) {
    int something = 483;
    return &something;
}

int main(void) {
    int *something = produce_something();
    int dereferenced = *something; // Segmentation fault (core dumped)
}

. , , foo bar:


fn sum<'a, 'b: 'a>(foo: &'b i32, bar: &'a i32) -> i32 {
    return foo + bar;
}

, . тАФ , , . .




Rust ( Rust). , : тАФ , тАФ .


. x Foo, y , x:


struct Foo {
    data: Vec<u8>,
}

fn main() {
    let x = Foo { data: Vec::new() }; //  (owning)
    let y = &x; //  (borrowing)
}

, , , . , Rust :


  • ;
  • .

2. Rust тАФ " C/C++"


тАФ " ". Rust тАФ , , , C/C++. тАФ SIMD -.


Vala, Zig, Golang . , , , C/C++. Vala Zig , Golang , .. (, ).


, C/C++ - , , Rust , - Java.


3. Unsafe , Rust


Unsafe, , тАФ Rust, , "" Rust. Borrow-checker , - . :


  • (FFI);
  • ;
  • ;
  • ;
  • .

, .. , . , .


//     UB :
fn safe_display() {
    unsafe {
        let x = 385;
        let x_ref: *const i32 = &x;
        println!("{}", *x_ref);
    }
}



: "Rust , ". , .. , Rust, . Rust .




: "Unsafe , Rust ". : " Java , , UB".


, UB, UB Rust. "", , "UB ", , . UB :


, (, ) , : ┬л ┬╗.

4. Rust C/C++


. , , Rust, , C/C++. Rust GCC C:





, RapidJSON serde_json. serde_json DOM , RapidJSON, / serde_json RapidJSON (DOM) GCC, CLANG:



Rustls, OpenSSL ( 10% 20%-40% , 10%-20% 30%-70% ).




, Rust, rustc, C/C++ , CLANG, LLVM IR. , тАФ .


rustc GCC/CLANG, , , . Rust C CLANG:


:
[https://godbolt.org/z/7b46MD]


pub fn compute(input: &mut [i64; 8]) {
    for i in 0..input.len() {
        input[i] = (input[i] + 3254) * 3;
    }
}

<T as core::convert::From<T>>::from:
        mov     rax, rdi
        ret

<T as core::convert::Into<U>>::into:
        mov     rax, rdi
        ret

<T as core::convert::TryFrom<U>>::try_from:
        mov     rax, rdi
        ret

<I as core::iter::traits::collect::IntoIterator>::into_iter:
        mov     rdx, rsi
        mov     rax, rdi
        ret

example::compute:
        xor     eax, eax
        jmp     .LBB4_1
.LBB4_3:
        mov     rcx, qword ptr [rdi + 8*rax]
        lea     rcx, [rcx + 2*rcx]
        add     rcx, 9762
        mov     qword ptr [rdi + 8*rax], rcx
        inc     rax
.LBB4_1:
        cmp     rax, 8
        jne     .LBB4_3
        ret

:
[https://godbolt.org/z/YOey3P]


#include <stdint.h>

void compute(int64_t *input) {
    for (int i = 0; i < 8; i++) {
        input[i] = (input[i] + 3254) * 3;
    }
}

compute:                                # @compute
        xor     eax, eax
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        cmp     rax, 8
        je      .LBB0_2
        mov     rcx, qword ptr [rdi + 8*rax]
        lea     rcx, [rcx + 2*rcx]
        add     rcx, 9762
        mov     qword ptr [rdi + 8*rax], rcx
        inc     rax
        jmp     .LBB0_1
.LBB0_2:
        ret

rustc , CLANG, тАФ LLVM. rustc, Rust, .. ( CLANG).




Rust restrict -, . C/C++ , / restrict, .



Rust , , ( ) . , . тАФ .


Source: https://habr.com/ru/post/hi467901/


All Articles