
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.
- Rust ist eine komplexe Programmiersprache
- Rust ist ein weiterer C / C ++ - Killer
- Unsicher ruiniert alle Garantien von Rust
- 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 , - . :
, .. , . , .
// 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 , , ( ) . , . — .