stringtranslate.com

Rust (lenguaje de programación)

Rust es un lenguaje de programación de propósito general que enfatiza el rendimiento , la seguridad de tipos y la concurrencia . Aplica la seguridad de la memoria , lo que significa que todas las referencias apuntan a una memoria válida. Lo hace sin un recolector de basura tradicional ; en cambio, tanto los errores de seguridad de la memoria como las carreras de datos se evitan mediante el "verificador de préstamos", que rastrea la vida útil del objeto de las referencias en el momento de la compilación .

Rust no impone un paradigma de programación , sino que fue influenciado por ideas de la programación funcional , incluyendo inmutabilidad , funciones de orden superior , tipos de datos algebraicos y coincidencia de patrones . También admite la programación orientada a objetos a través de estructuras, enumeraciones , rasgos y métodos. Es popular para la programación de sistemas . [13] [14] [15]

El desarrollador de software Graydon Hoare creó Rust como un proyecto personal mientras trabajaba en Mozilla Research en 2006. Mozilla patrocinó oficialmente el proyecto en 2009. En los años posteriores a la primera versión estable en mayo de 2015, Rust fue adoptado por empresas como Amazon , Discord , Dropbox , Google ( Alphabet ), Meta y Microsoft . En diciembre de 2022, se convirtió en el primer lenguaje distinto de C y ensamblador en ser compatible con el desarrollo del kernel de Linux .

Rust se ha destacado por su rápida adopción y ha sido estudiado en investigaciones sobre la teoría del lenguaje de programación .

Historia

Orígenes (2006-2012)

Sede de la Fundación Mozilla en Mountain View, California

Rust comenzó como un proyecto personal en 2006 por parte del empleado de Mozilla Research Graydon Hoare, llamado así por el grupo de hongos que están "sobrediseñados para sobrevivir". Mozilla comenzó a patrocinar el proyecto en 2009 y emplearía a una docena de ingenieros para trabajar en él a tiempo completo durante los siguientes diez años. [16]

Alrededor de 2010, el trabajo pasó del compilador inicial escrito en OCaml a un compilador autoalojado basado en LLVM escrito en Rust. El nuevo compilador de Rust se compiló con éxito en 2011. [17] [ Se necesita una mejor fuente ] En el otoño de 2011, se desarrolló el logotipo de Rust basado en un plato de bicicleta . [18]

Evolución (2012-2020)

El sistema de tipos de Rust sufrió cambios significativos entre las versiones 0.2, 0.3 y 0.4. En la versión 0.2, que se lanzó en marzo de 2012, se introdujeron las clases por primera vez. [19] Cuatro meses después, la versión 0.3 agregó destructores y polimorfismo , mediante el uso de interfaces. [20] En octubre de 2012, se lanzó la versión 0.4, que agregó rasgos como un medio de herencia . Las interfaces se combinaron con rasgos y se eliminaron como una característica separada; y las clases se reemplazaron por una combinación de implementaciones y tipos estructurados . [21]

A principios de la década de 2010, la gestión de memoria a través del sistema de propiedad se consolidó gradualmente para evitar errores de memoria. En 2013, se eliminó el recolector de basura de Rust , pero se mantuvieron las reglas de propiedad. [16]

En enero de 2014, el editor en jefe de Dr. Dobb's Journal , Andrew Binstock, comentó sobre las posibilidades de Rust de convertirse en un competidor de C++ , junto con D , Go y Nim (entonces Nimrod). Según Binstock, si bien Rust era "ampliamente visto como un lenguaje notablemente elegante", la adopción se desaceleró porque cambió radicalmente de una versión a otra. [22] La primera versión estable , Rust 1.0, se lanzó el 15 de mayo de 2015. [16]

El desarrollo del motor de navegación Servo continuó junto con el crecimiento de Rust. En septiembre de 2017, se lanzó Firefox 57 como la primera versión que incorporó componentes de Servo, en un proyecto llamado " Firefox Quantum ". [23]

Despidos en Mozilla y la Fundación Rust (2020-actualidad)

En agosto de 2020, Mozilla despidió a 250 de sus 1.000 empleados en todo el mundo, como parte de una reestructuración corporativa causada por la pandemia de COVID-19 . [24] [25] El equipo detrás de Servo se disolvió. El evento generó inquietudes sobre el futuro de Rust, ya que algunos miembros del equipo eran contribuyentes activos de Rust. [26] En la semana siguiente, el equipo central de Rust reconoció el severo impacto de los despidos y anunció que los planes para una fundación Rust estaban en marcha. El primer objetivo de la fundación sería tomar posesión de todas las marcas comerciales y nombres de dominio , y asumir la responsabilidad financiera de sus costos. [27]

El 8 de febrero de 2021, las cinco empresas fundadoras ( AWS , Huawei , Google , Microsoft y Mozilla ) anunciaron la formación de la Fundación Rust . [28] [29] En una publicación de blog publicada el 6 de abril de 2021, Google anunció el apoyo a Rust dentro del Proyecto de código abierto de Android como alternativa a C/C++. [30]

El 22 de noviembre de 2021, el Equipo de Moderación, responsable de hacer cumplir las normas de la comunidad y el Código de Conducta, anunció su renuncia "en protesta porque el Equipo Central se ha puesto a sí mismo al margen de cualquier responsabilidad". [31] En mayo de 2022, el Equipo Central de Rust, otros programadores principales y ciertos miembros de la junta directiva de la Fundación Rust implementaron reformas de gobernanza en respuesta al incidente. [32]

El 6 de abril de 2023, la Fundación Rust publicó un borrador de una nueva política de marca registrada , revisando sus reglas sobre cómo se pueden usar el logotipo y el nombre de Rust, lo que resultó en reacciones negativas de los usuarios y colaboradores de Rust. [33]

Sintaxis y características

La sintaxis de Rust es similar a la de C y C++, [34] [35] aunque muchas de sus características fueron influenciadas por lenguajes de programación funcional como OCaml . [36] Hoare describió a Rust como dirigido a "desarrolladores de C++ frustrados" y enfatizó características como la seguridad, el control del diseño de la memoria y la concurrencia . [17] La ​​seguridad en Rust incluye las garantías de seguridad de la memoria, seguridad de tipos y falta de carreras de datos.

Programa Hola Mundo

A continuación se muestra un programa "¡Hola, mundo!" en Rust. La fnpalabra clave denota una función y la println! macro (consulte § Macros) imprime el mensaje en la salida estándar . [37] Las instrucciones en Rust se separan con punto y coma .

fn  main () { println! ( "¡Hola, mundo!" ); }  

Variables

Las variables en Rust se definen a través de la letpalabra clave. [38] El siguiente ejemplo asigna un valor a la variable con nombre foo.

fn  main () { let foo = 10 ; println! ( "El valor de foo es {foo}" ); }      

Las variables son inmutables de forma predeterminada, y agregar la mutpalabra clave permite que la variable se mute. [39] El siguiente ejemplo utiliza //, que denota el comienzo de un comentario . [40]

