Выпуск компилятора языка D 2.112

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Ρ€Π΅Π»ΠΈΠ· DMD 2.112, эталонного компилятора для языка D. Код компилятора распространяСтся ΠΏΠΎΠ΄ свободной Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ BSL (Boost Software License). ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ систСмы Linux, Windows, macOS ΠΈ FreeBSD.

Π―Π·Ρ‹ΠΊ D ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ синтаксисом, схоТим с C/C++, ΠΈ обСспСчиваСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языков. Π―Π·Ρ‹ΠΊ D Ρ‚Π°ΠΊΠΆΠ΅ заимствуСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ возмоТности динамичСских языков, ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ обСспСчСния бСзопасности. НапримСр, имССтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°: ассоциативных массивов, косвСнного опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ², автоматичСского управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, срСдств ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования, шаблонов, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² для мСтапрограммирования. ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ доступСн сборщик мусора. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° языкС D ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π° языкС C, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π° C++ ΠΈ Objective-C.

Π‘Ρ€Π΅Π΄ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² выпускС 2.112:

  • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ассоциативным массивом (Ρ…ΡΡˆΠΌΠ°ΠΏ) Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹.
  • Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² язык ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Β«-preview=bitfieldsΒ».
  • ВисящиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Β«elseΒ», ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π±Π΅Π· выдСлСния Π±Π»ΠΎΠΊΠ° Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ скобками, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ вмСсто прСдупрСТдСния: int i, j; if (i) if (j) return 1; else // Error: else is dangling, add { } after condition `if (i)` return 2;
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Β«-extIΒ» для указания Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡƒΡ‚Π΅ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ ΠΏΡƒΡ‚ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° (-I), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ указания Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ находится Π²Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ исполняСмого Ρ„Π°ΠΉΠ»Π°. Π’ Windows ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ пСрСопрСдСлСния dllimport установлСн Π½Π° любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΡ€ΠΎΠΌΠ΅ Β«noneΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ символы внСшнСго модуля с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DllImport.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ для C-Ρ„Π°ΠΉΠ»ΠΎΠ². Подобно Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ Β«__importΒ», ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Β«__moduleΒ» пСрСносит объявлСниС ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈΠ· языка D Π² язык C. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько C-Ρ„Π°ΠΉΠ»ΠΎΠ² с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, hello/utils.c ΠΈ world/utils.c), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π° Ρ„Π°ΠΉΠ»Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ import utils, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌ. β€”hello/utils.c: #if __IMPORTC__ __module hello.utils; #endif int sqr(int x) { return x * x; } β€”world/utils.c: #if __IMPORTC__ __module world.utils; #endif int max(int a, int b) { return a > b ? a : b; } β€”app.d: import hello.utils; import world.utils; static assert(sqr(3) == 9); static assert(max(3, 5) == 5);
  • ОбъявлСно ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†Π΅Π»Ρ‹Ρ… чисСл Π² присваивании Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Β«int op= floatΒ». Π­Ρ‚ΠΎ сдСлано для прСдотвращСния ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ошибок, ΠΊΠΎΠ³Π΄Π° присваиваниС Β«op=Β» нСявно ΠΎΠ±Ρ€Π΅Π·Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ выраТСния ΠΎΡ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния Π΄ΠΎ нуля. uint a; float b = 0.1; a += b; // Deprecation: `uint += float` is performing truncating conversion
  • Π’ runtime Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ нСсколько Π½ΠΎΠ²Ρ‹Ρ… ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ.
  • Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ ошибки связанныС с Π½Π΅Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π² ABI macOS 15.4.
  • Π‘-макросы Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Β«ImportCΒ»: import core.sys.posix.stdlib; import core.sys.posix.unistd; extern(C) int main() { int status, pid = vfork(); if (pid == 0) { // … return 0; } waitpid(pid, &status, 0); if (WIFEXITED(status)) { // … } return 0; }
  • Π’ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° функция Β«lazyCacheΒ», которая прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² с ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ cache, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚ элСмСнты Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π²ΠΎ врСмя Π΅Π³ΠΎ создания, lazyCache ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ†Π΅Π½ΠΊΡƒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° элСмСнты Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ явно Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Ρ‹. auto result = iota(-4, 5).map!(a => tuple(a, expensiveComputation(a)))().lazyCache(); // No computations performed at this point auto firstElement = result.front; // First element is now evaluated
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° обратная ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Β«getrandom()Β» Π½Π° старых вСрсиях Linux ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах.
  • Β«std.uniΒ» ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π° Π΄ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Unicode 17.
  • Π’ Β«std.uuidΒ» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° uuid v7 .
  • Новый API для Β«std.convΒ», Π³Π΄Π΅ появились Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«writeTextΒ», Β«writeWTextΒ» ΠΈ Β«writeDTextΒ».
  • Π’ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ dub Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° опция Β«-dest ΠΈ ΠΊΠ»ΡŽΡ‡ frameworks. β€”Π‘Ρ‹Π»ΠΎ: lflags Β«-frameworkΒ» Β«CocoaΒ» β€”Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ: frameworks Β«CocoaΒ» Β«OpenGLΒ»

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ряда интСрСсных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° языкС D:

  • Π’ области Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ³Ρ€ (GameDev) Π±Ρ‹Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ обновлСния: Π² dvn, Π΄Π²ΠΈΠΆΠΎΠΊ для создания Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π½ΠΎΠ²Π΅Π»Π», Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования. Π’ ΠΏΠΎΡ€Ρ‚ Π΄Π²ΠΈΠΆΠΊΠ° Godot Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° экспорта Π² Web. Π’ Steam Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π° ΠΈΠ³Ρ€Π° The Art of Reflection, рСализованная с использованиСм Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ D ΠΈ DirectX Π½Π° собствСнном Π΄Π²ΠΈΠΆΠΊΠ΅.
  • Π’ области Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ развиваСтся лСгковСсный ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Ρ„Π°ΠΉΠ±Π΅Ρ€ΠΎΠ² photon, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Π°Π» высокиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² тСстС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ TechEmpower ΠΈ Π²ΠΎΡˆΡ‘Π» Π² Ρ‚ΠΎΠΏ 10 Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΠΎ нСскольким тСстам (Plaintest, JSON). Π”Π°Π½Π½Ρ‹ΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ Π±Ρ‹Π» ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ Π² популярный Π²Π΅Π±-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Vibe.D, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ прироста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π° Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
  • ПослС анонса ΠΎ Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ сборщика мусора Π½Π° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ Dconf (Π²ΠΈΠ΄Π΅ΠΎ1, Π²ΠΈΠ΄Π΅ΠΎ2), Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ вошло Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ·. Новый GC Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² качСствС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ поддСрТиваСтся Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° x86_64 для OC Linux ΠΈ Windows. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ΡΡ Ρ€Π°Π±ΠΎΡ‚Π° Π½Π°Π΄ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ macOS ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€.

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

author avatar
Erik Peterson Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€
A ProHoster specialist with over seven years of experience in hosting, network infrastructure, and internet security. I participate in the development and maintenance of server solutions, VPN services, and client platforms. I specialize in stability, data protection, and service optimization for clients. I regularly monitor updates in industry standards and best practices.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