Rust: Mozilla mütəxəssislərinin yeni proqramlaşdırma dili ilə işləməyə başlayır. Rust proqramlaşdırma dili: kommunal proqramlar, sənədlər, ideologiya və sintaksis Rust, proqramlaşdırmaya haradan başlamaq lazımdır

İndiyə qədər siz qeyd etmiş ola bilərsiniz ki, sözügedən proqramlaşdırma dilinin sintaksisi C/C++ kimi dillərin sintaksisinə çox bənzəyir, çünki hər iki halda şərhləri vurğulamaq üçün iki əyri işarədən istifadə olunur, kod blokları əyri mötərizələrlə əhatə olunub. , və funksiya arqumentləri mötərizələrlə əhatə olunmuşdur. Funksiyaların istifadə edildiyini də xatırlamalısınız açar söz fn və hər proqramın əsas () funksiyası olmalıdır. Nida işarəsi funksiya adından sonra println bu halda makronun istifadə edildiyini göstərir (əslində Rust işləmə zamanı kitabxanasından çap funksiyası ətrafında əlverişli sarğı).

Proqramı tərtib etmək üçün sadəcə əmri yerinə yetirin:

Rustc salam.rs

Nəticədə, proqramın mənbə kodu faylı ilə qovluqda salam adlı ikili fayl görünməlidir, onu yerinə yetirmək üçün sadəcə əmri yerinə yetirin./hello; Ancaq bu faylın ölçüsünə diqqət yetirsəniz, bir qədər şoka düşəcəksiniz: 800 KB-ni keçəcək. Və bütün bunlar belə sadə bir proqramın işləməsi üçün lazımdır? Varsayılan olaraq, Rust kompilyatoru iş vaxtı kitabxanalarının əksəriyyətini proqramla statik olaraq əlaqələndirir, beləliklə siz binar faylı Rust işləmə vaxtı kitabxanaları quraşdırılmamış sistemə köçürə və heç bir problem olmadan işlədə bilərsiniz. Bununla belə, siz kompilyatora optimallaşdırma və dinamik əlaqə qurmağı da söyləyə bilərsiniz:

Rustc -O C üstünlük-dinamik salam.rs

İndi siz daha idarə edilə bilən 8 KB ikilik ölçüsü əldə edəcəksiniz, lakin ldd yardım proqramını istifadə etsəniz, bunu tapa bilərsiniz. düzgün əməliyyat Proqram sistemdə libstd- dinamik kitabxanasının olmasını tələb edir<версия>.belə ki .

Proqramlaşdırma dilinin sintaksisi

İndi Rust-da proqramları tərtib edib işlədə bildiyimiz üçün mən bu proqramlaşdırma dilinin sintaksisini başa düşməyi və onun C, C++ və digər oxşar dillər kimi proqramlaşdırma dillərinin sintaksisindən fərqlərini vurğulamağı təklif edirəm:

Fn doubler (x: i32) -> i32 ( x * 2 ) fn main () ( qoy a: i32 = 5; qoy b; b = doubler(a); println!("a çarpı 2 ()", b) ; match b ( 1 ... 10 => println!("1-dən 10-a"), _ => println!("Başqa bir nömrə"), ) )

Əgər C/C++ dilləri ilə işləməyə öyrəşmisinizsə, bunu düşünə bilərsiniz bu kod nədənsə qəribədir, amma olduqca məntiqlidir. Gəlin main() funksiyası ilə başlayaq: birinci sətirdə 32 bitlik tam dəyişən a elan edək və ona 5 ilkin qiyməti təyin edək. Dəyişənin tipini göstərməyi atlaya bilərik (i32 standart dəyişən növüdür) və həmçinin ona ilkin dəyər təyin etməyin və bu halda sıfır dəyəri ehtiva edir. Nəzərə alın ki, əgər siz dəyişəni elan etsəniz və ona misaldakı a dəyişəni ilə eyni şəkildə xüsusi qiymət təyin etsəniz, onun dəyərini daha sonra dəyişə bilməyəcəksiniz, beləliklə, aşağıdakı kod parçasını tərtib edərkən xəta mesajı yaranacaq:

Qoy a: i32 = 5; a = 10;

Varsayılan olaraq, Rust-da dəyişənlər dəyişməzdir, yəni başlanğıcdan sonra onların dəyərləri dəyişə bilməz. Dəyişən dəyişənləri oxşar şəkildə açıq şəkildə elan etməlisiniz:

mut a olsun: i32 = 5;

Bu niyə lazımdır? Bu əlavə işdir, elə deyilmi? Əslində bu doğrudur, amma digər tərəfdən bu xüsusiyyət proqramlaşdırma dilinin inkişafına kömək edir təhlükəsiz proqramlar. Siz yalnız dəyərlərinin dəyişdirilməsi lazım olan dəyişənləri dəyişdirməlisiniz. Rust, proqramın necə işlədiyini mümkün qədər dəqiq təsvir etmək üçün sizi lazımi qədər ətraflı danışmağa məcbur edir: yuxarıdakı sətir gələcəkdə dəyərini dəyişdirmək imkanı ilə tam 32 bit ölçüsündə işarələnmiş tam dəyişən a elan edir.

Sonra a dəyişəni ilə dublyor funksiyamızı arqument kimi çağırırıq və qaytarılan dəyəri b dəyişənində saxlayırıq. Proqram kodunun əvvəlində yerləşən dublyor funksiyasının elanına diqqət yetirin: o, -> simvollarından sonra funksiya parametrinin tipini (i32) və qaytarılan dəyərin tipini (i32) göstərir. Funksiyanın tək bir əməliyyatı yerinə yetirdiyini görmək asandır, x * 2 , ondan sonra hətta nöqtəli vergül yoxdur, adi Rust kodu bloku kimi; orda nə baş verir?

Belə çıxır ki, siz funksiyanın dəyərini ya C-də olduğu kimi qaytara bilərsiniz, ya da bu halda olduğu kimi sadəcə ifadəni funksiya kodunun son sətirinə yerləşdirməklə. Və bu sadəcə ifadə olduğu üçün ondan sonra nöqtəli vergül qoymağa ehtiyac yoxdur.

Nəticəni çap etmək üçün println!() makrosundan istifadə etdiyimiz main() funksiyasına qayıdaq; Simvol ardıcıllığından () istifadə edərək dəyişənin dəyərini əvəz etmə texnikasına diqqət yetirin. Nəhayət, nümunə Rust proqramlaşdırma dilinin son dərəcə faydalı “uyğunluq” açar sözünü nümayiş etdirir ki, bu da çoxlu sayda if/else ifadələrini yerinə yetirməli olduğunuz halda kodun miqdarını əhəmiyyətli dərəcədə azalda bilər. Bu halda, 1...10 dəyər diapazonunun bəyanıdır (1-dən 10-a qədər) və alt xətt (_) simvolu bütün digər dəyərlərə uyğun gəlir.

Rust-da char sətir tipi dörd baytlıq simvollardan, yəni istənilən Unicode simvollarından istifadə etməyə imkan verir və bu o deməkdir ki, proqramlaşdırma dili dizayn mərhələsində müxtəlif dillərlə işləmək üçün uyğunlaşdırılmışdır. xüsusi simvollar. Başqa bir faydalı məlumat növü müxtəlif növ dəyişənlərin toplusudur:

