ИзданиС Π½Π° Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Rust 1.40

ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ΠΎ Ρ€Π΅Π»ΠΈΠ· Π½Π° систСмния Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Rust 1.40, основан ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Mozilla. Π’ΠΎΠ·ΠΈ Π΅Π·ΠΈΠΊ Π΅ фокусиран Π²ΡŠΡ€Ρ…Ρƒ бСзопасната Ρ€Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, осигурява Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈ прСдоставя срСдства Π·Π° достиганС Π½Π° висока паралСлност ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ, Π±Π΅Π· Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡŠΠ±ΠΈΡ€Π°Ρ‡ Π½Π° Π±ΠΎΠΊΠ»ΡƒΠΊ ΠΈ runtime.

Автоматичното ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π² Rust освобоТдава Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΎΡ‚ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°Π½Π΅ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ Π³ΠΎ Π·Π°Ρ‰ΠΈΡ‚Π°Π²Π° ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΏΡ€ΠΎΠΈΠ·Ρ‚ΠΈΡ‡Π°Ρ‰ΠΈ ΠΎΡ‚ ниско Π½ΠΈΠ²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Π·ΠΎΠ½Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° слСд Π½Π΅ΠΉΠ½ΠΎΡ‚ΠΎ освобоТдаванС, Ρ€Π°Π·ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½Π΅ Π½Π° Π½ΡƒΠ»Π΅Π²ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ извън Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ Ρ‚.Π½. Π—Π° разпространСниС Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, осигуряванС Π½Π° компилация ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° зависимости, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ сС Ρ€Π°Π·Π²ΠΈΠ²Π° Ρ‡Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π΅Π½ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€. Cargo, ΠΊΠΎΠΉΡ‚ΠΎ позволява Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° с Π΅Π΄Π½ΠΎ ΠΊΠ»ΠΈΠΊΠ²Π°Π½Π΅. Π—Π° хостванС Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ crates.io.

