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 duración de vida de los objetos 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 dimisión "en protesta por el hecho de que el Equipo Central se haya 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 result2 = suma ( 10.23 , 20.45 ); println! ( "La suma es: {}" , result2 ); // 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 instancia. 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 rasgo para un tipo. [60] Los rasgos pueden proporcionar métodos derivados adicionales cuando se implementan. [96] Por ejemplo, el rasgo Iteratorrequiere que el nextmétodo se defina para el tipo. Una vez que nextse define el método, el rasgo 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

Sección 'Óxido' no encontrada

Macros

Es posible ampliar el lenguaje Rust usando macros.

Macros declarativas

Una macro declarativa (también llamada "macro por ejemplo") es una macro, definida usando la macro_rules!palabra clave, que utiliza la coincidencia de patrones para determinar su expansión. [111] [112] Un ejemplo es la println!()macro. [113]

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. [114] [115]

Las macros de procedimiento vienen en tres versiones:

La rsx!macro en el marco de interfaz Dioxus es un ejemplo de una macro similar a una función. [116] [117] La serde_derive​​macro [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 usan 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

La biblioteca estándar de Rust define e implementa muchos tipos de datos personalizados ampliamente utilizados, incluidas las estructuras de datos centrales como Vec, Option, y HashMap, así como los tipos de puntero inteligente . Rust también proporciona una forma de excluir la mayor parte de la biblioteca estándar utilizando el atributo #![no_std]; esto permite que las aplicaciones, como los dispositivos integrados, eliminen el código de dependencia o proporcionen sus propias estructuras de datos centrales. Internamente, la biblioteca estándar se divide en tres partes, core, alloc, y std, donde stdy allocse excluyen mediante #![no_std]. [130]

Captura de pantalla de crates.io en junio de 2022

Carga

Cargo es el sistema de compilación y el administrador de paquetes de Rust . Descarga, compila, distribuye y carga paquetes (llamados crates ) que se mantienen en un registro oficial. También actúa como interfaz para Clippy y otros componentes de Rust. [131]

De manera predeterminada, Cargo obtiene sus dependencias del registro contribuido por el usuario crates.io , pero los repositorios de Git y los cajones en el sistema de archivos local y otras fuentes externas también se pueden especificar como dependencias. [132]

óxido

Rustfmt es un formateador de código para Rust. Formatea los espacios en blanco y las sangrías para producir código de acuerdo con un estilo común , a menos que se especifique lo contrario. Se puede invocar como un programa independiente o desde un proyecto de Rust a través de Cargo. [133]

Ejemplo de salida de Clippy en un programa de Rust de Hola mundo

Recortado

Clippy es la herramienta de análisis de errores integrada de Rust para mejorar la corrección, el rendimiento y la legibilidad del código de Rust. A partir de 2024 , tiene más de 700 reglas. [134] [135]

Sistema de versiones

Después de Rust 1.0, se desarrollan nuevas características en versiones nocturnas que se lanzan diariamente. Durante cada ciclo de lanzamiento de seis semanas, los cambios de las versiones nocturnas se lanzan a la versión beta, mientras que los cambios de la versión beta anterior se lanzan a una nueva versión estable. [136]

Cada dos o tres años se produce una nueva "edición". Las ediciones se lanzan para permitir la realización de cambios limitados , como la promoción awaita una palabra clave para admitir funciones async/await . Los crates que apuntan a diferentes ediciones pueden interoperar entre sí, por lo que un crate puede actualizarse a una nueva edición incluso si sus llamadores o sus dependencias aún apuntan a ediciones anteriores. La migración a una nueva edición puede ser asistida con herramientas automatizadas. [137]

Soporte IDE

rust-analyzer es una colección de utilidades que proporciona a los entornos de desarrollo integrados (IDE) y editores de texto información sobre un proyecto Rust a través del Protocolo de servidor de lenguaje . Esto permite funciones como el autocompletado y la visualización de errores de compilación durante la edición. [138]

Actuación

En general, las garantías de seguridad de memoria de Rust no imponen una sobrecarga en tiempo de ejecución. [139] Una excepción notable es la indexación de matrices , que se verifica en tiempo de ejecución, aunque esto a menudo no afecta el rendimiento. [140] Dado que no realiza la recolección de basura, Rust suele ser más rápido que otros lenguajes seguros para la memoria. [141] [84] [142]

Rust ofrece dos "modos": seguro e inseguro. El modo seguro es el "normal", en el que se escribe la mayor parte de Rust. En el modo inseguro, el desarrollador es responsable de la seguridad de la memoria del código, que es utilizado por los desarrolladores en casos en los que el compilador es demasiado restrictivo. [143]

Muchas de las características de Rust son las llamadas abstracciones de costo cero , lo que significa que se optimizan en tiempo de compilación y no incurren en penalizaciones de tiempo de ejecución. [144] El sistema de propiedad y préstamo permite implementaciones de copia cero para algunas tareas sensibles al rendimiento, como el análisis . [145] El envío estático se utiliza de forma predeterminada para eliminar las llamadas a métodos , con la excepción de los métodos llamados en objetos de rasgos dinámicos. [146] El compilador también utiliza la expansión en línea para eliminar las llamadas a funciones y las invocaciones de métodos enviados estáticamente. [147]

Dado que Rust utiliza LLVM , cualquier mejora de rendimiento en LLVM también se traslada a Rust. [148] A diferencia de C y C++, Rust permite reordenar elementos de estructura y enumeración [149] para reducir los tamaños de las estructuras en la memoria, para una mejor alineación de la memoria y para mejorar la eficiencia del acceso a la memoria caché . [150]

Adopción

Primera página de inicio del motor de navegación Servo de Mozilla

Rust se ha utilizado en software en diferentes dominios. Rust fue financiado inicialmente por Mozilla como parte del desarrollo de Servo , un motor de navegador paralelo experimental, en colaboración con Samsung . [151] Los componentes del motor Servo se incorporaron más tarde al motor de navegador Gecko subyacente a Firefox. [152] En enero de 2023, Google ( Alphabet ) anunció el soporte para el uso de bibliotecas de terceros Rust en Chromium . [153] [154]

Rust se utiliza en varios proyectos de software backend de grandes servicios web . OpenDNS , un servicio de resolución de DNS propiedad de Cisco , utiliza Rust internamente. [155] [156] Amazon Web Services utiliza Rust en "componentes sensibles al rendimiento" de sus diversos servicios. En 2019, AWS publicó en código abierto Firecracker , una solución de virtualización escrita principalmente en Rust. [157] Microsoft Azure IoT Edge, una plataforma utilizada para ejecutar servicios de Azure en dispositivos IoT , tiene componentes implementados en Rust. [158] Microsoft también utiliza Rust para ejecutar módulos en contenedores con WebAssembly y Kubernetes . [159] Cloudflare , una empresa que proporciona servicios de red de distribución de contenido , utilizó Rust para crear un nuevo proxy web llamado Pingora para aumentar el rendimiento y la eficiencia. [160] El administrador de paquetes npm comenzó a utilizar Rust para su servicio de autenticación de producción en 2019. [161] [162] [163]

En sistemas operativos, los desarrolladores de Android estaban usando Rust en 2021 para reescribir componentes existentes. [164] [165] El proyecto Rust para Linux , lanzado en 2020, agregó soporte inicial de Rust a Linux a fines de 2022, y los primeros controladores de Linux escritos en Rust se lanzaron a fines de 2023. [166] [167] Microsoft está reescribiendo partes de Windows en Rust. [168] El proyecto r9 tiene como objetivo volver a implementar Plan 9 de Bell Labs en Rust. [169] Rust se ha utilizado en el desarrollo de nuevos sistemas operativos como Redox , un sistema operativo "similar a Unix" y microkernel , [170] Theseus, un sistema operativo experimental con gestión de estado modular, [171] [172] y la mayor parte de Fuchsia . [173] Rust también se utiliza para herramientas de línea de comandos y componentes del sistema operativo, incluido stratisd , un administrador de sistema de archivos [174] [175] y COSMIC, un entorno de escritorio de System76 . [176]

En el desarrollo web, Deno , un entorno de ejecución seguro para JavaScript y TypeScript , está construido sobre V8 usando Rust y Tokio. [177] Otras adopciones notables en este espacio incluyen Ruffle , un emulador SWF de código abierto , [178] y Polkadot , una plataforma de cadena de bloques y criptomonedas de código abierto . [179]

Discord , una empresa de software de mensajería instantánea , ha reescrito partes de su sistema en Rust para aumentar el rendimiento en 2020. Ese mismo año, Dropbox anunció que su sincronización de archivos había sido reescrita en Rust. Facebook ( Meta ) también ha utilizado Rust para rediseñar su sistema que administra el código fuente de proyectos internos. [16]

En la encuesta de desarrolladores de Stack Overflow de 2023 , el 13 % de los encuestados había realizado recientemente un desarrollo extenso en Rust. [180] La encuesta también nombró a Rust como el "lenguaje de programación más amado" todos los años desde 2016 hasta 2023 (inclusive) y el "lenguaje de programación más admirado" en 2024, según la cantidad de desarrolladores interesados ​​en seguir trabajando en el mismo lenguaje. [181] [nota 5] En 2023, Rust fue la sexta "tecnología más buscada", con un 31 % de desarrolladores que actualmente no trabajan en Rust expresando interés en hacerlo. [180]

En la investigación académica

Rust ha sido estudiado en la investigación académica, tanto por las propiedades del lenguaje en sí como por la utilidad que proporciona para escribir software utilizado en la investigación. Se han examinado sus características en cuanto a seguridad [182] [143] y rendimiento [183] .

En un artículo de revista publicado en Proceedings of the International Astronomical Union , los astrofísicos Blanco-Cuaresma y Bolmont reimplementaron programas responsables de simular sistemas multiplanetarios en Rust, y descubrieron que era un lenguaje de programación competitivo por su "velocidad y precisión". [14] Asimismo, un artículo publicado en Nature compartió varias historias de bioinformáticos que usan Rust por su rendimiento y seguridad. [131] Sin embargo, ambos artículos han citado los conceptos únicos de Rust, incluido su sistema de propiedad, que es difícil de aprender como uno de los principales inconvenientes para adoptar Rust.

Comunidad

Un icono de cangrejo de color naranja brillante
Algunos usuarios de Rust se refieren a sí mismos como Rustaceans (similar a la palabra crustáceo ) y han adoptado un cangrejo naranja, Ferris, como su mascota no oficial. [184] [185]

Rust se ha destacado por tener una comunidad inclusiva y, en particular, por acoger a personas de la comunidad queer , en parte debido a su código de conducta , que describía un conjunto de expectativas que los miembros de la comunidad Rust debían seguir. Un artículo de MIT Technology Review describió a la comunidad Rust como "inusualmente amigable" con los recién llegados. [16] [131]

Fundación Rust

La Fundación Rust es una organización de membresía sin fines de lucro incorporada en Estados Unidos , con los propósitos principales de respaldar el proyecto técnico como entidad legal y ayudar a administrar la marca registrada y los activos de infraestructura. [186] [35]

Se estableció el 8 de febrero de 2021, con cinco miembros corporativos fundadores (Amazon Web Services, Huawei, Google, Microsoft y Mozilla). [187] La ​​junta directiva de la fundación está presidida por Shane Miller. [188] A partir de fines de 2021, su directora ejecutiva y directora ejecutiva es Rebecca Rumbul. [189] Antes de esto, Ashley Williams fue directora ejecutiva interina. [35]

Equipos de gobernanza

El proyecto Rust está compuesto por equipos que son responsables de diferentes subáreas del desarrollo. El equipo de compiladores desarrolla, administra y optimiza los componentes internos del compilador; y el equipo de lenguaje diseña nuevas características del lenguaje y ayuda a implementarlas. El sitio web del proyecto Rust enumera 6 equipos de alto nivel a partir de julio de 2024. [ 190] Los representantes de los equipos forman el consejo de liderazgo, que supervisa el proyecto Rust en su conjunto. [191]

Véase también

Notas

  1. ^ Incluye herramientas de compilación, herramientas de host y compatibilidad con bibliotecas estándar para x86-64 , ARM , MIPS , RISC-V , WebAssembly , i686 , AArch64 , PowerPC y s390x . [2]
  2. ^ Incluye Windows , Linux , macOS , FreeBSD , NetBSD e Illumos . Las herramientas de compilación de host en Android , iOS , Haiku , Redox y Fuchsia no se distribuyen oficialmente; estos sistemas operativos son compatibles como destinos. [2]
  3. ^ Las dependencias de terceros, por ejemplo, LLVM o MSVC , están sujetas a sus propias licencias. [3] [4]
  4. ^ En los sistemas Unix, suelen ser cadenas UTF-8 sin un byte 0 interno. En Windows, son cadenas UTF-16 sin un byte 0 interno. A diferencia de estos, stry Stringson siempre cadenas UTF-8 válidas y pueden contener ceros internos.
  5. ^ Es decir, entre los encuestados que han realizado "un trabajo de desarrollo extenso [con Rust] durante el último año" (13,05%), Rust tuvo el mayor porcentaje de quienes también expresaron interés en "trabajar en [Rust] durante el próximo año" (84,66%). [180]

Referencias

Fuentes de libros

Otros

  1. ^ "Anuncio de Rust 1.82.0". 2024-10-17 . Consultado el 2024-10-17 .
  2. ^ ab "Soporte de plataforma". El libro rustc . Consultado el 27 de junio de 2022 .
  3. ^ "El lenguaje de programación Rust". El lenguaje de programación Rust. 19 de octubre de 2022.
  4. ^ "Tipos de unicidad". Blog de Rust . Consultado el 8 de octubre de 2016. Quienes estén familiarizados con el estilo Elm pueden reconocer que los mensajes --explain actualizados se inspiran en gran medida en el enfoque Elm.
  5. ^ ab "Influencias - La referencia de Rust". La referencia de Rust . Archivado desde el original el 2023-11-26 . Consultado el 2023-12-31 .
  6. ^ "Tipos de unicidad". Documentación de Idris 1.3.3 . Consultado el 14 de julio de 2022 . Están inspirados en... tipos de propiedad y punteros prestados en el lenguaje de programación Rust.
  7. ^ "Microsoft abre el lenguaje de programación Project Verona inspirado en Rust en GitHub". ZDNet . Archivado desde el original el 17 de enero de 2020 . Consultado el 17 de enero de 2020 .
  8. ^ Jaloyan, Georges-Axel (19 de octubre de 2017). "Punteros seguros en SPARK 2014". arXiv : 1710.07047 [cs.PL].
  9. ^ Lattner, Chris. «Página de inicio de Chris Lattner». Nondot.org . Archivado desde el original el 25 de diciembre de 2018. Consultado el 14 de mayo de 2019 .
  10. ^ "Documentación de V (Introducción)". GitHub . Consultado el 4 de noviembre de 2023 .
  11. ^ Yegulalp, Serdar (29 de agosto de 2016). "Un nuevo contrincante se suma a Rust para derrocar al lenguaje C". InfoWorld . Consultado el 19 de octubre de 2022 .
  12. ^ Eshwarla, Prabhu (24 de diciembre de 2020). Programación práctica de sistemas para desarrolladores de Rust: cree software rápido y seguro para sistemas Linux/Unix con la ayuda de ejemplos prácticos. Packt Publishing Ltd. ISBN 978-1-80056-201-1.
  13. ^ ab Blanco-Cuaresma, Sergi; Bolmont, Emeline (30 de mayo de 2017). "¿Qué puede hacer el lenguaje de programación Rust por la astrofísica?". Actas de la Unión Astronómica Internacional . 12 (S325): 341–344. arXiv : 1702.02951 . Bibcode :2017IAUS..325..341B. doi :10.1017/S1743921316013168. ISSN  1743-9213. S2CID  7857871.
  14. ^ Blandy, Orendorff y Tindall 2021.
  15. ^ abcde Thompson, Clive (14 de febrero de 2023). «Cómo Rust pasó de ser un proyecto secundario al lenguaje de programación más querido del mundo». MIT Technology Review . Consultado el 23 de febrero de 2023 .
  16. ^ ab Avram, Abel (3 de agosto de 2012). "Entrevista sobre Rust, un lenguaje de programación de sistemas desarrollado por Mozilla". InfoQ. Archivado desde el original el 24 de julio de 2013. Consultado el 17 de agosto de 2013 .
  17. ^ "Logotipo de Rust". bugzilla.mozilla.org . Consultado el 2 de febrero de 2024 .
  18. ^ Hoare, Graydon (29 de marzo de 2012). «[rust-dev] Rust 0.2 publicado». mail.mozilla.org . Archivado desde el original el 6 de noviembre de 2022 . Consultado el 4 de abril de 2024 .
  19. ^ Hoare, Graydon (12 de julio de 2012). «[rust-dev] Se lanzó Rust 0.3». mail.mozilla.org . Archivado desde el original el 24 de agosto de 2022 . Consultado el 12 de junio de 2022 .
  20. ^ Hoare, Graydon (15 de octubre de 2012). «[rust-dev] Lanzamiento de Rust 0.4». mail.mozilla.org . Archivado desde el original el 31 de octubre de 2021 . Consultado el 31 de octubre de 2021 .
  21. ^ Binstock, Andrew (7 de enero de 2014). "El auge y la caída de las lenguas en 2013". Diario del Dr. Dobb . Archivado desde el original el 7 de agosto de 2016. Consultado el 20 de noviembre de 2022 .
  22. ^ Lardinois, Frederic (29 de septiembre de 2017). "Es hora de darle otra oportunidad a Firefox". TechCrunch . Consultado el 15 de agosto de 2023 .
  23. ^ Cimpanu, Catalin (11 de agosto de 2020). «Mozilla despide a 250 empleados mientras se centra en productos comerciales». ZDNet . Archivado desde el original el 18 de marzo de 2022. Consultado el 2 de diciembre de 2020 .
  24. ^ Cooper, Daniel (11 de agosto de 2020). «Mozilla despide a 250 empleados debido a la pandemia». Engadget . Archivado desde el original el 13 de diciembre de 2020. Consultado el 2 de diciembre de 2020 .
  25. ^ Tung, Liam. "Lenguaje de programación Rust: los recortes de empleo de Mozilla nos han afectado mucho, pero así es como sobreviviremos". ZDNet. Archivado desde el original el 2022-04-21 . Consultado el 2022-04-21 .
  26. ^ "Sentando las bases para el futuro de Rust". Blog de Rust . 2020-08-18. Archivado desde el original el 2020-12-02 . Consultado el 2020-12-02 .
  27. ^ "¡Hola mundo!". Fundación Rust . 8 de febrero de 2020. Archivado desde el original el 19 de abril de 2022. Consultado el 4 de junio de 2022 .
  28. ^ "Mozilla da la bienvenida a la Fundación Rust". Blog de Mozilla . 2021-02-09. Archivado desde el original el 2021-02-08 . Consultado el 2021-02-09 .
  29. ^ Amadeo, Ron (7 de abril de 2021). «Google ahora escribe código de Android de bajo nivel en Rust». Ars Technica . Archivado desde el original el 8 de abril de 2021. Consultado el 8 de abril de 2021 .
  30. ^ Anderson, Tim (23 de noviembre de 2021). «Todo el equipo de moderación de Rust dimite». The Register . Consultado el 4 de agosto de 2022 .
  31. ^ "Actualización de gobernanza". Blog Inside Rust . Consultado el 27 de octubre de 2022 .
  32. ^ Claburn, Thomas (17 de abril de 2023). «Rust Foundation se disculpa por la confusión en la política de marcas registradas». The Register . Consultado el 7 de mayo de 2023 .
  33. ^ Proven, Liam (27 de noviembre de 2019). "Rebecca Rumbul nombrada nueva directora ejecutiva de The Rust Foundation". The Register . Consultado el 14 de julio de 2022. Ambos son lenguajes con llaves, con una sintaxis similar a C que los hace poco intimidantes para los programadores de C.
  34. ^ abc Vigliarolo, Brandon (10 de febrero de 2021). "El lenguaje de programación Rust ahora tiene su propia base independiente". TechRepublic . Archivado desde el original el 20 de marzo de 2023 . Consultado el 14 de julio de 2022 .
  35. ^ Klabnik y Nichols 2019, pág. 263.
  36. ^ Klabnik y Nichols 2019, págs. 5-6.
  37. ^ Klabnik y Nichols 2023, pág. 32.
  38. ^ Klabnik y Nichols 2023, págs. 32-33.
  39. ^ Klabnik y Nichols 2023, págs. 49-50.
  40. ^ Klabnik y Nichols 2023, págs. 34-36.
  41. ^ Klabnik y Nichols 2023, págs. 6, 44, 47.
  42. ^ Klabnik y Nichols 2023, págs. 50–52.
  43. ^ Klabnik y Nichols 2023, pág. 56.
  44. ^ Klabnik y Nichols 2023, págs. 57–58.
  45. ^ Klabnik y Nichols 2023, págs. 54-56.
  46. ^ Klabnik y Nichols 2019, págs. 50–53.
  47. ^ Tyson, Matthew (3 de marzo de 2022). "Programación en Rust para desarrolladores de Java". InfoWorld . Consultado el 14 de julio de 2022 .
  48. ^ Klabnik y Nichols 2019, págs. 104-109.
  49. ^ Klabnik y Nichols 2019, págs. 24.
  50. ^ Klabnik y Nichols 2019, págs. 36–38.
  51. ^ Klabnik y Nichols 2023, págs. 36–38.
  52. ^ Klabnik y Nichols 2023, pág. 502.
  53. ^ "Glosario de términos Unicode". Consorcio Unicode . Consultado el 30 de julio de 2024 .
  54. ^ Klabnik y Nichols 2019, págs. 38-40.
  55. ^ Klabnik y Nichols 2019, pág. 83.
  56. ^ Klabnik y Nichols 2019, pág. 97.
  57. ^ Klabnik y Nichols 2019, págs. 98-101.
  58. ^ Klabnik y Nichols 2019, págs. 438–440.
  59. ^ desde Klabnik & Nichols 2019, págs. 93.
  60. ^ "OsStr en std::ffi – Rust". doc.rust-lang.org . Consultado el 2 de octubre de 2023 .
  61. ^ "OsString en std::ffi – Rust". doc.rust-lang.org . Consultado el 2 de octubre de 2023 .
  62. ^ "Ruta en std::path – Rust". doc.rust-lang.org . Consultado el 2 de octubre de 2023 .
  63. ^ "PathBuf en std::path – Rust". doc.rust-lang.org . Consultado el 2 de octubre de 2023 .
  64. ^ abc "std::boxed – Rust". doc.rust-lang.org . Consultado el 23 de junio de 2023 .
  65. ^ "std::boxed – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  66. ^ "Rc en std::rc – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  67. ^ "Arc en std::sync – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  68. ^ "Celda en std::cell – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  69. ^ "Mutex en std::sync – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  70. ^ "RwLock en std::sync – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  71. ^ "Condvar en std::sync – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  72. ^ "Duración en std::time – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  73. ^ "HashMap en std::collections – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  74. ^ "BTreeMap en std::collections – Rust". doc.rust-lang.org . Consultado el 24 de junio de 2023 .
  75. ^ McNamara 2021.
  76. ^ Klabnik y Nichols 2019, págs. 101-104.
  77. ^ "std::option - Rust". doc.rust-lang.org . Consultado el 12 de noviembre de 2023 .
  78. ^ desde Klabnik & Nichols 2019, págs. 418–427.
  79. ^ "Fundición - Rust con ejemplos". doc.rust-lang.org .
  80. ^ Klabnik y Nichols 2019, págs. 59–61.
  81. ^ desde Klabnik & Nichols 2019, págs. 63–68.
  82. ^ Klabnik y Nichols 2019, págs. 74-75.
  83. ^ ab Balasubramanian, Abhiram; Baranowski, Marek S.; Burtsev, Anton; Panda, Aurojit; Rakamarić, Zvonimir; Ryzhyk, Leonid (7 de mayo de 2017). "Programación de sistemas en Rust". Actas del 16.º taller sobre temas de actualidad en sistemas operativos . HotOS '17. Nueva York, NY, EE. UU.: Association for Computing Machinery. págs. 156–161. doi :10.1145/3102980.3103006. ISBN 978-1-4503-5068-6. S2CID  24100599. Archivado desde el original el 11 de junio de 2022. Consultado el 1 de junio de 2022 .
  84. ^ Klabnik y Nichols 2023, págs. 327–30.
  85. ^ Klabnik y Nichols 2019, pág. 194.
  86. ^ Klabnik y Nichols 2019, págs. 75, 134.
  87. ^ Shamrell-Harrington, Nell. "El verificador de préstamos de óxido: una mirada profunda". InfoQ . Consultado el 25 de junio de 2022 .
  88. ^ Klabnik y Nichols 2019, págs. 194-195.
  89. ^ Klabnik y Nichols 2023, págs. 208-12.
  90. ^ Klabnik y Nichols 2019, págs. 201–203.
  91. ^ Klabnik y Nichols 2019, págs. 171-172.
  92. ^ Klabnik y Nichols 2019, págs. 171-172, 205.
  93. ^ Klabnik y Nichols 2019, págs. 181, 182.
  94. ^ Gjengset 2021, pág. 25.
  95. ^ Klabnik y Nichols 2019, págs. 182-184.
  96. ^ Klabnik y Nichols 2019, págs. 281–283.
  97. ^ "Uso de objetos de características que permiten valores de diferentes tipos: el lenguaje de programación Rust". doc.rust-lang.org . Consultado el 11 de julio de 2022 .
  98. ^ Klabnik y Nichols 2019, págs. 441–442.
  99. ^ Klabnik y Nichols 2019, págs. 379–380.
  100. ^ Rosenblatt, Seth (3 de abril de 2013). "Samsung se suma a la búsqueda de Rust por parte de Mozilla". CNET . Archivado desde el original el 4 de abril de 2013. Consultado el 5 de abril de 2013 .
  101. ^ Brown, Neil (17 de abril de 2013). "A taste of Rust" (Una muestra de óxido). LWN.net . Archivado desde el original el 26 de abril de 2013. Consultado el 25 de abril de 2013 .
  102. ^ "Razas – El Rustonomicon". doc.rust-lang.org . Archivado desde el original el 2017-07-10 . Consultado el 2017-07-03 .
  103. ^ "Preguntas frecuentes sobre el lenguaje Rust". static.rust-lang.org . 2015. Archivado desde el original el 20 de abril de 2015 . Consultado el 24 de abril de 2017 .
  104. ^ McNamara 2021, págs. 139, 376–379, 395.
  105. ^ "RAII – Rust By Example". doc.rust-lang.org . Archivado desde el original el 2019-04-21 . Consultado el 2020-11-22 .
  106. ^ "Abstracción sin gastos generales: características en Rust". Blog de Rust . Archivado desde el original el 23 de septiembre de 2021. Consultado el 19 de octubre de 2021 .
  107. ^ "Cajas, pilas y montones". Rust By Example . Consultado el 13 de junio de 2022 .
  108. ^ Klabnik y Nichols 2019, págs. 70–75.
  109. ^ Klabnik y Nichols 2019, pág. 323.
  110. ^ "Macros por ejemplo". Referencia de Rust . Consultado el 21 de abril de 2023 .
  111. ^ Klabnik y Nichols 2019, págs. 446–448.
  112. ^ "Fuente de la macro std::println! de Rust". GitHub . Consultado el 1 de octubre de 2024 .
  113. ^ "Macros procedimentales". Referencia del lenguaje de programación Rust . Archivado desde el original el 2020-11-07 . Consultado el 2021-03-23 .
  114. ^ Klabnik y Nichols 2019, págs. 449–455.
  115. ^ "Fuente de la macro Dioxus rsx!". GitHub . Consultado el 1 de octubre de 2024 .
  116. ^ "Documentación de macros de Dioxus rsx!". Dioxus Labs . Consultado el 1 de octubre de 2024 .
  117. ^ "Serde Derive". Documentación de Serde Derive . Archivado desde el original el 2021-04-17 . Consultado el 2021-03-23 .
  118. ^ "extendr_api – Rust". Documentación de la API de Extendr . Archivado desde el original el 2021-05-25 . Consultado el 2021-03-23 .
  119. ^ "Variadics". El óxido a través del ejemplo .
  120. ^ "2137-variadic". El libro RFC de Rust .
  121. ^ "Interoperabilidad segura entre Rust y C++ con CXX". InfoQ . 2020-12-06. Archivado desde el original el 2021-01-22 . Consultado el 2021-01-03 .
  122. ^ "Diseño tipográfico: referencia de Rust". doc.rust-lang.org . Consultado el 15 de julio de 2022 .
  123. ^ Blandy, Orendorff y Tindall 2021, págs.
  124. ^ McNamara 2021, págs. 411–412.
  125. ^ "Descripción general del compilador". Guía de desarrollo del compilador de Rust . Consultado el 2 de junio de 2023 .
  126. ^ "Generación de código: guía de desarrollo del compilador Rust". rustc-dev-guide.rust-lang.org . Consultado el 3 de marzo de 2024 .
  127. ^ "rust-lang/rustc_codegen_gcc". GitHub . El lenguaje de programación Rust. 2024-03-02 . Consultado el 2024-03-03 .
  128. ^ "rust-lang/rustc_codegen_cranelift". GitHub . El lenguaje de programación Rust. 2024-03-02 . Consultado el 2024-03-03 .
  129. ^ Gjengset 2021, págs. 213-215.
  130. ^ abc Perkel, Jeffrey M. (1 de diciembre de 2020). «Por qué los científicos recurren a Rust». Nature . 588 (7836): 185–186. Bibcode :2020Natur.588..185P. doi :10.1038/d41586-020-03382-2. PMID  33262490. S2CID  227251258. Archivado desde el original el 6 de mayo de 2022. Consultado el 15 de mayo de 2022 .
  131. ^ Simone, Sergio De (18 de abril de 2019). "Rust 1.34 presenta registros alternativos para cajas no públicas". InfoQ . Consultado el 14 de julio de 2022 .
  132. ^ Klabnik y Nichols 2019, págs. 511–512.
  133. ^ Clippy, El lenguaje de programación Rust, 2023-11-30 , consultado el 2023-11-30
  134. ^ "Clippy Lints". El lenguaje de programación Rust . Consultado el 30 de noviembre de 2023 .
  135. ^ Klabnik & Nichols 2019, Apéndice G: Cómo se forma el óxido y el "óxido nocturno"
  136. ^ Blandy, Orendorff y Tindall 2021, págs. 176-177.
  137. ^ Klabnik y Nichols 2023, pág. 623.
  138. ^ McNamara 2021, pág. 11.
  139. ^ Popescu, Natalie; Xu, Ziyang; Apostolakis, Sotiris; August, David I.; Levy, Amit (15 de octubre de 2021). "Más seguro a cualquier velocidad: mejora automática de la seguridad consciente del contexto para Rust". Actas de la ACM sobre lenguajes de programación . 5 (OOPSLA). Sección 2. doi : 10.1145/3485480 . S2CID  238212612. p. 5: Observamos una gran variación en los costos generales de la indexación marcada: el 23,6% de los puntos de referencia informan impactos significativos en el rendimiento de la indexación marcada, pero el 64,5% informa poco o ningún impacto y, sorprendentemente, el 11,8% informa una mejora en el rendimiento ... En última instancia, si bien la indexación sin marcar puede mejorar el rendimiento, la mayoría de las veces no lo hace.
  140. ^ Anderson, Tim. "¿Puede el óxido salvar el planeta? ¿Por qué y por qué no?". The Register . Consultado el 11 de julio de 2022 .
  141. ^ Yegulalp, Serdar (6 de octubre de 2021). "¿Qué es el lenguaje Rust? Desarrollo de software seguro, rápido y sencillo". InfoWorld . Consultado el 25 de junio de 2022 .
  142. ^ ab Astrauskas, Vytautas; Matheja, Christoph; Poli, Federico; Müller, Peter; Summers, Alexander J. (13 de noviembre de 2020). "¿Cómo utilizan los programadores el óxido inseguro?". Actas de la ACM sobre lenguajes de programación . 4 (OOPSLA): 1–27. doi :10.1145/3428204. hdl : 20.500.11850/465785 . ISSN  2475-1421.
  143. ^ McNamara 2021, pág. 19, 27.
  144. ^ Couprie, Geoffroy (2015). "Nom, una biblioteca de combinadores de analizadores sintácticos orientada a bytes, de transmisión y copia cero en Rust". Talleres de seguridad y privacidad del IEEE de 2015. págs. 142–148. doi :10.1109/SPW.2015.31. ISBN 978-1-4799-9933-0.S2CID16608844  .​
  145. ^ McNamara 2021, pág. 20.
  146. ^ "Generación de código: referencia de Rust". doc.rust-lang.org . Consultado el 9 de octubre de 2022 .
  147. ^ "¿Qué tan rápido es Rust?". Preguntas frecuentes sobre el lenguaje de programación Rust . Archivado desde el original el 28 de octubre de 2020. Consultado el 11 de abril de 2019 .
  148. ^ Farshin, Alireza; Barbette, Tom; Roozbeh, Amir; Maguire Jr, Gerald Q.; Kostić, Dejan (2021). "PacketMill: Hacia una red de 100 GBPS por núcleo". Actas de la 26.ª Conferencia internacional de la ACM sobre soporte arquitectónico para lenguajes de programación y sistemas operativos. págs. 1–17. doi :10.1145/3445814.3446724. ISBN 9781450383172. S2CID  231949599 . Consultado el 12 de julio de 2022 . ... Si bien algunos compiladores (por ejemplo, Rust) admiten la reordenación de estructuras [82], los compiladores de C y C++ tienen prohibido reordenar las estructuras de datos (por ejemplo, struct o class) [74] ...
  149. ^ "Diseño de tipografía". Referencia de Rust . Consultado el 14 de julio de 2022 .
  150. ^ Lardinois, Frederic (3 de abril de 2015). «Mozilla y Samsung se unen para desarrollar Servo, el motor de navegación de próxima generación de Mozilla para procesadores multinúcleo». TechCrunch . Archivado desde el original el 10 de septiembre de 2016. Consultado el 25 de junio de 2017 .
  151. ^ Keizer, Gregg (31 de octubre de 2016). «Mozilla planea rejuvenecer Firefox en 2017». Computerworld . Consultado el 13 de mayo de 2023 .
  152. ^ Claburn, Thomas (12 de enero de 2023). «Google pule el código de Chromium con una capa de Rust». The Register . Consultado el 17 de julio de 2024 .
  153. ^ "Apoyo al uso de Rust en el proyecto Chromium". Blog de seguridad en línea de Google . Consultado el 12 de noviembre de 2023 .
  154. ^ Shankland, Stephen (12 de julio de 2016). "Firefox se renovará para que vuelva a interesarte". CNET . Consultado el 14 de julio de 2022 .
  155. ^ Security Research Team (4 de octubre de 2013). «ZeroMQ: nos ayuda a bloquear dominios maliciosos en tiempo real». Cisco Umbrella . Archivado desde el original el 13 de mayo de 2023. Consultado el 13 de mayo de 2023 .
  156. ^ Cimpanu, Catalin (15 de octubre de 2019). "AWS patrocinará el proyecto Rust". ZDNET . Consultado el 17 de julio de 2024 .
  157. ^ Nichols, Shaun (27 de junio de 2018). "¿El próximo truco de Microsoft? Sacar cosas de la nube a Azure IoT Edge". The Register . Archivado desde el original el 27 de septiembre de 2019. Consultado el 27 de septiembre de 2019 .
  158. ^ Tung, Liam. "Microsoft: Por qué usamos el lenguaje de programación Rust en lugar de Go para WebAssembly en la aplicación Kubernetes". ZDNet. Archivado desde el original el 2022-04-21 . Consultado el 2022-04-21 .
  159. ^ Claburn, Thomas (20 de septiembre de 2022). "En Rust confiamos: el director de tecnología de Microsoft Azure rechaza C y C++". The Register . Consultado el 7 de julio de 2024 .
  160. ^ Simone, Sergio De. "NPM adoptó Rust para eliminar cuellos de botella en el rendimiento". InfoQ . Consultado el 20 de noviembre de 2023 .
  161. ^ Lyu, Shing (2020), Lyu, Shing (ed.), "Bienvenido al mundo de Rust", Practical Rust Projects: Building Game, Physical Computing, and Machine Learning Applications , Berkeley, CA: Apress, págs. 1–8, doi :10.1007/978-1-4842-5599-5_1, ISBN 978-1-4842-5599-5, consultado el 29 de noviembre de 2023
  162. ^ Lyu, Shing (2021), Lyu, Shing (ed.), "Rust en el mundo web", Proyectos web prácticos de Rust: creación de aplicaciones web y en la nube , Berkeley, CA: Apress, págs. 1–7, doi :10.1007/978-1-4842-6589-5_1, ISBN 978-1-4842-6589-5, consultado el 29 de noviembre de 2023
  163. ^ Amadeo, Ron (7 de abril de 2021). «Google ahora escribe código de Android de bajo nivel en Rust». Ars Technica . Archivado desde el original el 8 de abril de 2021. Consultado el 21 de abril de 2022 .
  164. ^ Darkcrizt. «Google desarrolla una nueva pila Bluetooth para Android, escrita en Rust». Desde Linux . Archivado desde el original el 25 de agosto de 2021. Consultado el 31 de agosto de 2024 .
  165. ^ Anderson, Tim (7 de diciembre de 2021). "El núcleo oxidado de Linux se acerca con un nuevo parche". The Register . Consultado el 14 de julio de 2022 .
  166. ^ "Un primer vistazo a Rust en el kernel 6.1 [LWN.net]". lwn.net . Consultado el 11 de noviembre de 2023 .
  167. ^ Claburn, Thomas (27 de abril de 2023). "Microsoft está reescribiendo las bibliotecas centrales de Windows en Rust". The Register . Consultado el 13 de mayo de 2023 .
  168. ^ Probado, Liam. "Pequeño pero poderoso, 'Humanbiologics' de 9Front está aquí para los verdaderamente curiosos". The Register . Consultado el 7 de marzo de 2024 .
  169. ^ Yegulalp, Serdar. «El sistema operativo Redox de Rust podría mostrarle a Linux algunos trucos nuevos». InfoWorld . Archivado desde el original el 21 de marzo de 2016. Consultado el 21 de marzo de 2016 .
  170. ^ Anderson, Tim (14 de enero de 2021). «Otro sistema operativo con aspecto oxidado: Theseus se une a Redox en la búsqueda de sistemas más seguros y resistentes». The Register . Consultado el 14 de julio de 2022 .
  171. ^ Boos, Kevin; Liyanage, Namitha; Ijaz, Ramla; Zhong, Lin (2020). Theseus: un experimento sobre la estructura del sistema operativo y la gestión de estados. pp. 1–19. ISBN 978-1-939133-19-9.
  172. ^ Zhang, HanDong (Alex) (31 de enero de 2023). "Revisión de 2022 | La adopción de Rust en las empresas". Revista Rust . Consultado el 7 de febrero de 2023 .
  173. ^ Sei, Mark (10 de octubre de 2018). "Nuevas características de Fedora 29: Startis ahora oficialmente en Fedora". Marksei, Weekly sysadmin pills . Archivado desde el original el 13 de abril de 2019. Consultado el 13 de mayo de 2019 .
  174. ^ Proven, Liam (12 de julio de 2022). "Se lanzó Oracle Linux 9, con algunas novedades interesantes". The Register . Consultado el 14 de julio de 2022 .
  175. ^ Proven, Liam (2 de febrero de 2023). "System76 adelanta características que llegarán al escritorio COSMIC basado en Rust". The Register . Consultado el 17 de julio de 2024 .
  176. ^ Hu, Vivian (12 de junio de 2020). "Deno está listo para la producción". InfoQ . Consultado el 14 de julio de 2022 .
  177. ^ Abrams, Lawrence (6 de febrero de 2021). "Este emulador de Flash Player te permite jugar de forma segura a tus juegos antiguos". BleepingComputer . Consultado el 25 de diciembre de 2021 .
  178. ^ Kharif, Olga (17 de octubre de 2020). "El asesino de la cadena de bloques Ethereum se llama Polkadot" . Bloomberg LP . Consultado el 14 de julio de 2021 .
  179. ^ abc "Encuesta para desarrolladores de Stack Overflow 2023". Stack Overflow . Consultado el 25 de junio de 2023 .
  180. ^ Claburn, Thomas (23 de junio de 2022). "Linus Torvalds dice que Rust llegará al núcleo de Linux". The Register . Consultado el 15 de julio de 2022 .
  181. ^ Jung, Ralf; Jourdan, Jacques-Henri; Krebbers, Robbert; Dreyer, Derek (27 de diciembre de 2017). "RustBelt: asegurando las bases del lenguaje de programación Rust". Actas de la ACM sobre lenguajes de programación . 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 (20 de octubre de 2021). "Más seguro a cualquier velocidad: mejora automática de la seguridad en función del contexto para Rust". Actas de la ACM sobre lenguajes de programación . 5 (OOPSLA): 1–23. doi : 10.1145/3485480 . ISSN  2475-1421.
  183. ^ Klabnik y Nichols 2019, pág. 4.
  184. ^ "Primeros pasos". rust-lang.org . Archivado desde el original el 2020-11-01 . Consultado el 2020-10-11 .
  185. ^ Tung, Liam (8 de febrero de 2021). "El lenguaje de programación Rust acaba de dar un gran paso adelante". ZDNet . Consultado el 14 de julio de 2022 .
  186. ^ Krill, Paul. "El lenguaje Rust se traslada a una fundación independiente". InfoWorld . Archivado desde el original el 2021-04-10 . Consultado el 2021-04-10 .
  187. ^ Vaughan-Nichols, Steven J. (9 de abril de 2021). "Shane Miller de AWS dirigirá la recién creada Fundación Rust". ZDNet . Archivado desde el original el 10 de abril de 2021 . Consultado el 10 de abril de 2021 .
  188. ^ Vaughan-Nichols, Steven J. (17 de noviembre de 2021). «La Fundación Rust nombra a Rebecca Rumbul como directora ejecutiva». ZDNet . Archivado desde el original el 18 de noviembre de 2021. Consultado el 18 de noviembre de 2021 .
  189. ^ "Gobernanza". El lenguaje de programación Rust . Archivado desde el original el 2022-05-10 . Consultado el 2024-07-18 .
  190. ^ "Presentación del Consejo de liderazgo de Rust". Blog de Rust . Consultado el 12 de enero de 2024 .

Enlaces externos