Qoy x = (1, 2.0, "Salam");

Bu halda, tam dəyər, float dəyəri və sətir dəyəri eyni dəstdə yerləşdirilir. Bu dəyərlər dəyişməzdir və eyni şəkildə əldə edilə bilər:

Println!("()", x.2);

Nəticə olaraq, x-in üçüncü elementinin dəyəri, yəni "Salam" sətri çıxacaq. Rust-da da dəstəklənən müntəzəm massivlərdə olduğu kimi, dəzgahların elementlərinin nömrələnməsi sıfırdan başlayır. Funksiyadan bir neçə dəyəri qaytarmaq üçün dəstlərdən istifadə edə bilərsiniz:

Fn açarı(giriş: (i32, i32)) -> (i32, i32) ( (giriş.1, giriş.0) ) fn main() ( qoy x = (10, 50); y = keçid(x) ; println!("(), ()", y.0, y.1 )

Bu halda, switch() adlı funksiya iki 32 bitlik tam dəyərdən ibarət bir dəst alır və onları giriş dəyişənində saxlayır. O, həmçinin iki tam dəyəri olan bir dəst qaytarır. Bu funksiya tənzimləmə elementlərini dəyişdirməyə və nəticədə yaranan dəstəni qaytarmağa imkan verən sadə ifadədən istifadə edir.

main() funksiyası 10 və 50 dəyərlərindən ibarət x adlı bir dəst yaradır və switch() çağırışından qaytarılmış dəyərləri ehtiva edən y adlı bir dəst yaradır. Bundan sonra, tuple dəyərləri sadəcə ekranda göstərilir (50, 10).

Məsləhət: Rust-un imkanlarını özünüz araşdırmağa can atırsınızsa, https://doc.rust-lang.org/book ünvanında yerləşən rəsmi sənədləri oxumaqla başlamağı tövsiyə edirik.

oldu Qısa Təsvir Rust proqramlaşdırma dilinin sintaksisi və imkanları; haqqında daha çox bilmək istəyirsinizsə verilmiş dil xüsusi məqalələr seriyasından proqramlaşdırma, bu barədə bizə məlumat verin!



Bu gün Rust sintaksisi kompilyatorla təchiz edilmiş sintaksis fayllarından istifadə edərək vim və emacs-da dəstəklənir.
Məşhur mülkiyyət redaktoru Sublime Text 2 və pulsuz redaktor Kate üçün sintaksis paketləri də var. Hələ IDE-də Rust üçün dəstək yoxdur. Deyəsən, sazlayıcı dəstəyi də yoxdur.

Rustc kompilyatoru ilə aşağıdakı kommunal xidmətlər təmin edilir:
> rustdoc- Doxygen kimi mənbə kodundan sənədlərin avtomatik yaradılması üçün yardım proqramı;
> rustpkg- asan quraşdırma üçün paket meneceri əlavə paketlər və kitabxanalar;
> rusti- sözdə REPL yardım proqramı (oxu-qiymətləndirmə-çap-döngü). Bu, əslində Rust ifadəsini qəbul edən test tərcüməçisidir komanda xətti, onu daxili LLVM təqdimatında tərtib edir, icra edir və nəticəni çap edir;
> pas- parametrlərdən asılı olaraq digər yardım proqramlarını və ya kompilyatoru işə salan universal yardım proqramı. Heç vaxt mənim üçün işləmədi.

Dillə bağlı bütün mövcud sənədlər www.rust-lang.org rəsmi saytında toplanır. Mövcuddur ətraflı bələdçi(http://static.rust-lang.org/doc/tutorial.html) - sintaksis, yaddaş modeli, iş vaxtı sistemi və s.-nin bütün nüanslarına dair hərtərəfli rəsmi sənədlər, həmçinin daxili nüvəyə dair sənədlər kitabxana və standart kitabxana std. Bütün sənədlər ingilis dilindədir. Rus dilində cari materiallar yoxdur və bir neçə mövcud icmal məqaləsi artıq çox köhnəlmişdir.

İdeologiya və sintaksis


Rust, kod bloklarını ayırmaq üçün əyri mötərizələrdən istifadə edən C-yə bənzər bir dildir. Dil “çox paradiqma”dır, yəni. kodu imperativ-prosedural, obyekt yönümlü, paralel və ya funksional şəkildə yazmağa imkan verir. Rust yerli olaraq tərtib edir ikili kod hər hansı dəstəklənən platformada (backend kimi LLVM istifadə edir). Teorik olaraq, Rust kodu C/C++ kodu qədər sürətli olmalıdır. Rust bir sistem dili kimi yerləşdirilib, lakin C, C++ və ya D kimi "əsl" sistem dilləri kimi montaj kod blokları üçün daxili dəstəyi yoxdur.

Rust yaddaş modeli mahiyyət etibarilə boş və ya sallanan göstəricilərə və bufer daşqınlarına icazə vermir. Yalnız bir kod xətti daxilində işləyən isteğe bağlı zibil toplayıcısı var. Bu dil, mesajlaşmadan istifadə edərək mövzular arasında yüngül çoxlu tapşırıq və ünsiyyət üçün daxili dəstəyə malikdir. Ortaq yaddaş Rustda ümumiyyətlə yoxdur. Bütün dəyişənlər yığın dəyişənlərinə, verilmiş iplik üçün yığın dəyişənlərinə və bütün mövzular tərəfindən oxuna bilən, lakin onlar tərəfindən dəyişdirilə bilməyən “mübadilə” yığın dəyişənlərinə bölünür. Bu, çox yivli proqramlaşdırmanın bəlası sayılan dalana dirənməni avtomatik aradan qaldırır. Dilin ABI-si C ilə uyğun gəlir, ona görə də Rust proqramları əlavə sarğılar olmadan C dilində yazılmış kitabxanalarla əlaqələndirilə bilər. Aşağı səviyyəli ehtiyaclar üçün sistem proqramlaşdırması və C ilə uyğunluğu təmin etmək üçün dil göstəricilərin düzgünlüyünü yoxlamadan xüsusi “təhlükəsiz” rejimə malikdir. İdeologiyasına görə Rust Go dilinə ən yaxındır. Go-da olduğu kimi, əsas diqqət çox yivli proqramlaşdırmanın sadəliyinə və irimiqyaslı proqramların işlənib hazırlanması sürətinə verilir və sintaksis də bəzi yerlərdə qeyri-adi və bir qədər təəccüblüdür. Eyni zamanda, Rust Go kimi minimalist deyil və sistem dili olduğunu iddia edir.

Rust sintaksisi əsasən C və C++ dillərindən götürülüb, Go, C#, Haskell, Python və Ruby-dən bəzi ideyalar birləşib. Mən dilin sintaksisini hərtərəfli təsvir etməyəcəyəm, ancaq ən maraqlı anlayışlara diqqət yetirəcəyəm.

Mən Rustda yeniyəm, lakin tez bir zamanda mənim sevimli proqramlaşdırma dilimə çevrilir. Rust-da kiçik layihələrin yazılması adətən daha az erqonomik olsa da və daha uzun sürsə də (ən azı sükan arxasında mənimlə), bu, proqram dizaynı haqqında düşüncələrimə meydan oxuyur. Yeni bir şey öyrəndikdən sonra tərtibçi ilə döyüşlərim daha az olur.

Rust İcması Son vaxtlar səylərinin çoxunu Tokio kitabxanası kimi həyata keçirilən asinxron I/O üzərində cəmləşdirmişdir. Və bu əladır.

İcma üzvlərinin bir çoxu, veb serverləri və əlaqəli şeylərlə işləməmişlər, nəyə nail olmaq istədiyimizi aydın bilmirlər. Bu şeylər 1.0 gündə müzakirə olunanda mənim də bu barədə qeyri-müəyyən bir fikrim var idi, əvvəllər onunla işləməmişəm.

  • Bu nədir - Async I/O?
  • Korutinlər nədir? korutinlər )?
  • Yüngül iplər nədir ( yüngül iplər )?
  • Fyuçers nədir?( fyuçerslər )?

  • Onlar bir-birinə necə uyğun gəlir?

Mən sizə lenti endirən kiçik proqramı necə yazacağınızı göstərəcəyəm ( yem) JSON formatında, formatlaşdırılmış formada konsola qeydlərin siyahısını təhlil edir və göstərir.

Bizim üçün hər şey çox yığcam kodla nəticələndi. Necə? Kesimin altına baxın.

Təhlükəsiz açar söz Rust dilinin dizaynının ayrılmaz hissəsidir. Bununla tanış olmayanlar üçün təhlükəli açar sözdür, sadə dillə desək, növ yoxlamasından yan keçmək üçün bir yoldur( növün yoxlanılması) Pas.

Təhlükəsiz açar sözünün mövcudluğu əvvəlcə çoxları üçün sürprizdir. Həqiqətən də, proqramların yaddaş səhvlərindən çökməməsi Rust-un bir xüsusiyyəti deyilmi? Əgər bu doğrudursa, onda nə üçün tip sistemindən yan keçməyin asan yolu var? Bu, bir dil dizayn qüsuru kimi görünə bilər.

Yenə də, mənim fikrimcə, etibarsızlıq dezavantaj deyil. Əslində, bu dilin vacib bir hissəsidir. təhlükəli bir növ xilasetmə klapan kimi fəaliyyət göstərir - bu o deməkdir ki, biz sadə hallarda tip sistemindən istifadə edə bilərik, lakin yenə də kodunuzda istifadə etmək istədiyiniz hər cür ağıllı fəndlərə icazə verə bilərik. Biz yalnız sizdən bu texnikaları (təhlükəsiz kodu) təhlükəsiz xarici abstraksiyaların arxasında gizlətməyinizi tələb edirik.

Bu qeyd təhlükəli açar sözünü və məhdud "təhlükəsizlik" ideyasını təqdim edir. Əslində bu, bir az sonra yazmağı ümid etdiyim bir qeydin müjdəçisidir. O, təhlükəli kodda nəyin edilə və nəyin edilə bilməyəcəyini göstərən Rustun yaddaş modelini müzakirə edir.

Rust üçün yeni olduğum üçün çaşqın idim müxtəlif yollarla simli təmsillər. Rust dili haqqında bir kitabda üçdən istifadə edən Referanslar və Borclanma adlı bir fəsil var müxtəlif növlər misallarda sətir dəyişənləri: String , &String və &str .

str və String arasındakı fərqlə başlayaq: String genişlənən, yığınla ayrılmış məlumat strukturudur, str isə dəyişməz, sabit uzunluqlu sətirdir. haradasa nəzərə.

Bir çox proqramçılar artıq obyekt yönümlü dillərdə proqramlaşdırmağı bilirlər. Rust klassik obyekt yönümlü dil deyil, lakin əsas OOP alətlərindən istifadə edilə bilər.

Bu yazıda Rust-da OOP üslubunda necə proqramlaşdırmağı nəzərdən keçirəcəyik. Bunu bir nümunədən istifadə edərək edəcəyik: təlim tapşırığında siniflərin iyerarxiyasını quracağıq.

Bizim vəzifəmiz həndəsi fiqurlarla işləməkdir. Biz onları mətn şəklində ekranda göstərəcəyik və onların sahəsini hesablayacağıq. Bizim formalar dəstimiz düzbucaqlı, kvadrat, ellips, dairədir.

Rust bir çox digər məşhur dillərdən bir qədər fərqli olan zərif bir dildir. Məsələn, siniflərdən və mirasdan istifadə etmək əvəzinə, Rust özünəməxsus xüsusiyyətlərə əsaslanan tip sistemini təklif edir. Bununla belə, mən inanıram ki, Rust ilə tanışlığa başlayan bir çox proqramçı (mənim kimi) ümumi qəbul edilmiş dizayn nümunələri ilə tanış deyil.

Bu yazıda dizayn nümunəsini müzakirə etmək istəyirəm yeni tip(yeni tip), həmçinin növün dəyişdirilməsinə kömək edən From və Into xüsusiyyətləri.

Son vaxtlar dizayn nümunələri və proqramlaşdırmada istifadə etdiyimiz texnikalar haqqında çox düşünürəm. Layihəni araşdırmağa başlamaq və əvvəllər dəfələrlə gördüyünüz tanış nümunələri və üslubları görmək həqiqətən əladır. Bu, layihənin başa düşülməsini asanlaşdırır və işi sürətləndirməyə imkan verir.

Bəzən yeni bir layihə üzərində işləyirsən və başa düşürsən ki, son layihədə etdiyin kimi bir şey etməlisən. O, funksionallıq parçası və ya kitabxana olmaya bilər, səliqəli makroya və ya kiçik konteynerə sarılması mümkün olmayan bir şey ola bilər. Bu, sadəcə olaraq problemi yaxşı həll edən dizayn nümunəsi və ya struktur konsepsiyası ola bilər.

Bu cür problemlərə tez-tez tətbiq olunan maraqlı nümunələrdən biri "Sonlu Dövlət Maşını"dır. Bu ifadənin tam olaraq nə demək olduğunu və niyə bu qədər maraqlı olduğunu başa düşmək üçün bir az vaxt sərf etməyi təklif edirəm.

Aşağıda Rust proqramlaşdırma dilində köçürmə, köçürmə və borc almanın qrafik təsviri verilmişdir. Əsasən, bu anlayışlar Rust-a xasdır və tez-tez yeni başlayanlar üçün büdrəmədir.

Çaşqınlığın qarşısını almaq üçün mətni minimuma endirməyə çalışdım. Bu qeyd müxtəlif dərslikləri əvəz etmir və yalnız vizual məlumatın qavranılmasının daha asan olduğuna inananlar üçün hazırlanmışdır. Əgər siz yenicə Rust öyrənməyə başlayırsınızsa və bu diaqramları faydalı hesab edirsinizsə, mən konsepsiyaları möhkəmləndirmək üçün kodunuzu oxşar diaqramlarla qeyd etməyi tövsiyə edərdim.

Peano nömrələrindən istifadə edərək natural ədədlər hesabının həyata keçirilməsi proqramlaşdırmanın tədrisində məşhur vəzifədir. Onları Rustda həyata keçirmək mümkün olacaqmı deyə düşünürdüm.

Beləliklə, mənim vəzifəm növ yoxlaması ilə natural ədədləri yazmaq və əlavə etməkdir.

Vikipediyaya görə, “Peano aksiomları 19-cu əsrdə italyan riyaziyyatçısı Cüzeppe Peano tərəfindən təqdim edilmiş natural ədədlər üçün aksioma sistemlərindən biridir.”

Bizi onlardan ikisi maraqlandırır - onların köməyi ilə natural ədədləri daxil edib istifadə edə bilərsiniz:

  • 1-dir natural ədəd
  • Natural ədəddən sonra gələn ədəd də natural ədəddir.

Gəlin bunu istifadə edərək pas ilə hərfi yazaq:

1 2 3 4 enum Nat(Sıfır, Succ(Nat))

Nat ya sıfırdır, ya da növbəti natural ədəddir.

Şərh: Futures-rs layihəsi yenidən təşkil olundu və bir çox şeyin adı dəyişdirildi. Mümkünsə, bağlantılar yeniləndi.

Fyuçerslərə başlamaq

Bu sənəd, fyuçerslərin və mövzuların sıfır dəyəri ilə həyata keçirilməsini təmin edən Rust üçün fyuçers proqramlaşdırma dili konteynerini araşdırmağa kömək edəcək. Futures C++, Java və Scala kimi bir çox başqa proqramlaşdırma dillərində mövcuddur və fyuçers konteyneri bu dillərin kitabxanalarından ilham alır. Bununla belə, o, erqonomikdir və eyni zamanda Rust-a xas olan sıfır qiymətli abstraksiya fəlsəfəsinə riayət edir, yəni: fyuçersləri yaratmaq və tərtib etmək üçün heç bir yaddaş ayrılması tələb olunmur və onları idarə edən Tapşırıq üçün yalnız bir ayırma tələb olunur. Fyuçers Rust-da asinxron, tərtib edilə bilən, yüksək performanslı I/O üçün əsas olmaq üçün nəzərdə tutulub və erkən performans ölçmələri fyuçers üzərində qurulmuş sadə HTTP serverinin həqiqətən sürətli olduğunu göstərir.

Bu sənədlər bir neçə hissəyə bölünür:

  • "Salam, dünya!";
  • gələcək növü;
  • axın növü;
  • xüsusi fyuçers və axın (Stream);
  • qaytarma fyuçersləri;
  • Tapşırıq və gələcək;
  • yerli tapşırıq məlumatları.

Şərh: Futures-rs layihəsi yenidən təşkil olundu və bir çox şeyin adı dəyişdirildi. Mümkünsə, bağlantılar yeniləndi.

Rust ekosistemindəki əsas boşluqlardan biri sürətli və səmərəli idi asinxron I/O. Bizim mio kitabxanasından möhkəm təməlimiz var, lakin o, çox aşağı səviyyədədir: biz dövlət maşınlarını əl ilə yaratmalı və geri çağırışlarla məşğul olmalıyıq.

Biz daha yüksək səviyyəli, daha yaxşı erqonomikaya malik bir şey istərdik, lakin onun yaxşı olması birləşmə qabiliyyəti, birlikdə işləyən asinxron abstraksiyaların ekosistemini dəstəkləyir. Çox tanış səslənir: həyata keçirməklə eyni məqsəd güdülürdü fyuçerslər(və ya vədlər) şəklində sintaktik şəkəri dəstəkləyən bir çox dildə async/gözləyinüst.

Prosessorlar tərəfindən dəstəklənən primitiv tam ədəd növləri bizim real həyatda işləməyə öyrəşdiyimiz sonsuz tam ədədlər dəstinin məhdud təxminisidir. Bu məhdud təmsil həmişə "real" rəqəmlərə uyğun gəlmir, məsələn 255_u8 + 1 == 0 . Tez-tez proqramçı bu fərqi unudur, bu da asanlıqla səhvlərə səbəb ola bilər.

Rust səhvlərdən qorunmağı hədəfləyən, onların ən məkrlisinin - yaddaş səhvlərinin - qarşısını almağa yönəlmiş proqramlaşdırma dilidir, həm də proqramçıya digər problemlərdən qaçmağa kömək etməyə çalışır: səhvlərə məhəl qoyulmur və görəcəyimiz kimi, tam ədədlərin daşması.

Dəmir haqqında bir az

Iron, Rust proqramlaşdırma dilində yazılmış və başqa bir tanınmış kitabxana olan hiper üzərində qurulmuş yüksək səviyyəli veb çərçivədir. Dəmir, Rustun bizə verdiyi bütün üstünlüklərdən istifadə etmək üçün nəzərdə tutulmuşdur. Dəmir öz nüvəsindəki əməliyyatların qarşısını almağa çalışır.

Fəlsəfə

Dəmir mümkün qədər genişlənmə prinsipi üzərində qurulub. O, öz funksionallığını genişləndirmək üçün konsepsiyaları təqdim edir:

  • “aralıq” əlamətlər – sorğunun işlənməsi zamanı sona çatan funksionallığı həyata keçirmək üçün istifadə olunur;
  • modifikatorlar - sorğuları və cavabları ən erqonomik şəkildə dəyişdirmək üçün istifadə olunur.

Məqalənin gedişində siz modifikatorların əsas hissəsi və aralıq növləri ilə tanış olacaqsınız.

Layihənin yaradılması

Əvvəlcə komandadan istifadə edərək Cargo istifadə edərək layihə yaradaq:

Tərtib etdikdən sonra müvafiq icra olunan faylı alırıq:

1 2 3 $ rustc hello.rs $ du -h salam 632K salam

Sadə çap üçün 632 kilobayt?! Rust C/C++-ı əvəz etmək potensialına malik sistem dili kimi yerləşdirilib, elə deyilmi? Belə ki, niyə yoxlamaq deyil oxşar proqramən yaxın rəqibinizdə?

Ətrafımızda geniş yayılmış bir inanc var ki, zibil yığıcının üstünlüklərindən biri yüksək performanslı kilidsiz məlumat strukturlarını inkişaf etdirmək asanlığıdır. Yaddaşın əl ilə idarə edilməsini onlarda etmək asan deyil, lakin GC bu problemi asanlıqla həll edir.

Bu yazı göstərəcək ki, Rust istifadə edərək, paralel məlumat strukturları üçün yaddaş idarəetmə API qurmaq mümkündür:

  • GC kimi kilidsiz məlumat strukturunu həyata keçirməyə imkan verəcək;
  • Yaddaş idarəetmə sxemindən sui-istifadəyə qarşı statik qoruma yaradır;
  • GC ilə müqayisə edilə bilən əlavə xərclərə (və daha çox proqnozlaşdırıla bilən) sahib olacaq.

Aşağıda göstərəcəyim testlərdə Rust Java-nın kilidsiz növbə tətbiqlərini asanlıqla üstələyir və Rust tətbiqinin özünü yazmaq asandır.

Mən yeni Crossbeam kitabxanasında epoxa əsaslanan yaddaşın bərpası sxemini tətbiq etdim, o, indi məlumat strukturlarınızla istifadə etməyə hazırdır. Bu yazıda mən kilidsiz məlumat strukturları, dövr alqoritmi və daxili Rust API haqqında danışacağam.

Yaddaşa giriş xətaları və yaddaş sızması ən çox diqqət çəkən səhvlərin iki kateqoriyasıdır, buna görə də onların baş verməsinin qarşısını almağa və ya heç olmasa azaltmağa çox səy sərf olunur. Adlarından oxşarlıq görünsə də, müəyyən mənada diametral şəkildə əks mövqedədirlər və problemlərdən birinin həlli bizi ikincidən xilas etmir. İdarə olunan dillərin geniş istifadəsi bu fikri dəstəkləyir: onlar yaddaşın boşaldılması işini öz üzərinə götürərək bəzi yaddaşa giriş xətalarının qarşısını alır.

Sadəcə qoymaq: yaddaşa girişin pozulması səhv məlumatlarla bir növ hərəkətdir və yaddaş sızmasıdır yoxluğu düzgün məlumatlarla müəyyən hərəkətlər. Cədvəl şəklində:

Proqramlaşdırma dillərini öyrənməklə bağlı bir neçə fikrim var.

Əvvəla, biz bu barədə yanlış yolla gedirik. Əminəm ki, siz də eyni hissləri keçirmisiniz. Təhsil almağa çalışırsan yeni dil və onda hər şeyin necə işlədiyini tam başa düşmürsən. Niyə bir sintaksis bir yerdə, digəri isə başqa yerdə istifadə olunur? Bütün bu qəribəliklər bezdiricidir və sonda adi dilimizə qayıdırıq.

İnanıram ki, dilləri qavrayışımız bizə qəddar zarafat edir. Yeni bir dil haqqında son dəfə müzakirə etdiyinizi xatırlayın. Kimsə bunu qeyd etdi və başqası onun sürəti, sintaksisi və ya mövcud veb çərçivəsi haqqında soruşdu.

Bu, avtomobillərin müzakirəsinə çox bənzəyir. Yeni UAZ Rıbak haqqında eşitmisiniz? O nə qədər sürətlidir? Onu gölün üstündən keçirə bilərəmmi?

Bənzər bir şəkildə dillər haqqında danışarkən, onların bir-birini əvəz edə biləcəyini nəzərdə tuturuq. Maşınlar kimi. Lada Saransk sürməyi bilirəmsə, o zaman UAZ Rıbakı problemsiz idarə edə bilərəm. Yeganə fərq sürət və tablosudur, elə deyilmi?

Ancaq PHP avtomobilinin necə görünəcəyini təsəvvür edin. İndi Lisp avtomobilinin nə qədər fərqli olacağını təsəvvür edin. Birindən digərinə keçmək hansı düymənin isitməni idarə etdiyini öyrənməkdən daha çox tələb edir.

Qeyd: Bu məqalə oxucunun Rust FFI (tərcümə), endianness və ioctl ilə tanış olduğunu güman edir.

C kodu üçün bağlamalar yaradan zaman biz istər-istəməz birləşməni ehtiva edən strukturla qarşılaşacağıq. Rust-da birləşmələr üçün daxili dəstək yoxdur, ona görə də biz özümüz strategiya qurmalı olacağıq. C-də birlik saxlama növüdür fərqli növlər bir yaddaş sahəsində məlumat. Konkatenasiyaya üstünlük vermək üçün bir çox səbəb var, məsələn: tam ədədlərin ikili təsvirləri və üzən nöqtəli ədədlər arasında çevrilmə, psevdopolimorfizmin həyata keçirilməsi və bitlərə birbaşa çıxış. Mən psevdopolimorfizmə diqqət yetirəcəyəm.

Rust populyarlıq qazanır, lakin çoxları hələ də onun dəyərini və funksiyalarını başa düşmürlər. Rust proqramlaşdırma dilinin əsas üstünlükləri haqqında sizə məlumat verəcəyik.

Rust və digər dillərin ortaq cəhəti nədir?

Yuxarıdakı təriflərə inanmaq çətindir; bu, qeyri-real ifadə kimi görünür, çünki əvvəllər bütün dillər tərəflərdən birini seçirdi: etibarlılıq və ya performans.

Yüksək sürətin heyrətamiz nümayəndəsidir, lakin biz hamımız bilirik ki, ayrılmış yaddaşa səhv giriş səbəbindən səhvlər nə qədər tez-tez baş verir, uzaq serverlər, və işin nəticələrinin gözlənilməz nəticələri haqqında demək üçün heç bir şey yoxdur. Çoxlu yazı mövzuları səbəbindən nəticəni proqnozlaşdırmaq çox vaxt çətindir.

Etibarlılığa qarşı qərəzlilik ən yaxşı dillə nümayiş etdirilir Haskell, təbiətdə yığılmış və yüksək təhlükəsizlik performansını təmin edir. Tərtib edilə bilən hər şey düzgün işləyəcək. Əsas çatışmazlıq - bu aşağı performansdır, yüksək sürət tələb edən layihəni təsəvvür etmək çətindir Haskell.

Qalanları da neytral mövqe, müəyyən tarazlıq tutur. Onlar praktikliyə diqqət yetirirlər.

Pas udulmuş ən yaxşı xüsusiyyətlər C++Haskell, və həmçinin digər rəqiblərdən kifayət qədər praktikliyi və funksionallığı qoruya bildi.

Rust dilinin gözəlliyi nədir?

Rust-un sehrli xüsusiyyətləri kompilyasiya əsasları və mülkiyyətçi haqqında məlumat ( sahibi), yalnız müvəqqəti olaraq sazlayan və ya layihəni öz üzərinə götürmüş proqramçı haqqında ( dəyişkən borc), eləcə də adi tamaşaçı haqqında ( dəyişməz borc).

Proqramlaşdırma zamanı Java və ya C++, məlumatın növü bir qədər fərqli olsa da, bu məlumatı yaddaşda saxlamalısınız. IN Pas bu dil konstruksiyalarından istifadə etməklə həyata keçirilir, bu məlumat tərtibçinin şəxsiyyəti müəyyənləşdirməsini və düzgün davranış modelini seçməsini asanlaşdırır. Kompilyatorla kodun icrası zamanı potensial və ümumi problemlərin aradan qaldırılmasını təmin edə bilərsiniz.

Bu dil bir az fərqli yanaşma tələb edir. Qeyri-adiliyə baxmayaraq, alqoritm olduqca aydın və effektivdir. İndi biz öyrənməyə başladıqda dalana səbəb ola biləcək dilin əsaslarını müəyyən edəcəyik:

  1. Varislik sistemi tamamilə aradan qaldırıldı və onu əvəz etmək üçün daha çox xüsusiyyətlər istifadə olunur.
  2. Göstəricilər yalnız tabe olmayan kodda mövcuddur əlavə qorunma, yəni unsafe() funksiyası daxilində. Onları əvəz etmək üçün təhlükəsiz kod mövcud obyektlərə düzgün göstərici təmin edən istinadlardan istifadə edir.
  3. Əgər keçid statikdirsə və konkret elementə işarə edirsə, məsələn, dəyişməz borc = &Object , keçid ölənə qədər heç bir istifadəçi tərəfindən dəyişdirilə bilməz.
  4. Dəyişən borrow = &mut Obyekt linki dəyişərsə, məzmunu linkin bütün ömrü boyu heç bir başqa istifadəçi oxuya bilməz.
  5. Tərtibatçılar diqqətini Mac və *nix platformalarına yönəldirlər, buna görə də sistemdə işləyir Windows yalnız GNU mühitindən istifadə etməklə mümkündür.

Olduqca vacibdir hədəf auditoriya, Rust dili kifayət qədər fəal icmaya, inkişaf etmiş ünsiyyət və öyrənmə sisteminə malikdir. IRC kanalına və ya Reddit-ə baş çəkməyi tövsiyə edirik. Əvvəl bu gün artıq yazılmışdır və onların əksəriyyəti hələ də daim inkişaf etdirilir, onların layihələri GitHub-da tapıla bilər.

Dil qrafika və oyunlar yaratmaq yolunu tutmuş tərtibatçılar arasında ən populyardır. Hətta tam hüquqlu bir əməliyyat sistemi yaratmaq üçün inkişaflar var, lakin hələ də inkişaf etdirilir. Yaxın gələcəkdə müştəri proqramlarının və veb serverlərin yazılması imkanı var. Yuxarıda göstərilən bütün tapşırıqlar tamamilə Rust imkanları daxilindədir.

Əsas və yəqin ki, yeganə çatışmazlıq onun həddindən artıq aktiv inkişafıdır. Yeni versiyalar buraxıldıqca, sintaksis bir qədər dəyişir və yeni imkanlara uyğunlaşmaq üçün vaxtaşırı davranış və inkişaf məntiqini dəyişdirməyə ehtiyac var. Vəziyyət Rust-1.0 buraxılana qədər bir müddət davam edəcək.

Adi sütun " Bu həftə Rustda", Rust tapa bilərsiniz "n Stuffs keçiddə həmişə əvvəlki və keçmiş dəyişikliklər, eləcə də dilin inkişaf perspektivləri haqqında məlumat var.


“Rust dilinin tənqidi və niyə C/C++ heç vaxt ölməyəcək” məqaləsini çox bəyəndik. Biz müəllifə təklif etdik ki, məqaləni ingilis dilinə tərcümə edək, həm də bloqumuzda dərc edək. O, razılaşdı və biz bu məqaləni rus dilində təqdim etməkdən məmnunuq və Ingilis dili. Orijinal məqalə yerləşir.

Orijinal məqalə yerləşdirilib (mətn rus dilində). Məqalə müəllifin razılığı ilə bloqumuzda dərc olunub.

Qeyd: Aşağıda mən Rustun sürətli və təhlükəsiz bir dil yaratmaq cəhdi olduğunu fərz edirəm. Axı, Mozilla uşaqları onu brauzer mühərriki inkişaf etdirmə vasitəsi kimi etdilər. Bu başqa bir təhlükəsiz dildirsə, onda qəribə bir şey alırıq. Onsuz da onlarla fərqli təhlükəsiz dillər var, hər kəs öz zövqünə uyğun bir şey tapacaq. Məqsəd C++ dilini əvəz etmək deyilsə, onda (1) niyə dildə təhlükəli alt çoxluq yaradılıb? (2) niyə yüngül axınları dildən silmək lazım idi? Yəni bu halda baş verənlərin heç bir mənası yoxdur.

Birdən linux.org.ru forumunu oxusanız, qeyd edim ki, bu, sırf 10-luq siyahı deyil. texniki səbəblər bu mövzuda müzakirə olunan Rust-u bəyənməmək. ilə Skype-da müzakirə ilə göstərildiyi kimi əziz yoldaş @sum3rman, bu səbəblərin nə qədər “texniki” hesab edilməsi ilə bağlı birdən çox fikir var. Ümumiyyətlə, mən pis bir siyahı hazırladım, amma yəqin ki, yenə də onun ən maraqlı məqamlarından bəzilərini sitat gətirmək riskinə girəcəyəm. Əslində burada kifayət qədər sadə, texniki olmayan səbəblər var.

C/C++-ın yaxın gələcəkdə heç bir yerə getməyəcəyi faktı hər bir ayıq düşüncəli insana aydındır. Heç kim demək olar ki, bütün masaüstü proqramları, nüvələri yenidən yazmayacaq əməliyyat sistemləri, kompilyatorlar, oyun və brauzer mühərrikləri, virtual maşınlar, verilənlər bazası, arxivçilər, audio və video kodeklər, tonlarla digər C-kitabxanaları və s. Bu, çox, çox sürətli, sazlanmış, zamanla sınaqdan keçirilmiş koddur. Onu yenidən yazmaq çox, çox bahalı, risklidir və düzünü desəm, yalnız ən inadkar Rust pərəstişkarlarının təhrif olunmuş şüurunda məna kəsb edir.

Yaxşı, yeni kod yazarkən Rustdan istifadə etmək haqqında nə demək olar?

Unutmayaq ki, bu, “daha ​​düzgün” C/C++ etmək üçün ilk cəhd deyil. Məsələn, D dilini götürək. 2001-ci ildə ortaya çıxdı, çox yaxşı dil. Heç bir vakansiya, normal inkişaf alətləri, xüsusilə görkəmli uğur hekayələri yoxdur. OpenMW layihəsi əvvəlcə D dilində yazılmışdı və sonra birdən onlar onu tamamilə C++ dilində yenidən yazmağa qərar verdilər. Tərtibatçıların etiraf etdiyi kimi, onlar "böyük layihə, biz buna töhfə verməkdən məmnun olarıq, lakin bu axmaq D."ni bilmirik və bilmək istəmirik" üslubunda çoxlu məktublar aldılar. Wikipedia bildirir ki, D ilə yanaşı, C++-nı bu və ya digər dərəcədə öldürmək üçün bir çox başqa cəhdlər olub, məsələn, Vala, Cyclone, Limbo, BitC. Neçə insan belə dillər haqqında eşitmişdir?

Düşünürəm ki, tarixdən dərs almağın vaxtıdır. Siz heç olmasa ona normal inkişaf alətlərini göstərməyincə, ona bir-iki uğur hekayəsi danışmayınca və yaxınlıqda yaşayan bu dildə onlarla proqramçı göstərməyincə, heç bir ağlı başında olan adam layihəyə yeni bir dil çəkməyəcək. Proqramçılar, bəlkə də, ən gənclərindən başqa, siz onlara normal inkişaf vasitələrini (Racer kimi sənətkarlıq deyil), bir neçə on minlərlə hazır kitabxana göstərməyincə, vaxtlarını və sağlamlıqlarını növbəti ən düzgün dili öyrənməyə sərf etməyəcəklər "eksperimental", "qeyri-sabit" və s. deyil), bir neçə uğur hekayəsi danışmayın və şəhərlərində onlarla açıq vakansiya göstərməyin. Toyuq və yumurta problemi. Çox nadir hallarda bu problem uğurla həll edilə bilər (burada Scala nümunə kimi istifadə edilə bilər), əsasən bəziləri tərəfindən vaxt və pul sərmayəsi hesabına böyük şirkət(Google, Typesafe), nədənsə dili populyarlaşdırmaqda maraqlıdır.

