Przejdź do głównej zawartości

Rust



“We must all either wear out or Rust out, every one of us. My choice is to wear out.” — Theodore Roosevelt.


 Od dawna chciałem to zrobić. Przeglądałem kursy online, czytałem książki, ale jakoś nie umiałem zabrać się za nic konkretnego. Nie miałem pomysłu, a pisanie kolejnego hello worlda nie daje już takiej przyjemności jak kiedyś. Na szczęście pojawił się problem do rozwiązania. Mam dużą kolekcję zdjęć. Podchodzi pod 1TB i ciągle zawiera sporo duplikatów. Usuwam je "na bieżąco" co w praktyce oznacza, że jak mi się przypomni to szukam i usuwam aż się nie znudzę, czyli dość szybko. Mam nawet zautomatyzowany skrypt w pythonie, który je kataloguje i też (przynajmniej w teorii) usuwa duplikaty. Ale wymarzyłem sobie coś innego. Chciałbym program, który przemieli wszystkie pliki, policzy ich skróty kryptograficzne, zapisze w bazie danych i za każdym razem,  kiedy nowy plik będzie tam dodawany - od razu sprawdzi, czy nie było go już wcześniej. Mój dysk sieciowy na którym trzymam zdjęcia przypięty jest do komputera z procesorem arm7, jakby nie patrzeć dość słabego, więc dobrze, jakby program sam w sobie był maksymalnie wydajny, żeby jak najlepiej wykorzystał skromne możliwości procesora.
W końcu mam coś, gdzie mogę użyć Rusta!! Tadaaam!
Z Rustem łączą mnie dość ciekawe emocje. Kiedy pierwszy raz przeczytałem o filozofii języka i o problemach, które ma rozwiązać, pomyślałem, że pomysł jest genialny i powinni to wymyślić 20 lat temu (a nie 10 ;) ), wygląda jakby od razu twórcy pomyśleli o wszystkim: system dociągania i publikacji paczek, łatwa dokumentacja wyciągająca treści z komentarzy, łącznie z tym, że przykład użycia wpisany w komentarzu-dokumentacji tez podlega kompilacji co gwarantuje, że nie zapomnimy uaktualnić opisu jak się zmieni interfejs. Nawet sama nazwa chwytliwa. Naprawdę pomyśleli o wszystkim. Kiedy więc wypoczywałem na letnim urlopie, żeby odpocząć od pracy programisty, czytałem sobie książki (a jak!) o tym języku. Wszytko wyglądało jasno, przejrzyście i miało sens, ale jak wiadomo, żeby się nauczyć języka to trzeba w nim coś napisać a nie tylko czytać. Mimo tego czytanie na wakacjach o ruście miało też jeszcze jedną nieoczekiwaną konsekwencję. Jesienią, po wakacjach, nudziłem się i chciałem sobie coś poczytać. Z braku innych książek, wróciłem do książki o programowaniu w rust. I od razu poczułem się jak na wakacjach. Bez kitu, jakbym wiedział, że mój mózg może przywołać tamten nastrój jeśli tylko będę czytać to co w wakacje, to od lat już bym to utrwalał i czytał w wakacje tę samą książkę w kółko. Polecam spróbować (nie koniecznie książka o ruście, myślę, że każda przy której trzeba się skupić da radę) bo nie miałem pojęcia, że wywołam taki efekt. W każdym razie jesienią czytałem tego więcej bo działało dobrze poprawiając mój nastrój. W efekcie mam teoretyczną wiedzę sporą a praktyczną małą. Aż do teraz.
Ale ale, wróćmy do początku. Rust jest językiem, który obiecuje wyeliminować pewne problemy, które mają programy. Zwłaszcza problemy z pamięcią i wyścigami (dyndające wskaźniki? użycie pamięci po zwolnieniu "use after free"?, modyfikowanie kolekcji w czasie, kiedy inny wątek ją przegląda?) i to na etapie kompilacji. Można powiedzieć, że to nic takiego, .net i java też zarządzają pamięcią i pilnują, żeby była zwalniana, dopiero kiedy nikt jej nie potrzebuje. Tyle, że potrzebują do tego garbage collectora, który przegląda co jest w użyciu a co nie i co jakiś czas robi masowe czyszczenie. Nie tak wydajne jak wtedy, kiedy dokładnie się wie w którym momencie wartość przestaje być użyteczna. A nawet jeśli komuś odpowiada garbage collector, to ani java, ani .net nie ochroni przed dodaniem do listy elementu kiedy inny wątek właśnie się iteruje. Poleci wyjątek, przejrzymy logi, zdebugujemy i dodamy lock i problem zniknie.
Fajnie, ale w rust kod, który pozwala na taką modyfikację nawet się nie skompiluje i w tym widać moc języka. Nie czekamy na błędy w runtime, takie sytuacje wyłapuje kompilator. Poza błędami logicznymi na które nie ma rady bo żaden kompilator nie wie co chciał powiedzieć programista, zarządzanie pamięcią mamy obsłużone. Bez potrzeby maszyn wirtualnych, z wydajnością sprzętu. Mamy najlepsze z obu światów (natywnych i wirtualno maszynowych w stylu java/.net) - szybkie i mające pamięć pod kontrolą. Wróżę piękną przyszłość temu językowi. Dlatego tak chciałem coś w nim zrobić. Dlatego tak się cieszę, że mam w końcu okazję.

Opinie dotyczące języka często zawierają coś, co wygląda jak wewnętrzna sprzeczność: Łatwy język ale z wysokim progiem wejścia. Że niby jak? to łatwy czy nie? Z mojego niewielkiego doświadczenia, wynika, że faktycznie jest łatwy ale po pokonaniu pierwszych problemów. Program katalogujący zdjęcia, który zacząłem pisać jest moim projektem na którym będę poznawać podstawy. Pomyślałem, że być może ktoś mógłby skorzystać z małej pomocy przy rozwiązywaniu prostych problemów związanych z rozpoczęciem programowania w tym języku. Dlatego zacząłem też nagrywać swój ekran podczas pracy. Mam nadzieję, że komuś to się przyda. Jak dla mnie to nowe doznanie, zdałem sobie sprawę jak trudno jest jednocześnie myśleć o tym, co się chce zrobić i komentować to, żeby oglądająca to osoba też wiedziała. W efekcie niektóre zdania są rozciągnięte na kilka minut z każdym słowem wypowiadanym osobno :). Popracuję na tym.

Tak swoją drogą, program już teraz działa. Nadal nie ma wszystkich funkcjonalności, jest ciągle rozwijany, ale już teraz jest użyteczny. Jeśli chcesz go wypróbować (albo jeszcze lepiej - dołączyć i rozwijać go ze mną), znajduje się tutaj: https://github.com/jaropawlak/duplicates.

A jeśli masz ochotę zobaczyć jak wyglądała dotychczasowa praca nad programem, być może zainteresować się też nowym językiem programowania... zapraszam tutaj: https://www.youtube.com/playlist?list=PLzLg_yz4EiAXCTmdnZm9skW9SYKH3caSV.

A odnosząc się do cytatu z początku artykułu, z pełną świadomością, że jest nie na temat, nie licząc jednego słowa zupełnie przypadkiem takiego, jak temat całego artykułu... pamiętaj, że między "wear out" a "rust out" jest jeszcze "wear out with a little Rust" ;)


Komentarze