Sanggah empat stereotip tentang bahasa pemrograman Rust


Bahasa pemrograman Rust , dimulai sebagai proyek hobi dan kemudian didukung oleh Mozilla Corporation, memungkinkan programmer biasa untuk menulis sistem yang aman dan cepat pada saat yang sama: dari kalkulator ke server yang penuh muatan.


Untuk waktu keberadaannya yang relatif singkat, bahasa ini telah berhasil memperoleh stereotip, empat di antaranya akan saya coba bantah di bawah. Saya bisa melewatkan beberapa poin, diskusi dalam komentar dipersilahkan.


  1. Rust adalah bahasa pemrograman yang kompleks
  2. Rust adalah pembunuh C / C ++ lainnya
  3. Tidak aman menghancurkan semua jaminan yang diberikan oleh Rust
  4. Karat tidak akan pernah menyalip C / C ++ dalam kecepatan

1. Rust - bahasa pemrograman yang kompleks


Kompleksitas bahasa pemrograman ditentukan oleh keberadaan sejumlah besar sintaks yang tidak konsisten satu sama lain. Contoh yang mencolok adalah C ++ dan C #, karena untuk sebagian besar programmer, C ++ adalah bahasa yang paling rumit yang tidak dimiliki C #, meskipun ada banyak elemen sintaksis. Karat cukup seragam karena Awalnya dirancang dengan memperhatikan kesalahan masa lalu, dan semua inovasi diperkenalkan secara eksklusif sesuai dengan yang sudah ada.




Stereotip ini berakar pada konsep daya tahan tautan, yang memungkinkan menggambarkan jaminan validitas tautan yang digunakan pada tingkat semantik bahasa. Sintaks seumur hidup terlihat aneh pada awalnya:


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/id467901/


All Articles