Rust 1.78 чыгарылды. Go жана Rust күчтүү жактарын айкалыштырган Borgo тили

Mozilla долбоору тарабынан негизделген, бирок азыр Rust Foundation көз карандысыз коммерциялык эмес уюмунун демөөрчүлүгү астында иштелип чыккан Rust 1.78 жалпы максаттуу программалоо тилинин релизи жарыяланды. Бул тил эстутумдун коопсуздугуна көңүл бурат жана таштанды жыйгычты жана иштөө убактысын колдонуудан качуу менен жогорку жумуш параллелизмине жетүү үчүн каражаттарды камсыз кылат (иштөө убактысы стандарттык китепкананы негизги инициализацияга жана тейлөөгө чейин кыскарган).

Rust'тун эстутум менен иштөө ыкмалары иштеп чыгуучуну көрсөткүчтөрдү манипуляциялоодо каталардан куткарат жана эстутумдун төмөнкү деңгээлдеги иштөөсүнөн улам келип чыккан көйгөйлөрдөн коргойт, мисалы, эстутумдун аймагына ал бошотулгандан кийин жетүү, нөл көрсөткүчтөрдү шилтемеден чыгаруу, буфердин ашып кетиши ж.б. Китепканаларды жайылтуу, курууну камсыз кылуу жана көз карандылыкты башкаруу үчүн долбоор Cargo пакетинин менеджерин иштеп чыгат. crates.io репозиторий китепканаларды хостинг үчүн колдоого алынат.

Эстутумдун коопсуздугу Rust программасында компиляция убагында маалымдама текшерүү, объектке ээлик кылуу, объекттин иштөө мөөнөттөрүн (кошумчаларын) эсепке алуу жана кодду аткаруу учурунда эстутумга жетүүнүн тууралыгын баалоо аркылуу камсыз кылынат. Rust ошондой эле бүтүн сандардын ашып кетишинен коргоону камсыз кылат, колдонуудан мурун өзгөрмө маанилерин милдеттүү түрдө инициализациялоону талап кылат, стандарттык китепканада каталарды жакшыраак иштетет, өзгөрүлгүс шилтемелер жана өзгөрмөлөр концепциясын демейки боюнча колдонот, логикалык каталарды азайтуу үчүн күчтүү статикалык терүүнү сунуштайт.

Негизги инновациялар:

  • "#[диагностикалык]" жаңы атрибут мейкиндиги сунушталды, ал компилятор чыгарган ката билдирүүлөрүнө таасир этүүчү каражатты камсыз кылат. Жаңы мейкиндикте биринчиси "#[diagnostic::on_unimlemented]" атрибуту, ал түрү үчүн ишке ашырылбаган белгини колдонуу керек болгон кырдаалда ыргытылган ката билдирүүлөрүн ыңгайлаштыруу үчүн колдонулушу мүмкүн. #[diagnostic::on_unimlemented( message = "My Message for `ImportantTrait<{A}>` `{Self}` үчүн аткарылган жок", label = "Менин энбелгисим", note = "Note 1", note = "Эскертүү 2" )] өзгөчөлүгү ImportantTrait {} fn use_my_trait(_: impl ImportantTrait ) {} fn main() { use_my_trait(String::new()); } ката[E32]: `ImportantTrait үчүн менин билдирүүм ` `String` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ Менин энбелгим | | | бул чакыруу менен киргизилген чек менен талап кылынат | = жардам: өзгөчөлүк `ImportantTrait ` `String` үчүн аткарылган эмес = эскертүү: Эскертүү 18 = Эскертүү: Эскертүү 12
  • Кооптуу функцияларга колдонулган алдын ала ырастоо текшерүүлөрү эми код түзүлгөнгө чейин кийинкиге жылдырылышы мүмкүн, бул текшерүүлөрдү стандарттык китепкананы "#[cfg(debug_assertions)]" режиминде куруунун зарылдыгы жок аткарууга мүмкүндүк берет. Текшерүүлөрдү баштоо үчүн, кодуңуздун сыноо же мүчүлүштүктөрдү оңдоо түзүмдөрү үчүн мүчүлүштүктөрдү аныктоо ырастоолорун иштетүү жетиштүү.
  • Көрсөткүчтөрдүн жана кесимдердин тегиздөөсүнө таасир этүүчү стандарттык китепканадагы функциялардын жүрүм-туруму азыр аткаруу убагында болжолдонууга болот жана киргизилген маалыматтарга көз каранды. Көрсөткүчтү тегиздөө үчүн офсетти эсептеген көрсөткүч көрсөткүчү::align_offset, эми операция ишке ашпай калса гана usize::MAX кайтарат. slice::align_to жана slice::align_to_mut экөө тең, тилимдерди тегизделген орто тилке жана түпнуска башталгыч жана аяктоо тилкелери менен өкүлчүлүккө айландырган функциялар эми дайыма эң чоң ортоңку бөлүктү кайтарып берет.
  • Туруктуу категорияга төмөндөгүлөр которулду:
    • impl &Stdin үчүн окуу
    • Кээ бир std::error::Катага байланыштуу ишке ашыруулар үчүн статикалык эмес (статикалык эмес) өмүр бою колдонууга уруксат бериңиз.
    • Impl ишке ашыруу ?Size маанисин пайдаланууга уруксат.
    • impl From io :: Error үчүн
  • 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 жана i686vp- азыр жок дегенде 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 архитектуралары үчүн колдонууда, u128 жана i128 түрлөрү менен байланышкан ABI өзгөртүлдү.
  • Жүк пакт башкаргычында кулпу файлдарынын 4-версиясы (lockfile v4) турукташтырылган.
  • Жүктүн акыркы маалыматтар колдонулушу жөнүндө маалымат менен турукташкан глобалдык кэш бар. Кэш $CARGO_HOME/.global-cache ичинде SQLite аркылуу жайгаштырылат жана индекске, куту файлына, код каталогуна, git клонуна жана git текшерүүгө акыркы өзгөртүүлөрдү чагылдыруу үчүн автоматтык түрдө жаңыртылып турат.

Кошумчалай кетсек, Borgo программалоо тили Go тилине караганда экспрессивдүү, бирок Rust тилине караганда азыраак татаал болууга аракет кылат. Borgo ар бир тилдин кемчиликтерин толуктап, Go жана Rust мыкты өзгөчөлүктөрүн айкалыштырат. Мисалы, Go жөнөкөй жана жөнөкөй, бирок коопсуздуктун өркүндөтүлгөн түрүн камсыз кылбайт. Rust тили коопсуз программалоо үчүн куралдар менен камсыз кылат, бирок өтө татаал. Долбоорду The Simple Haskell Handbook китебинин автору жана Quad CI үзгүлтүксүз интеграция системасын иштеп чыгуучу Марко Сампеллегрини иштеп чыгууда.

Rust 1.78 чыгарылды. Go жана Rust күчтүү жактарын айкалыштырган Borgo тили

Borgo статикалык терүүнү, Go-like түрлөрүн жана Rust-like синтаксисин колдонот. Борго кодундагы саптардын аягында үтүрлүү чекиттер милдеттүү эмес. 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", узактыгы: 0,} let state = NetworkState.Success(res) let msg = state of match { NetworkState.Loading => “дагы эле жүктөлүүдө”, NetworkState.Failed(код) => fmt.Sprintf(“Ката коду: %d”, код), NetworkState.Success (res) => res.title, } fmt.Println(msg) }

Source: opennet.ru

Комментарий кошуу