Widerlegen Sie vier Stereotypen über die Programmiersprache Rust


Die Programmiersprache Rust , die als Hobbyprojekt gestartet und anschließend von Mozilla unterstützt wurde, ermöglicht es gewöhnlichen Programmierern, gleichzeitig sichere und schnelle Systeme zu schreiben: von Taschenrechnern bis zu stark ausgelasteten Servern.


Für ihre relativ kurze Existenzzeit hat diese Sprache bereits Stereotypen erworben, von denen ich vier im Folgenden zu widerlegen versuchen werde. Ich kann einige Punkte überspringen, Diskussionen in den Kommentaren sind willkommen.


  1. Rust ist eine komplexe Programmiersprache
  2. Rust ist ein weiterer C / C ++ - Killer
  3. Unsicher ruiniert alle Garantien von Rust
  4. Rust wird C / C ++ niemals in seiner Geschwindigkeit überholen

1. Rust - eine komplexe Programmiersprache


Die Komplexität der Programmiersprache wird durch das Vorhandensein einer großen Anzahl von Syntaxkonstrukten bestimmt, die nicht miteinander übereinstimmen. Ein bemerkenswertes Beispiel ist C ++ und C #, da C ++ für die überwiegende Mehrheit der Programmierer die komplizierteste Sprache ist, die C # trotz der großen Anzahl von Syntaxelementen nicht ist. Rost ist da ziemlich einheitlich Es wurde ursprünglich mit Blick auf die Fehler der Vergangenheit entworfen, und alle Innovationen werden nur in Übereinstimmung mit den bestehenden eingeführt.




Dieses Stereotyp hat seine Wurzeln im Konzept der Lebensdauer von Links, das es ermöglicht, die Garantien für die Gültigkeit von Links zu beschreiben, die auf der Ebene der Semantik der Sprache verwendet werden. Die lebenslange Syntax sieht zunächst seltsam aus:


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


All Articles