Пуснат Rust 1.78. Език Borgo, който съчетава силните страни на Go и Rust

Езикът за програмиране с общо предназначение Rust 1.78, основан от проекта Mozilla, но сега разработен под егидата на независимата организация с нестопанска цел Rust Foundation, беше пуснат. Езикът се фокусира върху безопасността на паметта и предоставя средствата за постигане на висок паралелизъм на работата, като същевременно се избягва използването на събирач на отпадъци и време за изпълнение (времето за изпълнение е намалено до основна инициализация и поддръжка на стандартната библиотека).

Методите за обработка на паметта на Rust спасяват разработчика от грешки при манипулиране на указатели и предпазват от проблеми, които възникват поради обработка на паметта на ниско ниво, като достъп до област на паметта, след като тя е била освободена, дерефериране на нулеви указатели, препълване на буфер и т.н. За разпространение на библиотеки, предоставяне на компилации и управление на зависимости, проектът разработва мениджъра на пакети Cargo. Хранилището crates.io се поддържа за хостване на библиотеки.

Безопасността на паметта е осигурена в Rust по време на компилиране чрез проверка на референции, проследяване на собствеността на обекта, проследяване на продължителността на живот на обекта (обхвати) и оценка на коректността на достъпа до паметта по време на изпълнение на кода. Rust също осигурява защита срещу целочислени препълвания, изисква променливите да бъдат инициализирани преди употреба, обработва грешките по-добре в стандартната библиотека, прилага концепцията за неизменни препратки и променливи по подразбиране и предлага силно статично въвеждане за минимизиране на логическите грешки.

Основни иновации:

  • Предложено е ново пространство от имена на атрибути "#[diagnostic]", което предоставя средство за повлияване на съобщенията за грешки, генерирани от компилатора. Първият в новото пространство е атрибутът "#[diagnostic::on_unimplemented]", който може да се използва за персонализиране на съобщенията за грешка, хвърлени в ситуация, в която трябва да използвате характеристика, която не е внедрена за типа. #[diagnostic::on_unimplemented( message = "Моето съобщение за `ImportantTrait<{A}>` не е внедрено за `{Self}`", label = "Моят етикет", note = "Бележка 1", note = "Бележка 2" )] черта ImportantTrait {} fn use_my_trait(_: impl ImportantTrait ) {} fn main() { use_my_trait(String::new()); } грешка[E32]: Моето съобщение за „Важен черта ` не е имплементирано за `String` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ My Label | | | изисква се от граница, въведена от това извикване | = помощ: чертата `ImportantTrait ` не е внедрено за `Низ` = бележка: Бележка 18 = бележка: Бележка 12
  • Проверките преди заявяване, приложени към опасни функции, вече могат да бъдат отложени до генерирането на код, което позволява тези проверки да се извършват без необходимост от изграждане на стандартната библиотека в режим "#[cfg(debug_assertions)]". За да задействате проверки, вече е достатъчно да активирате твърденията за отстраняване на грешки за тестови или отстраняване на грешки компилации на вашия код.
  • Поведението на функциите в стандартната библиотека, които влияят на подравняването на указатели и срезове, вече е предвидимо по време на изпълнение и зависи от входните данни. Функцията pointer::align_offset, която изчислява отместването за подравняване на указателя, сега връща usize::MAX само ако операцията е неуспешна. И двете функции slice::align_to и slice::align_to_mut, които трансформират срезове в представяне с подравнен среден срез и оригиналните начален и краен срезове, сега винаги връщат най-голямата средна част.
  • Следните бяха прехвърлени в стабилна категория:
    • impl Четене за &Stdin
    • Позволете използването на нестатичен (нестатичен) живот за някои реализации, свързани с std::error::Error.
    • Impl изпълнение ?Разрешена е стойност на размера.
    • impl From за io::Грешка
  • Функцията Barrier::new() е стабилизирана за използване с атрибута "const" във всеки контекст вместо константи.
  • За целеви платформи x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm и i686-pc-windows-gnullvm сега изисква поне версия на Windows 10.
  • Третото ниво на поддръжка е внедрено за платформите wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf и loongarch64-unknown-linux-musl. Третото ниво включва основна поддръжка, но без автоматизирано тестване, публикуване на официални компилации или проверка дали кодът може да бъде компилиран.
  • Внедрено е второто ниво на поддръжка за целевата платформа Add wasm32-wasip1. Второто ниво на поддръжка включва гаранция за монтаж.
  • Платформата wasm32-wasi-preview1-threads е преименувана на wasm32-wasip1-threads.
  • Компилаторът е превключен да използва LLVM 18. Когато се използва LLVM 18 за x86-32 и x86-64 архитектури, ABI, свързан с типовете u128 и i128, е променен.
  • В Cargo pact manager версия 4 на заключващите файлове (lockfile v4) е стабилизирана.
  • Cargo има стабилизиран глобален кеш с информация за последното използване на данни. Кешът се хоства в $CARGO_HOME/.global-cache с помощта на SQLite и се актуализира автоматично, за да отрази най-новите промени в индекса, файла на кутията, кодовата директория, git clone и git checkout.

Освен това езикът за програмиране Borgo се опитва да бъде по-изразителен от езика Go, но по-малко сложен от езика Rust. Borgo съчетава най-добрите характеристики на Go и Rust, компенсирайки недостатъците на всеки език. Например Go е прост и ясен, но не предоставя разширени функции за безопасност. Езикът Rust предоставя инструменти за безопасно програмиране, но е прекалено сложен. Проектът се разработва от Марко Сампелегрини, автор на The Simple Haskell Handbook и разработчик на системата за непрекъсната интеграция Quad CI.

Пуснат Rust 1.78. Език Borgo, който съчетава силните страни на Go и Rust

Borgo използва статично писане, подобни на Go типове и подобен на Rust синтаксис. Точката и запетая не са задължителни в края на редовете в кода Borgo. Кодът на Borgo е компилиран в Go представяне, което е напълно съвместимо със съществуващите Go пакети. Кодът на компилатора е написан на Rust и се разпространява под лиценз ISC. използвайте fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: “Hello world”, duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.Loading => „все още се зарежда“, NetworkState.Failed(code) => fmt.Sprintf(„Получих код на грешка: %d“, код), NetworkState.Success (res) => res.title, } fmt.Println(msg) }

Източник: opennet.ru

Добавяне на нов коментар