fn  main () { let mut foo = 10 ; // Este código no se compilaría sin agregar "mut". println! ( "El valor de foo es {foo}" ); foo = 20 ; println! ( "El valor de foo es {foo}" ); }            

Varias letexpresiones pueden definir múltiples variables con el mismo nombre, lo que se conoce como sombreado de variables . El sombreado de variables permite transformar variables sin tener que nombrarlas de manera diferente. [41] El siguiente ejemplo declara una nueva variable con el mismo nombre que es el doble del valor original:

fn  main () { let foo = 10 ; println! ( "El valor de foo es {foo}" ); let foo = foo * 2 ; println! ( "El valor de foo es {foo}" ); }             

El sombreado variable también es posible para valores de diferentes tipos, desde una cadena hasta su longitud:

fn  main () { let espacios = " " ; let espacios = espacios . len (); }         

Palabras clave y flujo de control

En Rust, los bloques de código están delimitados por llaves . [42]

ifbloques

Una if expresión condicional ejecuta código en función de si el valor dado es true. elsese puede utilizar cuando el valor se evalúa como false, y se puede utilizar para combinar múltiples expresiones. [43]else if

fn  main () { let x = 10 ; if x > 5 { println! ( "el valor es mayor que cinco" ); }             si x % 7 == 0 { println! ( "el valor es divisible por 7" ); } de lo contrario si x % 5 == 0 { println! ( "el valor es divisible por 5" ); } de lo contrario { println! ( "el valor no es divisible por 7 o 5" ); } }                      

whilebucles

whilese puede utilizar para repetir un bloque de código mientras se cumple una condición. [44]

fn  main () { // Iterar sobre todos los números enteros del 4 al 10 let mut valor = 4 ; while valor <= 10 { println! ( "valor = {valor}" ); valor += 1 } }                 

forbucles e iteradores

Los bucles For en Rust recorren los elementos de una colección. [45] Las expresiones For funcionan sobre cualquier tipo de iterador .

fn  main (){ // Uso de `for` con sintaxis de rango para la misma funcionalidad que la anterior para el valor en 4 ..= 10 { println! ( "valor = {valor}" ); } }        

En el código anterior, 4..=10hay un valor de tipo Rangeque implementa la Iteratorcaracterística. El código entre llaves se aplica a cada elemento devuelto por el iterador.

Los iteradores se pueden combinar con funciones sobre iteradores como map, filter, y sum. Por ejemplo, la siguiente suma todos los números entre 1 y 100 que son múltiplos de 3:

( 1 ..= 100 ) .filtrar ( |& x | x % 3 == 0 ).suma ( )     

loopy breakdeclaraciones

En términos más generales, la looppalabra clave permite repetir una parte del código hasta que breakse produzca un valor. breakOpcionalmente, puede salir del bucle con un valor. Las etiquetas indicadas con se pueden utilizar para interrumpir un bucle externo cuando los bucles están anidados. [46]'label_name

fn  main () { let valor = 456 ; let mut x = 1 ; let y = loop { x *= 10 ; if x > valor { break x / 10 ; } }; println! ( "mayor potencia de diez que es menor que valor: {y}" );                               deje que mut suba = 1 ; ' externo : bucle { deje que mut baje = 120 ; bucle { si arriba > 100 { romper 'externo ; }                      si abajo < 4 { romper ; }       abajo /= 2 ; arriba += 1 ; println! ( "arriba: {arriba}, abajo: {abajo}" ); } arriba *= 2 ; } }           

Expresiones

Rust está orientado a expresiones , y casi todas las partes del cuerpo de una función son expresiones , incluidos los operadores de flujo de control. [47] La if​​expresión se utiliza para proporcionar el operador condicional ternario . Como los retornos son implícitos, una función no necesita terminar con una returnexpresión; si se omite el punto y coma, el valor de la última expresión en la función se utiliza como valor de retorno , [48] como se ve en la siguiente implementación recursiva de la función factorial :

fn  factorial ( i : u64 )  -> u64  { si i == 0 { 1 } de lo contrario { i * factorial ( i - 1 ) } }               

La siguiente implementación iterativa..= utiliza el operador para crear un rango inclusivo:

fn  factorial ( i : u64 )  -> u64  { ( 2 ..= i ) .producto () } 

Coincidencia de patrones

Las expresiones matchand se pueden utilizar para la búsqueda de patrones . Por ejemplo, se puede utilizar para duplicar un valor entero opcional si está presente y devolver cero en caso contrario: [49]if letmatch

fn  double ( x : Opción < u64 > )  -> u64  { coincidir x { Alguna ( x ) => x * 2 , Ninguna => 0 , } }            

De manera equivalente, esto se puede escribir con y :if letelse

fn  double ( x : Opción < u64 > )  -> u64  { si deja Alguna ( x ) = x { x * 2 } de lo contrario { 0 } }              

Tipos

Rust es un lenguaje fuertemente tipado y estático . Los tipos de todas las variables deben conocerse en el momento de la compilación; asignar un valor de un tipo particular a una variable con un tipo diferente provoca un error de compilación . La inferencia de tipos se utiliza para determinar el tipo de las variables si no se especifica. [50]

El tipo entero predeterminado es , y el tipo de punto flotantei32 predeterminado es . Si el tipo de un número literal no se proporciona explícitamente, se infiere del contexto o se utiliza el tipo predeterminado. [51]f64

Tipos primitivos

Los tipos enteros en Rust se nombran en función de su signo y la cantidad de bits que ocupa el tipo. Por ejemplo, i32es un entero con signo que ocupa 32 bits de almacenamiento, mientras que u8no tiene signo y solo ocupa 8 bits de almacenamiento. isizey usizeocupan espacio de almacenamiento según la arquitectura de la computadora que ejecuta el código; por ejemplo, en computadoras con arquitecturas de 32 bits , ambos tipos ocuparán 32 bits de espacio.

De manera predeterminada, los literales enteros están en base 10, pero se admiten diferentes bases0b11 con prefijos, por ejemplo, para números binarios , 0o567para octales y 0xDBpara hexadecimales . De manera predeterminada, los literales enteros tienen como valor predeterminado su tipo. Se pueden usar i32sufijos como para establecer explícitamente el tipo de un literal. [52] Los literales de byte como están disponibles para representar el valor ASCII (en ) de un carácter específico. [53]4u32b'X'u8

El tipo booleano se conoce como boolque puede tomar un valor de trueo false. A charocupa 32 bits de espacio y representa un valor escalar Unicode: un punto de código Unicode que no es un sustituto . [54] Los números de punto flotante IEEE 754 son compatibles con f32para flotantes de precisión simple y f64para flotantes de precisión doble . [55]

Tipos definidos por el usuario

Los tipos definidos por el usuario se crean con las palabras clave structor enum. La structpalabra clave se utiliza para indicar un tipo de registro que agrupa múltiples valores relacionados. [56] enum Los s pueden adoptar diferentes variantes en tiempo de ejecución, con capacidades similares a los tipos de datos algebraicos que se encuentran en los lenguajes de programación funcional. [57] Tanto las estructuras como las enumeraciones pueden contener campos con diferentes tipos. [58] Se pueden definir nombres alternativos para el mismo tipo con la typepalabra clave. [59]

La implpalabra clave puede definir métodos para un tipo definido por el usuario. Los datos y las funciones se definen por separado. Las implementaciones cumplen una función similar a la de las clases en otros lenguajes. [60]

Biblioteca estándar

OptionLos valores se manejan utilizando azúcar sintáctica , como la if letconstrucción, para acceder al valor interno (en este caso, una cadena): [76]