Artıq qeyd etdiyim kimi, təkcə qeyri-texniki səbəblər kifayət qədərdir. Ancaq sırf maraqdan ötrü gəlin bir anlıq onların orada olmadığını təsəvvür etməyə çalışaq. Onda Rustda yazmamaq üçün heç bir səbəb yoxdur? Belə çıxır ki, bu da ən azı çox böyük sualdır.

C/C++ müxtəlif şeylərə görə tənqid olunur. Yeri gəlmişkən, tənqid çox vaxt hətta uzaqdan belə istehsalda C++ kodunu görməyənlər tərəfindən edilir. Problemi qısa və aydın şəkildə aşağıdakı kimi təsvir etmək olar: C++ çox sürətlidir (həmçinin yaddaşa, batareyanın doldurulmasına və s. tələb etmir), lakin o mənada təhlükəsiz deyil ki, o, serialların hüdudlarından kənara çıxmağa, səhvən daxil olmağa imkan verir. azad yaddaş parçaları və s. Bir vaxtlar bu problem Java, C#, Python və başqaları kimi təhlükəsiz dillər kütləsinin yaranmasına səbəb oldu. Amma məlum oldu ki, bu dillər C++ ilə müqayisədə həddən artıq resurs tələb edir və başqa çatışmazlıqlara malikdir, məsələn, zibilin yığılması zamanı qaçılmaz olaraq dünyanı dayandırır. Buna görə də insanlar C++ qədər sürətli, həm də təhlükəsiz bir dil yaratmaq vəzifəsi ilə mübarizə aparırlar. Belə dillərdən biri Rust dilidir.