Основни нововъвСдСния:

  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½Π΅ Π½Π° структури (struct) ΠΈ изброявания (enum) с Π±Π»ΠΎΠΊΠ° Variant Ρ‡Ρ€Π΅Π· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Β«#[non_exhaustive]Β«, ΠΊΠΎΠΉΡ‚ΠΎ позволява Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅ позволява добавянСто Π½Π° Π½ΠΎΠ²ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ Π² обявСни структури ΠΈ изброявания. НапримСр, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ с ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎ обявСни ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Β«#[non_exhaustive]Β» Π·Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½Π΅ Π½Π° структури, Π² ΠΊΠΎΠΈΡ‚ΠΎ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС добавят Π½ΠΎΠ²ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π°. ДосСга Π² ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ситуация Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ Π΅ трябвало Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ частно обявлСниС Π½Π° ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΈ ΠΏΡ€ΠΈΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ към Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ списък с ΠΏΠΎΠ»Π΅Ρ‚Π°. Новият Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π° Ρ‚ΠΎΠ²Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈ позволява Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅ Π΄Π° сС добавят Π½ΠΎΠ²ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π° Π±Π΅Π· риск ΠΎΡ‚ Π½Π°Ρ€ΡƒΡˆΠ°Π²Π°Π½Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Π²Π΅Ρ‡Π΅ написан външСн ΠΊΠΎΠ΄. Π’ crate-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ съвпадСния Π½Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ Π² сСкцията Β«matchΒ» сС изисква явно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° маската Β«_ => {…}Β», ΠΎΠ±Ρ…Π²Π°Ρ‰Π°Ρ‰Π° възмоТни Π±ΡŠΠ΄Π΅Ρ‰ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π°, ΠΈΠ½Π°Ρ‡Π΅ ΠΏΡ€ΠΈ добавянС Π½Π° Π½ΠΎΠ²ΠΈ ΠΏΠΎΠ»Π΅Ρ‚Π° Ρ‰Π΅ сС ΠΈΠ·Π²Π΅ΠΆΠ΄Π° Π³Ρ€Π΅ΡˆΠΊΠ°.
  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΎ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° процСдурния макрос mac!() Π² контСкста Π½Π° Ρ‚ΠΈΠΏ. НапримСр, сСга ΠΌΠΎΠΆΠ΅ Π΄Π° сС пишС Β«type Foo = expand_to_type!(bar);Β», Π°ΠΊΠΎ Β«expand_to_typeΒ» Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅Π½ макрос.
  • Π’ Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ Β«extern { … }Β» Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΈ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΠ²Π½ΠΈ макроси, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ макроси Β«bang!()Β», Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

    macro_rules! make_item { ($name:ident) => { fn $name(); } }

    extern {
    make_item!(alpha);
    make_item!(beta);
    }

    extern Β«CΒ» {
    #[my_identity_macro]
    fn foo();
    }

  • Π’ макроситС Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Β«macro_rules!Β». Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Β«macro_rules!Β» Π΅ възмоТно ΠΊΠ°ΠΊΡ‚ΠΎ Π² макроси, наподобяващи Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Β«mac!()Β»), Ρ‚Π°ΠΊΠ° ΠΈ Π² макроси с Ρ„ΠΎΡ€ΠΌΠ° Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ (Β«#[mac]Β»).
  • Π’ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° Π·Π° съвпадСниС $m:meta Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ стойности Π½Π° изброявания Ρ‚ΠΎΠΊΠ΅Π½ΠΈ (Β«[TOKEN_STREAM]Β», Β«{TOKEN_STREAM}Β» ΠΈ Β«(TOKEN_STREAM)Β»), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

    macro_rules! accept_meta { ($m:meta) => {} }
    accept_meta!( my::path );
    accept_meta!( my::path = Β«litΒ» );
    accept_meta!( my::path ( a b c ) );
    accept_meta!( my::path [ a b c ] );
    accept_meta!( my::path { a b c } );

  • Π’ Ρ€Π΅ΠΆΠΈΠΌ Rust 2015 Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€Π°Π½ ΠΈΠ·Ρ…ΠΎΠ΄ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π·Π°Π΅ΠΌΠ°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ (borrow checker) с ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°Ρ‚Π° NLL (Non-Lexical Lifetimes). По-Ρ€Π°Π½ΠΎ прСдупрСТдСнията бяха Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΈ с Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° Π² Ρ€Π΅ΠΆΠΈΠΌ Rust 2018.
    Π‘Π»Π΅Π΄ Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π°Π½Π΅ Π½Π° промяната ΠΈ Π·Π° Ρ€Π΅ΠΆΠΈΠΌ Rust 2015 Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»Π½ΠΎ Π΄Π° сС ΠΎΡ‚ΡŠΡ€Π²Π°Ρ‚ Π΄Π° сС ΠΎΡ‚ΠΊΠ°ΠΆΠ°Ρ‚ ΠΎΡ‚ стария borrow checker.

    НапомнямС, Ρ‡Π΅ систСмата Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, основана Π½Π° новия ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° ΠΎΡ‚Ρ‡ΠΈΡ‚Π°Π½Π΅ Π½Π° ТизнСния Ρ†ΠΈΠΊΡŠΠ» Π½Π° Π·Π°Π΅Ρ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Π΄Π° сС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Ρ‚ някои ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ старият ΠΊΠΎΠ΄ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π΅ Π΅ рСгистрирал. Въй ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ…ΠΎΠ΄ΡŠΡ‚ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π·Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° повлияС Π½Π° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚Ρ‚Π° с ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ ΠΊΠΎΠ΄, вмСсто Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ бяха ΠΈΠ·Π΄Π°Π²Π°Π½ΠΈ прСдупрСТдСния.

  • ΠŸΡ€ΠΈΠ·Π½Π°ΠΊΡŠΡ‚ Β«constΒ», ΠΊΠΎΠΉΡ‚ΠΎ опрСдСля Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π² контСкста Π½Π° константи, Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ Π·Π° функцията is_power_of_two (Π·Π° Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΈ Ρ†Π΅Π»ΠΈ числа).
  • Нова сСрия API Π΅ ΠΏΡ€Π΅Π²Π΅Π΄Π΅Π½Π° Π² катСгорията стабилни, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ стабилизирани макроси todo!() ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value,
    Option::as_deref, Option::as_deref_mut, Option::flatten, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, {f32,f64}::from_be_bytes, {f32,f64}::from_le_bytes, ΠΈ {f32,f64}::from_ne_bytes.
  • Π’ пакСтния ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ cargo
    Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅ Π½Π° диска Π½Π° прСдупрСТдСнията ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π°. Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Β«cargo metadataΒ» Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° опцията Β«β€”filter-platformΒ» Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π² Π³Ρ€Π°Ρ„Π°Ρ‚Π° Π·Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° зависимоститС само Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΡƒΠΊΠ°Π·Π°Π½Π°Ρ‚Π° Ρ†Π΅Π»Π΅Π²Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°. Π”ΠΎΠ±Π°Π²Π΅Π½ Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π½Π° конфигурацията http.ssl-version Π·Π° опрСдСлянС Π½Π° допустимитС вСрсии Π½Π° TLS.
    Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° сСкцията Β«dev-dependenciesΒ» Π±Π΅Π· посочванС Π½Π° ΠΊΠ»ΡŽΡ‡Π° Β«versionΒ».
  • Π’ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° rustc Π΅ осигурСно Ρ‚Ρ€Π΅Ρ‚ΠΎ Π½ΠΈΠ²ΠΎ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Ρ†Π΅Π»Π΅Π²ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈ thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 ΠΈ mips64el-unknown-linux-muslabi64. Π’Ρ€Π΅Ρ‚ΠΎΡ‚ΠΎ Π½ΠΈΠ²ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° Π±Π°Π·ΠΎΠ²Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°, Π½ΠΎ Π±Π΅Π· Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ тСстванС ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΈ сборки.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster