Rust是一门体系编程言语,专心于安全,尤其是并发安全,支撑函数式和指令式以及泛型等编程范式的多范式言语。Rust在语法上和C++类似,可是设计者想要在确保功用的一起供给更好的内存安全。
由于Rust有几千行代码,所以我无论怎么都不能自称是Rust专家,但这并不阻碍我对Rust的了解。我十分喜爱Rust的语法,与其他许多言语比较,Rust的详细语法和C,C++类似,都是由花括号限制代码块,还有相同的操控流关键字,例如if,else,while,和for。可是也并非一切的C或许C++关键字被完成了。某些Rust函数(比方关键字match用于形式匹配)关于那些通晓这些言语的人就没那么了解了。尽管与C/C++极端类似,Rust在深层语法上跟元言语宗族的言语像是Haskell更挨近。根本上一个函数体的每个部分都是表达式,乃至是操控流操作符。
大约两个月前,我开端开发一个指令行项目,需求一个像样的规范库。终究成果有必要是一个本地的、静态链接的可履行文件。实际上,我有C / C ++,Rust或Go几种挑选。关于C++来说,STL是不或许的,由于我以为它很糟糕,并且短少许多必需的功用。Qt是一个美丽的C++库,我本来想运用它,可是静态链接需求一个商业Qt答应。最重要的是,在多个操作体系上进行编译需求在每个操作体系上重建静态Qt库,因而需求进行许多额定的作业。
但除此之外,还有一个事实是这个项目开发起来很无聊,我想让它变得风趣。所以当我简略地比较了一下Go和Rust时,就不再考虑它了。出于简化的意图,Go短少了其他言语中存在的许多重要结构。尽管Go的简洁性令人耳目一新并且有其魅力,但我仍是觉得杂乱的Rust包括许多重要的功用。
需求阐明的是,我不喜爱不必要的杂乱性,这便是为什么我没有运用C ++中的大多数新功用。我的意思,功用有必要要完全,可是运用进程要简略。 Rust为自己设定了许多方针,其间一些方针很杂乱,没有垃圾收集器。Rust不像Go,Java以及.NET Framework那样运用主动垃圾收回体系,不同的是Rust经过RAII来办理内存和资源,还可选引证计数。
说了这么多,Rust在许多方面还不是一种老练的言语,不能用于任何像C / C ++这样的项目。别的,它的库没有Go的那么丰厚,在我看来,它的一些规范库的确十分古怪,编译也或许十分慢。
尽管Rust是一种牢靠且安全的言语,运用起来很风趣。但能够确认地说,我现在还没有看到过Rust的详细用例。相反,我能够看到Go的许多用例,而不是Rust的用例。
以下是以我创立的一个样本:
fn foo() {
panic!("this is an error");
}
fn main() {
println!("Hello, world!");
foo();
}
它会打印出来许多元数据:
Hello, world!
thread 'main' panicked at 'this is an error', srcmain.rs:2:2
note: Run with 'RUST_BACKTRACE=1' environment variable to display a backtrace.
假如将RUST_BACKTRACE设置为1,状况会更糟:
Hello, world!
thread 'main' panicked at 'this is an error', srcmain.rs:2:2
stack backtrace:
0: std::sys_common::backtrace::print
at /rustc/2aa4c46cfdd726e97360c2734835aa3515e8c858/srclibstdsys_commonbacktrace.rs:58
1: std::panicking::default_hook::{{closure}}
at /rustc/2aa4c46cfdd726e97360c2734835aa3515e8c858/srclibstdpanicking.rs:200
2: std::panicking::default_hook
at /rustc/2aa4c46cfdd726e97360c2734835aa3515e8c858/srclibstdpanicking.rs:215
3: std::panicking::rust_panic_with_hook
at /rustc/2aa4c46cfdd726e97360c2734835aa3515e8c858/srclibstdpanicking.rs:478
4: std::panicking::begin_panic
5: std::panicking::try
at /rustc/2aa4c46cfdd726e97360c2734835aa3515e8c858/srclibstdpanicking.rs:276
6: std::panic::catch_unwind
at /rustc/2aa4c46cfdd726e97360c2734835aa3515e8c858/srclibstdpanic.rs:388
7: std::rt::lang_start_internal
at /rustc/2aa4c46cfdd726e97360c2734835aa3515e8c858/srclibstdrt.r
s:48
8: main
9: BaseThreadInitThunk
10: RtlInitializeExceptionChain
11: RtlInitializeExceptionChain
我在GitHub的这个线程中发现了这些与闭源项目相关的隐私问题,可是我没有找到任何现成的解决方案。
因而,清楚明了的仅有解决方案是修正Rust编译器,这正是我以下要做的。尽管我在Windows上描述了怎么履行此操作,可是与构建进程无关的部分在Unix上也是有用的。
为了防止这种费事,我简要地研讨了Go,以检查在Go二进制文件中能够找到多少元数据。没想到,Go会打印出比Rust更多的元数据。并且它乃至比Rust更糟糕,连修正编译器也会杯水车薪。
值得一提的另一个原因是,至少在Windows上,Go经过CGo调用c代码的功用时,需求运用mingw编译器,这会导致一系列新的问题。
构建Rust编译器的之一步是下载源代码,你能够从Rust官网或GitHub来下载。然后,你需求Visual Studio 2019或更高版别。文档说的是,Visual Studio版别要在2013年或以上,但我发现有的当地却提到了版别要在2019年或以上。不过,我在运用Visual Studio 2013构建时遇到了困难。所以,我仍是主张运用Visual Studio 2019。[1][2][3][4][5]黑客接单网