
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.
- Rust adalah bahasa pemrograman yang kompleks
- Rust adalah pembunuh C / C ++ lainnya
- Tidak aman menghancurkan semua jaminan yang diberikan oleh Rust
- 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 , - . :
, .. , . , .
// 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 , , ( ) . , . โ .