fn  main () { let nombre1 : Option <& str > = None ; // En este caso, no se imprimirá nada si let Some ( nombre ) = nombre1 { println! ( "{nombre}" ); }               let name2 : Option <& str > = Some ( "Matthew" ); // En este caso, se imprimirá la palabra "Matthew" si let Some ( name ) = name2 { println! ( "{name}" ); } }            

Punteros

Rust no utiliza punteros nulos para indicar la falta de datos, ya que hacerlo puede provocar una desreferenciación nula . Por consiguiente, se garantiza que las referencias básicas &y no sean nulas. En cambio, Rust utiliza para este propósito: indica que hay un valor presente y es análogo al puntero nulo. [77] implementa una "optimización de puntero nulo", evitando cualquier sobrecarga espacial para tipos que no pueden tener un valor nulo (referencias o los tipos, por ejemplo). [78]&mutOptionSome(T)None OptionNonZero

A diferencia de las referencias, los tipos de punteros sin formato *consty *mutpueden ser nulos; sin embargo, es imposible desreferenciarlos a menos que el código se declare explícitamente inseguro mediante el uso de un unsafebloque. A diferencia de la desreferenciación, la creación de punteros sin formato está permitida dentro del código seguro de Rust. [79]

Conversión de tipos

Rust no ofrece conversión de tipos implícita (coerción) entre tipos primitivos. Sin embargo, se puede realizar una conversión de tipos explícita (casting) utilizando la aspalabra clave. [80]

sea ​​x = 1000 ; println! ( "1000 como u16 es: {}" , x como u16 );      

Titularidad y duración de vida

El sistema de propiedad de Rust consiste en reglas que garantizan la seguridad de la memoria sin usar un recolector de basura. En tiempo de compilación, cada valor debe estar asociado a una variable llamada el propietario de ese valor, y cada valor debe tener exactamente un propietario. [81] Los valores se mueven entre diferentes propietarios a través de la asignación o pasando un valor como un parámetro de función. Los valores también pueden tomarse prestados, lo que significa que se pasan temporalmente a una función diferente antes de ser devueltos al propietario. [82] Con estas reglas, Rust puede evitar la creación y el uso de punteros colgantes : [82] [83]

fn  print_string ( s : Cadena ) { println! ( "{}" , s ); }   fn  main () { let s = String :: from ( "Hola, Mundo" ); print_string ( s ); // s consumido por print_string // s se ha movido, por lo que ya no se puede usar // otro print_string(s); generaría un error de compilación }         

Debido a estas reglas de propiedad, los tipos de Rust se conocen como tipos lineales o afines , lo que significa que cada valor se puede usar exactamente una vez. Esto impone una forma de aislamiento de fallas de software , ya que el propietario de un valor es el único responsable de su corrección y desasignación. [84]

Cuando un valor queda fuera del ámbito, se elimina ejecutando su destructor . El destructor puede definirse mediante programación mediante la implementación del Droprasgo. Esto ayuda a administrar recursos como identificadores de archivos, sockets de red y bloqueos , ya que cuando se eliminan objetos, los recursos asociados con ellos se cierran o liberan automáticamente. [85]

Los tiempos de vida suelen ser una parte implícita de todos los tipos de referencia en Rust. Cada tiempo de vida abarca un conjunto de ubicaciones en el código para las que una variable es válida. Por ejemplo, una referencia a una variable local tiene un tiempo de vida correspondiente al bloque en el que está definida: [86]

fn  main () { let x = 5 ; // ------------------+- Tiempo de vida 'a // | let r = & x ; // -+-- Tiempo de vida 'b | // | | println! ( "r: {}" , r ); // | | // | | // -+ | } // ------------------+                   

El verificador de préstamos del compilador Rust utiliza duraciones de vida para garantizar que los valores a los que apunta una referencia sigan siendo válidos. [87] [88] En el ejemplo anterior, almacenar una referencia a una variable xen res válido, ya que variable xtiene una duración de vida más larga ( 'a) que variable r( 'b). Sin embargo, cuando xtiene una duración de vida más corta, el verificador de préstamos rechazaría el programa:

fn  main () { let r ; // ------------------+- Tiempo de vida 'a // | { // | let x = 5 ; // -+-- Tiempo de vida 'b | r = & x ; // | | } // -| | // | println! ( "r: {}" , r ); // | } // ------------------+                       

Dado que el tiempo de vida de la variable referenciada ( 'b) es más corto que el tiempo de vida de la variable que contiene la referencia ( 'a), el verificador de préstamos genera errores, lo que impide xque se utilice desde fuera de su alcance. [89]

Los parámetros de duración de vida hacen explícita la duración de las referencias, por ejemplo, especificando la fuente de una salida: [90]

fn  remove_prefix <' a > ( mut original : & ' a str , prefijo : & str ) -> & ' a str { si original . starts_with ( prefijo ) { original = original [ prefijo . len () .. ]; } original }              

Con información sobre cómo se relacionan los tiempos de vida del valor de salida de la función con sus entradas, el compilador puede evitar problemas de seguridad de memoria, como punteros colgantes.

Cuando los tipos definidos por el usuario contienen referencias a datos, también necesitan utilizar parámetros de duración de vida. El ejemplo siguiente analiza algunas opciones de configuración de una cadena y crea una estructura que contiene las opciones. La función parse_configtambién muestra la elisión de duración de vida, lo que reduce la necesidad de definir explícitamente los parámetros de duración de vida. [91]

utilizar std :: colecciones :: HashMap ; // Esta estructura tiene un parámetro de duración, 'src'. El nombre solo se utiliza dentro de la definición de la estructura. #[derive(Debug)] struct  Config <' src > { hostname : & ' src str , username : & ' src str , }     // El parámetro '_ lifetime, en este caso, se refiere al tiempo de vida anónimo adjunto al tipo // del argumento `config`. fn  parse_config ( config : & str )  -> Config <' _ > { let key_values : HashMap < _ , _ > = config . lines () . filter ( | line | ! line . starts_with ( '#' )) . filter_map ( | line | line . split_once ( '=' )) . map ( | ( key , value ) | ( key . trim (), value . trim ()))) . collect (); Config { hostname : key_values [ "hostname" ], username : key_values [ "username" ], } }                     fn  main () { let config = parse_config ( r#"nombre_host = foobar nombre_usuario=barfoo"# , ); println! ( "Configuración analizada: {:#?}" , config ); }         
Una presentación sobre Rust por Emily Dunham del equipo Rust de Mozilla (conferencia linux.conf.au , Hobart, 2017)

Polimorfismo

Genéricos

Las características más avanzadas de Rust incluyen el uso de funciones genéricas . A una función genérica se le asignan parámetros genéricos , que permiten que la misma función se aplique a diferentes tipos de variables. Esta capacidad reduce el código duplicado [92] y se conoce como polimorfismo paramétrico .

El siguiente programa calcula la suma de dos cosas, para lo cual la adición se implementa utilizando una función genérica:

utilizar std :: ops :: Add ; // suma es una función genérica con un parámetro de tipo, T fn  suma < T > ( num1 : T , num2 : T ) -> T donde T : Agregar < Salida = T > , // T debe implementar el rasgo Agregar donde la adición devuelve otro T { num1 + num2 // num1 + num2 es una sintaxis simplificada para num1.add(num2) proporcionada por el rasgo Agregar }           fn  main () { let resultado1 = suma ( 10 , 20 ); println! ( "La suma es: {}" , resultado1 ); // La suma es: 30          deje que resultado2 = suma ( 10.23 , 20.45 ); println! ( "La suma es: {}" , resultado2 ); // La suma es: 30.68 }       

En el momento de la compilación, sumse crean instancias de funciones polimórficas como con los tipos específicos que requiere el código; en este caso, suma de números enteros y suma de números flotantes.

Los genéricos se pueden utilizar en funciones para permitir la implementación de un comportamiento para diferentes tipos sin repetir el mismo código. Las funciones genéricas se pueden escribir en relación con otros genéricos, sin conocer el tipo real. [93]

Rasgos

El sistema de tipos de Rust admite un mecanismo llamado rasgos, inspirado en las clases de tipos del lenguaje Haskell , [6] para definir un comportamiento compartido entre diferentes tipos. Por ejemplo, el Addrasgo se puede implementar para números flotantes y enteros, que se pueden sumar; y el rasgo Displayo Debugse puede implementar para cualquier tipo que se pueda convertir en una cadena. Los rasgos se pueden usar para proporcionar un conjunto de comportamiento común para diferentes tipos sin conocer el tipo real. Esta función se conoce como polimorfismo ad hoc .

Las funciones genéricas pueden restringir el tipo genérico para implementar una característica o características particulares; por ejemplo, una add_onefunción puede requerir que el tipo implemente Add. Esto significa que una función genérica puede ser verificada por tipo tan pronto como se define. La implementación de genéricos es similar a la implementación típica de plantillas de C++: se genera una copia separada del código para cada instanciación. Esto se llama monomorfización y contrasta con el esquema de borrado de tipo que se usa típicamente en Java y Haskell. El borrado de tipo también está disponible a través de la palabra clave dyn(abreviatura de dinámico). [94] Debido a que la monomorfización duplica el código para cada tipo usado, puede resultar en un código más optimizado para casos de uso específicos, pero el tiempo de compilación y el tamaño del binario de salida también aumentan. [95]

Además de definir métodos para un tipo definido por el usuario, la implpalabra clave se puede utilizar para implementar un atributo para un tipo. [60] Los atributos pueden proporcionar métodos derivados adicionales cuando se implementan. [96] Por ejemplo, el atributo Iteratorrequiere que el nextmétodo se defina para el tipo. Una vez que nextse define el método, el atributo puede proporcionar métodos auxiliares funcionales comunes sobre el iterador, como mapo filter. [97]

Objetos de rasgo

Los rasgos de Rust se implementan utilizando un envío estático , lo que significa que el tipo de todos los valores se conoce en el momento de la compilación; sin embargo, Rust también utiliza una característica conocida como objetos de rasgo para lograr el envío dinámico (también conocido como tipado de pato ). [98] Los objetos de rasgo enviados dinámicamente se declaran utilizando la sintaxis dyn Trdonde Tres un rasgo. Los objetos de rasgo tienen un tamaño dinámico, por lo tanto, deben colocarse detrás de un puntero, como Box. [99] El siguiente ejemplo crea una lista de objetos donde cada objeto se puede imprimir utilizando el Displayrasgo:

utilizar std :: fmt :: Mostrar ; sea ​​v : Vec < Caja < dyn Pantalla >> = vec! [ Caja :: new ( 3 ), Caja :: new ( 5.0 ), Caja :: new ( "hola" ), ];       para x en v { println! ( "{x}" ); }     

Si un elemento de la lista no implementa la Displaycaracterística, provocará un error en tiempo de compilación. [100]

Seguridad de la memoria

Rust está diseñado para ser seguro para la memoria . No permite punteros nulos, punteros colgantes o carreras de datos . [101] [102] [103] Los valores de datos se pueden inicializar solo a través de un conjunto fijo de formularios, todos los cuales requieren que sus entradas ya estén inicializadas. [104]

El código inseguro puede subvertir algunas de estas restricciones, utilizando la unsafepalabra clave. [79] El código inseguro también puede usarse para funcionalidad de bajo nivel, como acceso a memoria volátil , intrínsecos específicos de la arquitectura, juegos de palabras de tipos y ensamblaje en línea. [105]

Gestión de la memoria

Rust no utiliza recolección de basura . La memoria y otros recursos se gestionan mediante la convención "la adquisición de recursos es inicialización", [106] con conteo de referencias opcional . Rust proporciona una gestión determinista de los recursos, con una sobrecarga muy baja . [107] Los valores se asignan en la pila de forma predeterminada, y todas las asignaciones dinámicas deben ser explícitas. [108]

Los tipos de referencia integrados que utilizan el &símbolo no implican un recuento de referencias en tiempo de ejecución. La seguridad y validez de los punteros subyacentes se verifica en tiempo de compilación, lo que evita punteros colgantes y otras formas de comportamiento indefinido . [109] El sistema de tipos de Rust separa las referencias compartidas e inmutables de la forma &Tde las referencias únicas y mutables de la forma &mut T. Una referencia mutable se puede convertir en una referencia inmutable, pero no al revés. [110]

Cierres

En Rust, las funciones anónimas se denominan cierres. [111] Se definen utilizando la siguiente sintaxis:

|< parámetro - nombre > : < tipo >|  -> < retorno - tipo > { < cuerpo > };   

Por ejemplo:

sea ​​f = | x : i32 | -> i32 { x * 2 };         

Sin embargo, con la inferencia de tipos, el compilador puede inferir el tipo de cada parámetro y el tipo de retorno, por lo que la forma anterior se puede escribir como:

sea ​​f = | x | { x * 2 };        

Con cierres con una sola expresión (es decir, un cuerpo con una línea) y un tipo de retorno implícito, se pueden omitir las llaves:

sea ​​f = | x | x * 2 ;      

Los cierres sin parámetros de entrada se escriben así:

sea ​​f = || println! ( "¡Hola, mundo!" );    

Los cierres se pueden pasar como parámetros de entrada de funciones que esperan un puntero de función:

// Una función que toma un puntero de función como argumento y lo llama con // el valor `5`. fn  apply ( f : fn ( i32 )  -> i32 )  -> i32  { // Sin punto y coma, para indicar un retorno implícito f ( 5 ) }  fn  main () { // Definiendo el cierre let f = | x | x * 2 ;          println! ( "{}" , aplicar ( f )); // 10 println! ( "{}" , f ( 5 )); // 10 }     

Sin embargo, es posible que se necesiten reglas complejas para describir cómo se capturan los valores en el cuerpo del cierre. Se implementan utilizando los rasgos , y : Fn[ FnMut112 ]FnOnce

  • Fn: el cierre captura por referencia ( &T). Se utilizan para funciones que aún pueden ser llamadas si solo tienen acceso de referencia (con &) a su entorno.
  • FnMut: el cierre captura por referencia mutable ( &mut T). Se utilizan para funciones que pueden ser llamadas si tienen acceso de referencia mutable (con &mut) a su entorno.
  • FnOnce: el cierre captura por valor ( T). Se utilizan para funciones que solo se llaman una vez.

Con estas características, el compilador capturará las variables de la manera menos restrictiva posible. [112] Ayudan a gobernar cómo se mueven los valores entre ámbitos, lo que es muy importante ya que Rust sigue una construcción de por vida para garantizar que los valores se "tomen prestados" y se muevan de una manera predecible y explícita. [113]

A continuación se muestra cómo se puede pasar un cierre como parámetro de entrada utilizando el Fnrasgo:

// Una función que toma un valor de tipo F (que se define como // un tipo genérico que implementa el rasgo `Fn`, por ejemplo, un cierre) // y lo llama con el valor `5`. fn  apply_by_ref < F > ( f : F )  -> i32  donde F : Fn ( i32 ) -> i32 { f ( 5 ) }   fn  main () { let f = | x | { println! ( "Obtuve el valor: {}" , x ); x * 2 }; // Aplica la función antes de imprimir su valor de retorno println! ( "5 * 2 = {}" , apply_by_ref ( f )); }                // ~~ Salida del programa ~~ // Obtuve el valor: 5 // 5 * 2 = 10

La definición de función anterior también se puede abreviar para mayor comodidad de la siguiente manera:

fn  aplicar_por_ref ( f : impl Fn ( i32 ) -> i32 ) -> i32 { f ( 5 ) }     

Macros

Es posible ampliar el lenguaje Rust usando macros.

Macros declarativas

Una macro declarativa (también llamada "macro por ejemplo") es una macro que utiliza la coincidencia de patrones para determinar su expansión. [114] [115]

Macros de procedimiento

Las macros procedimentales son funciones de Rust que ejecutan y modifican el flujo de tokens de entrada del compilador antes de que se compilen otros componentes. Por lo general, son más flexibles que las macros declarativas, pero son más difíciles de mantener debido a su complejidad. [116] [117]

Las macros de procedimiento vienen en tres versiones:

La println!macro es un ejemplo de una macro similar a una función. La serde_derivemacro [118] proporciona una biblioteca de uso común para generar código para leer y escribir datos en muchos formatos, como JSON . Las macros de atributos se utilizan comúnmente para enlaces de lenguaje, como la extendrbiblioteca para enlaces de Rust a R. [ 119]

El siguiente código muestra el uso de las macros de procedimiento derivadas de Serialize, Deserialize, y Debugpara implementar la lectura y escritura de JSON, así como la capacidad de formatear una estructura para la depuración.

utilizar serde :: { Serializar , Deserializar };  #[derive(Serializar, Deserializar, Depurar)] struct  Point { x : i32 , y : i32 , }   fn  main () { let punto = Punto { x : 1 , y : 2 };          deje que serializado = serde_json :: to_string ( & point ) .unwrap (); println! ( "serializado = {}" , serializado );      deje que deserialice : Punto = serde_json :: from_str ( & serializado ) .unwrap (); println! ( "deserializado = {:?}" , deserializado ); }     

Macros variádicas

Rust no admite argumentos variádicos en funciones. En su lugar, utiliza macros . [120]

macro_rules! calculate { // El patrón para un solo `eval` ( eval $e : expr ) => {{ { let val : usize = $e ; // Fuerza a que los tipos sean enteros println! ( "{} = {}" , stringify! { $e }, val ); } }};                   // Descomponer múltiples `eval`s recursivamente ( eval $e : expr , $( eval $es : expr ), + ) => {{ calculate ! { eval $e } calculate ! { $( eval $es ), + } }}; }                 fn  main () { calcular ! { // Mira ma! Variadic `calculate!`! eval 1 + 2 , eval 3 + 4 , eval ( 2 * 3 ) + 1 } }                   
Rust puede interactuar con el sistema variádico de C a través de un c_variadicconmutador de características. Al igual que con otras interfaces de C, el sistema se considera unsafeparte de Rust. [121]

Interfaz con C y C++

Rust tiene una interfaz de función externa (FFI) que se puede usar tanto para llamar a código escrito en lenguajes como C desde Rust como para llamar a código Rust desde esos lenguajes. A partir de 2024 , existe una biblioteca externa llamada CXX para llamar a o desde C++. [122] Rust y C difieren en cómo disponen las estructuras en la memoria, por lo que a las estructuras de Rust se les puede dar un #[repr(C)]atributo, lo que obliga a tener el mismo diseño que la estructura C equivalente. [123]

Ecosistema

Compilando un programa Rust con Cargo

El ecosistema Rust incluye su compilador, su biblioteca estándar y componentes adicionales para el desarrollo de software. La instalación de componentes normalmente la gestiona Rust rustup, un instalador de la cadena de herramientas de Rust desarrollado por el proyecto Rust. [124]

Compilador

El compilador de Rust se llama rustc, y traduce el código de Rust a un lenguaje de bajo nivel llamado representación intermedia LLVM (LLVM IR). Luego, LLVM se invoca como un subcomponente para traducir el código IR a código de máquina . Luego, se utiliza un enlazador para combinar múltiples paquetes juntos como un solo archivo ejecutable o binario. [125] [126]

Además de LLVM, el compilador también admite el uso de backends alternativos como GCC y Cranelift para la generación de código. [127] La ​​intención de esos backends alternativos es aumentar la cobertura de la plataforma de Rust o mejorar los tiempos de compilación. [128] [129]

Biblioteca estándar

The Rust standard library defines and implements many widely used custom data types, including core data structures such as Vec, Option, and HashMap, as well as smart pointer types. Rust also provides a way to exclude most of the standard library using the attribute #![no_std]; this enables applications, such as embedded devices, which want to remove dependency code or provide their own core data structures. Internally, the standard library is divided into three parts, core, alloc, and std, where std and alloc are excluded by #![no_std].[130]

Screenshot of crates.io in June 2022

Cargo

Cargo is Rust's build system and package manager. It downloads, compiles, distributes, and uploads packages—called crates—that are maintained in an official registry. It also acts as a front-end for Clippy and other Rust components.[131]

By default, Cargo sources its dependencies from the user-contributed registry crates.io, but Git repositories and crates in the local filesystem, and other external sources can also be specified as dependencies.[132]

Rustfmt

Rustfmt is a code formatter for Rust. It formats whitespace and indentation to produce code in accordance with a common style, unless otherwise specified. It can be invoked as a standalone program, or from a Rust project through Cargo.[133]

Example output of Clippy on a hello world Rust program

Clippy

Clippy is Rust's built-in linting tool to improve the correctness, performance, and readability of Rust code. As of 2024, it has more than 700 rules.[134][135]

Versioning system

Following Rust 1.0, new features are developed in nightly 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.[136]

Every two or three years, a new "edition" is produced. Editions are released to allow making limited breaking changes, such as promoting await to a keyword to support async/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.[137]

IDE support

rust-analyzer is a collection of utilities that provides Integrated development environments (IDEs) and text editors with information about a Rust project through the Language Server Protocol. This enables features including autocompletion, and the display of compilation errors while editing.[138]

Performance

In general, Rust's memory safety guarantees do not impose a runtime overhead.[139] A notable exception is array indexing which is checked at runtime, though this often does not impact performance.[140] Since it does not perform garbage collection, Rust is often faster than other memory-safe languages.[141][84][142]

Rust provides two "modes": safe and unsafe. Safe mode is the "normal" one, in which most Rust is written. In unsafe mode, the developer is responsible for the code's memory safety, which is used by developers for cases where the compiler is too restrictive.[143]

Many of Rust's features are so-called zero-cost abstractions, meaning they are optimized away at compile time and incur no runtime penalty.[144] The ownership and borrowing system permits zero-copy implementations for some performance-sensitive tasks, such as parsing.[145] Static dispatch is used by default to eliminate method calls, with the exception of methods called on dynamic trait objects.[146] The compiler also uses inline expansion to eliminate function calls and statically-dispatched method invocations.[147]

Since Rust utilizes LLVM, any performance improvements in LLVM also carry over to Rust.[148] Unlike C and C++, Rust allows for reordering struct and enum elements[149] to reduce the sizes of structures in memory, for better memory alignment, and to improve cache access efficiency.[150]

Adoption

Early homepage of Mozilla's Servo browser engine

Rust has been used in software across different domains. Rust was initially funded by Mozilla as part of developing Servo, an experimental parallel browser engine, in collaboration with Samsung.[151] Components from the Servo engine were later incorporated in the Gecko browser engine underlying Firefox.[152] In January 2023, Google (Alphabet) announced support for using third party Rust libraries in Chromium.[153][154]

Rust is used in several backend software projects of large web services. OpenDNS, a DNS resolution service owned by Cisco, uses Rust internally.[155][156] Amazon Web Services uses Rust in "performance-sensitive components" of its several services. In 2019, AWS has open-sourced Firecracker, a virtualization solution primarily written in Rust.[157] Microsoft Azure IoT Edge, a platform used to run Azure services on IoT devices, has components implemented in Rust.[158] Microsoft also uses Rust to run containerized modules with WebAssembly and Kubernetes.[159] Cloudflare, a company providing content delivery network services, used Rust to build a new web proxy named Pingora for increased performance and efficiency.[160]The npm package manager started using Rust for its production authentication service in 2019.[161][162][163]

In operating systems, the Android developers were using Rust in 2021 to rewrite existing components.[164][165]The Rust for Linux project, launched in 2020, added initial Rust support to Linux in late 2022, and the first Linux drivers written in Rust were released in late 2023.[166][167]Microsoft is rewriting parts of Windows in Rust.[168] The r9 project aims to re-implement Plan 9 from Bell Labs in Rust.[169] Rust has been used in the development of new operating systems such as Redox, a "Unix-like" operating system and microkernel,[170] Theseus, an experimental operating system with modular state management,[171][172] and most of Fuchsia.[173] Rust is also used for command-line tools and operating system components, including stratisd, a file system manager[174][175] and COSMIC, a desktop environment by System76.[176]

In web development, Deno, a secure runtime for JavaScript and TypeScript, is built on top of V8 using Rust and Tokio.[177] Other notable adoptions in this space include Ruffle, an open-source SWF emulator,[178] and Polkadot, an open source blockchain and cryptocurrency platform.[179]

Discord, an instant messaging software company, has rewritten parts of its system in Rust for increased performance in 2020. In the same year, Dropbox announced that its file synchronization had been rewritten in Rust. Facebook (Meta) has also used Rust to redesign its system that manages source code for internal projects.[16]

In the 2023 Stack Overflow Developer Survey, 13% of respondents had recently done extensive development in Rust.[180] The survey also named Rust the "most loved programming language" every year from 2016 to 2023 (inclusive), based on the number of developers interested in continuing to work in the same language.[181][note 5] In 2023, Rust was the 6th "most wanted technology", with 31% of developers not currently working in Rust expressing an interest in doing so.[180]

In academic research

Rust has been studied in academic research, both for properties of the language itself as well as the utility the language provides for writing software used for research. Its features around safety[182][143] and performance[183] have been examined.

In a journal article published to Proceedings of the International Astronomical Union, astrophysicists Blanco-Cuaresma and Bolmont re-implemented programs responsible for simulating multi-planet systems in Rust, and found it to be a competitive programming language for its "speed and accuracy".[15] Likewise, an article published on Nature shared several stories of bioinformaticians using Rust for its performance and safety.[131] However, both articles have cited Rust's unique concepts, including its ownership system, being difficult to learn as one of the main drawbacks to adopting Rust.

Community

Un icono de cangrejo de color naranja brillante
Some Rust users refer to themselves as Rustaceans (similar to the word crustacean) and have adopted an orange crab, Ferris, as their unofficial mascot.[184][185]

Rust has been noted as having an inclusive community, and particularly welcomed people from the queer community, partly due to its code of conduct which outlined a set of expectations for Rust community members to follow. One MIT Technology Review article described the Rust community as "unusually friendly" to newcomers.[16][131]

Rust Foundation

The Rust Foundation is a non-profit membership organization incorporated in United States, with the primary purposes of backing the technical project as a legal entity and helping to manage the trademark and infrastructure assets.[186][35]

It was established on February 8, 2021, with five founding corporate members (Amazon Web Services, Huawei, Google, Microsoft, and Mozilla).[187] The foundation's board is chaired by Shane Miller.[188] Starting in late 2021, its Executive Director and CEO is Rebecca Rumbul.[189] Prior to this, Ashley Williams was interim executive director.[35]

Governance teams

The Rust project is composed of teams that are responsible for different subareas of the development. The compiler team develops, manages, and optimizes compiler internals; and the language team designs new language features and helps implement them. The Rust project website lists 6 top-level teams as of July 2024.[190] Representatives among teams form the Leadership council, which oversees the Rust project as a whole.[191]

See also

Notes

  1. ^ Including build tools, host tools, and standard library support for x86-64, ARM, MIPS, RISC-V, WebAssembly, i686, AArch64, PowerPC, and s390x.[2]
  2. ^ Including Windows, Linux, macOS, FreeBSD, NetBSD, and Illumos. Host build tools on Android, iOS, Haiku, Redox, and Fuchsia are not officially shipped; these operating systems are supported as targets.[2]
  3. ^ Third-party dependencies, e.g., LLVM or MSVC, are subject to their own licenses.[3][4]
  4. ^ On Unix systems, this is often UTF-8 strings without an internal 0 byte. On Windows, this is UTF-16 strings without an internal 0 byte. Unlike these, str and String are always valid UTF-8 and can contain internal zeros.
  5. ^ That is, among respondents who have done "extensive development work [with Rust] in over the past year" (13.05%), Rust had the largest percentage who also expressed interest to "work in [Rust] over the next year" (84.66%).[180]

References

Book sources

Others

  1. ^ "Announcing Rust 1.81.0". 2024-09-05. Retrieved 2024-09-05.
  2. ^ a b "Platform Support". The rustc book. Retrieved 2022-06-27.
  3. ^ "The Rust Programming Language". The Rust Programming Language. 2022-10-19.
  4. ^ "Uniqueness Types". Rust Blog. Retrieved 2016-10-08. Those of you familiar with the Elm style may recognize that the updated --explain messages draw heavy inspiration from the Elm approach.
  5. ^ a b "Influences - The Rust Reference". The Rust Reference. Archived from the original on 2023-11-26. Retrieved 2023-12-31.
  6. ^ "Uniqueness Types". Idris 1.3.3 documentation. Retrieved 2022-07-14. They are inspired by ... ownership types and borrowed pointers in the Rust programming language.
  7. ^ "Microsoft opens up Rust-inspired Project Verona programming language on GitHub". ZDNet. Archived from the original on 2020-01-17. Retrieved 2020-01-17.
  8. ^ Jaloyan, Georges-Axel (2017-10-19). "Safe Pointers in SPARK 2014". arXiv:1710.07047 [cs.PL].
  9. ^ Lattner, Chris. "Chris Lattner's Homepage". Nondot.org. Archived from the original on 2018-12-25. Retrieved 2019-05-14.
  10. ^ "V documentation (Introduction)". GitHub. Retrieved 2023-11-04.
  11. ^ Yegulalp, Serdar (2016-08-29). "New challenger joins Rust to topple C language". InfoWorld. Retrieved 2022-10-19.
  12. ^ Eshwarla, Prabhu (2020-12-24). Practical System Programming for Rust Developers: Build fast and secure software for Linux/Unix systems with the help of practical examples. Packt Publishing Ltd. ISBN 978-1-80056-201-1.
  13. ^ Blandy, Jim; Orendorff, Jason (2017-11-21). Programming Rust: Fast, Safe Systems Development. O'Reilly Media, Inc. ISBN 978-1-4919-2725-0.
  14. ^ a b Blanco-Cuaresma, Sergi; Bolmont, Emeline (2017-05-30). "What can the programming language Rust do for astrophysics?". Proceedings of the International Astronomical Union. 12 (S325): 341–344. arXiv:1702.02951. Bibcode:2017IAUS..325..341B. doi:10.1017/S1743921316013168. ISSN 1743-9213. S2CID 7857871.
  15. ^ a b c d e Thompson, Clive (2023-02-14). "How Rust went from a side project to the world's most-loved programming language". MIT Technology Review. Retrieved 2023-02-23.
  16. ^ a b Avram, Abel (2012-08-03). "Interview on Rust, a Systems Programming Language Developed by Mozilla". InfoQ. Archived from the original on 2013-07-24. Retrieved 2013-08-17.
  17. ^ "Rust logo". bugzilla.mozilla.org. Retrieved 2024-02-02.
  18. ^ Hoare, Graydon (2012-03-29). "[rust-dev] Rust 0.2 released". mail.mozilla.org. Archived from the original on 2022-11-06. Retrieved 2024-04-04.
  19. ^ Hoare, Graydon (2012-07-12). "[rust-dev] Rust 0.3 released". mail.mozilla.org. Archived from the original on 2022-08-24. Retrieved 2022-06-12.
  20. ^ Hoare, Graydon (2012-10-15). "[rust-dev] Rust 0.4 released". mail.mozilla.org. Archived from the original on 2021-10-31. Retrieved 2021-10-31.
  21. ^ Binstock, Andrew (2014-01-07). "The Rise And Fall of Languages in 2013". Dr. Dobb's Journal. Archived from the original on 2016-08-07. Retrieved 2022-11-20.
  22. ^ Lardinois, Frederic (2017-09-29). "It's time to give Firefox another chance". TechCrunch. Retrieved 2023-08-15.
  23. ^ Cimpanu, Catalin (2020-08-11). "Mozilla lays off 250 employees while it refocuses on commercial products". ZDNet. Archived from the original on 2022-03-18. Retrieved 2020-12-02.
  24. ^ Cooper, Daniel (2020-08-11). "Mozilla lays off 250 employees due to the pandemic". Engadget. Archived from the original on 2020-12-13. Retrieved 2020-12-02.
  25. ^ Tung, Liam. "Programming language Rust: Mozilla job cuts have hit us badly but here's how we'll survive". ZDNet. Archived from the original on 2022-04-21. Retrieved 2022-04-21.
  26. ^ "Laying the foundation for Rust's future". Rust Blog. 2020-08-18. Archived from the original on 2020-12-02. Retrieved 2020-12-02.
  27. ^ "Hello World!". Rust Foundation. 2020-02-08. Archived from the original on 2022-04-19. Retrieved 2022-06-04.
  28. ^ "Mozilla Welcomes the Rust Foundation". Mozilla Blog. 2021-02-09. Archived from the original on 2021-02-08. Retrieved 2021-02-09.
  29. ^ Amadeo, Ron (2021-04-07). "Google is now writing low-level Android code in Rust". Ars Technica. Archived from the original on 2021-04-08. Retrieved 2021-04-08.
  30. ^ Anderson, Tim (2021-11-23). "Entire Rust moderation team resigns". The Register. Retrieved 2022-08-04.
  31. ^ "Governance Update". Inside Rust Blog. Retrieved 2022-10-27.
  32. ^ Claburn, Thomas (2023-04-17). "Rust Foundation apologizes for trademark policy confusion". The Register. Retrieved 2023-05-07.
  33. ^ Proven, Liam (2019-11-27). "Rebecca Rumbul named new CEO of The Rust Foundation". The Register. Retrieved 2022-07-14. Both are curly bracket languages, with C-like syntax that makes them unintimidating for C programmers.
  34. ^ a b c Vigliarolo, Brandon (2021-02-10). "The Rust programming language now has its own independent foundation". TechRepublic. Archived from the original on 2023-03-20. Retrieved 2022-07-14.
  35. ^ Klabnik & Nichols 2019, p. 263.
  36. ^ Klabnik & Nichols 2019, pp. 5–6.
  37. ^ Klabnik & Nichols 2023, p. 32.
  38. ^ Klabnik & Nichols 2023, pp. 32–33.
  39. ^ Klabnik & Nichols 2023, pp. 49–50.
  40. ^ Klabnik & Nichols 2023, pp. 34–36.
  41. ^ Klabnik & Nichols 2023, pp. 6, 44, 47.
  42. ^ Klabnik & Nichols 2023, pp. 50–52.
  43. ^ Klabnik & Nichols 2023, p. 56.
  44. ^ Klabnik & Nichols 2023, pp. 57–58.
  45. ^ Klabnik & Nichols 2023, pp. 54–56.
  46. ^ Klabnik & Nichols 2019, pp. 50–53.
  47. ^ Tyson, Matthew (2022-03-03). "Rust programming for Java developers". InfoWorld. Retrieved 2022-07-14.
  48. ^ Klabnik & Nichols 2019, pp. 104–109.
  49. ^ Klabnik & Nichols 2019, pp. 24.
  50. ^ Klabnik & Nichols 2019, pp. 36–38.
  51. ^ Klabnik & Nichols 2023, pp. 36–38.
  52. ^ Klabnik & Nichols 2023, p. 502.
  53. ^ "Glossary of Unicode Terms". Unicode Consortium. Retrieved 2024-07-30.
  54. ^ Klabnik & Nichols 2019, pp. 38–40.
  55. ^ Klabnik & Nichols 2019, p. 83.
  56. ^ Klabnik & Nichols 2019, p. 97.
  57. ^ Klabnik & Nichols 2019, pp. 98–101.
  58. ^ Klabnik & Nichols 2019, pp. 438–440.
  59. ^ a b Klabnik & Nichols 2019, pp. 93.
  60. ^ "OsStr in std::ffi – Rust". doc.rust-lang.org. Retrieved 2023-10-02.
  61. ^ "OsString in std::ffi – Rust". doc.rust-lang.org. Retrieved 2023-10-02.
  62. ^ "Path in std::path – Rust". doc.rust-lang.org. Retrieved 2023-10-02.
  63. ^ "PathBuf in std::path – Rust". doc.rust-lang.org. Retrieved 2023-10-02.
  64. ^ a b c "std::boxed – Rust". doc.rust-lang.org. Retrieved 2023-06-23.
  65. ^ "std::boxed – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  66. ^ "Rc in std::rc – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  67. ^ "Arc in std::sync – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  68. ^ "Cell in std::cell – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  69. ^ "Mutex in std::sync – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  70. ^ "RwLock in std::sync – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  71. ^ "Condvar in std::sync – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  72. ^ "Duration in std::time – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  73. ^ "HashMap in std::collections – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  74. ^ "BTreeMap in std::collections – Rust". doc.rust-lang.org. Retrieved 2023-06-24.
  75. ^ McNamara 2021.
  76. ^ Klabnik & Nichols 2019, pp. 101–104.
  77. ^ "std::option - Rust". doc.rust-lang.org. Retrieved 2023-11-12.
  78. ^ a b Klabnik & Nichols 2019, pp. 418–427.
  79. ^ "Casting - Rust By Example". doc.rust-lang.org.
  80. ^ Klabnik & Nichols 2019, pp. 59–61.
  81. ^ a b Klabnik & Nichols 2019, pp. 63–68.
  82. ^ Klabnik & Nichols 2019, pp. 74–75.
  83. ^ a b Balasubramanian, 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. ISBN 978-1-4503-5068-6. S2CID 24100599. Archived from the original on 2022-06-11. Retrieved 2022-06-01.
  84. ^ Klabnik & Nichols 2023, pp. 327–30.
  85. ^ Klabnik & Nichols 2019, p. 194.
  86. ^ Klabnik & Nichols 2019, pp. 75, 134.
  87. ^ Shamrell-Harrington, Nell. "The Rust Borrow Checker – a Deep Dive". InfoQ. Retrieved 2022-06-25.
  88. ^ Klabnik & Nichols 2019, pp. 194–195.
  89. ^ Klabnik & Nichols 2023, pp. 208–12.
  90. ^ Klabnik & Nichols 2019, pp. 201–203.
  91. ^ Klabnik & Nichols 2019, pp. 171–172.
  92. ^ Klabnik & Nichols 2019, pp. 171–172, 205.
  93. ^ Klabnik & Nichols 2019, pp. 181, 182.
  94. ^ Gjengset 2021, p. 25.
  95. ^ Klabnik & Nichols 2019, pp. 182–184.
  96. ^ Klabnik & Nichols 2019, pp. 281–283.
  97. ^ "Using Trait Objects That Allow for Values of Different Types – The Rust Programming Language". doc.rust-lang.org. Retrieved 2022-07-11.
  98. ^ Klabnik & Nichols 2019, pp. 441–442.
  99. ^ Klabnik & Nichols 2019, pp. 379–380.
  100. ^ Rosenblatt, Seth (2013-04-03). "Samsung joins Mozilla's quest for Rust". CNET. Archived from the original on 2013-04-04. Retrieved 2013-04-05.
  101. ^ Brown, Neil (2013-04-17). "A taste of Rust". LWN.net. Archived from the original on 2013-04-26. Retrieved 2013-04-25.
  102. ^ "Races – The Rustonomicon". doc.rust-lang.org. Archived from the original on 2017-07-10. Retrieved 2017-07-03.
  103. ^ "The Rust Language FAQ". static.rust-lang.org. 2015. Archived from the original on 2015-04-20. Retrieved 2017-04-24.
  104. ^ McNamara 2021, p. 139, 376–379, 395.
  105. ^ "RAII – Rust By Example". doc.rust-lang.org. Archived from the original on 2019-04-21. Retrieved 2020-11-22.
  106. ^ "Abstraction without overhead: traits in Rust". Rust Blog. Archived from the original on 2021-09-23. Retrieved 2021-10-19.
  107. ^ "Box, stack and heap". Rust By Example. Retrieved 2022-06-13.
  108. ^ Klabnik & Nichols 2019, pp. 70–75.
  109. ^ Klabnik & Nichols 2019, p. 323.
  110. ^ "Closures - Rust By Example". doc.rust-lang.org.
  111. ^ a b "As input parameters - Rust By Example". doc.rust-lang.org.
  112. ^ "Lifetimes - Rust By Example". doc.rust-lang.org.
  113. ^ "Macros By Example". The Rust Reference. Retrieved 2023-04-21.
  114. ^ Klabnik & Nichols 2019, pp. 446–448.
  115. ^ "Procedural Macros". The Rust Programming Language Reference. Archived from the original on 2020-11-07. Retrieved 2021-03-23.
  116. ^ Klabnik & Nichols 2019, pp. 449–455.
  117. ^ "Serde Derive". Serde Derive documentation. Archived from the original on 2021-04-17. Retrieved 2021-03-23.
  118. ^ "extendr_api – Rust". Extendr Api Documentation. Archived from the original on 2021-05-25. Retrieved 2021-03-23.
  119. ^ "Variadics". Rust By Example.
  120. ^ "2137-variadic". The Rust RFC Book.
  121. ^ "Safe Interoperability between Rust and C++ with CXX". InfoQ. 2020-12-06. Archived from the original on 2021-01-22. Retrieved 2021-01-03.
  122. ^ "Type layout – The Rust Reference". doc.rust-lang.org. Retrieved 2022-07-15.
  123. ^ Blandy, Orendorff & Tindall 2021, pp. 6–8.
  124. ^ McNamara 2021, pp. 411–412.
  125. ^ "Overview of the compiler". Rust Compiler Development Guide. Retrieved 2023-06-02.
  126. ^ "Code Generation - Rust Compiler Development Guide". rustc-dev-guide.rust-lang.org. Retrieved 2024-03-03.
  127. ^ "rust-lang/rustc_codegen_gcc". GitHub. The Rust Programming Language. 2024-03-02. Retrieved 2024-03-03.
  128. ^ "rust-lang/rustc_codegen_cranelift". GitHub. The Rust Programming Language. 2024-03-02. Retrieved 2024-03-03.
  129. ^ Gjengset 2021, p. 213-215.
  130. ^ a b c Perkel, Jeffrey M. (2020-12-01). "Why scientists are turning to Rust". Nature. 588 (7836): 185–186. Bibcode:2020Natur.588..185P. doi:10.1038/d41586-020-03382-2. PMID 33262490. S2CID 227251258. Archived from the original on 2022-05-06. Retrieved 2022-05-15.
  131. ^ Simone, Sergio De (2019-04-18). "Rust 1.34 Introduces Alternative Registries for Non-Public Crates". InfoQ. Retrieved 2022-07-14.
  132. ^ Klabnik & Nichols 2019, pp. 511–512.
  133. ^ Clippy, The Rust Programming Language, 2023-11-30, retrieved 2023-11-30
  134. ^ "Clippy Lints". The Rust Programming Language. Retrieved 2023-11-30.
  135. ^ Klabnik & Nichols 2019, Appendix G – How Rust is Made and "Nightly Rust"
  136. ^ Blandy, Orendorff & Tindall 2021, pp. 176–177.
  137. ^ Klabnik & Nichols 2023, p. 623.
  138. ^ McNamara 2021, p. 11.
  139. ^ Popescu, 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. S2CID 238212612. 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.
  140. ^ Anderson, Tim. "Can Rust save the planet? Why, and why not". The Register. Retrieved 2022-07-11.
  141. ^ Yegulalp, Serdar (2021-10-06). "What is the Rust language? Safe, fast, and easy software development". InfoWorld. Retrieved 2022-06-25.
  142. ^ a b Astrauskas, Vytautas; Matheja, Christoph; Poli, Federico; Müller, Peter; Summers, Alexander J. (2020-11-13). "How do programmers use unsafe rust?". Proceedings of the ACM on Programming Languages. 4 (OOPSLA): 1–27. doi:10.1145/3428204. hdl:20.500.11850/465785. ISSN 2475-1421.
  143. ^ McNamara 2021, p. 19, 27.
  144. ^ Couprie, Geoffroy (2015). "Nom, A Byte oriented, streaming, Zero copy, Parser Combinators Library in Rust". 2015 IEEE Security and Privacy Workshops. pp. 142–148. doi:10.1109/SPW.2015.31. ISBN 978-1-4799-9933-0. S2CID 16608844.
  145. ^ McNamara 2021, p. 20.
  146. ^ "Code generation – The Rust Reference". doc.rust-lang.org. Retrieved 2022-10-09.
  147. ^ "How Fast Is Rust?". The Rust Programming Language FAQ. Archived from the original on 2020-10-28. Retrieved 2019-04-11.
  148. ^ Farshin, Alireza; Barbette, Tom; Roozbeh, Amir; Maguire Jr, Gerald Q.; Kostić, Dejan (2021). "PacketMill: Toward per-Core 100-GBPS networking". Proceedings of the 26th ACM International Conference on Architectural Support for Programming Languages and Operating Systems. pp. 1–17. doi:10.1145/3445814.3446724. ISBN 9781450383172. S2CID 231949599. Retrieved 2022-07-12. ... While some compilers (e.g., Rust) support structure reordering [82], C & C++ compilers are forbidden to reorder data structures (e.g., struct or class) [74] ...
  149. ^ "Type layout". The Rust Reference. Retrieved 2022-07-14.
  150. ^ Lardinois, Frederic (2015-04-03). "Mozilla And Samsung Team Up To Develop Servo, Mozilla's Next-Gen Browser Engine For Multicore Processors". TechCrunch. Archived from the original on 2016-09-10. Retrieved 2017-06-25.
  151. ^ Keizer, Gregg (2016-10-31). "Mozilla plans to rejuvenate Firefox in 2017". Computerworld. Retrieved 2023-05-13.
  152. ^ Claburn, Thomas (2023-01-12). "Google polishes Chromium code with a layer of Rust". The Register. Retrieved 2024-07-17.
  153. ^ "Supporting the Use of Rust in the Chromium Project". Google Online Security Blog. Retrieved 2023-11-12.
  154. ^ Shankland, Stephen (2016-07-12). "Firefox will get overhaul in bid to get you interested again". CNET. Retrieved 2022-07-14.
  155. ^ Security Research Team (2013-10-04). "ZeroMQ: Helping us Block Malicious Domains in Real Time". Cisco Umbrella. Archived from the original on 2023-05-13. Retrieved 2023-05-13.
  156. ^ Cimpanu, Catalin (2019-10-15). "AWS to sponsor Rust project". ZDNET. Retrieved 2024-07-17.
  157. ^ Nichols, Shaun (2018-06-27). "Microsoft's next trick? Kicking things out of the cloud to Azure IoT Edge". The Register. Archived from the original on 2019-09-27. Retrieved 2019-09-27.
  158. ^ Tung, Liam. "Microsoft: Why we used programming language Rust over Go for WebAssembly on Kubernetes app". ZDNet. Archived from the original on 2022-04-21. Retrieved 2022-04-21.
  159. ^ Claburn, Thomas (2022-09-20). "In Rust We Trust: Microsoft Azure CTO shuns C and C++". The Register. Retrieved 2024-07-07.
  160. ^ Simone, Sergio De. "NPM Adopted Rust to Remove Performance Bottlenecks". InfoQ. Retrieved 2023-11-20.
  161. ^ Lyu, Shing (2020), Lyu, Shing (ed.), "Welcome to the World of Rust", Practical Rust Projects: Building Game, Physical Computing, and Machine Learning Applications, Berkeley, CA: Apress, pp. 1–8, doi:10.1007/978-1-4842-5599-5_1, ISBN 978-1-4842-5599-5, retrieved 2023-11-29
  162. ^ Lyu, Shing (2021), Lyu, Shing (ed.), "Rust in the Web World", Practical Rust Web Projects: Building Cloud and Web-Based Applications, Berkeley, CA: Apress, pp. 1–7, doi:10.1007/978-1-4842-6589-5_1, ISBN 978-1-4842-6589-5, retrieved 2023-11-29
  163. ^ Amadeo, Ron (2021-04-07). "Google is now writing low-level Android code in Rust". Ars Technica. Archived from the original on 2021-04-08. Retrieved 2022-04-21.
  164. ^ Darkcrizt. "Google Develops New Bluetooth Stack for Android, Written in Rust". Desde Linux. Archived from the original on 2021-08-25. Retrieved 2024-08-31.
  165. ^ Anderson, Tim (2021-12-07). "Rusty Linux kernel draws closer with new patch". The Register. Retrieved 2022-07-14.
  166. ^ "A first look at Rust in the 6.1 kernel [LWN.net]". lwn.net. Retrieved 2023-11-11.
  167. ^ Claburn, Thomas (2023-04-27). "Microsoft is rewriting core Windows libraries in Rust". The Register. Retrieved 2023-05-13.
  168. ^ Proven, Liam. "Small but mighty, 9Front's 'Humanbiologics' is here for the truly curious". The Register. Retrieved 2024-03-07.
  169. ^ Yegulalp, Serdar. "Rust's Redox OS could show Linux a few new tricks". InfoWorld. Archived from the original on 2016-03-21. Retrieved 2016-03-21.
  170. ^ Anderson, Tim (2021-01-14). "Another Rust-y OS: Theseus joins Redox in pursuit of safer, more resilient systems". The Register. Retrieved 2022-07-14.
  171. ^ Boos, Kevin; Liyanage, Namitha; Ijaz, Ramla; Zhong, Lin (2020). Theseus: an Experiment in Operating System Structure and State Management. pp. 1–19. ISBN 978-1-939133-19-9.
  172. ^ Zhang, HanDong (Alex) (2023-01-31). "2022 Review | The adoption of Rust in Business". Rust Magazine. Retrieved 2023-02-07.
  173. ^ Sei, Mark (2018-10-10). "Fedora 29 new features: Startis now officially in Fedora". Marksei, Weekly sysadmin pills. Archived from the original on 2019-04-13. Retrieved 2019-05-13.
  174. ^ Proven, Liam (2022-07-12). "Oracle Linux 9 released, with some interesting additions". The Register. Retrieved 2022-07-14.
  175. ^ Proven, Liam (2023-02-02). "System76 teases features coming in homegrown Rust-based desktop COSMIC". The Register. Retrieved 2024-07-17.
  176. ^ Hu, Vivian (2020-06-12). "Deno Is Ready for Production". InfoQ. Retrieved 2022-07-14.
  177. ^ Abrams, Lawrence (2021-02-06). "This Flash Player emulator lets you securely play your old games". BleepingComputer. Retrieved 2021-12-25.
  178. ^ Kharif, Olga (2020-10-17). "Ethereum Blockchain Killer Goes By Unassuming Name of Polkadot". Bloomberg L.P. Retrieved 2021-07-14.
  179. ^ a b c "Stack Overflow Developer Survey 2023". Stack Overflow. Retrieved 2023-06-25.
  180. ^ Claburn, Thomas (2022-06-23). "Linus Torvalds says Rust is coming to the Linux kernel". The Register. Retrieved 2022-07-15.
  181. ^ Jung, Ralf; Jourdan, Jacques-Henri; Krebbers, Robbert; Dreyer, Derek (2017-12-27). "RustBelt: securing the foundations of the Rust programming language". Proceedings of the ACM on Programming Languages. 2 (POPL): 1–34. doi:10.1145/3158154. hdl:21.11116/0000-0003-34C6-3. ISSN 2475-1421.
  182. ^ Popescu, Natalie; Xu, Ziyang; Apostolakis, Sotiris; August, David I.; Levy, Amit (2021-10-20). "Safer at any speed: automatic context-aware safety enhancement for Rust". Proceedings of the ACM on Programming Languages. 5 (OOPSLA): 1–23. doi:10.1145/3485480. ISSN 2475-1421.
  183. ^ Klabnik & Nichols 2019, p. 4.
  184. ^ "Getting Started". rust-lang.org. Archived from the original on 2020-11-01. Retrieved 2020-10-11.
  185. ^ Tung, Liam (2021-02-08). "The Rust programming language just took a huge step forwards". ZDNet. Retrieved 2022-07-14.
  186. ^ Krill, Paul. "Rust language moves to independent foundation". InfoWorld. Archived from the original on 2021-04-10. Retrieved 2021-04-10.
  187. ^ Vaughan-Nichols, Steven J. (2021-04-09). "AWS's Shane Miller to head the newly created Rust Foundation". ZDNet. Archived from the original on 2021-04-10. Retrieved 2021-04-10.
  188. ^ Vaughan-Nichols, Steven J. (2021-11-17). "Rust Foundation appoints Rebecca Rumbul as executive director". ZDNet. Archived from the original on 2021-11-18. Retrieved 2021-11-18.
  189. ^ "Governance". The Rust Programming Language. Archived from the original on 2022-05-10. Retrieved 2024-07-18.
  190. ^ "Introducing the Rust Leadership Council". Rust Blog. Retrieved 2024-01-12.

Further reading

External links