Pas həqiqətən təhlükəsizdir, lakin təəssüf ki, sürətli deyil. Yazı zamanı Rust sürətinə görə Java, Go və Haskell ilə müqayisə edilə bilər:

Səmimi qəlbdən ümid edirəm ki, zaman keçdikcə o, bir növ overclock ediləcək, lakin o vaxta qədər, sürət və təhlükəsizlik mübadilələri baxımından Scala və ya Go-dan daha maraqlı deyil. Sual hələ də açıq qalır: bir dili ümumiyyətlə sürətli və təhlükəsiz etmək mümkündürmü, yoxsa massiv sərhədlərini aşmaq üçün daimi yoxlamalar, C-kitabxanalarına bağlamalar ətrafında təhlükəsiz bağlamalar və sair hər hansı bir dili avtomatik olaraq C/-dən 2 dəfə yavaş edirmi? C++.

Rustu tam olaraq nə təhlükəsiz edir? Danışsaq sadə sözlərlə, onda bu, daxili statik kod analizatoru olan bir dildir. Bütün tipik C++ xətalarını, təkcə yaddaşın idarə edilməsi ilə deyil, həm də çox iş parçacığı ilə əlaqəli olanları tutan həqiqətən çox gözəl statik analizator. Dəyişən obyektin keçidini kanal vasitəsilə başqa mövzuya ötürdüm və sonra bu linkdən özüm istifadə etməyə çalışdım - o, tərtib edilmədi. Bu, həqiqətən gözəldir.

