Rust 1.78 llançat. Llenguatge Borgo que combina els punts forts de Go i Rust

S'ha publicat el llançament del llenguatge de programació de propòsit general Rust 1.78, fundat pel projecte Mozilla, però ara desenvolupat sota els auspicis de l'organització independent sense ànim de lucre Rust Foundation. El llenguatge se centra en la seguretat de la memòria i proporciona els mitjans per aconseguir un alt paral·lelisme de treballs evitant l'ús d'un col·lector d'escombraries i el temps d'execució (el temps d'execució es redueix a la inicialització bàsica i al manteniment de la biblioteca estàndard).

Els mètodes de gestió de memòria de Rust estalvien al desenvolupador d'errors en manipular els punters i protegeixen dels problemes que sorgeixen a causa del maneig de la memòria de baix nivell, com ara accedir a una àrea de memòria després d'haver-se alliberat, desreferenciar punters nuls, desbordaments de memòria intermèdia, etc. Per distribuir biblioteques, proporcionar compilacions i gestionar dependències, el projecte desenvolupa el gestor de paquets Cargo. El repositori crates.io és compatible per allotjar biblioteques.

La seguretat de la memòria es proporciona a Rust en temps de compilació mitjançant la comprovació de referències, el seguiment de la propietat de l'objecte, el seguiment de la vida útil dels objectes (àmbits) i l'avaluació de la correcció de l'accés a la memòria durant l'execució del codi. Rust també proporciona protecció contra desbordaments d'enters, requereix la inicialització obligatòria dels valors de les variables abans de l'ús, gestiona millor els errors a la biblioteca estàndard, aplica el concepte de referències i variables immutables per defecte, ofereix una escriptura estàtica forta per minimitzar els errors lògics.

Principals innovacions:

  • S'ha proposat un nou espai de noms d'atributs "#[diagnòstic]", que proporciona un mitjà per influir en els missatges d'error produïts pel compilador. El primer del nou espai és l'atribut "#[diagnostic::on_unimplemented]", que es pot utilitzar per personalitzar els missatges d'error llançats en una situació en què cal utilitzar un tret que no està implementat per al tipus. #[diagnostic::on_unimplemented( message = "El meu missatge per a `ImportantTrait<{A}>` no està implementat per a `{Self}`", label = "La meva etiqueta", note = "Nota 1", note = "Nota 2" )] tret ImportantTrait {} fn use_my_trait(_: impl ImportantTrait ) {} fn main() { use_my_trait(String::new()); } error[E32]: El meu missatge per a `ImportantTrait ` no està implementat per a `String` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ La meva etiqueta | | | exigit per un límit introduït per aquesta convocatòria | = ajuda: el tret `ImportantTrait ` no s'implementa per a `String' = nota: Nota 18 = nota: Nota 12
  • Les comprovacions prèvies a l'afirmació aplicades a les funcions no segures ara es poden ajornar fins a la generació del codi, la qual cosa permet que aquestes comprovacions es realitzin sense necessitat de crear la biblioteca estàndard en mode "#[cfg(debug_assertions)]". Per activar les comprovacions, ara n'hi ha prou amb habilitar les declaracions de depuració per a les versions de prova o depuració del vostre codi.
  • El comportament de les funcions de la biblioteca estàndard que afecten l'alineació dels punters i els sectors ara és previsible en temps d'execució i depèn de les dades d'entrada. La funció pointer::align_offset, que calcula el desplaçament per alinear el punter, ara retorna use::MAX només si l'operació falla. Les funcions slice::align_to i slice::align_to_mut ambdues, que transformen les rodanxes en una representació amb una part central alineada i les rodanxes inicials i finals originals, ara sempre retornen la part mitjana més gran.
  • Els següents es van traslladar a la categoria estable:
    • impl Llegir per a &Stdin
    • Permet l'ús d'una vida útil no estàtica (no estàtica) per a algunes implementacions relacionades amb std::error::error.
    • Implementar la implementació permès utilitzar el valor ?Size.
    • impl De per a io::Error
  • La funció Barrier::new() s'ha estabilitzat per utilitzar-la amb l'atribut "const" en qualsevol context en lloc de constants.
  • Per a plataformes de destinació x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm i i i686_10-pc-windows-gnullvm-i ara requereix almenys la versió de Windows XNUMX.
  • El tercer nivell de suport s'ha implementat per a les plataformes wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf i loongarch64-unknown-linux-musl. El tercer nivell inclou el suport bàsic, però sense proves automatitzades, publicar compilacions oficials o comprovar si es pot crear el codi.
  • S'ha implementat el segon nivell de suport per a la plataforma objectiu Add wasm32-wasip1. El segon nivell de suport implica una garantia de muntatge.
  • La plataforma wasm32-wasi-preview1-threads s'ha canviat de nom a wasm32-wasip1-threads.
  • El compilador s'ha canviat per utilitzar LLVM 18. Quan s'utilitza LLVM 18 per a arquitectures x86-32 i x86-64, s'ha canviat l'ABI associat als tipus u128 i i128.
  • Al gestor de pactes de càrrega, s'ha estabilitzat la versió 4 dels fitxers de bloqueig (arxiu de bloqueig v4).
  • Cargo té una memòria cau global estabilitzada amb informació sobre l'ús de dades més recent. La memòria cau s'allotja a $CARGO_HOME/.global-cache mitjançant SQLite i s'actualitza automàticament per reflectir els darrers canvis a l'índex, al fitxer crate, al directori de codi, al clon de git i al pagament de git.

A més, el llenguatge de programació Borgo intenta ser més expressiu que el llenguatge Go, però menys complex que el llenguatge Rust. Borgo combina les millors característiques de Go i Rust, compensant les mancances de cada idioma. Per exemple, Go és senzill i senzill, però no ofereix funcions de seguretat avançades. El llenguatge Rust proporciona eines per a una programació segura, però és massa complicat. El projecte està sent desenvolupat per Marco Sampellegrini, autor de The Simple Haskell Handbook i desenvolupador del sistema d'integració contínua Quad CI.

Rust 1.78 llançat. Llenguatge Borgo que combina els punts forts de Go i Rust

Borgo utilitza la mecanografia estàtica, tipus Go-like i la sintaxi Rust-like. Els punts i coma són opcionals al final de les línies del codi Borgo. El codi Borgo es compila en una representació Go que és totalment compatible amb els paquets Go existents. El codi del compilador està escrit en Rust i es distribueix sota la llicència ISC. utilitzeu fmt enum NetworkState { Càrrega, Fallada (int), Success (T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: "Hola món", duration: 0, } let state = NetworkState.Success(res) let msg = coincideix amb l'estat { NetworkState.Loading => “encara s'està carregant”, NetworkState.Failed(codi) => fmt.Sprintf(“He obtingut el codi d'error: %d”, codi), NetworkState.Success (res) => res.title, } fmt.Println(msg) }

Font: opennet.ru

Afegeix comentari