Czym jest Rust i dlaczego programiści się na niego przesiadają?
Rust regularnie trafia na szczyt ankiet o „najbardziej lubiany język” i tym razem zachwyty są w dużej mierze zasłużone. To nie jest modny framework miesiąca, tylko język programowania systemowego, który rozwiązuje problem obecny w C i C++ od dziesięcioleci: błędy pamięci, które ujawniają się dopiero na produkcji, o drugiej w nocy, pod realnym obciążeniem.
Problem, który Rust miał rozwiązać
W językach takich jak C i C++ programista sam zarządza pamięcią. Daje to szybkość i kontrolę, ale też całą kategorię błędów – use-after-free, dereferencje wskaźnika null, wyścigi danych – które bardzo trudno wychwycić podczas code review, a jeszcze trudniej zdebugować, gdy trafią już na produkcję. Ogromna część poważnych podatności bezpieczeństwa na przestrzeni lat wynikała właśnie z takiego błędnego zarządzania pamięcią.
Odpowiedzią Rusta jest „borrow checker” – część kompilatora, która egzekwuje ścisłe reguły dotyczące tego, kto jest właścicielem danego fragmentu pamięci i jak długo. Jeśli kod spowodowałby błąd pamięci, po prostu się nie skompiluje. W pierwszym tygodniu pracy z Rustem bywa to frustrujące, a w każdym kolejnym – naprawdę uspokajające.
Dlaczego ma to znaczenie w praktyce
- Wydajność bez garbage collectora: Rust działa mniej więcej tak szybko jak C++, ale nie wstrzymuje programu, by sprzątać pamięć, jak robią to Java czy Go.
- Mniej incydentów na produkcji: całe klasy awarii i luk bezpieczeństwa wychwytywane są na etapie kompilacji, a nie przez użytkownika.
- Naprawdę użyteczna współbieżność: reguły własności w Ruście znacznie utrudniają przypadkowe wprowadzenie wyścigu danych, który w kodzie wielowątkowym należy zwykle do najbardziej uciążliwych błędów do wytropienia.
Gdzie Rust jest faktycznie używany
Rust zaczynał jako język systemowy do takich zastosowań jak silniki przeglądarek, ale dawno wyszedł poza tę niszę. Dziś to poważna opcja dla usług backendowych, które muszą być jednocześnie szybkie i niezawodne, dla narzędzi wiersza poleceń (spora część nowoczesnych narzędzi deweloperskich powstaje w Ruście), dla urządzeń wbudowanych i IoT o ograniczonych zasobach oraz dla infrastruktury, w której awaria naprawdę dużo kosztuje – wszędzie tam, gdzie działa krytyczna logika backendowa.
Uczciwie o wadach
Rust ma wyraźną krzywą uczenia się i wcale tego nie ukrywa. Borrow checker będzie odrzucał kod, który „oczywiście powinien działać”, dopóki nie zrozumiecie, dlaczego nie działa – a ten okres przestawiania się jest frustrujący dla wielu doświadczonych programistów przyzwyczajonych do języków z garbage collectorem. To też nie jest narzędzie do wszystkiego: jeśli budujecie aplikację webową typu CRUD o prostych wymaganiach, gwarancje bezpieczeństwa Rusta mogą nie być warte dodatkowego czasu developmentu w porównaniu z Go czy typowanym frameworkiem backendowym.
Czy warto się go uczyć?
Jeśli pracujecie nad czymś, gdzie liczy się wydajność, gdzie awaria jest kosztowna albo co dotyka infrastruktury wrażliwej z punktu widzenia bezpieczeństwa – tak, Rust jest wart tej inwestycji. Jeśli tworzycie typowe produkty webowe, w których szybkość pracy zespołu jest ważniejsza niż urywanie milisekund, będzie raczej miłym dodatkiem niż koniecznością.
Dobór narzędzia do rzeczywistych wymagań systemu w zakresie wydajności i niezawodności – zamiast tego, które jest akurat najmodniejsze – w dużej mierze decyduje o tym, czy infrastruktura wytrzyma realny ruch. Takie decyzje podejmujemy na co dzień przy projektach z zakresu chmury i infrastruktury, gdzie koszt złego wyboru wychodzi na jaw po kilku miesiącach, a nie pierwszego dnia.