Arqument tez-tez edilir ki, kodun yalnız 10% -i vaxtın 90% -ində icra olunur (bu, mənim başa düşdüyüm qədər, sırf bir qaydadır - bu mövzuda heç bir ciddi araşdırma tapa bilmədim). Buna görə də, proqramın çoxu təhlükəsiz Rust-da yazıla bilər, qaynar kodun 10% təhlükəli alt çoxluqda yazılmışdır və indiki Rust tətbiqinin ləngliyi həqiqətən problem deyil. Yaxşı, amma sonra məlum olur ki, Rust heç lazım deyil, çünki kodun 90%-ni Go-da, 10%-ni isə C-də yaza bilirəm. Yalnız gümüş güllə axtaranlar və əlaqəsi olmayan nəzəriyyəçilər Rustdan yalnız proqramın 100% bir dildə yazıla bilməsi üçün istifadə edəcəklər. Baxmayaraq ki, əslində bunlar Java plus C və ya Go plus C birləşməsindən o qədər də fərqlənməyən eyni dilin iki ləhcəsidir.

Əslində 10:90 qaydası hələ də yalandır. Bu məntiqlə Java-da WebKit-in 90%-ni, VirtualBox-un 90%-ni və ya GCC-nin 90%-ni yenidən yaza və eyni nəticəni əldə edə bilərsiniz. Aydındır ki, bu belə deyil. Məsələ bir sıra verilişlərdə bu münasibətin çox fərqli olmasında deyilsə belə, əllərinizə baxın. Deyək ki, bütün proqram təhlükəli C/C++ dilində yazılıb və onun icra müddəti, nisbətən desək, 0,9*1 (qaynar kodun kiçik bir hissəsi) + 0,1*1 (çox soyuq kod) = 1-ə bərabərdir. İndi gəlin onu Si-də əlavələrlə təhlükəsiz dildə olan proqramla müqayisə edin: 0.9*1 + 0.1*2 = 1.1, fərqin təxminən 10%-i. Bu çoxdu, yoxsa az? Ölçünüzdən asılıdır. Google vəziyyətində, hətta bir neçə faiz milyonlarla dollara qənaət edə bilər ("İstifadə" məqaləsinin 5-ci bəndinə baxın). Və ya onunla təsəvvür edin növbəti yeniləmə JVM birdən 10% daha çox resurs tələb etməyə başlayacaq! Faizləri Amerika puluna çevirdikdən sonra əldə edilən rəqəmdə neçə sıfır olacağını təxmin etməyə belə qorxuram! C və C++ istifadə edilən tapşırıqlarda 10% çox şeydir.

Biz bir mantra kimi “vaxtından əvvəl optimallaşdırma bütün pisliklərin köküdür” təkrar edirik. Amma hərfi mənada götürsək, hər yerdə sürətli çeşidləmə əvəzinə bubble sort istifadə edək. Proqramın bu xüsusi yerdə yavaşlayacağını dəqiq bilmirik! Dərhal daha səmərəli atomdan istifadə edə bilsəniz, bəzi hərəkətlərin adi sayğaclarını aktyorlara və ya əməliyyat yaddaşına yığmağın mənası nədir? Və ümumiyyətlə, əhəmiyyətsiz hallarda hamısını, hamısını, bütün dəyişənləri zorla başlatmağın, bir dəstə əlavə yoxlama aparmağın və s. Gəlin 10% deyil, 2-5% sürətlənmə ilə yekunlaşaq. Bu da heç də pis deyil, əgər bir neçə əlavə dəqiqəlik fikir tələb olunurdusa. Artıq aşkar etdiyimiz kimi, C/C++-da həll olunan problemlərdə bu, böyük fərq ola bilər! Sonra kim dedi ki, qaynar nöqtə tapmaq, kodu yenidən yazmaq (bəlkə də çoxlu kod) və həqiqətən daha sürətli olduğunu sübut etmək performans haqqında əvvəlcədən düşünməkdən daha asandır?

Sürət-təhlükəsizlik mübadilə məsələsinə məhəl qoymasaq, dilin dizaynı ilə bağlı suallarım da var. Xüsusilə, göstəricilərin beş növü ilə bağlı. Bir tərəfdən, proqramçı dəyişənlərin harada, yığında və ya yığında yerləşdiyini və bir neçə ipin eyni vaxtda onlarla işləyə biləcəyini və ya işləyə bilməyəcəyini düşünəndə bu pis deyil. Amma digər tərəfdən təsəvvür edin ki, siz proqram yazırsınız və belə çıxır ki, dəyişən stack üzərində deyil, yığın üzərində yaşamalıdır. Box istifadə etmək üçün hər şeyi yenidən yazırsınız. Beləliklə, həqiqətən ehtiyacınız olanın Rc və ya Arc olduğunu başa düşürsünüz. Yenidən yazırsan. Və sonra onu yenidən yığındakı müntəzəm dəyişənə yenidən yazırsınız. Bütün bunlar - əlində normal IDE olmadan. Və müntəzəm oyunlar kömək etməyəcək. Yaxşı və ya sadəcə "Vec" üslubunda >>>", salam, Java! Amma ən acınacaqlısı odur ki, kompilyator artıq bütün dəyişənlərin ömrünü bilir, o, bütün bu Box, Arc və s.-ni avtomatik olaraq çıxara bilər. Amma nədənsə işin bu hissəsi köçürülür. proqramçı üçün val yazmaq daha asan olardı (üçüncü minillikdə!) və lazım olduqda, bu mənada The Rust tərtibatçıları bütün fikri məhv etdi.

