Software developer Graydon Hoare created Rust in 2006 while working atMozilla, which officially sponsored the project in 2009. The first stable release, Rust 1.0, was published in May 2015. Following a layoff of Mozilla employees in August 2020, four other companies joined Mozilla in sponsoring Rust through the creation of theRust Foundation in February 2021.
Rust has been adopted by many software projects, especiallyweb services andsystem software. It has been studied academically and has a growing community of developers.
Rust began as a personal project byMozilla employee Graydon Hoare in 2006. According toMIT Technology Review, he started the project due to his frustration with a broken elevator in his apartment building whose software had crashed,[15] and named the language after thegroup of fungi of the same name that is "over-engineered for survival".[15] During the time period between 2006 and 2009, Rust was not publicized to others at Mozilla and was written in Hoare's free time;[16]: 7:50 Hoare began speaking about the language around 2009 after a small group at Mozilla became interested in the project.[17] Hoare cited languages from the 1970s, 1980s, and 1990s as influences — includingCLU,BETA,Mesa, NIL,[note 4]Erlang,Newsqueak,Napier,Hermes,Sather,Alef, andLimbo.[17] He described the language as "technology from the past come to save the future from itself."[16]: 8:17 [17] Early Rust developer Manish Goregaokar similarly described Rust as being based on "mostly decades-old research."[15]
During the early years, the Rustcompiler was written in about 38,000 lines ofOCaml.[16]: 15:34 [18] Features of early Rust that were later removed include explicitobject-oriented programming via anobj keyword,[16]: 10:08 and atypestates system for variable state changes (such as going from uninitialized to initialized).[16]: 13:12
Mozilla officially sponsored the Rust project in 2009.[15]Brendan Eich and other executives, intrigued by the possibility of using Rust for a safeweb browserengine, placed engineers on the project including Patrick Walton, Niko Matsakis, Felix Klock, and Manish Goregaokar.[15] A conference room taken by the project developers was dubbed "the nerd cave," with a sign placed outside the door.[15]
During this time period, work had shifted from the initial OCaml compiler to aself-hosting compiler (i.e., written in Rust) targettingLLVM.[19][note 5] The ownership system was in place by 2010.[15] The Rust logo was developed in 2011 based on a bicycle chainring.[21]
Rust 0.1 became the first public release on January 20, 2012[22] for Windows, Linux, and MacOS.[23] The early 2010s witnessed an increasing number of full-time engineers at Mozilla, as well as increasing involvement from open source volunteers outside of Mozilla and outside of the United States.[15]
The years from 2012 to 2015 were marked by substantial changes to the Rusttype system.[16]: 18:36 [15] Memory management through the ownership system was gradually consolidated and expanded. By 2013, thegarbage collector was rarely used, and was removed in favor of the ownership system.[15] Other features were removed in order to simplify the language, including typestates, thepure keyword,[24] various specialized pointer types, and syntax support forchannels.[16]: 22:32
According to Steve Klabnik, Rust was influenced during this period by developers coming fromC++ (e.g., low-level performance of features),scripting languages (e.g., Cargo and package management), andfunctional programming (e.g., type systems development).[16]: 30:50
Graydon Hoare stepped down from Rust in 2013.[15] After Hoare's departure, it evolved organically under a federated governance structure, with a "core team" of initially six people,[16]: 21:45 and around 30-40 developers total across various other teams.[16]: 22:22 ARequest for Comments (RFC) process for new language features was added in March 2014.[16]: 33:47 The core team would grow to nine people by 2016[16]: 21:45 with over 1600 RFCs.[16]: 34:08
According to Andrew Binstock forDr. Dobb's Journal in January 2014, while Rust was "widely viewed as a remarkably elegant language", adoption slowed because it radically changed from version to version.[25] Rust development at this time focused on finalizing features for version 1.0 so that it could begin promisingbackward compatibility.[16]: 41:26
Six years after Mozilla's sponsorship, Rust 1.0 was published and became the firststable release on May 15, 2015.[15] A year after, the Rust compiler had accumulated over 1,400 contributors and there were over 5,000 third-party libraries published on the Rust package management website Crates.io.[16]: 43:15
The development of theServo browser engine continued in parallel with Rust, jointly funded by Mozilla andSamsung.[26] The teams behind the two projects worked in close collaboration; new features in Rust were tested out by the Servo team, and new features in Servo were used to give feedback back to the Rust team.[16]: 5:41 The first version of Servo was released in 2016.[15] TheFirefox web browser shipped with Rust code as of 2016 (version 45),[16]: 53:30 [27] but components of Servo did not appear in Firefox until September 2017 (version 57) as part of theGecko andQuantum projects.[28]
Improvements were made to the Rust toolchain ecosystem during the years following 1.0 includingRustfmt,integrated development environment integration,[16]: 44:56 and a regular compiler testing and release cycle.[16]: 46:48 Rust gained a communitycode of conduct and anIRC chat for community discussion.[16]: 50:36
The earliest known adoption outside of Mozilla was by individual projects at Samsung,Facebook (nowMeta Platforms),Dropbox, and Tilde, Inc., the company behindember.js.[16]: 55:44 [15]Amazon Web Services followed in 2020.[15] Engineers cited performance, lack of a garbage collector, safety, and pleasantness of working in the language as reasons for the adoption. Amazon developers cited a finding by Portuguese researchers that Rust code usedless energy compared to similar code written inJava.[15][29]
In August 2020, Mozilla laid off 250 of its 1,000 employees worldwide, as part of a corporate restructuring caused by theCOVID-19 pandemic.[30][31] The team behind Servo was disbanded. The event raised concerns about the future of Rust.[32] In the following week, the Rust Core Team acknowledged the severe impact of the layoffs and announced that plans for a Rust foundation were underway. The first goal of the foundation would be to take ownership of alltrademarks anddomain names and to take financial responsibility for their costs.[33]
On February 8, 2021, the formation of theRust Foundation was announced by five founding companies:Amazon Web Services,Google,Huawei,Microsoft, andMozilla.[34][35] The foundation would provide financial support for Rust developers in the form of grants and server funding.[15] In a blog post published on April 6, 2021, Google announced support for Rust within theAndroid Open Source Project as an alternative to C/C++.[36]
On November 22, 2021, the Moderation Team, which was responsible for enforcing the community code of conduct, announced their resignation "in protest of the Core Team placing themselves unaccountable to anyone but themselves".[37] In May 2022, members of the Rust leadership council posted a public response to the incident.[38]
The Rust Foundation posted a draft for a new trademark policy on April 6, 2023, which resulted in widespread negative reactions from Rust users and contributors.[39] The trademark policy included rules for how the Rust logo and name could be used.[39]
On February 26, 2024, the U.S.White HouseOffice of the National Cyber Director released a 19-page press report urging software development to move away from C and C++ to memory-safe languages like C#, Go, Java, Ruby, Swift, and Rust.[40][41][42]
Variables in Rust are defined through thelet keyword.[47] The example below assigns a value to the variable with namefoo of typei32 and outputs its value; the type annotation:i32 can be omitted.
fnmain(){letfoo:i32=10;println!("The value of foo is {foo}");}
Variables areimmutable by default, unless themut keyword is added.[48] The following example uses//, which denotes the start of acomment.[49]
fnmain(){// This code would not compile without adding "mut".letmutfoo=10;println!("The value of foo is {foo}");foo=20;println!("The value of foo is {foo}");}
Multiplelet expressions can define multiple variables with the same name, known asvariable shadowing. Variable shadowing allows transforming variables without having to name the variables differently.[50] The example below declares a new variable with the same name that is double the original value:
fnmain(){letfoo=10;// This will output "The value of foo is 10"println!("The value of foo is {foo}");letfoo=foo*2;// This will output "The value of foo is 20"println!("The value of foo is {foo}");}
Variable shadowing is also possible for values of different types. For example, going from a string to its length:
Ablock expression is delimited bycurly brackets. When the last expression inside a block does not end with a semicolon, the block evaluates to the value of that trailing expression:[51]
fnmain(){letx={println!("this is inside the block");1+2};println!("1 + 2 = {x}");}
Trailing expressions of function bodies are used as the return value:[52]
Anifconditional expression executes code based on whether the given value istrue.else can be used for when the value evaluates tofalse, andelseif can be used for combining multiple expressions.[53]
fnmain(){letx=10;ifx>5{println!("value is greater than five");}ifx%7==0{println!("value is divisible by 7");}elseifx%5==0{println!("value is divisible by 5");}else{println!("value is not divisible by 7 or 5");}}
if andelse blocks can evaluate to a value, which can then be assigned to a variable:[53]
For loops in Rust loop over elements of a collection.[55]for expressions work over anyiterator type.
fnmain(){// Using `for` with range syntax for the same functionality as above// The syntax 4..=10 means the range from 4 to 10, up to and including 10.forvaluein4..=10{println!("value = {value}");}}
In the above code,4..=10 is a value of typeRange which implements theIterator trait. The code within the curly braces is applied to each element returned by the iterator.
Iterators can be combined with functions over iterators likemap,filter, andsum. For example, the following adds up all numbers between 1 and 100 that are multiples of 3:
More generally, theloop keyword allows repeating a portion of code until abreak occurs.break may optionally exit the loop with a value. In the case of nested loops, labels denoted by'label_name can be used to break an outer loop rather than the innermost loop.[56]
fnmain(){letvalue=456;letmutx=1;lety=loop{x*=10;ifx>value{breakx/10;}};println!("largest power of ten that is smaller than or equal to value: {y}");letmutup=1;'outer:loop{letmutdown=120;loop{ifup>100{break'outer;}ifdown<4{break;}down/=2;up+=1;println!("up: {up}, down: {down}");}up*=2;}}
Thematch andiflet expressions can be used forpattern matching. For example,match can be used to double an optional integer value if present, and return zero otherwise:[57]
Rust isstrongly typed andstatically typed, meaning that the types of all variables must be known at compilation time. Assigning a value of a particular type to a differently typed variable causes acompilation error.Type inference is used to determine the type of variables if unspecified.[58]
The type(), called the "unit type" in Rust, is a concrete type that has exactly one value. It occupies no memory (as it represents the absence of value). All functions that do not have an indicated return type implicitly return(). It is similar tovoid in other C-style languages, howevervoid denotes the absence of a type and cannot have any value.
The default integer type isi32, and the defaultfloating point type isf64. If the type of aliteral number is not explicitly provided, it is either inferred from the context or the default type is used.[59]
Integer types in Rust are named based on thesignedness and the number of bits the type takes. For example,i32 is a signed integer that takes 32 bits of storage, whereasu8 is unsigned and only takes 8 bits of storage.isize andusize take storage depending on thememory address bus width of the compilation target. For example, when building for32-bit targets, both types will take up 32 bits of space.[60][61]
By default, integer literals are in base-10, but differentradices are supported with prefixes, for example,0b11 forbinary numbers,0o567 foroctals, and0xDB forhexadecimals. By default, integer literals default toi32 as its type. Suffixes such as4u32 can be used to explicitly set the type of a literal.[62] Byte literals such asb'X' are available to represent theASCII value (as au8) of a specific character.[63]
Compound types can contain multiple values. Tuples are fixed-size lists that can contain values whose types can be different. Arrays are fixed-size lists whose values are of the same type. Expressions of the tuple and array types can be written through listing the values, and can be accessed with.index or[index]:[67]
Rust's ownership system consists of rules that ensure memory safety without using a garbage collector. At compile time, each value must be attached to a variable called theowner of that value, and every value must have exactly one owner.[69] Values are moved between different owners through assignment or passing a value as a function parameter. Values can also beborrowed, meaning they are temporarily passed to a different function before being returned to the owner.[70] With these rules, Rust can prevent the creation and use ofdangling pointers:[70][71]
fnprint_string(s:String){println!("{}",s);}fnmain(){lets=String::from("Hello, World");print_string(s);// s consumed by print_string// s has been moved, so cannot be used any more// another print_string(s); would result in a compile error}
The functionprint_string takes ownership over theString value passed in; Alternatively,& can be used to indicate areference type (in&String) and to create a reference (in&s):[72]
fnprint_string(s:&String){println!("{}",s);}fnmain(){lets=String::from("Hello, World");print_string(&s);// s borrowed by print_stringprint_string(&s);// s has not been consumed; we can call the function many times}
Because of these ownership rules, Rust types are known aslinear oraffine types, meaning each value can be used exactly once. This enforces a form ofsoftware fault isolation as the owner of a value is solely responsible for its correctness and deallocation.[73]
When a value goes out of scope, it isdropped by running itsdestructor. The destructor may be programmatically defined through implementing theDroptrait. This helps manage resources such as file handles, network sockets, andlocks, since when objects are dropped, the resources associated with them are closed or released automatically.[74]
Object lifetime refers to the period of time during which a reference is valid; that is, the time between the object creation and destruction.[75] Theselifetimes are implicitly associated with all Rust reference types. While often inferred, they can also be indicated explicitly with named lifetime parameters (often denoted'a,'b, and so on).[76]
Lifetimes in Rust can be thought of aslexically scoped, meaning that the duration of an object lifetime is inferred from the set of locations in the source code (i.e., function, line, and column numbers) for which a variable is valid.[77] For example, a reference to a local variable has a lifetime corresponding to the block it is defined in:[77]
The borrow checker in the Rust compiler then enforces that references are only used in the locations of the source code where the associated lifetime is valid.[78][79] In the example above, storing a reference to variablex inr is valid, as variablex has a longer lifetime ('a) than variabler ('b). However, whenx has a shorter lifetime, the borrow checker would reject the program:
fnmain(){letr;// ------------------+- Lifetime 'a// |{// |letx=5;// -+-- Lifetime 'b |r=&x;// ERROR: x does | |}// not live long -| |// enough |println!("r: {}",r);// |}// ------------------+
Since the lifetime of the referenced variable ('b) is shorter than the lifetime of the variable holding the reference ('a), the borrow checker errors, preventingx from being used from outside its scope.[80]
Lifetimes can be indicated using explicitlifetime parameters on function arguments. For example, the following code specifies that the reference returned by the function has the same lifetime asoriginal (andnot necessarily the same lifetime asprefix):[81]
User-defined types are created with thestruct orenum keywords. Thestruct keyword is used to denote arecord type that groups multiple related values.[84]enums can take on different variants at runtime, with its capabilities similar toalgebraic data types found in functional programming languages.[85] Both records and enum variants can containfields with different types.[86] Alternative names, or aliases, for the same type can be defined with thetype keyword.[87]
Theimpl keyword can define methods for a user-defined type. Data and functions are defined separately. Implementations fulfill a role similar to that ofclasses within other languages.[88]
A diagram of the dependencies between the standard library modules of Rust.
The Ruststandard library defines and implements many widely used custom data types, including core data structures such asVec,Option, andHashMap, as well assmart pointer types. Rust provides a way to exclude most of the standard library using the attribute#![no_std], for applications such as embedded devices. Internally, the standard library is divided into three parts,core,alloc, andstd, wherestd andalloc are excluded by#![no_std].[89]
Rust uses theoption typeOption<T> to define optional values, which can be matched usingif let ormatch to access the inner value:[90]
fnmain(){letname1:Option<&str>=None;// In this case, nothing will be printed outifletSome(name)=name1{println!("{name}");}letname2:Option<&str>=Some("Matthew");// In this case, the word "Matthew" will be printed outifletSome(name)=name2{println!("{name}");}}
Similarly, Rust'sresult typeResult<T, E> holds either a successfully computed value (theOk variant) or an error (theErr variant).[91] LikeOption, the use ofResult means that the inner value cannot be used directly; programmers must use amatch expression, syntactic sugar such as? (the “try” operator), or an explicitunwrap assertion to access it. BothOption andResult are used throughout the standard library and are a fundamental part of Rust's explicit approach to handling errors and missing data.
The& and&mut reference types are guaranteed to not be null and point to valid memory.[92] The raw pointer types*const and*mut opt out of the safety guarantees, thus they may be null or invalid; however, it is impossible to dereference them unless the code is explicitly declared unsafe through the use of anunsafe block.[93] Unlike dereferencing, the creation of raw pointers is allowed inside safe Rust code.[94]
Rust provides no implicit type conversion (coercion) between most primitive types. But, explicit type conversion (casting) can be performed using theas keyword.[95]
letx:i32=1000;println!("1000 as a u16 is: {}",xasu16);
A presentation on Rust by Emily Dunham fromMozilla's Rust team (linux.conf.au conference, Hobart, 2017)
A function can be made generic by adding type parameters inside angle brackets (<Num>), which only allow types that implement the trait:
// zero is a generic function with one type parameter, Numfnzero<Num:Zero>()->Num{Num::zero()}fnmain(){leta:u32=zero();letb:f32=zero();assert!(a.is_zero()&&b.is_zero());}
In the examples above,Num:Zero as well aswhereSelf:PartialEq are trait bounds that constrain the type to only allow types that implementZero orPartialEq.[97] Within a trait or impl,Self refers to the type that the code is implementing.[98]
Generics can be used in functions to allow implementing a behavior for different types without repeating the same code (seebounded parametric polymorphism). Generic functions can be written in relation to other generics, without knowing the actual type.[99]
By default, traits usestatic dispatch: the compilermonomorphizes the function for each concrete type instance, yielding performance equivalent to type-specific code at the cost of longer compile times and larger binaries.[100]
When the exact type is not known at compile time, Rust providestrait objects&dyn Trait andBox<dyn Trait>.[101] Trait object calls usedynamic dispatch via a lookup table; a trait object is a "fat pointer" carrying both a data pointer and a method table pointer.[100] This indirection adds a small runtime cost, but it keeps a single copy of the code and reduces binary size. Only "object-safe" traits are eligible to be used as trait objects.[102]
This approach is similar toduck typing, where all data types that implement a given trait can be treated as functionally interchangeable.[103] The following example creates a list of objects where each object implements theDisplay trait:
The built-in reference types using the& symbol do not involve run-time reference counting. The safety and validity of the underlying pointers is verified at compile time, preventingdangling pointers and other forms ofundefined behavior.[108] Rust's type system separates shared,immutable references of the form&T from unique, mutable references of the form&mut T. A mutable reference can be coerced to an immutable reference, but not vice versa.[109]
Rust's memory safety checks (See#Safety) may be circumvented through the use ofunsafe blocks. This allows programmers to dereference arbitrary raw pointers, call external code, or perform other low-level functionality not allowed by safe Rust.[110] Some low-level functionality enabled in this way includesvolatile memory access, architecture-specific intrinsics,type punning, and inline assembly.[111]
Unsafe code is sometimes needed to implement complex data structures.[112] A frequently cited example is that it is difficult or impossible to implementdoubly linked lists in safe Rust.[113][114][115][116]
Programmers using unsafe Rust are considered responsible for upholding Rust's memory and type safety requirements, for example, that no two mutable references exist pointing to the same location.[117] If programmers write code which violates these requirements, this results inundefined behavior.[117] The Rust documentation includes a list of behavior considered undefined, including accessing dangling or misaligned pointers, or breaking the aliasing rules for references.[118]
Macros allow generation and transformation of Rust code to reduce repetition. Macros come in two forms, withdeclarative macros defined throughmacro_rules!, andprocedural macros, which are defined in separate crates.[119][120]
A declarative macro (also called a "macro by example") is a macro, defined using themacro_rules! keyword, that uses pattern matching to determine its expansion.[121][122] Below is an example that sums over all its arguments:
macro_rules!sum{($initial:expr$(,$expr:expr)*$(,)?)=>{$initial$(+$expr)*}}fnmain(){letx=sum!(1,2,3);println!("{x}");// prints 6}
In this example, the macro namedsum is defined using the formmacro_rules! sum {(...) => { ... } }. The first part inside the parentheses of the definition, the macro pattern( $initial:expr $(, $expr:expr )* $(,)? ) specifies the structure of input it can take. Here,$initial:expr represents the first expression, while$(, $expr:expr )* means there can be zero or more additional comma-separated expressions after it. The trailing$(,)? allows the caller to optionally include a final comma without causing an error. The second part after the arrow=> describes what code will be generated when the macro is invoked. In this case,$initial $(+ $expr)* means that the generated code will start with the first expression, followed by a+ and each of the additional expressions in sequence. The* again means "repeat this pattern zero or more times". This means, when the macro is later called in line 8, assum!(1, 2, 3) the macro will resolve to1 + 2 + 3 representing the addition of all of the passed expressions.
Procedural macros are Rust functions that run and modify the compiler's inputtoken stream, before any other components are compiled. They are generally more flexible than declarative macros, but are more difficult to maintain due to their complexity.[123][124]
Rust supports the creation offoreign function interfaces (FFI) through theextern keyword. A function that uses the Ccalling convention can be written usingextern"C"fn. Symbols can be exported from Rust to other languages through the#[unsafe(no_mangle)] attribute, and symbols can be imported into Rust throughextern blocks:[note 6][126]
The#[repr(C)] attribute enables deterministic memory layouts forstructs andenums for use across FFI boundaries.[126] External libraries such asbindgen andcxx can generate Rust bindings for C/C++.[126][127]
Memory safety includes the absence of dereferences tonull,dangling, and misalignedpointers, and the absence ofbuffer overflows anddouble free errors.[128][129][130][131] Data values can be initialized only through a fixed set of forms, all of which require their inputs to be already initialized.[132]
The Rust ecosystem includes its compiler, itsstandard library, and additional components for software development. Component installation is typically managed byrustup, a Rusttoolchain installer developed by the Rust project.[137]
The Rust compiler,rustc, compiles Rust code intobinaries. First, the compiler parses the source code into anAST. Next, this AST is lowered toIR. The compiler backend is then invoked as a subcomponent to applyoptimizations and translate the resulting IR intoobject code. Finally, alinker is used to combine the object(s) into a single executable image.[138]
rustc usesLLVM as its compiler backend by default, but it also supports using alternative backends such asGCC andCranelift.[139] The intention of those alternative backends is to increase platform coverage of Rust or to improve compilation times.[140][141]
Cargo is Rust'sbuild system andpackage manager. It downloads, compiles, distributes, and uploads packages—calledcrates—that are maintained in an official registry. It also acts as a front-end for Clippy and other Rust components.[142]
By default, Cargo sources its dependencies from the user-contributed registrycrates.io, butGit repositories, crates in the local filesystem, and other external sources can also be specified as dependencies.[143]
Rustfmt is acode formatter for Rust. It formats whitespace andindentation to produce code in accordance with a commonstyle, unless otherwise specified. It can be invoked as a standalone program, or from a Rust project through Cargo.[144]
Example output of Clippy on a hello world Rust program
Clippy is Rust's built-inlinting tool to improve the correctness, performance, and readability of Rust code. As of 2025[update], it has 795 rules.[145][146]
Following Rust 1.0, new features are developed innightly versions which are released daily. During each six-week release cycle, changes to nightly versions are released to beta, while changes from the previous beta version are released to a new stable version.[147]
Every two or three years, a new "edition" is produced. Editions are released to allow making limitedbreaking changes, such as promotingawait to a keyword to supportasync/await features. Crates targeting different editions can interoperate with each other, so a crate can upgrade to a new edition even if its callers or its dependencies still target older editions. Migration to a new edition can be assisted with automated tooling.[148]
Since it performs no garbage collection, Rust is often faster than other memory-safe languages.[150][73][151] Most of Rust's memory safety guarantees impose no runtime overhead,[152] with the exception ofarray indexing which is checked at runtime by default.[153] The performance impact of array indexing bounds checks varies, but can be significant in some cases.[153]
Many of Rust's features are so-calledzero-cost abstractions, meaning they are optimized away at compile time and incur no runtime penalty.[154] The ownership and borrowing system permitszero-copy implementations for some performance-sensitive tasks, such asparsing.[155]Static dispatch is used by default to eliminatemethod calls, except for methods called on dynamic trait objects.[156] The compiler usesinline expansion to eliminatefunction calls and statically-dispatched method invocations.[157]
Since Rust usesLLVM, all performance improvements in LLVM apply to Rust also.[158] Unlike C and C++, Rust allows the compiler to reorder struct and enum elements unless a#[repr(C)] representation attribute is applied.[159] This allows the compiler to optimize for memory footprint, alignment, and padding, which can be used to produce more efficient code in some cases.[160]
In operating systems, theRust for Linux project, launched in 2020, merged initial support into theLinux kernel version 6.1 in late 2022.[170][171][172] The project is active with a team of 6–7 developers, and has added more Rust code with kernel releases from 2022 to 2024,[173] aiming to demonstrate theminimum viability of the project and resolve key compatibility blockers.[170][174] The first drivers written in Rust were merged into the kernel for version 6.8.[170] TheAndroid developers used Rust in 2021 to rewrite existing components.[175][176]Microsoft has rewritten parts ofWindows in Rust.[177] The r9 project aims to re-implementPlan 9 from Bell Labs in Rust.[178] Rust has been used in the development of new operating systems such asRedox, a "Unix-like" operating system andmicrokernel,[179] Theseus, an experimental operating system with modular state management,[180][181] and most ofFuchsia.[182] Rust is used for command-line tools and operating system components such asstratisd, afile system manager[183][184] and COSMIC, adesktop environment bySystem76.[185]
In other uses,Discord, aninstant messaging software company, rewrote parts of its system in Rust for increased performance in 2020. In the same year, Dropbox announced that itsfile synchronization had been rewritten in Rust.Facebook (Meta) used Rust to redesign its system that manages source code for internal projects.[15]
In the 2025Stack Overflow Developer Survey, 14.8% of respondents had recently done extensive development in Rust.[192] The survey named Rust the "most admired programming language" annually from 2016 to 2025 (inclusive), as measured by the number of existing developers interested in continuing to work in the language.[193][note 7] In 2025, 29.2% of developers not currently working in Rust expressed an interest in doing so.[192]
Rust's safety and performance have been investigated in programming languages research.[194][112][195]
In other fields, a journal article published toProceedings of the International Astronomical Union used Rust to simulate multi-planet systems.[196] An article published inNature shared stories of bioinformaticians using Rust.[142] Both articles cited Rust's performance and safety as advantages, and thelearning curve as being a primary drawback to Rust adoption.
The 2025DARPA project TRACTOR aims to automatically translate C to Rust using techniques such as static analysis, dynamic analysis, and large language models.[197]
Some Rust users refer to themselves as Rustaceans (similar to the wordcrustacean) and have adopted an orange crab, Ferris, as their unofficial mascot.[198][199]
According to theMIT Technology Review, the Rust community has been seen as "unusually friendly" to newcomers and particularly attracted people from thequeer community, partly due to itscode of conduct.[15] Inclusiveness has been cited as an important factor for some Rust developers.[142] The official Rust blog collects and publishes demographic data each year.[200]
It was established on February 8, 2021, with five founding corporate members (Amazon Web Services, Huawei, Google, Microsoft, and Mozilla).[202] The foundation's board was chaired by Shane Miller,[203] with Ashley Williams as interim executive director.[44] In late 2021, Rebecca Rumbul became Executive Director and CEO.[204]
The Rust project is maintained by 8 top-levelteams as of November 2025[update]: the leadership council, compiler team, dev tools team, infrastructure team, language team, launching pad, library team, and moderation team.[205] The leadership council oversees the project and is formed by representatives among the other teams.[206]
^Third-party dependencies, e.g.,LLVM orMSVC, are subject to their own licenses.[3][4]
^abNIL is cited as an influence for Rust in multiple sources; this likely refers to Network Implementation Language developed by Robert Strom and others atIBM, which pioneeredtypestate analysis,[5][6] not to be confused withNew Implementation of LISP.
^The list of Rust compiler versions (referred to as a bootstrapping chain) has history going back to 2012.[20]
^wrappingno_mangle withunsafe as well as prefacing theextern"C" block withunsafe are required in the 2024 edition or later.[125]
^That is, among respondents who have done "extensive development work [with Rust] in over the past year" (14.8%), Rust had the largest percentage who also expressed interest to "work in [Rust] over the next year" (72.4%).[192]
Blandy, Jim; Orendorff, Jason; Tindall, Leonora F. S. (2021).Programming Rust: Fast, Safe Systems Development (2nd ed.). O'Reilly Media.ISBN978-1-4920-5254-8.OCLC1289839504.
^"Copyright".GitHub. The Rust Programming Language. 2022-10-19.Archived from the original on 2023-07-22. Retrieved2022-10-19.
^"Licenses".The Rust Programming Language.Archived from the original on 2025-02-23. Retrieved2025-03-07.
^Strom, Robert E. (1983). "Mechanisms for compile-time enforcement of security".Proceedings of the 10th ACM SIGACT-SIGPLAN symposium on Principles of programming languages - POPL '83. pp. 276–284.doi:10.1145/567067.567093.ISBN0897910907.S2CID6630704.
^"Uniqueness Types".Rust Blog.Archived from the original on 2016-09-15. Retrieved2016-10-08.Those of you familiar with the Elm style may recognize that the updated--explain messages draw heavy inspiration from the Elm approach.
^"Influences".The Rust Reference.Archived from the original on 2023-11-26. Retrieved2023-12-31.
^"Uniqueness Types".Idris 1.3.3 documentation.Archived from the original on 2018-11-21. Retrieved2022-07-14.They are inspired by ... ownership types and borrowed pointers in the Rust programming language.
^abBalasubramanian, Abhiram; Baranowski, Marek S.; Burtsev, Anton; Panda, Aurojit; Rakamarić, Zvonimir; Ryzhyk, Leonid (2017-05-07)."System Programming in Rust".Proceedings of the 16th Workshop on Hot Topics in Operating Systems. HotOS '17. New York, NY, US: Association for Computing Machinery. pp. 156–161.doi:10.1145/3102980.3103006.ISBN978-1-4503-5068-6.S2CID24100599.Archived from the original on 2022-06-11. Retrieved2022-06-01.
^Milano, Mae; Turcotti, Julia; Myers, Andrew C. (2022-06-09). "A flexible type system for fearless concurrency".Proceedings of the 43rd ACM SIGPLAN International Conference on Programming Language Design and Implementation. New York, NY, USA: Association for Computing Machinery. pp. 458–473.doi:10.1145/3519939.3523443.ISBN978-1-4503-9265-5.
^abPopescu, Natalie; Xu, Ziyang; Apostolakis, Sotiris; August, David I.; Levy, Amit (2021-10-15)."Safer at any speed: automatic context-aware safety enhancement for Rust".Proceedings of the ACM on Programming Languages.5 (OOPSLA). Section 2.doi:10.1145/3485480.S2CID238212612. p. 5:We observe a large variance in the overheads of checked indexing: 23.6% of benchmarks do report significant performance hits from checked indexing, but 64.5% report little-to-no impact and, surprisingly, 11.8% report improved performance ... Ultimately, while unchecked indexing can improve performance, most of the time it does not.