Rust (programovací jazyk)

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
Rust
Rust programming language black logo.svg
Paradigma multiparadigmatický: objektově orientovaný, aspektově orientovaný, imperativní, funkcionální, generický, paralelní
Vznikl v před 2009
Vývojář Graydon Hoare,
Mozilla (od roku 2010)
Poslední verze 1.20[1][2] (31. srpna 2017)
Typová kontrola silná, statická
Hlavní implementace rustc
Ovlivněn jazyky C++, C#, Haskell, OCaml, Scheme
Ovlivnil jazyky C# 7, Elm, Idris, Swift
OS Linux, FreeBSD, Windows, OS X
Licence MIT a Apache verze 2
Web www.rust-lang.org
Mozilla Research

Rust je víceúčelový, multiparadigmatický, kompilovaný programovací jazyk, vyvinutý organizací Mozilla Research.[3] Je navržen jako „bezpečný, paralelní, praktický programovací jazyk“,[4][5] podporující čistě funkcionální, imperativně-procedurální, strukturované a objektově orientované programovací styly.

Tento programovací jazyk pochází z osobního projektu zaměstnance Mozilly jménem Graydon Hoare. Mozilla začala sponzorovat tento projekt v roce 2009[6] a zveřejnila ho v roce 2010.[7] Ten samý rok se práce posunuly z počátečního překladače (naprogramovaného v OCaml) do sebe-hostujícího překladače napsaného v Rustu.[8] Tento, známý jako rustc, úspěšně přeložil sám sebe v roce 2011.[9] rustc používá LLVM jako svůj back-end.[10]

Prvně číslovaná pre-alpha release překladače Rust přišla v lednu 2012.[11] Rust 1.0, první stabilní verze, byla vydána 15. května 2015.[12]

Třebaže je vývoj sponzorován Mozillou, jde o OpenSource projekt. Design tohoto jazyka byl vyladěn zkušenostmi z programování jádra webového prohlížeče Servo[13] a kompilátoru jazyka Rust. Velké množství současných příspěvků pochází od členů komunity.[14]

Design[editovat | editovat zdroj]

Cílem Rustu je být dobrým jazykem pro vytváření vysoce paralelních a vysoce bezpečných systémů.[15] Toto byl základ pro soubor vlastností s důrazem na bezpečnost, kontrolu rozvržení paměti, a paralelizmu. Výkon Rustu je srovnatelný s výkonem C++.[16][17]

Syntaxe Rustu je podobná syntaxi C a C++, s bloky kódu ohraničenými složenými závorkami, a řídící klíčová slova programu jako if, else, while, a for. Ne všechna klíčová slova jazyků C a C++ jsou přítomna, zatímco některá další (jako například match pro vícenásobné skoky, podobné switch v jiných jazycích) byla zaměněna nebo přidána. Přes syntaktickou podobnost je Rust sémanticky velmi odlišný od C a C++.

Tento systém je navržen jako paměťově bezpečný, nepovolující ukazatele NULL a znemožňující neplatné ukazatele.[18][19] Datové hodnoty mohou být inicializovány pouze několika pevnými způsoby, avšak všechny tyto způsoby vyžadují inicializovaný vstup.[20] Životní cyklus ukazatelů a jejich neměnnost umožňuje kompilátoru předejít mnohým typům chyb, které jsou možné v C++, a to i při použití jeho inteligentního ukazatele.

Tento typový systém podporuje typ jménem trait, který je podobný typu třída. Trait je přímo inspirován jazykem Haskel. Jedná se o nástroj pro ad-hoc polymorfismus, čehož bylo dosaženo zákazem psaní deklarace proměnných. Další vlastnosti z jazyka Haskell, jako jsou higher-kinded polymorfizmus, zatím nejsou podporovány.

Rust nepoužívá automatickou správu dat (garbage collection), jako je použita na platformách Java a .NET (mj. jazyky Java a C#), přesto je však jeho správa paměti bezpečná, snadná a nevyžadující přerušování běhu programu a sledování odkazů.[21]

Rust umožňuje odvození typu ('type-inference') pro proměnné deklarované použitím klíčového slova let. Tyto proměnné, původně inicializované s cílem určit jejich typ, nevyžadují zachovat původně přidělenu hodnotu. Pokud kompilátor nenalezne na příslušné větvi proměnné přesnou hodnotu, kompilace končí chybou.

Funkce mohou používat generické parametry, ale ty musí být vázány traity. Neexistuje způsob, jak obejít signatury typů a přitom ve funkcích a operátorech využívat generické proměnné.[22]

Objektový systém v Rustu je založen okolo implementací traitů a struktur. Jejich použití nahrazuje roli tříd v jiných (objektových) jazycích, a je definována klíčovým slovem impl. Dědičnost a polymorfizmus jsou poskytovány traity; umožňují je metody, které jsou definovány v mixinech k implementaci. Strukturované typy jsou použity pro definici členských proměnných. Implementace a traity nemohou definovat členské proměnné sami, a pouze traity mohou poskytovat dědičnost, aby nenastal diamond problem jazyka C++.

Projekty v jazyce Rust[editovat | editovat zdroj]

Bezpečné vykreslovací jádro pro webové prohlížeče Servo, které vyvíjí Mozilla a Samsung. V současné době již zvládne test Acid2 a je výrazně rychlejší, než jádro Firefoxu napsané v C++ (Gecko).[23][24]

Parser multimédií prohlížeče Firefox je také napsán v jazyce Rust.[25]

Emulátor PlayStation napsaný v Rustu za použití OpenGL vykreslování pomocí Glium API. - Rustation[26][27]

Emulátor N64, napsaný v Rustu - Rustendo64[28]

Bezpečný OpenGL wrapper pro jazyk Rust - Glium[29]

Unixový operační systém - Redox[30][31]

Historie[editovat | editovat zdroj]

12. července 2016 bylo oznámeno, že bylo zahájeno přepisování parseru multimédií prohlížeče Mozilla Firefox do jazyka Rust.[32][33] Tento parser je již k dispozici od verze Firefoxu 48.[34]

Související projekty[editovat | editovat zdroj]

Existuje překladač podporovaný Mozillou, který překládá zdrojový kód z jazyka C do jazyka Rust. Řeší mj. překlad konstrukcí jazyka C s příkazem goto. Je napsán v Haskellu.[35][36]

Ukázka kódu[editovat | editovat zdroj]

Ukázka Hello world

fn main() {
    println!("Hello, world");
}

Ukázka traitů

trait MaObsah {
    fn obsah(&self) -> f64;
}

struct Kruh {
    x: f64,
    y: f64,
    polomer: f64,
}

impl MaObsah for Kruh {
    fn obsah(&self) -> f64 {
        std::f64::consts::PI * (self.polomer * self.polomer)
    }
}

struct Ctverec {
    x: f64,
    y: f64,
    strana: f64,
}

impl MaObsah for Ctverec {
    fn obsah(&self) -> f64 {
        self.strana * self.strana
    }
}

fn vypis_obsah<T: MaObsah>(tvar: T) {
    println!("Tento utvar ma obsah {}", tvar.obsah());
}

fn main() {
    let c = Kruh {
        x: 0.0f64,
        y: 0.0f64,
        polomer: 1.0f64,
    };

    let s = Ctverec {
        x: 0.0f64,
        y: 0.0f64,
        strana: 1.0f64,
    };

    vypis_obsah(c);
    vypis_obsah(s);
}

Odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Rust (programming language) na anglické Wikipedii.

  1. Announcing Rust 1.20
  2. The Rust Programming Language Blog
  3. Noel. The Rust Language [online]. Lambda the Ultimate, 2010-07-08, [cit. 2010-10-30]. [1]. (anglicky) 
  4. The Rust Programming Language [online]. [cit. 2012-10-21]. [2]. (anglicky) 
  5. Doc language FAQ [online]. [cit. 2012-10-21]. [3]. (anglicky) 
  6. Project FAQ [online]. 2010-09-14, [cit. 2012-01-11]. [4]. (anglicky) 
  7. Future Tense [online]. 2011-04-29, [cit. 2012-02-06]. At Mozilla Summit 2010, we launched Rust, a new programming language motivated by safety and concurrency for parallel hardware, the “manycore” future which is upon us.. [5]. (anglicky) 
  8. HOARE, Graydon. Rust Progress [online]. 2010-10-02, [cit. 2010-10-30]. [6]. (anglicky) 
  9. HOARE, Graydon. [rust-dev] stage1/rustc builds [online]. 2011-04-20, [cit. 2011-04-20]. After that last change fixing the logging scope context bug, looks like stage1/rustc builds. Just shy of midnight :). [7]. (anglicky) 
  10. Introducing MIR - The Rust Programming Language Blog. blog.rust-lang.org [online].  [cit. 2016-06-19]. Dostupné online.  
  11. catamorphism. Mozilla and the Rust community release Rust 0.1 (a strongly-typed systems programming language with a focus on memory safety and concurrency) [online]. 2012-01-20, [cit. 2012-02-06]. [8]. (anglicky) 
  12. Announcing Rust 1.0 - The Rust Programming Language Blog [online]. The Rust Core Team, [cit. 2016-01-21]. [9]. (anglicky) 
  13. Peter Bright. Samsung teams up with Mozilla to build browser engine for multicore machines [online]. 2013-04-03, [cit. 2013-04-04]. [10]. (anglicky) 
  14. Rust Contributors [online]. . [11]. (anglicky) 
  15. AVRAM, Abel. Interview on Rust, a Systems Programming Language Developed by Mozilla [online]. InfoQ, 2012-08-03, [cit. 2013-08-17]. GH: A lot of obvious good ideas, known and loved in other languages, haven't made it into widely used systems languages... There were a lot of good competitors in the late 1970s and early 1980s in that space, and I wanted to revive some of their ideas and give them another go, on the theory that circumstances have changed: the internet is highly concurrent and highly security-conscious, so the design-tradeoffs that always favor C and C++ (for example) have been shifting.. [12]. (anglicky) 
  16. WALTON, Patrick. C++ Design Goals in the Context of Rust [online]. 2010-12-05, [cit. 2011-01-21]. ... It’s impossible to be “as fast as C” in all cases while remaining safe... C++ allows all sorts of low-level tricks, mostly involving circumventing the type system, that offer practically unlimited avenues for optimization. In practice, though, C++ programmers restrict themselves to a few tools for the vast majority of the code they write, including stack-allocated variables owned by one function and passed by alias, uniquely owned objects (often used with auto_ptr or the C++0x unique_ptr), and reference counting via shared_ptr or COM. One of the goals of Rust’s type system is to support these patterns exactly as C++ does, but to enforce their safe usage. In this way, the goal is to be competitive with the vast majority of idiomatic C++ in performance, while remaining memory-safe.... [13]. (anglicky) 
  17. How Fast Is Rust? [online]. [cit. 2016-02-08]. [14]. (anglicky) 
  18. ROSENBLATT, Seth. Samsung joins Mozilla's quest for Rust [online]. 2013-04-03, [cit. 2013-04-05]. [Brendan Eich] noted that every year browsers fall victim to hacking in the annual Pwn2Own contest at the CanSecWest conference. "There's no free memory reads" in Rust, he said, but there are in C++. Those problems "lead to a lot of browser vulnerabilities" and would be solved by Rust, which is a self-compiling language.. [15]. (anglicky) 
  19. BROWN, Neil. A taste of Rust [online]. 2013-04-17, [cit. 2013-04-25]. ... Other more complex data structures could clearly be implemented to allow greater levels of sharing, while making sure the interface is composed only of owned and managed references, and thus is safe from unplanned concurrent access and from dangling pointer errors.. [16]. (anglicky) 
  20. Doc language FAQ [online]. 2010-09-14, [cit. 2012-01-11]. [17]. (anglicky) 
  21. FORSYTH, Jared. Rust vs Go [online]. [cit. 2016-09-06]. Dostupné online.  
  22. WALTON, Patrick. Rust Features I: Type Inference [online]. 2010-10-01, [cit. 2011-01-21]. [18]. (anglicky) 
  23. STANKE, Michal. Strategický plán na rok 2016 a dále. http://www.mozilla.cz [online]. 2016-01-15 [cit. 2016-02-22]. Dostupné online.  (česky) 
  24. LARABEL, Michael. Mozilla's Servo Engine Is Crazy Fast Compared To Gecko. http://www.phoronix.com [online]. 2014-11-09 [cit. 2016-02-22]. Dostupné online.  (anglicky) 
  25. DSL.sk - Vydaný Firefox 48 s dôležitými novinkami. DSL.sk. . Dostupné online [cit. 2016-10-22].  
  26. [https://github.com/simias/rustation
  27. https://news.ycombinator.com/item?id=10338299]
  28. [19]
  29. [20]
  30. LARABEL, Michael. Redox: A Rust-Written, Microkernel Open-Source OS. https://www.phoronix.com. . Dostupné online [cit. 2016-07-28]. (anglicky) 
  31. [21]
  32. BOŘÁNEK, Roman. První součásti Firefoxu jsou přepisovány do Rustu. http://www.root.cz [online]. 2016-07-12 [cit. 2016-07-13]. Dostupné online.  (česky) 
  33. HAGARA, Ladislav. Firefox 48 bude obsahovat komponentu napsanou v programovacím jazyce Rust. http://www.abclinuxu.cz [online]. 2016-07-13 [cit. 2016-07-16]. Dostupné online.  (česky) 
  34. Shipping Rust in Firefox ★ Mozilla Hacks – the Web developer blog. hacks.mozilla.org [online].  [cit. 2016-09-07]. Dostupné online.  
  35. jameysharp/corrode. GitHub [online].  [cit. 2016-11-11]. Dostupné online.  
  36. Corrode update: support from Mozilla, and new features. jamey.thesharps.us [online].  [cit. 2016-11-11]. Dostupné online.  

Externí odkazy[editovat | editovat zdroj]