Buna görə, xüsusən də Rustun tətbiq dairəsi çox daralır. Ağlı başında olan heç kim belə bir dildə veb və server tərəfi yazmaz. Xüsusilə nəzərə alsaq ki, JVM altında eyni dillər üzərində əhəmiyyətli üstünlüklər təmin etmir. Normal yüngül iplərlə (futurs deyil) Go bu tapşırıqlar üçün daha cəlbedici görünür. Füturlarla, ayağınıza atəş açmamaq üçün hələ də işləməyi öyrənməlisiniz və "təhlükəsiz dil" deyirsiniz. Bəli, bu dillərin öz xüsusiyyətləri var, dünyanı eyni şəkildə dayandırırlar, lakin bu problem həm mikroservislərə kəsilməklə, həm də digər üsullarla həll edilə bilər. Bəli, heç kim Rust-u JavaScript-ə tərcümə etməyəcək, AWS-də tərtibat üçün skriptlər yazmayacaq və ya MongoDB üçün sorğu dili kimi istifadə etməyəcək. Onların Android üçün yazacaqları ehtimalı da azdır, lakin fərqli bir səbəbdən - birdən çox arxitektura var və JVM ilə bu, çox asandır. Birdən Rustun "bütün tapşırıqlar üçün uyğun olduğunu" düşünsəniz, sizi məyus etməliyəm.

Yaxşı, yığına:

  • Makrolar, normal istisnaların olmaması səbəbindən yaranan həddindən artıq təfərrüatların ehtiyat nüsxəsidir. Mən artıq metaproqramlaşdırmanın problemləri haqqında yazmışam, xüsusən ona görə Rust üçün normal IDE görməyəcəyik. Mən əmin deyiləm, amma Rustdakı makroların ad boşluqları belə yoxdur.
  • İnsanlar axmaqdır və yük həqiqətən Crates.io-dan yan keçərək paketləri birbaşa git depolarından çəkməyə təşviq edir. Nəticədə, Rabar ilə Erlang dünyasında olduğu kimi paketlərlə eyni qarışıqlıq əldə etmək ehtimalı yüksəkdir.
  • Bir çox yeni dillər kimi Rust da sadələşdirmə yolunu tutur. Ümumiyyətlə, niyə normal miras və istisnaların olmadığını başa düşürəm, amma kiminsə mənim üçün belə şeylərə qərar verməsi xoşagəlməz bir dad yaradır. C++ nəyi istifadə etmək və nəyi istifadə etməmək baxımından proqramçıya məhdudiyyət qoymur.
  • Əgər biz sadələşdirmə yolu ilə getsək, o zaman bütün bu dil uzantılarını atmalı olacağıq. Əks halda belə çıxır ki, Haskell dünyasında olduğu kimi, hər proqramçı öz ləhcəsində yazır.
  • Ağıllı göstəricilər, əgər bir şey varsa, pulsuz deyil və proqnozlaşdırıla bilən zibil toplama vaxtlarına səbəb olmur. Bəzi mövzu birdən çox dərin məlumat strukturunu azad etmək şərəfinə malikdir. O, ölü halqaların labirintindən keçərkən, ondan asılı olan iplər səbirlə axmaq olur. Eyni problem kiçik qrupları ilə Erlanqda da var, mən bunu bir neçə dəfə müşahidə etmişəm. Ağıllı göstəricilərin də öz problemləri, eyni yaddaş parçalanması və sızmaları var. Vikpointer-i siklik quruluşda unutdum, hamısı budur. Və bu, təhlükəsiz olduğunu iddia edən bir dildə. Proqnozlaşdırıla bilən GC vaxtını istəyirsinizsə, ya yük altında tətbiqinizin davranışını öyrənin və GC vaxtı sizə uyğun gəlmirsə, hərəkətə keçin (eyni obyekt hovuzlarını yadda saxlayın) və ya yaddaşı əl ilə idarə edin.
  • Kimsə Rust semantikasının ciddi təsvirini görübmü? Heç olmasa yaddaş modeli varmı? Həm də mənə "təhlükəsiz" bir dil, həqiqətən şərh edə bilən proqramların "düzgünlüyünü sübut edir" mənbə on fərqli yollar, ha!
  • Bunu sizə bir daha xatırlatmaya bilmərəm Problem demək olar ki, həmişə insanlardır, texnologiya deyil.. Əgər pis C++ kodu ilə nəticələnirsinizsə və ya Java birdən yavaşlayırsa, bu, texnologiyanın pis olması deyil, ondan düzgün istifadə etməyi öyrənmədiyiniz üçündür. Siz də Rustdan bədbəxt olacaqsınız, lakin müxtəlif səbəblərdən. Daha populyar alətlərdən istifadə etməyi və sevməyi öyrənmək daha asan olmazdımı?

Ümumiyyətlə, növbəti 5 il ərzində mən Rustdansa, vaxtımı C/C++ öyrənməyə sərf edərdim. C++ - bu sənaye standartıdır. 30 ildən artıqdır ki, bu dildə müxtəlif problemlər uğurla həll olunur. Rust və onun kimiləri isə qeyri-müəyyən gələcəyi olan anlaşılmaz oyuncaqlardır. Ən azı 2000-ci illərdən bəri C++-ın gözlənilməz ölümü ilə bağlı söhbətlər gedirdi, lakin bu müddət ərzində C/C++ dilində yazılar heç də az deyil. Tam əksinə. Və görürük ki, dil inkişaf edir (C++11, C++14), onun üçün yeni alətlər peyda olur (CLion və Clang-ı xatırlayaq) və sadəcə olaraq çoxlu uyğun vakansiyalar var.

C++ proqramçısı hər zaman layiqli maaşdan çox asanlıqla iş tapa bilər və lazım gələrsə, Rustda tez bir zamanda yenidən hazırlana bilər. Bunun əksi çox, çox şübhəlidir. Yeri gəlmişkən, dil, əgər bir şey varsa, yeni bir iş yeri seçərkən həlledici deyil, yeganə amildən uzaqdır. Bundan əlavə, təcrübəli C/C++ proqramçısı asanlıqla PostgreSQL və ya Linux nüvələri, güclü müasir inkişaf vasitələrindən istifadə edir, həmçinin ixtiyarında çoxlu kitab və məqalələr var (məsələn, OpenGL-də).

Vaxtınıza və sağlamlığınıza diqqət yetirin, düşündüyünüz qədər vaxtınız yoxdur!


Kateqoriyalar