Zacznę od zacytowania Niklausa Wirtha:
I would love to see somebody tackle the challenge of demonstrating that you can create a portable systems language (meaning that it has performance equal to C, C++, Fortran) that is portable, type safe, and also memory safe. To add that on top of classes and templates and the portability of C, to add strong type safety (which requires a form of garbage collection) and not leave performance on the table – that would be something.
No i można powiedzieć, że wszystkie te "cele" są w trakcie realizacji przez Rusta. Oczywiście wiąże się to z pewnymi kosztami:
- nie jest to język dla początkujących (mimo w miarę intuicyjnych podpowiedzi kompilatora)
- lifetime i ownership potrafi przysporzyć trochę problemów nawet bardziej zaawansowanym programistom
- jak na razie dość długie czasy kompilacji
- mocne typowanie potrafi przysporzyć problemów (np.
fn add2<T>(a: T) -> T where T: Float { a + 2.0 }
nie zadziała, trzeba użyć [o zgrozo]fn add2<T>(a: T) -> T where T: Float { a + cast(2.0).unwrap() }
, jednak mam nadzieję, że to niedługo poprawią) - łatwo napisać kod, który niespecjalnie będzie wydajny, przez multum wywołań
clone
Jednak w przeciwieństwie do innych ostatnio "nowych" języków (jak Go czy D) ma wiele usprawnień:
- brak
null
, zamiast tego mamyenum
, który działa podobnie jaktype
w Haskellu - proste FFI
- bezpieczeństwo pamięci w czasie kompilacji (brak GC)
- wbudowane wsparcie dla wielowątkowości i SIMD
- typy Hindley-Milner'a, przy których
auto
z C++ jest śmieszne - aktywne budowanie społeczności już w czesnych stadach rozwoju (via Reddit, Discourse i Cargo - manager paczek i build tool)
- szybkość (wiadomo, idealnie nie jest, ale patrząc na wersję języka to i tak można powiedzieć, że jest nieźle)
- brak dziedziczenia, w zamian dostajemy system
traits
, który działa podobnie jak w Scali - szablony z constraintsami
- makra składniowe i rozszerzenia kompilatora (zaczerpnięte z Lispów)
- wbudowane krotki
- destructive assignment
- immutability by default
- pattern matching
Hello World (bo być musi, potem napiszę jakiś dłuższy przykład):
fn main() {
println!("Hello World!");
}
Co o tym sądzicie? Ma ten język szansę na zajęcie swojego miejsca w niszy gdzie teraz jest C/C++? IMHO ma szansę na ograniczenie roli C++, bo C zawsze będzie jako uniwersalny język do FFI.
Materiały: