<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>C++</title>
    <description>C++: материалы для изучения языка программирования, а также заметки о его интересных особенностях и развитии.</description>
    <link>https://tproger.ru/tag/cpp</link>
    <atom:link href="https://tproger.ru/tag/cpp/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 13:30:17 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>C++</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>SDL3 получила поддержку HarmonyOS и OpenHarmony</title>
      <link>https://tproger.ru/news/sdl3-poluchila-podderzhku-harmonyos-i-openharmony</link>
      <comments>https://tproger.ru/news/sdl3-poluchila-podderzhku-harmonyos-i-openharmony?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тимур Гайнутдинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/sdl3-poluchila-podderzhku-harmonyos-i-openharmony</guid>
      <description><![CDATA[<p>Кроссплатформенная библиотека SDL3 для игр, эмуляторов и мультимедийных приложений получила официальный порт для HarmonyOS и OpenHarmony.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/sdl3-poluchila-podderzhku-harmonyos-i-openharmony">SDL3 получила поддержку HarmonyOS и OpenHarmony</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 16 Sep 2026 10:40:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>15 сентября разработчики объединили в основную ветку SDL порт для HarmonyOS и OpenHarmony. SDL упрощает создание кроссплатформенных игр и мультимедийных приложений, поэтому обновление в первую очередь касается разработчиков на C и C++, которым нужен ещё один целевой набор платформ.</p><p>Автор порта протестировал его на реальном устройстве Huawei. По его словам, возможностей уже достаточно для выпуска полноценных игр и приложений, а коммерческие проекты на базе порта готовятся к релизу. В репозитории также появилась подробная инструкция по настройке среды, сборке проекта и отладке.</p><p>Порт пока закрывает не все сценарии. Самый заметный пробел связан с поддержкой джойстиков; также остаётся добавить поддержку пера и диалоговых окон.</p><p>Для инди-разработчиков и небольших команд это означает, что HarmonyOS и OpenHarmony становятся официальной целью сборки SDL3, а не отдельной веткой, которую приходится поддерживать самостоятельно. Работа над портом была профинансирована Outfit7.</p><h2>Источники</h2><ul><li><a href="https://github.com/libsdl-org/SDL/pull/16281">harmonyos: Port SDL3 to HarmonyOS/OpenHarmony. by icculus · Pull Request #16281 · libsdl-org/SDL · GitHub</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>libheif 1.23.4 закрыла уязвимости при чтении и декодировании HEIF</title>
      <link>https://tproger.ru/news/libheif-1-23-4-zakryla-uyazvimosti-pri-chtenii-i-dekodirovanii-hei</link>
      <comments>https://tproger.ru/news/libheif-1-23-4-zakryla-uyazvimosti-pri-chtenii-i-dekodirovanii-hei?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/libheif-1-23-4-zakryla-uyazvimosti-pri-chtenii-i-dekodirovanii-hei</guid>
      <description><![CDATA[<p>libheif 1.23.4 чинит квадратичный разбор iinf (23 МБ файла дают 1,5 ГБ памяти), рекурсию в проверке ссылок, вечный дедлок декодера и падение WebAssembly-сборки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/libheif-1-23-4-zakryla-uyazvimosti-pri-chtenii-i-dekodirovanii-hei">libheif 1.23.4 закрыла уязвимости при чтении и декодировании HEIF</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 07 Sep 2026 09:30:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вышла libheif 1.23.4, библиотека для чтения и записи HEIF и AVIF, которую используют для работы с изображениями. Выпуск <a href="https://github.com/strukturag/libheif/releases/tag/v1.23.4">закрывает шесть уязвимостей</a>, три из них с высокой оценкой, и объявлен ABI- и API-совместимой заменой 1.23.3: релиз сохраняет интерфейсы предыдущей версии. Это уже третий выпуск безопасности подряд после 1.23.2 и 1.23.3, все шесть проблем нашёл один исследователь под ником hackerman70000.</p><p>Уязвимости затрагивают разные этапы обработки файла. Для ошибки iinf/max_items достаточно чтения контейнера через heif_context_read_from_file, без декодирования изображения. Отдельная проблема возникает при обходе ссылок на этапе декодирования, а взаимная блокировка потоков связана с параллельным декодированием grid-тайлов. Поэтому проверка только загрузки метаданных не воспроизводит все три проблемы с высокой оценкой.</p><ul><li>Лимит max_items не применялся к дочерним боксам iinf: файл объявляет сколько угодно элементов, разбор становится квадратичным. Замер: 1,7, 6 и 23 секунды процессора на файлы 1, 2 и 4,1 МБ; файл 6,9 МБ держит 480 МБ памяти, 23 МБ файл 1,5 ГБ, и max_total_memory этого не видит. В сборке под Emscripten тот же счётчик задавал размер alloca на 64-килобайтном стеке WebAssembly: 16 000 элементов проходят, 17 000 роняют вызов, с 18 000 модуль ломается необратимо.</li><li>Неограниченная рекурсия при обходе ссылок могла исчерпать стек; исправленный обход на этапе декодирования использует явный список в куче.</li><li>Инверсия порядка блокировок при параллельном декодировании тайлов grid (включено по умолчанию) давала вечный дедлок; циклические графы ссылок отклоняются до начала декодирования.</li><li>Три проблемы средней важности: чтение за границей буфера в плагинах кодировщиков aom и x265, неисправимая утечка памяти в heif_track_get_next_raw_sequence_sample и чтение за границей в экспериментальном плагине WebCodecs.</li><li>Уязвимы версии от 1.16.0 до 1.23.3 включительно (в зависимости от проблемы), исправлено в 1.23.4; номера CVE будут присвоены позже.</li></ul><h2>Как одна неучтённая ветка отключила лимит на число элементов</h2><p>В <a href="https://github.com/strukturag/libheif/security/advisories/GHSA-vg7w-rp49-4fc2">отчёте</a> описана классическая ошибка перегруженного параметра. Функция Box::read_children принимает max_number, у которого два смысла: со значением-сентинелом READ_CHILDREN_ALL она читает до конца бокса и проверяет лимит max_items, а с любым другим числом читает ровно столько детей и ничего не проверяет. Box_iinf::parse передавала туда счётчик из самого файла, поэтому проверка, написанная специально для iinf, никогда не выполнялась.</p><p>Дальше цена растёт квадратично: для каждого элемента вызывается полный проход по списку ссылок iref без раннего выхода. Исследователь измерил на одном ядре 1,7, 6,0 и 23 секунды для файлов в 1,0, 2,0 и 4,1 МБ; абсолютные цифры различаются вдвое между машинами, но рост в 3–4 раза на каждое удвоение стабилен против 2 раз у линейного парсера. Всё это происходит внутри вызова, который затем возвращает heif_error_Ok, без коллбэка отмены и прогресса. В 1.23.4 лимит проверяется заранее, объявленное число ограничено оставшимся входом, а запросы к iref индексируются по идентификатору элемента: на файле с 1 000 элементов и 160 000 ссылок dimg время чтения упало с 1,83 до 0,26 секунды.</p><p>Сборка под WebAssembly страдала отдельно. Два вспомогательных метода в Emscripten-обвязке выделяли массив идентификаторов через alloca с размером из того же счётчика. Скрипт сборки не задаёт ни размер стека, ни проверку его переполнения, поэтому использовался стек по умолчанию в 64 КБ: 16 000 элементов занимают 64 000 байт и декодируются, 17 000 прерывают вызов, а с 18 000 переполнение уходит в сегмент статических данных и экземпляр модуля перестаёт работать до перезагрузки страницы. Хелпер вызывается при каждом HeifDecoder.decode().</p><h2>Рекурсия и дедлок: две другие высокие уязвимости</h2><p><a href="https://github.com/strukturag/libheif/security/advisories/GHSA-xrp2-63fq-jm8q">Вторая проблема</a>: проверка на циклы ссылок между производными элементами была рекурсивной, и длинная цепочка исчерпывала стек. Без лимита на число элементов глубина ничем не ограничена. Исправленный обход на этапе декодирования использует явный рабочий список в куче вместо рекурсии.</p><p><a href="https://github.com/strukturag/libheif/security/advisories/GHSA-prgh-72vc-3xmc">Третья проблема</a> затрагивает серверы с параллельным декодированием: параллельное декодирование тайлов grid включено по умолчанию, а ImageItem::decode_image() держит нерекурсивный мьютекс элемента на время вложенных декодирований. Два рабочих потока, чьи элементы ссылаются друг на друга, берут два мьютекса в противоположном порядке и зависают навсегда; процесс не падает и не освобождает ресурсы. Исправление отклоняет циклические графы декодирования, включая рёбра dimg и alpha auxl, до старта.</p><h2>Кому обновляться в первую очередь</h2><p>Всем, кто принимает HEIC и AVIF от пользователей: это серверные конвертеры, бэкенды фотохостингов и мессенджеров, CI-пайплайны с ImageMagick, а также веб-приложения, которые декодируют HEIC на клиенте через libheif-js или собственную Emscripten-сборку. Для последних важно, что обрушение WebAssembly-модуля необратимо в рамках страницы. Мейнтейнеры советуют обновиться всем пользователям; в дистрибутивах смотрите на пакет libheif1 или libheif в вашем менеджере. Уязвимость средней важности в плагине WebCodecs касается только Emscripten-сборок с WITH_WEBCODECS=ON, по умолчанию выключенной опции, и только без libde265.</p><p>Отдельный отчёт о расходе ресурсов опубликован для Go-библиотеки Excelize: файл на 3 КБ заставляет библиотеку выполнять произвольное число итераций хеширования, и патча пока нет (исправление в сохранённом отчёте не указано). Из недавних выпусков безопасности того же масштаба мы разбирали <a href="https://tproger.ru/news/curl-8-22-0-zakryl-devyat-uyazvimostej-i-otkazalsya-ot-tls-srp">curl 8.22.0 с девятью уязвимостями</a> и <a href="https://tproger.ru/news/postgres-pro-zakryl-28-uyazvimostej-postgresql-vneocherednymi-reli">внеочередные релизы PostgreSQL от Postgres Pro</a>.</p><p>Источники: <a href="https://github.com/strukturag/libheif/releases/tag/v1.23.4">libheif v1.23.4 – security maintenance, release notes</a>, <a href="https://github.com/strukturag/libheif/security/advisories/GHSA-vg7w-rp49-4fc2">GHSA-vg7w-rp49-4fc2: The max_items security limit is not enforced for iinf child boxes</a>, <a href="https://github.com/strukturag/libheif/security/advisories/GHSA-xrp2-63fq-jm8q">GHSA-xrp2-63fq-jm8q: Unbounded iref entry list and unbounded recursion</a>, <a href="https://github.com/strukturag/libheif/security/advisories/GHSA-prgh-72vc-3xmc">GHSA-prgh-72vc-3xmc: Lock-order inversion in parallel grid tile decoding</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Void в C: четыре значения ключевого слова</title>
      <link>https://tproger.ru/articles/void-v-c-chetyre-znacheniya-klyuchevogo-slova</link>
      <comments>https://tproger.ru/articles/void-v-c-chetyre-znacheniya-klyuchevogo-slova?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/void-v-c-chetyre-znacheniya-klyuchevogo-slova</guid>
      <description><![CDATA[<p>Разбираем, зачем в C и C++ void означает «ничего» четырьмя разными способами: возврат, параметры, указатели и приведение. С примерами и историей от автора Bourne Shell.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/void-v-c-chetyre-znacheniya-klyuchevogo-slova">Void в C: четыре значения ключевого слова</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 22 Aug 2026 08:51:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>В C всего 32 ключевых слова, и void кажется одним из самых простых: оно обозначает «ничего». Но если присмотреться, это «ничего» играет в языке как минимум четыре разные роли. Более того, именно void, а не печально известный static, можно считать самым «перегруженным» ключевым словом в C: у static три смысла, а у void — четыре.</p><p>Разбираем, откуда взялось это слово — его придумал создатель Bourne Shell Стивен Борн — и зачем оно нужно в современном C и C++.</p><p>— В C и C++ ключевое слово void используется четырьмя способами: возвращаемый тип, отсутствие параметров, указатель на неизвестный тип и явное приведение к «ничему».</p><p>— Слово void предложил Стивен Борн, автор Bourne Shell; до этого функция без возвращаемого значения просто не указывала тип.</p><p>— f(void) и f() — разные вещи в C: первая форма явно говорит «параметров нет».</p><p>— void* — универсальный указатель, но разыменовывать его нельзя.</p><p>— Приведение к void помогает подавить предупреждения о неиспользуемом возвращаемом значении или параметре.</p><h2>Краткая история: как появилось void</h2><p>В самой ранней версии C, так называемом K&amp;R-диалекте, функция без возвращаемого значения писалась без типа. Если возвращаемый тип не указан, компилятор считал, что функция возвращает int. Параметры тоже можно было описывать отдельно от списка аргументов — прямо как в старых учебниках:</p><p>Такой код сегодня выглядит экзотично, но именно так писали до появления прототипов функций. При этом компилятор всё равно генерировал машинную команду возврата и передавал вызывающей стороне какое-то мусорное значение. Хотя вызывающий не ждал результата, это было неэффективно и неочевидно.</p><p>Это раздражало Стивена Борна — да, того самого, который создал Bourne Shell. Он пожаловался Деннису Ритчи, и Ритчи увидел выгоду: если явно сказать, что функция ничего не возвращает, можно сэкономить одну машинную инструкцию. Так в C появилось слово void.</p><p>Позже void обросло новыми смыслами и перекочевало в C++, C#, Java, D и Swift — хотя Swift предпочитает писать его с заглавной буквы: Void.</p><h2>Четыре смысла void</h2><h3>1. Функция не возвращает значение</h3><p>Самый известный смысл. Вместо того чтобы молча возвращать int, функция явно объявляет: «я работаю ради побочного эффекта».</p><p>В современном C и C++ большинство функций без возвращаемого значения пишутся именно так. Это делает намерения автора очевидными и помогает компилятору ловить ошибки: если вы случайно попытаетесь использовать результат void-функции, получите ошибку компиляции.</p><h3>2. Явное отсутствие параметров: f(void)</h3><p>В C++ пустые скобки f() означают «функция не принимает параметров». В K&amp;R C те же пустые скобки означали лишь «это функция», без всякой информации о параметрах. Чтобы сохранить совместимость со старым кодом и одновременно ввести прототипы, в C придумали запись f(void):</p><p>Разница тонкая, но важная. Если в C объявить void foo();, а потом вызвать foo(42), компилятор не проверит количество и типы аргументов — это старая K&amp;R-форма. Запись void foo(void); защищает от таких ошибок.</p><p><b>Совет:</b><br />Всегда пишите int main(void) в C. Форма void main() не соответствует стандарту и может ломать работу runtime.</p><h3>3. Указатель на неизвестный тип: void*</h3><p>Объект типа void создать нельзя, но указатель на void — можно. void* — это универсальный указатель: он может хранить адрес данных любого типа. В отличие от char*, который в K&amp;R C выполнял ту же роль, void* чётко говорит: «тип здесь не важен».</p><p>Практически все функции динамического выделения памяти — malloc, calloc, realloc — возвращают void*. В C это удобно: компилятор неявно приводит void* к целевому типу. В C++ такой неявный каст запрещён, поэтому там пишут int* arr = (int*)malloc(...) или, что лучше, используют new.</p><h3>4. Приведение к void</h3><p>Последний смысл — самый неочевидный. Приведение выражения к void означает: «я намеренно игнорирую результат». Это полезно в двух случаях.</p><p>Первый: отбрасывание возвращаемого значения функции. Например, printf возвращает число напечатанных символов, но обычно оно не нужно:</p><p>Такая запись читается как «вызываем функцию только ради побочного эффекта». Большинство компиляторов и так не ругаются на неиспользованный результат printf, но для функций с атрибутом [[nodiscard]] приведение к void — единственный легальный способ проигнорировать результат.</p><p>Второй случай — неиспользуемый параметр функции. В callback-интерфейсах часто приходится принимать аргументы, которые конкретная реализация не использует:</p><p>В C23 можно просто опустить имя параметра, а в C++ — всегда можно было. Но приведение к void работает в любом стандарте и явно показывает намерение.</p><h2>Практика: что проверить в своём коде</h2><ul><li>В C пишите int main(void), а не void main().</li><li>Для функций без параметров используйте f(void), особенно в заголовочных файлах.</li><li>Не разыменовывайте void* — сначала приведите указатель к конкретному типу.</li><li>Если игнорируете возвращаемое значение, добавьте (void) — это помогает при включённых предупреждениях.</li><li>Не пытайтесь объявить переменную типа void: объект «ничего» в C не существует.</li></ul><blockquote>All uses of void are valid in both C and C++. If that weren't the case, I would have said so.</blockquote><h2>Выводы</h2><p>void — не просто синтаксический сахар для «пустоты». Это ключевое слово, которое помогает компилятору различать четыре разных ситуации: отсутствие результата, отсутствие параметров, неизвестный тип данных и намеренное игнорирование значения.</p><p>Исторически void появилось из инженерной прагматики: сэкономить одну инструкцию возврата и сделать код понятнее. Сегодня оно остаётся незаменимым инструментом — особенно если вы пишете на C, работаете с системными библиотеками или объясняете студентам, почему void main() — не лучшая идея.</p><p>Источник: Paul J. Lucas, <a href="https://dev.to/pauljlucas/into-the-void-4h69">«Into the Void»</a>, Dev.to. Дополнительный справочник по void — <a href="https://en.cppreference.com/w/c/language/void">cppreference.com</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как я писал ОС, но не под x86, а под RISC-V</title>
      <link>https://tproger.ru/articles/kak-ya-pisal-os-no-ne-pod-x86-a-pod-risc-v</link>
      <comments>https://tproger.ru/articles/kak-ya-pisal-os-no-ne-pod-x86-a-pod-risc-v?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[lmemq]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ya-pisal-os-no-ne-pod-x86-a-pod-risc-v</guid>
      <description><![CDATA[<p>Решил разобраться, как устроены операционные системы изнутри, и написал свою простую ОС под RISC-V. Делюсь написанием многопоточности, сохранением регистров процессора и другими интересными кейсами</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ya-pisal-os-no-ne-pod-x86-a-pod-risc-v">Как я писал ОС, но не под x86, а под RISC-V</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Язык ассемблера]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 23 Jul 2026 13:21:29 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Введение и дисклеймер</h3><p>Сразу скажу - я не считаю себя втором Терри Дэвисом и тем более не хочу делать аналог Виндовс. Изначально я все это затеял только ради прикола и изучения ассемблера.</p><p>А, и если что - мне 14, но я не против любой критики. И да, я тоже как и большинство местами использовал ИИ. Я не сидел читал мануалы часами, просто гуглил или просил нейронку пояснить.</p><h3>Так а в чем же проблема x86_64?</h3><p>Я так скажу - я пробовал писать под эту архитектуру. Мне не понравилось, всякие режимы (которые за меня правда переключал загрузчик), да и местный ассемблер мне было лень изучать. Просто захотел писать под более новую архитектуру.</p><p>Не буду говорить, что RISC-V лучшая, но я просто выбрал ее. Прикол в том, что инструкции короткие, да и в целом достаточно перспективно. Хотя и тут были проблемы.</p><h3>Был драйвер, стала ОС</h3><p>Я ничего с нуля не писал.Все началось с пыток ИИ, когда я пытался выдавить из него то обращение по конкретному адресу для доступа к графике, то опрос портов, то еще что-то такое. Мне стало лень и я пошел искать что-то плюс-минус готовое. И я нашел его - <a href="https://github.com/CityAceE/qemu-ramfb-riscv64-driver">ramfb</a>. По сути я получил готовый указатель на фреймбуфер для вывода на экран… И все. Но и на этом большое спасибо авторам драйвера. Дальше началась моя ОС.</p><h3>А где хранить данные?</h3><p>А тут первая проблема - как таковой кучи у меня еще нету. Есть стек, который за меня выделил автор драйвера. Есть всякие глобальные переменные. Но что если мне нужно много памяти (например, под картинки) и я не знаю точный размер? И в добавок, кто вообще рисует напрямую на экран? Тут нужен некий массив пикселей, который будет лежать в памяти, а по нашей команде быстро перенесется на экран (называется backbuffer).</p><p>Под кучу взял 64 мб из памяти, так как Qemu, где запускается моя ОС, выделяет ей аж 128 мб, часть уже занята ядром и стеком, но бОльшая часть пустует. Сделал простенький список свободных и занятых блоков памяти.</p><p>Это когда ты делишь память на куски, каждый помечаешь как занятый или свободный. Нужно мало памяти - откусываем от большого куска блок. Блок освободился, а рядом есть другой свободный блок - соединяем в один большой.Сразу же добавил функцию, чтобы узнать сколько памяти занято. Сейчас, например, занято около 3-4 мб. Ну это учитывая, что backbuffer и занял почти 3.5 мб.</p><p>В оперативной памяти что-то типа</p><h3>Такая разная многопоточность</h3><p>Как я думаю большинство знает, если у процессора одно ядро, одновременно на нем может выполняться только одна задача-поток. Но мы же может останавливать задачу, запускать другую, останавливать, запускать еще другую и так много раз в секунду. Тогда будет казаться, будто бы у нас несколько задач выполняются одновременно.</p><h4>Многопоточность кооперативная</h4><p>Так мы можем сказать потокам, чтобы если один из них решит, что стоит сделать паузу, сам вызвал yield() и отдал процессор другому потоку. И я это сделал. Все что нужно было - сохранить s-регистры процессора (те, в которых лежат всякие важные значения), указатель на личный стек потока (размер стека задается при создании) и указатель на “дорогу назад” ra. То есть yield() сохраняет эту информацию потока А, затем вместо нее загружает информацию потока Б. И так по кругу.</p><p>Кстати, стеки самих потоков я выделял в той самой куче. Просто брал блок на пару кб и говорил потоку: “Это твой стек”.</p><p>Но у такого концепта есть проблема - зависает один поток, остальные перестают выполняться. Да и в целом писать yield() каждый раз сложно.</p><h3>Многопоточность вытесняющая</h3><p>Поэтому я и решил переписать все на вытеснение. Для начала я сделал так - каждые 100к тиков процессора сохраняются все регистры и пинается функция обработки прерываний. Таймер, по которому будет работать многопоточность - это тоже прерывание. Так же эта функция ловит ошибки по типу kernel panic. Это было сложнее - так как потоки не добровольно отдают процессор, приходится сохранять вообще все 32 регистра. Но криво-косо я написал это и функцию sleep(), во время которой функция простаивает, ее никто не трогает.</p><p>А тут еще и ИИ начал выдавать бред, пока я тестировал у меня… начинал выполняться основной код, все было хорошо, а потоки - нет. Я сам не вижу ошибку, ИИ тоже. Он то предложит заменить какую-то часть функции, то еще что-то такое. Наконец я вспомнил про замечательную штуку - gdb. Запустил, посмотрел… Оказалось так - цикл отрисовки экрана был слишком долгим, во время него вызывалось переключение потоков, а их еще не было кроме главного. В итоге я подумал что смысла создавать потоки в конце, после отрисовки, нет, и перенес их в самое начало. Удивительно, но все заработало.</p><h3>Немного про режимы</h3><p>Как выяснилось, в RISC-V есть 3 режима (точнее 4, включая гипервизор, но тут он мне точно не нужен) - M-mode с полными привелегиями, S-mode для ядра ОС (я думал что и мое его использует), ну и U-mode для пользователей, но до этого мои ручки еще не дошли.</p><p>Ну и по пути я случайно осознал, что мое ядро выполняется аж в М-режиме:</p><p>Вызываю я ecall из потока. Смотрю - kernel panic. В логах какой-то код “11”. Оказалось, это и есть ecall - в M-mode он 11, а в S-mode (в котором, как я думал, работало ядро, и который я пытался выловить) это 9. Ну когда я нашел, уже быстро исправил.</p><h3>Визуальчик</h3><p>Но в это время на сам экран эмулятора Qemu… Ничего и не выводилось. Совсем. Просто белый экран. Хотелось красоты.</p><p>Тогда я вспомнил, что день назад прикрутил qoi.h к моему коду. QOI - формат изображений. Выбрал я его, так как декодер легкий и его удобно использовать в любой ОС, где есть базовые функции.</p><p>Я аккуратно, разумеется, согласно лицензии, взял из pop os, которой когда-то пользовался, картинку для фона. Конвертировал ее в .qoi, а так как моя ос еще не умела читать с диска, перевел картинку в заголовочный файл .h. Весит правда много, но влезает.</p><p>Дальше я нашел шрифт (Liberation Mono от Red Hat), перегнал и его в .h. Честно, визуал меня не сильно интересовал, поэтому быстро попросил ИИ переделать функции вывода в консоль в функции вывода на экран. Проверил, просмотрел что и как сделано, получилось нормально для старта. Правда пока что в графической консоли нет нормальной перемотки и много чего другого.</p><h3>Вывод</h3><p>Конечно, еще нету даже ввода с клавиатуры, мыши, файловой системы (даже простой). Но я считаю, что вышло неплохо, пусть и далеко от уровня реальной ОС типа Линукса. Понятно, что код не очень-то красивый, достаточно простой. Статью я выкладываю больше просто чтобы разобраться самому в том, что я написал.</p><p>Если я не забью на код, хотел бы написать еще и MMU и переход в U-mode.</p><p>Для тех кому очень интересно - можете глянуть исходный код <a href="https://github.com/lmemq/mqos-rv">mqos</a>, там же будут инструкции по запуску.</p>]]></content:encoded>
    </item>
    <item>
      <title>Denwer SE: Возрождение легендарного локального веб-сервера на современном стеке</title>
      <link>https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so</link>
      <comments>https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Тишов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so</guid>
      <description><![CDATA[<p>Помните диск Z:, иконку джентльмена и магию Run.exe? Денвер вернулся. Denwer SE: Python вместо Perl, HTTPS без красных экранов, свежий PHP и портативность. И да, он всё ещё помещается на флешку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/denwer-se-vozrozhdenie-legendarnogo-lokalnogo-veb-servera-na-so">Denwer SE: Возрождение легендарного локального веб-сервера на современном стеке</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Для продвинутых]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[CMS]]></category>
      <category><![CDATA[Laravel]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 May 2026 10:11:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы начинали веб-разработку в середине 2000-х, то наверняка помните Denwer — «джентльменский набор веб-разработчика». Иконка в виде человека в шляпе, виртуальный диск Z:, папка <i>home/localhost/www</i> — всё это было ритуалом, который упрощал жизнь тысячам разработчиков. Но оригинальный Denwer безнадёжно устарел: Perl-скрипты, 32-битные сборки, поддержка только древних версий PHP и MySQL. Ему на смену пришли громоздкие комбайны вроде Open Server или сложные для новичков Docker-контейнеры.</p><p>Однако недавно проект получил второе дыхание. Разработчик Александр Тишов (Amro) — создатель <a href="https://seditio.org" rel="nofollow">CMS Seditio</a> и основатель веб-студии <a href="https://avego.org" rel="nofollow">«Авего»</a>  — выпустил <a href="https://seditio.org/dev/denwer-se-lokalnyj-veb-stek-dlya-windows-apache-php-mysql-mariadb" rel="nofollow">Denwer SE (Second Edition)</a>. Это не просто обновление, а полный реинжиниринг с сохранением классической философии: портативность, скорость работы и привычная структура каталогов.</p><p>В этой статье разберём, что изменилось под капотом, почему панель управления переехала с Perl на Python, как работает автоматический HTTPS с собственным корневым сертификатом и зачем нужен зоопарк версий PHP от 5.6 до 8.5.</p><h2>Краткий экскурс: от Denwer 3 до Denwer SE</h2><p>Оригинальный Denwer (сокращение от Джентельменский Набор Веб-разработчика) появился в начале 2000-х. Он представлял собой связку Apache + PHP + MySQL, упакованную в самораспаковывающийся архив. Главные фишки:</p><ul><li>Виртуальный диск (по умолчанию Z:), который монтировался через subst.</li><li>Автоматическое создание виртуальных хостов по именам папок в home.</li><li>Консольные exe-файлы (Run, Stop, Restart) без графического окна.</li></ul><p>Проблемы оригинала:</p><ul><li>Управление на Perl — медленно, тяжело поддерживать в Windows.</li><li>Только 32-битные компоненты.</li><li>Невозможно быстро переключать версии PHP или БД.</li><li>Отсутствие нормального HTTPS (только самоподписанные сертификаты с ошибками в браузере).</li><li>Поддержка прекратилась в 2016 году.</li></ul><p>Denwer SE решает все эти проблемы, оставаясь при этом таким же портативным — достаточно скопировать папку на флешку или в облачный каталог.</p><h2>Архитектура: Python вместо Perl</h2><p>Denwer SE — панель управления написана на Python и скомпилирована в один EXE-файл (через PyInstaller).</p><p>Внутри служебной папки <b>denwer\</b> лежат:</p><ul><li>DLL-версия Python — интерпретатор, который использует основной исполняемый файл.</li><li>Скомпилированные модули .pyd — в том числе GUI на базе Tcl/Tk для оконного интерфейса и системного трея.</li><li>Минимальный набор библиотек для управления службами, правки hosts и генерации сертификатов.</li></ul><p>Это даёт несколько преимуществ:</p><ul><li>Портативность — панель ищет соседние папки home и usr, поэтому каталог со стеком можно переносить куда угодно без переустановки.</li><li>Скорость — Python-скрипты запускаются быстрее, чем Perl, особенно на холодном старте.</li><li>Читаемость кода — разработчику проще поддерживать и расширять функционал.</li></ul><h2>Полный переход на x64</h2><p>Оригинальный Denwer навсегда остался 32-битным, что в современных реалиях просто неприемлемо. Denwer SE собирается исключительно под x64:</p><ul><li>Apache (версия 2.4.x) — 64-битный.</li><li>Все модули PHP (от 5.6 до 8.5) — Thread Safe x64.</li><li>MySQL / MariaDB — 64-битные сборки.</li></ul><p>Системные требования — Windows 7/8/10/11 (x64). Для работы компонентов потребуются Microsoft Visual C++ Redistributable (VC11, VC12, VC14, VC15). Разработчик положил установщики этих пакетов в папку <b>vcredist\</b> — при необходимости можно доустановить вручную.</p><h2>Структура каталогов: преемственность и гибкость</h2><p>Denwer SE сохранил классическую структуру, чтобы старые пользователи не ломали голову:</p><p>Главный конфиг — usr\configuration.txt. В нём задаются пути без жёсткой привязки к букве диска, например:</p><p>При старте панель монтирует виртуальный диск (по умолчанию Z:) и динамически подставляет путь через переменную <b>subst_drive</b>.</p><h2>Управление версиями PHP и БД без танцев с бубном</h2><p>В Denwer SE встроен менеджер версий. Вы просто выбираете из выпадающего списка нужную версию PHP (например, 8.3 или 5.6) — панель сама правит конфигурацию Apache.</p><p>Как это работает под капотом:</p><p>В папке usr/local/apache/php лежат подкаталоги php5.6, php7.4, php8.3 и т.д..</p><p>В каждом из них есть файл php-denwer.conf— шаблон для подключения модуля к Apache. При выборе версии этот файл копируется в <b>conf/extra/httpd-denwer.conf</b>, который затем включается в основной httpd.conf.</p><p>Если вы хотите добавить свою сборку PHP (например, PHP 8.4-rc), достаточно:</p><ul><li>Распаковать x64 Thread Safe версию в отдельный каталог внутри php\.</li><li>Создать php-denwer.conf по образцу.</li><li>Убедиться, что все DLL от VC++ установлены.</li></ul><p>Аналогично для баз данных: переключение между MySQL 5.7 и MariaDB 11.8 происходит через тот же интерфейс. В каталоге СУБД может лежать файл <b>db-denwer.conf</b>, который при старте копируется в <b>my.ini</b>.</p><h2>HTTPS, который не бесит: локальный Root CA</h2><p>Самое болезненное место при локальной разработке это самоподписанные сертификаты. Браузеры постоянно ругаются, приходится кликать «Принять риск». Для командной разработки это вообще катастрофа: каждый участник должен сгенерировать свой сертификат и добавить в исключения.</p><p>Denwer SE решает проблему элегантно — он создаёт собственный корневой центр сертификации (CA) и подписывает им сертификаты для всех ваших локальных доменов.</p><p>Как это работает:</p><ol><li>При первом запуске (если найден OpenSSL) панель генерирует ключи denwer-ca.key и сертификат denwer-ca.crt в папку usr/local/apache/conf/cert/denwer-ca/.</li><li>Для каждого виртуального хоста (папки в home/) автоматически создаётся сертификат в conf/cert/&lt;domain&gt;/.</li><li>Все сертификаты хостов подписаны локальным CA.</li></ol><p>Чтобы браузер доверял им, нужно один раз установить <b>denwer-ca.crt</b> в хранилище «Доверенные корневые центры сертификации» Windows. Для этого в панели есть специальная кнопка (требует прав администратора).</p><p>После этого любые HTTPS-запросы к локальным хостам работают без единого предупреждения.</p><h2>Удобства для разработчика (DX)</h2><p>В версии 1.2.4 добавили несколько фич, которые экономят время каждый день:</p><ul><li>Лог с таймштампами — каждая строка в окне панели имеет префикс [чч:мм:сс]. Теперь видно, сколько секунд сервер поднимается и где возможны задержки.</li><li>Прямой доступ к php.ini и my.cnf — рядом со списками версий появились кнопки, открывающие конфигурацию именно активной версии.</li><li>Автоматическое ведение hosts — панель в реальном времени сканирует home/, находит новые домены и прописывает их в C:\Windows\System32\drivers\etc\hosts. Журнал добавляемых записей сохраняется в usr\AddedHosts.txt. При остановке стека лишние строки удаляются.</li><li>Для смены версии PHP или базы данных панель требует полной остановки всех служб. Вы нажимаете «Стоп», меняете версию в списке, затем «Старт» — и стек поднимается уже с новыми настройками. Автоматический перезапуск без вашего участия работает только для Apache: когда вы добавляете новый домен в папку home/, панель сама переписывает vhosts.conf и перезапускает веб-сервер, не трогая БД.</li></ul><h2>Почему не Open Server или Docker?</h2><p>Этот вопрос закономерно возникает у всех, кто видит очередной локальный веб-сервер. Ведь есть уже давно Open Server Panel, Laragon, XAMPP, а для продвинутых — Docker. Зачем ещё один?</p><p><b>Open Server</b> — мощный и удобный комбайн с десятками версий PHP и настройками «на века». Но он разворачивается в системе не портативно: создаёт папки в ProgramData, пишет в реестр, а запуск может занимать 5–10 секунд. Denwer SE, напротив, полностью переносим: скопировал папку на флешку или в облачный каталог — и всё работает. Запуск стека — буквально 1–2 секунды, что критично, когда вы десятки раз за день перезапускаете сервер для тестов.</p><p><b>Docker</b> — индустриальный стандарт для изоляции и воспроизводимости окружений. Но для локальной разработки простого сайта он часто избыточен. Вам нужно разобраться в образах, контейнерах, пробросе портов, volume’ах и docker-compose.yml. А в Denwer SE вы просто создали папку в home/ — и готово. Никакой работы с командной строкой, никакого потребления гигабайт ОЗУ на фоновую службу Docker Desktop.</p><p><b>Laragon</b> — быстрый, портативный, поддерживает не только PHP, но и Node.js, Python, Go. Но он ориентирован на современные фреймворки, особенно Laravel. Denwer SE же сделан для тех, кто вырос на классическом Денвере: виртуальный диск Z:, папка home/имя_домена/www, минимум настроек. Не нужно переучиваться — просто распаковал и работаешь как 10 лет назад, но с новыми версиями PHP и HTTPS.</p><h2>Как начать пользоваться Denwer SE</h2><ol><li>Скачать архив с <a href="https://seditio.org/dev/denwer-se-lokalnyj-veb-stek-dlya-windows-apache-php-mysql-mariadb" rel="nofollow">официального сайта автора</a>.</li><li>Распаковать в любое место, например C:\web\DenwerSE\.</li><li>Запустить DenwerSE.exe — если нет прав администратора, попросит их для монтирования диска и правки hosts.</li><li>Нажать «Запустить» — появится виртуальный диск Z:, а в системном трее иконка.</li><li>Создать папку сайта — например, home\myproject.local и положить туда index.php.</li><li>Открыть в браузере http://myproject.local/ (или https://myproject.local/). HTTPS будет работать сразу после установки корневого сертификата (кнопка в панели).</li></ol><p>По умолчанию пароль к MySQL/MariaDB — пустая строка (пользователь <b>root</b>). При желании его можно сменить через phpMyAdmin.</p><h2>Заключение</h2><p>Denwer SE — это не просто ностальгический проект. Это действительно современный инструмент, который доказывает, что концепция «локального сервера в одну папку» всё ещё актуальна. Отказ от Perl в пользу Python, менеджер версий PHP/БД, нормальный HTTPS, портативность и мгновенный запуск — всё это делает его отличным выбором для быстрого прототипирования, тестирования легаси-кода или обучения веб-разработке.</p><p>Если вы устали ждать, пока Open Server применит настройки, или не хотите разбираться в Docker Compose — попробуйте <b>Denwer SE</b>. Вероятно, он напомнит вам старые добрые времена, но уже без боли устаревших технологий.</p><ul><li>Автор проекта: Александр Тишов
	(Amro), разработчик CMS Seditio.</li><li>Лицензия: Freeware.</li><li>Совместимость: Windows 7/8/10/11 x64.</li></ul><p>Исходники панели управления не открыты (распространяется скомпилированный EXE), но архитектура и конфиги полностью прозрачны. В планах — добавить поддержку Nginx в качестве альтернативы. Следите за обновлениями.</p>]]></content:encoded>
    </item>
    <item>
      <title>Valve впервые за 4 года обновил GameNetworkingSockets — что нового в 1.5</title>
      <link>https://tproger.ru/news/valve-vpervye-za-4-goda-obnovil-gamenetworkingsockets-chto-novo</link>
      <comments>https://tproger.ru/news/valve-vpervye-za-4-goda-obnovil-gamenetworkingsockets-chto-novo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/valve-vpervye-za-4-goda-obnovil-gamenetworkingsockets-chto-novo</guid>
      <description><![CDATA[<p>Valve выпустил GameNetworkingSockets 1.5 — первый релиз за 4 года. Поменялась семантика SendMessages, добавили ECN, jitter stats, Rust bindings. Что обновить.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/valve-vpervye-za-4-goda-obnovil-gamenetworkingsockets-chto-novo">Valve впервые за 4 года обновил GameNetworkingSockets — что нового в 1.5</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 30 Apr 2026 14:37:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Valve <a href="https://github.com/ValveSoftware/GameNetworkingSockets/releases/tag/v1.5.0">впервые с лета 2022 года выложила тег</a> GameNetworkingSockets — релиз 1.5. Накопленный за почти четыре года хвост — около 350 коммитов с прошлого тега: поменялась семантика SendMessages (нужно ревизовать места, которые ничего не делают с её результатом), появились ECN и jitter-метрики, ETW-диагностика на Windows, фиксы race-багов в P2P через WebRTC ICE и community-биндинги для Rust. Если про эту библиотеку слышите впервые — на ней работают Counter-Strike, Dota 2 и десятки сторонних проектов, использующих Steam Datagram Relay.</p><p>GameNetworkingSockets (GNS) — это open-source транспортный слой для игр от Valve. UDP-сокеты с надёжной доставкой, шифрованием end-to-end, congestion control, NAT traversal через ICE, retry-логикой поверх ненадёжной сети. По устройству ближе всего к QUIC — UDP в основе, поверх свой надёжный канал, шифрование, фрагментация. Но это не QUIC: формат пакетов и хэндшейк свои, совместимости с RFC 9000 нет. Когда Valve открыла исходники в 2018 году, у инди-разработчиков и небольших студий появился рабочий движок сетевой части без необходимости заказывать его за миллионы долларов или писать самим с нуля.</p><p>С тех пор библиотеку взяли в самые разные продукты — от шутеров до симуляторов и до RPG. Major-тег 1.4.0 вышел в январе 2022 года, патч-релиз 1.4.1 — в июне 2022. С тех пор в репозитории шла обычная разработка — около 350 коммитов в master с фиксами и улучшениями, — но нового тега не было. 28 апреля 2026 года Valve собрала весь этот хвост в релиз 1.5 и подытожила, что именно изменилось.</p><p><b>v1.5.0 — первый тег за почти 4 года.</b> Major-тег 1.4.0 вышел в январе 2022, патч 1.4.1 — в июне 2022. Накопленный хвост — около 350 коммитов в master с прошлого тега.</p><p><b>Поменялась семантика SendMessages.</b> Раньше функция возвращала единый код, по которому невозможно было понять, какие из сообщений ушли. Теперь каждое сообщение получает свой результат, и интерфейс облегчает retry. Старый код, который игнорировал результат и работал как «отправь и забудь», нужно пересмотреть.</p><p><b>Новые конфиги</b>: Explicit Congestion Notification (ECN), статистика jitter, IPLocalHost_AllowWithoutAuth и ещё несколько. Помогают тюнинговать поведение в стрессовых сетях и тестовых окружениях.</p><p><b>Native ICE-клиент по-прежнему в beta.</b> Race-баги, ведущие к hang, починили; для production-P2P пока всё равно WebRTC ICE.</p><p><b>Появились первые Rust bindings</b> — community-вклад, не официально поддерживаемый Valve, но рабочая отправная точка для Rust-проектов.</p><h2>Что такое GameNetworkingSockets и кто на нём работает</h2><p>GameNetworkingSockets — это библиотека сетевого транспорта, открытая Valve в 2018 году. По смыслу она ближе всего к QUIC: UDP в основе, поверх — собственный надёжный канал, шифрование, контроль перегрузки, фрагментация. Главное отличие — ориентация на игровой трафик: маленькие частые сообщения, тонкая конфигурация ретраев, поддержка ненадёжной доставки рядом с надёжной (можно выбрать на каждое сообщение).</p><p>Использует библиотеку прежде всего сама Valve: на ней работают Counter-Strike, Dota 2 и любой другой мультиплеер из Steam, который ходит через Steam Datagram Relay (SDR) — собственную сеть Valve, агрегирующую трафик через быстрые узлы поближе к игроку. Кроме Valve, библиотеку взяли разные инди- и middleware-проекты, плюс она встроена как дополнительный backend в несколько игровых движков.</p><p>У GNS есть два режима. Первый — клиент-сервер по обычному IP, без участия Steam-сети. Второй — P2P, через ICE для NAT traversal. P2P-режим требует внешнего signaling-сервера для обмена ICE-кандидатами между пирами; пример Valve поставляет в репозитории.</p><h2>Что нового в 1.5</h2><h3>API: новая семантика SendMessages, плоский C API для Messages</h3><p>Главное изменение в API — поведение ISteamNetworkingSockets::SendMessages при ошибках. Раньше функция возвращала единый код, который не давал понять, какие из сообщений ушли, а какие нет. Теперь каждое сообщение получает свой результат, а интерфейс облегчает retry — можно прозрачно переотправить только упавшие, не дублируя успешные. Если у вас в коде есть обёртка «отправил пачку — получил ОК или нет», её надо переписать под новый паттерн, иначе при сбоях часть сообщений просто потеряется.</p><p>Добавлен flat C API для ISteamNetworkingMessages — это режим, где сокеты привязываются не к connection-у, а к идентичности игрока, и отправка идёт по принципу «отправь пользователю X». Раньше этот режим был доступен только из C++. Теперь можно дёргать его и из C, и из любого языка с C FFI без C++-обёртки — что особенно актуально для Rust-, Go- и Python-биндингов.</p><p>Появилась хук-функция SteamNetworkingSockets_SetServiceThreadInitCallback — для тех, кто хочет подкрутить поведение сервисного потока (приоритет, имя, привязка к ядру) до того, как библиотека начнёт обрабатывать пакеты.</p><h3>Надёжность и наблюдаемость</h3><p>На уровне пакетов и очереди сообщений библиотека теперь автоматически корректирует часть out-of-order ситуаций — раньше эти случаи выливались в reorder-events для прикладного кода, и каждый разработчик разбирался с ними сам. Не идеальное решение для всех сценариев, но для игрового трафика — обычно то, что нужно по умолчанию.</p><p>Из новых конфигов и метрик:</p><ul><li>ECN (Explicit Congestion Notification) — поддержка пометок в IP-заголовке, чтобы роутеры могли сигнализировать о перегрузке без потери пакетов.</li><li>Jitter stats — статистика разброса времени доставки, видимая через стандартные accessor-ы. Полезно для тонкой настройки буферов и плавности геймплея.</li><li>IPLocalHost_AllowWithoutAuth — режим без аутентификации для localhost-соединений, удобен в тестовых сборках, dedicated-серверах локальной отладки и CI.</li><li>ETW (Event Tracing for Windows) — диагностические события, видимые в Windows Performance Analyzer и аналогах.</li></ul><h3>P2P: ICE-клиенты, race-баги</h3><p>P2P-стек получил серию точечных фиксов. В WebRTC ICE-клиенте, который Valve использует как основной для P2P, починили race-баги, которые приводили к hang при определённых таймингах рукопожатия. В нативном ICE-клиенте — собственной имплементации ICE-стека Valve, которая развивается параллельно ICE из WebRTC, исправили несколько багов, но он по-прежнему помечен как beta — для production пока рекомендуют WebRTC ICE.</p><p>Пример сигнального сервера в репозитории переписан с нуля на Python — раньше он жил на C++ и имел набор багов, которые мешали запустить локальный P2P-тест из коробки. Сейчас пример работает «как описано» и заодно проверяется в CI: P2P-сценарии добавили в авто-тесты, что для самоподдерживающейся кодовой базы серьёзный шаг.</p><h3>Rust bindings, CMake/vcpkg, протобафы</h3><p>В релиз попали первые официальные Rust bindings — но с дисклеймером community contribution: их пишет и поддерживает не Valve, а сторонние мейнтейнеры. Если планируете сетевой стек на Rust поверх GNS — подключите биндинг как зависимость, но будьте готовы к тому, что приоритет фиксов и обновлений отличается от основной библиотеки.</p><p>Интеграция с CMake и vcpkg существенно упрощена — собрать GNS без сторонних рецептов теперь реально на обычной машине. Параллельно починили совместимость с новыми версиями protobuf и abseil — последняя регулярная боль для тех, кто строил на vcpkg или conan.</p><h2>Почему 4 года тишины</h2><p>Valve в release notes причину не комментирует. Видимая динамика — около 600 коммитов в master за этот период, регулярные мерж-реквесты от внешних контрибьюторов, активное реагирование на issue. Пакетный релиз делается, по всей видимости, по другому критерию — когда внутреннее использование в продуктах требует фиксированной версии для интеграции.</p><p>Для пользователей библиотеки это означало одно из двух: либо собирать сборку из master и брать на себя риск сломанных интерфейсов, либо сидеть на 1.4, не получая четырёх лет улучшений. Релиз 1.5 закрывает обе дороги: можно зафиксироваться на стабильном теге и получить весь хвост.</p><h2>Стоит ли переходить на 1.5</h2><p>Если у вас 1.4 в продакшене:</p><ul><li>Тщательно проверьте код вокруг SendMessages — теперь по каждому сообщению есть свой результат, и старый «отправь и забудь» нужно дополнить логикой ретраев.</li><li>Прогоните регрессионный тест P2P, если используете — race-баги в WebRTC ICE и нативном ICE затрагивали реальные сценарии и могли проявляться раз в N подключений.</li><li>Подключите ECN и jitter stats к телеметрии — за 4 года накопилось чем мерить качество соединения, грех не воспользоваться.</li><li>Если в ваших сборках болела совместимость с протобафом или abseil — берите 1.5: эти места починили.</li></ul><p>Если выбираете между GNS и альтернативами для нового проекта — релиз 1.5 не меняет принципиально позиционирование. GNS остаётся хорошим выбором, когда нужен стабильный, проверенный в Counter-Strike транспорт с готовым P2P для NAT traversal. Для проектов, где важно глубже интегрироваться с QUIC, WebTransport или WebRTC напрямую, существуют более специализированные стеки. Между GNS и более минималистичными ENet, kcp, RakNet выбор зависит от потребностей: GNS даёт из коробки больше фич (ICE, шифрование, контроль перегрузки), ценой большего C++-кода и зависимостей; ENet и kcp компактнее и быстрее интегрируются.</p><h2>Выводы</h2><p>GameNetworkingSockets 1.5 — это спокойный пакетный релиз: четыре года накопленных улучшений, без масштабных переписываний интерфейсов. Главное API-изменение — семантика SendMessages, и это та правка, которую разработчики на 1.4 пропустить не смогут. Всё остальное — про observability, P2P-стабильность и удобство сборки.</p><p>Сам факт, что Valve собрала тег после такой паузы, — хороший сигнал: библиотеку используют достаточно, чтобы стабильный артефакт имел смысл. Для маленьких студий, у которых нет сил тащить master из репозитория каждый раз, это означает возможность снова жить на стабильной версии без четырёхлетнего отставания.</p><p>Источники: <a href="https://github.com/ValveSoftware/GameNetworkingSockets/releases/tag/v1.5.0">релиз v1.5.0 на GitHub</a>, <a href="https://github.com/ValveSoftware/GameNetworkingSockets">репозиторий и документация</a>, обзор у <a href="https://www.phoronix.com/news/Valve-GameNetworkingSockets-1.5">Phoronix</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как сделать быстрый интерпретатор динамического языка — перевод статьи Филипа Пизло</title>
      <link>https://tproger.ru/translations/kak-sdelat-bystryj-interpretator-dinamicheskogo-yazyka-perevod</link>
      <comments>https://tproger.ru/translations/kak-sdelat-bystryj-interpretator-dinamicheskogo-yazyka-perevod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/kak-sdelat-bystryj-interpretator-dinamicheskogo-yazyka-perevod</guid>
      <description><![CDATA[<p>Перевод статьи Филипа Пизло (WebKit FTL JIT): 21 оптимизация AST-интерпретатора без JIT, байткода и SSA. От 35x медленнее CPython до 1,9x быстрее.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/kak-sdelat-bystryj-interpretator-dinamicheskogo-yazyka-perevod">Как сделать быстрый интерпретатор динамического языка — перевод статьи Филипа Пизло</a>»</p>]]></description>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 22 Apr 2026 16:30:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Хотите ускорить рантайм своего маленького DSL или учебного языка — но писать JIT нет сил, а байткод-компилятор кажется отдельным проектом? Перевод <a href="https://zef-lang.dev/implementation" rel="nofollow">статьи Филипа Пизло</a> (автора JavaScriptCore-FTL, B3 и Riptide GC в WebKit) показывает, как простой AST-интерпретатор для собственного языка Zef он разогнал <b>в 16,6 раза</b> без единой строчки машинного кода, а с переходом на обычный C++ — в <b>67 раз</b>.</p><p>Пизло — человек, от которого обычно ждут постов про «как мы выкрутили очередной трюк в JIT JavaScriptCore». Его прошлые тексты — это <a href="https://webkit.org/blog/3362/introducing-the-webkit-ftl-jit/" rel="nofollow">FTL JIT</a>, <a href="https://webkit.org/blog/5852/introducing-the-b3-jit-compiler/" rel="nofollow">B3</a>, <a href="https://webkit.org/blog/7122/introducing-riptide-webkits-retreating-wavefront-concurrent-garbage-collector/" rel="nofollow">Riptide GC</a> и другие вещи, которые требуют двух лет опыта в компиляторах. Но этот текст — принципиально другой. Он показывает ровно то, о чём обычно не пишут: что делать, когда у вас ещё нет JIT, а GC ещё не является главной болью.</p><p>Стартовая версия интерпретатора Zef была <b>в 35 раз медленнее CPython 3.10</b>, в 80 раз медленнее Lua 5.4.7 и в 23 раза медленнее QuickJS-ng 0.14.0. После 21 оптимизации (<i>ни одной из которых не требует SSA-преобразований (static single assignment), переделки сборщика мусора, байткода или машинного кода</i>) тот же интерпретатор проигрывает CPython всего в 2,1 раза, Lua — в 4,8 раза, QuickJS — в 1,35 раза. Если же собрать тем же обычным C++ без Fil-C — Zef становится <b>быстрее CPython в 1,9 раза и быстрее QuickJS в 3 раза</b>.</p><p><b>Представление значений</b>: tagged 64-битные значения с NaN-boxing (упаковка целых и указателей в неиспользуемые биты double) позволяют держать числа на стеке и отличать их от указателей по битам.</p><p><b>Symbols вместо строк</b>: один раз интернировать все имена методов и переменных в Symbol*, потом сравнивать указатели — даёт +18%.</p><p><b>Object Model + Inline Caches + Watchpoints</b>: самый большой прирост (+355%, 4,55x) — одна мегакоммит-оптимизация, без которой остальное не работает.</p><p><b>Специализация мелочей</b>: выделенный AST-узел для a + b вместо строкового a.add(b), Getter/Setter-инференс, специализированные ZeroArguments/OneArgument/TwoArguments.</p><p><b>Штраф Fil-C — 4x</b>: memory-safe C, в котором автор пишет, даёт GC бесплатно, но накладывает штраф; итоговый буст после перехода на обычный C++ — 67x.</p><h2>О каком интерпретаторе речь</h2><p>Zef — это учебный динамический язык, который Пизло написал для удовольствия. В нём есть классы с наследованием, приватные поля (по умолчанию), замыкания, кастомные операторы, getter'ы и setter'ы. На уровне идиом он похож на Ruby и тихую версию JavaScript. Исходный интерпретатор — <a href="https://zef-lang.dev/source-viewers/baseline.html" rel="nofollow">наивный AST-walker</a>, в котором каждая нода — это C++-объект с виртуальным методом Node::evaluate, а все переменные живут в std::unordered_map&lt;std::string, Value&gt;.</p><p>Весь исходный код интерпретатора, diff-просмотрщики для каждой оптимизации и бенчмарки выложены на <a href="https://zef-lang.dev/implementation" rel="nofollow">zef-lang.dev/implementation</a>. Бенчмарки — набор ScriptBench1: Richards (OS scheduler), DeltaBlue (constraint solver), N-Body (физика) и Splay (самобалансирующееся двоичное дерево). Все портированы на Zef, Lua, Python и JavaScript.</p><p>Одна деталь про измерения: Пизло собирает свой интерпретатор компилятором <a href="https://fil-c.org/" rel="nofollow">Fil-C++</a> — это его собственный memory-safe C, который даёт сборщик мусора из коробки, но платит за это примерно 4x производительности. То есть когда в тексте написано «в 35 раз медленнее CPython», держите в голове, что 4x из этого — стоимость безопасности памяти, а остальные ~9x — это то, что будем выжимать.</p><h2>Исходная точка: в 35 раз медленнее Python</h2><p>В базовом варианте Пизло сделал два единственных осознанных про производительность выбора:</p><ul><li><b>64-битное tagged-представление значений</b>. Значение может быть int32, double или Object*. Double'ы сдвигаются на 0x1000000000000 — техника из JavaScriptCore, которую в литературе зовут NaN-boxing. Целые и указатели лежат как есть. Это позволяет определить тип значения битовой проверкой и не выделять int'ы в куче.</li><li><b>Язык — C++</b>. Пизло обосновывает: «Java — потолок низкоуровневых оптимизаций слишком низкий, Rust — сборщик мусора требует глобального изменяемого состояния и циклических ссылок, с этим придётся драться или писать много unsafe».</li></ul><p>Всё остальное — сознательные «плохие» решения ради скорости разработки:</p><ul><li>Fil-C++ — штраф 4x, но GC бесплатно.</li><li>Рекурсивный AST-интерпретатор через виртуальные вызовы.</li><li>std::string везде — для имён переменных, методов, полей.</li><li>std::unordered_map везде — на каждый Get переменной идёт хеш-лукап по строке.</li><li>Цепочки рекурсивных вызовов по scope chain: класс внутри функции внутри класса внутри функции — каждый доступ проходит через несколько уровней вызовов.</li></ul><p>Результат — <b>35x медленнее CPython, 80x медленнее Lua, 23x медленнее QuickJS</b>. Дальше — что с этим можно сделать, <i>не переписывая интерпретатор на JIT</i>.</p><h2>#1–2: Прямой вызов операторов и RMW</h2><p>В Zef выражение a + b эквивалентно a.add(b). Наивный парсер делает одну и ту же AST-ноду для обоих случаев — DotCall(a, "add", [b]). Каждый плюс превращается в лукап строки "add" в Value::callMethod, который каскадом сравнивает её со всеми возможными именами операторов.</p><p>Первая оптимизация — парсер генерирует отдельные ноды Binary&lt;&gt; и Unary&lt;&gt;, каждая со своим виртуальным evaluate, который сразу зовёт Value::add, Value::sub и так далее. Без строковых сравнений на каждый плюс.</p><p><b>+17,5%</b>. Вторая оптимизация делает то же самое для += и аналогов — отдельные ноды SetRMW, DotSetRMW, SubscriptRMW. <b>+3,7%</b>. Итог: 1,22x быстрее старта.</p><h2>#3: Убрать проверку IntObject из быстрого пути</h2><p>В базовой версии Value различал четыре случая: tagged int32, tagged double, IntObject (для int64, не влезающих в 32 бита) и всё остальное. Фастпас вызывал isInt(), который через виртуальный вызов спрашивал Object::isInt() — на случай, если под обложкой лежит IntObject.</p><p>Правка — пусть Value работает только с int32 и double, а весь int64-код уезжает внутрь IntObject. <b>+1%</b>. Мелочь, но копеечка.</p><h2>#4: Symbols вместо std::string</h2><p>Это первый по-настоящему большой прирост. В исходном интерпретаторе std::string — это ключ везде, где есть хеш-лукап: локальные переменные, dot-доступ, имена операторов, имена методов. То есть на каждый x + 1 идут хеширование строки "x", strcmp на каждой коллизии, ещё раз для "+".</p><p>Оптимизация — классический interning. Новый класс Symbol. Строки превращаются в Symbol* через глобальный hash-consing — одна строка = один указатель. Равенство Symbol* теперь проверяется сравнением указателей, а хеш-таблицы ключуются по Symbol*, а не по std::string.</p><p>Правка большая по количеству затронутых файлов, но по сути тривиальная — меняются сигнатуры функций с const std::string&amp; на Symbol*. <b>+18%</b>. Суммарно: 1,46x быстрее старта.</p><h2>#5: Value Inline</h2><p>Простая техника: вынести часть методов Value в отдельный заголовочник valueinlines.h, чтобы они видели типы, которые нельзя было включить в value.h из-за циркулярных зависимостей. Компилятор теперь может их инлайнить в горячих местах. <b>+2,8%</b>.</p><h2>#6: Объектная модель + inline caches + watchpoints — 4,55x одним махом</h2><p>Самая большая оптимизация в статье, и единственная, которую Пизло специально защищает:</p><blockquote>Иногда единственный способ сделать реализацию языка быстрее — это посадить большой патч. Не позволяйте никому говорить, что хороший инженерный труд бывает только в маленьких удобоваримых изменениях. Это не всегда так. И точно не так, если вы хотите иметь быструю реализацию динамического языка.</blockquote><p>Патч объединяет три независимо бесполезных вещи:</p><h3>Новая объектная модель: Storage + Offsets</h3><p>В исходной версии каждый lexical scope выделял объект Context, а внутри Context жил hashmap с «полями» — локальными переменными. Объекты пользовательских классов были хуже: каждый объект содержал hashmap «класс → Context», потому что если Bar наследует Foo, поля у них приватные и могут иметь одинаковые имена — нужно различать, к какому классу относится поле.</p><p>Новая идея — Storage, который держит данные по Offsets, вычисленным на этапе resolve AST. Context всё ещё существует, но создаётся заранее, а объекты на рантайме просто выделяют Storage размера, который Context уже посчитал. Доступ к полю становится индексом по offset'у, а не лукапом в хеш-таблице.</p><h3>Inline caches</h3><p>Классическая техника — обычно её описывают в контексте JIT-компиляторов. Но здесь Пизло применяет её в <i>интерпретаторе</i>: для каждой AST-ноды типа expr.name запоминается тип, который expr имел в прошлый раз, и offset, куда резолвилось name. Запоминание — через placement-new на месте старой ноды: под той же памятью лежит новая специализированная нода, которая умеет быстрый путь.</p><p>Специализация может быть: «прямой load из Storage» (для локальной переменной), «проверка класса + direct call в функцию, которую видели в прошлый раз» (для метода). Плюс chain steps и watchpoints, если access требовал обхода scope chain.</p><h3>Watchpoints</h3><p>Представим: класс Foo внутри lexical scope, в котором есть переменная x. Метод Foo обращается к x. Внутри Foo имени x нет. Казалось бы, можно делать доступ без проверок. Но кто-то может унаследовать Foo и добавить геттер с именем x — тогда доступ должен пойти в геттер.</p><p>Watchpoint — это пассивный охранник: «если кто-то переопределил имя x в подклассе, инвалидируй мой inline cache». Пока имя не переопределяли, доступ работает на минимальных циклах.</p><h3>Почему всё вместе</h3><p>Пизло объясняет, почему эти три вещи не разделить:</p><ul><li>Новая объектная модель без inline caches не даёт никакого прироста.</li><li>Inline caches без watchpoints не могут кешировать большинство интересных случаев — слишком много условий.</li><li>И объектная модель, и watchpoints должны работать вместе с самого начала.</li></ul><p><b>+355% — 4,55x быстрее</b>. После этого Zef в 5,2 раза медленнее CPython, в 11,7 раза медленнее Lua, в 3,3 раза медленнее QuickJS. То есть накладные расходы Fil-C++ (примерно 4x) — это уже почти вся разница. Суммарно: 6,8x быстрее старта.</p><h2>#7: Arguments — свой тип вместо std::vector</h2><p>Раньше аргументы функций передавались как const std::optional&lt;std::vector&lt;Value&gt;&gt;&amp;. optional нужен, чтобы отличать геттер-вызов o.getter от функции без аргументов o.function() — в Zef это разные вещи для некоторых типов. То есть каждый вызов аллоцировал std::vector, копировал его, и ещё раз копировал в scope функции.</p><p>Правка — новый тип Arguments, физически совпадающий с layout scope, который callee создаст. Caller выделяет его напрямую, callee не копирует. Плюс в Fil-C++ std::optional всегда живёт в куче из-за специфики invisicaps — это отдельный штраф. <b>+33%</b>.</p><h2>#8–10: Специализация геттеров, сеттеров и callMethod</h2><p>Много методов в Zef устроены тривиально:</p><p>Это запись readable f. Метод fn f f — просто чтение переменной. Гонять это через полноценный eval AST'а расточительно. Оптимизация #8 — инференс: если тело функции — это просто Get, заменяем UserFunction на специализированный GetterFunction, делающий load по известному offset'у. <b>+5,6%</b>.</p><p>Оптимизация #9 — то же самое для сеттеров (fn set_x(v) x = v). Инференс сложнее — нужно матчить параметр сеттера как источник присваивания. <b>+3,4%</b>. Оптимизация #10 — тривиальная однострочная: inline-инг callMethod в заголовочник. <b>+3,2%</b>. Суммарно: 10,2x быстрее старта.</p><h2>#11: Глобальная hashtable для method dispatch</h2><p>Когда inline cache промахивается, старый путь лез через ClassObject::tryCallMethod и tryCallMethodDirect, которые делают два хеш-лукапа на каждый уровень иерархии наследования: «есть ли метод в этом классе» и «есть ли вложенный класс с этим именем». O(depth × 2).</p><p>Правка — глобальный hashmap (ClassObject*, Symbol*) → callee, который запоминает все успешные резолвы. Промах по IC теперь — один лукап в эту таблицу, и только если её нет — полный медленный путь. <b>+15%</b>. Суммарно: 11,8x.</p><h2>#12: Избавиться от std::optional на горячем пути</h2><p>В Fil-C++ std::optional почти всегда аллоцируется в куче — из-за особенностей union-типов и invisicaps. LLVM может непредсказуемо потерять capabilities указателей внутри union'ов; Fil-C++ компилятор страхуется и вставляет интринсики, которые заставляют всё, что выглядит как union, аллоцировать на heap.</p><p>Правка — обход кода, ведущего к std::optional на горячем пути. <b>+1,7%</b>. Важный сайд-эффект для тех, кто пишет на Fil-C++: избегайте union-типов в горячем коде.</p><h2>#13: ZeroArguments, OneArgument, TwoArguments</h2><p>Большинство встроенных функций Zef берут 0, 1 или 2 аргумента. Им не нужен полноценный Arguments-объект — он просто занимает память. Три новых типа: ZeroArguments, OneArgument, TwoArguments. Функции шаблонизируются и инстанцируются отдельно для каждого.</p><p>ZeroArguments нужен отдельно, потому что (Arguments*)nullptr уже используется для геттер-вызова. Теперь ZeroArguments означает «функция без аргументов». <b>+3,8%</b>.</p><h2>#14: Slow paths Value через static + by value</h2><p>Раньше медленные пути Value были member-функциями и принимали неявный const Value*. Значит, caller должен был stack-аллоцировать Value. В Fil-C++ любая stack-аллокация это heap-аллокация.</p><p>Правка — сделать эти методы static и принимать Value по значению. Аллокации не нужны. <b>+10%</b>. Суммарно: 13,6x. Это ещё одна «специфичная для Fil-C++» оптимизация, которая в Yolo-C++ (обычный C++) была бы бесплатной по умолчанию.</p><h2>#15–17: Дедупликация, быстрый sqrt и toString</h2><p>#15 — «оптимизация» в кавычках: убрать дублированный код в DotSetRMW. Пизло надеялся на прирост от уменьшения кода. Прироста нет — но код чище.</p><p>#16 — специализация Dot-ноды для value.sqrt. Inline caches хороши для объектов, но для числовых примитивов они не работают — там фастпас другой, через Binary&lt;&gt;/Unary&lt;&gt;. sqrt в базовом варианте летел через общий путь. Теперь — свой специализированный код. <b>+1,6%</b>.</p><p>#17 — то же самое для toString. Плюс чуть меньше аллокаций при конвертации int → string. <b>+2,7%</b>. Суммарно: 14,2x.</p><h2>#18: Специализация литералов массивов</h2><p>Код вроде my whatever = [1, 2, 3] по-старому каждый раз спускался в AST и вычислял 1, 2, 3. Но если литерал константный — результат известен на парсинге.</p><p>Оптимизация — специализированная ArrayLiteral-нода, которая при вычислении просто копирует заготовленный массив значений. <b>+8,1%</b>. Суммарно: 15,35x.</p><h2>#19: Value::callOperator по значению</h2><p>Та же идея, что в #14 — не передавать Value по ссылке в медленный путь callOperator, а принимать его по значению. Ещё одна Fil-C++-специфичная аллокация убирается. <b>+6,5%</b>. Суммарно: 16,3x.</p><h2>#20–21: Настройки компилятора и отключение ассертов</h2><p>#20 — билд-система: отключить RTTI и libc++ hardening, потому что Fil-C++ их всё равно перекрывает. Ни одного изменения в C++-коде, только флаги сборки. <b>+1,8%</b>.</p><p>#21 — отключить по умолчанию ассерты. Код использовал макрос ZASSERT (всегда проверяет). Замена на ASSERT (только если ASSERTS_ENABLED) должна была дать прирост, но — не дала. Зато готовит код к сборке в обычном C++.</p><p><b>После 21 оптимизации: 16,6x быстрее старта</b>. Zef в 2,1x медленнее CPython, в 4,8x медленнее Lua, в 1,35x медленнее QuickJS. Стартовали с 35x, 80x и 23x разрывов — оказались в окрестностях конкурентов, без строчки JIT.</p><h2>Переход на обычный C++ — ещё 4x</h2><p>Финальный эксперимент — собрать тот же код обычным C++ (GCC 11.4.0) вместо Fil-C++. Пизло называет это Yolo-C++ — без гарантий безопасности памяти. Получается <b>ещё 4x</b>. Суммарно: <b>67x быстрее базовой версии</b>. Zef в 1,9x <i>быстрее</i> CPython 3.10, в 1,2x медленнее Lua и в 3x быстрее QuickJS.</p><p>Сборка неидеальна: вместо Fil-C++ GC там calloc, память не освобождается — интерпретатор течёт, просто ScriptBench1 слишком короткий, чтобы это заметить. С реальным GC Yolo-C++-версия была бы ещё быстрее.</p><blockquote>В этот момент Zef в 1,9 раза быстрее CPython 3.10, в 1,2 раза медленнее Lua 5.4.7 и в 3 раза быстрее QuickJS-ng 0.14.0. Мы стали в 67 раз быстрее, чем там, где начали.</blockquote><h2>Итоговая таблица всех оптимизаций</h2><p>Что получается по ходу работы — в одной таблице (геосреднее по четырём бенчмаркам, чем быстрее, тем лучше):</p><h2>Выводы</h2><p>Главное в этом тексте Пизло — не сами оптимизации, а то, что они <i>все простые</i>. SSA здесь нет. GC переделывать не надо. Байткода нет. Машинного кода нет. Есть базовые вещи: не хешировать строки (Symbols), не аллоцировать лишнее (Value by value, специализированные Arguments), не ходить по hashmap'ам (Offsets + IC), запомнить то, что уже видели (inline caches), инвалидировать кеш только когда реально что-то поменялось (watchpoints).</p><p>Для тех, кто пишет интерпретатор с нуля — список в статье Пизло работает как чеклист. Первые оптимизации (#1–#5) дают суммарные 1,5x — они дешёвые. #6 даёт 4,55x — это день работы, но переворачивает игру. Всё остальное — серия из 3–8% приростов, которые в сумме добирают разницу.</p><p>Для тех, кто хочет потом написать JIT — эта статья объясняет, <i>как выглядит база</i>, на которую JIT потом ложится без сюрпризов. NaN-boxing, новая объектная модель, IC и watchpoints — это ровно то, что должно быть у интерпретатора до того, как вы начнёте генерировать машинный код.</p><p>Оригинал: <a href="https://zef-lang.dev/implementation" rel="nofollow">How To Make a Fast Dynamic Language Interpreter</a>, Filip Pizlo, 21 апреля 2026 года. Автор — один из ключевых инженеров WebKit JavaScriptCore, автор FTL JIT, B3, Riptide GC.</p>]]></content:encoded>
    </item>
    <item>
      <title>C++26 завершён — самый значимый релиз со времён C++11 с рефлексией и безопасностью памяти</title>
      <link>https://tproger.ru/news/c--26-zaverwyon---samyj-znachimyj-reliz-so-vremyon-c--11-s-refleksi</link>
      <comments>https://tproger.ru/news/c--26-zaverwyon---samyj-znachimyj-reliz-so-vremyon-c--11-s-refleksi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/c--26-zaverwyon---samyj-znachimyj-reliz-so-vremyon-c--11-s-refleksi</guid>
      <description><![CDATA[<p>Комитет ISO завершил C++26 — самый важный релиз со времён C++11. Рефлексия, hardened stdlib, контракты и std::execution. Узнайте, что изменится при перекомпиляции.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/c--26-zaverwyon---samyj-znachimyj-reliz-so-vremyon-c--11-s-refleksi">C++26 завершён — самый значимый релиз со времён C++11 с рефлексией и безопасностью памяти</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Новости]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 30 Mar 2026 02:27:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Комитет ISO <a href="https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/">завершил</a> техническую работу над C++26. По масштабу изменений — рефлексия, безопасность памяти, контракты, std::execution — это самый значимый релиз со времён C++11.</p><p>В субботу, 29 марта, около 210 экспертов из 24 стран — 130 очно и 80 удалённо — разрешили оставшиеся международные комментарии на встрече в Лондоне (Кройдон, Великобритания). Документ отправляется на финальное голосование ISO (DIS — Draft International Standard) и будет опубликован в ближайшее время.</p><p>— C++26 завершён — самый значимый релиз со времён C++11</p><p>— Четыре главные фичи: рефлексия, безопасность памяти, контракты, std::execution</p><p>— Рефлексия позволяет C++ инспектировать и генерировать собственный код на этапе компиляции</p><p>— Hardened stdlib уже развёрнута в Google (1000+ багов исправлено, segfault-ы −30%) и Apple с оверхедом 0,3%</p><p>— GCC уже имеет рефлексию и контракты в trunk — можно пробовать сейчас</p><p>— Работа над C++29 стартует в июне с фокусом на дальнейшую безопасность памяти</p><h2>Четыре главные фичи C++26</h2><p>Херб Саттер, почётный председатель комитета ISO C++ (chair emeritus с 2025 года), <a href="https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/">называет</a> их «Fab Four» — четвёрка фич, которые делают C++26 прорывным релизом.</p><h3>1. Рефлексия — крупнейшее обновление со времён шаблонов</h3><p>Compile-time рефлексия позволяет C++ описывать самого себя и генерировать код на этапе компиляции. Оператор <b>^</b> (reflection operator) превращает сущность в её метаданные, а шаблонные функции из пространства <b>std::meta</b> позволяют работать с ними:</p><p>По словам Саттера, это «самый мощный новый движок для выражения эффективных абстракций за всю историю C++». Рефлексия <a href="https://herbsutter.com/2025/06/">попала</a> в драфт C++26 ещё в июне 2025 года.</p><h3>2. Меньше UB — больше безопасности памяти</h3><p>C++26 делает существующий код безопаснее <b>просто при перекомпиляции</b>, без изменений в исходниках. UB (undefined behavior, неопределённое поведение) — исторически главный источник уязвимостей в C++. Два ключевых улучшения:</p><ul><li><b>Чтение неинициализированных переменных больше не UB.</b> Целая категория уязвимостей исчезает при переходе на C++26</li><li><b>Hardened стандартная библиотека</b> — автоматические проверки границ при обращении к элементам vector, span, string, string_view и десятков других типов. При выходе за границы — trap вместо тихого повреждения памяти</li></ul><p>Это не теоретический дизайн. В Google hardened stdlib уже <a href="https://dl.acm.org/doi/10.1145/3712171">развёрнута</a> на сотнях миллионов строк C++: исправлено более 1000 багов, прогноз — предотвращение 1000–2000 багов в год, segfault-ы по всему production-флоту снизились на 30%. В Apple — аналогичный масштаб. Средние накладные расходы — всего 0,3% производительности.</p><blockquote>Из сотен миллионов строк C++ в Google только пять сервисов полностью отказались от hardening из-за проблем с производительностью. Гранулярный API для небезопасного доступа использовался всего в семи местах.</blockquote><h3>3. Контракты: pre, post, contract_assert</h3><p>Языковые контракты позволяют задавать предусловия, постусловия и утверждения прямо в объявлениях функций — вместо хрупкого макроса <b>assert</b> из C, который не знает ни о параметрах, ни о возвращаемых значениях:</p><p>Фича вызвала серьёзные дебаты. Часть комитета считает, что текущий дизайн контрактов недостаточно продуман — в частности, спорным остаётся поведение при нарушении контракта (вызов хендлера vs немедленный terminate). На финальном голосовании 114 экспертов проголосовали за, 12 — против, 3 воздержались. Рекордно низкое число воздержавшихся показывает, что все определились с позицией.</p><h3>4. std::execution — асинхронная модель C++</h3><p><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html">std::execution</a> (Sender/Receiver) предоставляет унифицированный фреймворк для конкурентности и параллелизма. В отличие от <b>std::async</b> и сырых потоков, фреймворк обеспечивает <b>структурированную конкурентность</b> — код свободен от гонок данных по конструкции.</p><p>Саттер предупреждает: фича мощная (его компания <a href="https://www.citadelsecurities.com/">Citadel Securities</a> уже использует её в production), но пока её сложнее освоить, чем большинство фич C++ — не хватает документации и вспомогательных библиотек.</p><h2>Быстрое внедрение</h2><p>Саттер ожидает, что C++26 будет внедряться значительно быстрее, чем C++17/20/23. Две причины:</p><ol><li><b>Экстраординарный спрос.</b> Рефлексия нужна всем, кто пишет сериализацию, ORM, конфигурации, логирование. Hardened stdlib даёт безопасность бесплатно. В отличие от нишевых фич C++20 (концепты, модули), здесь каждый C++-разработчик найдёт применение в своём коде</li><li><b>Компиляторы уже готовы.</b> На протяжении разработки C++26 и GCC, и Clang уже реализовали две трети фич. GCC уже имеет рефлексию и контракты в trunk — можно пробовать прямо сейчас</li></ol><h2>Как попробовать C++26 уже сейчас</h2><p>Рефлексию и контракты можно попробовать в <a href="https://compiler-explorer.com/">Compiler Explorer</a> (godbolt.org), выбрав GCC trunk с флагом <b>-std=c++26 -freflection</b>. Hardened stdlib в libstdc++ активируется флагами:</p><h2>C++29: ещё больше безопасности</h2><p>На встрече приняли расписание C++29 (следующий трёхлетний цикл). Главный фокус — дальнейшее усиление безопасности памяти, в том числе <a href="https://isocpp.org/std/the-committee">профили безопасности</a> Бьёрна Страуструпа.</p><p>Особенно примечателен доклад Оливера Ханта из Apple (P4158R0): WebKit <a href="https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/">захардинил</a> более 4 миллионов строк кода подходом «подмножество надмножества» (аналогично Profiles). Результат: закрыты целые классы уязвимостей, политики предотвратили бы большинство исторических эксплойтов.</p><p>Следующие встречи комитета — в Брно (Чехия) в июне и в Бузиос (Рио-де-Жанейро, Бразилия) в ноябре, где начнётся работа над фичами C++29.</p><h2>Выводы</h2><p>C++26 — начало фундаментально новой эры: C++ становится безопаснее по умолчанию, оставаясь верным принципу zero-overhead. Рефлексия даёт инструмент, который заменит тонны макросов и кодогенераторов. Hardened stdlib уже доказала свою эффективность на сотнях миллионов строк кода в Google и Apple.</p><p>Подробный отчёт со встречи — в <a href="https://herbsutter.com/2026/03/29/c26-is-done-trip-report-march-2026-iso-c-standards-meeting-london-croydon-uk/">блоге Херба Саттера</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Toyota открыла исходный код игрового движка Fluorite для Flutter-разработчиков</title>
      <link>https://tproger.ru/news/toyota-otkryla-ishodnyj-kod-igrovogo-dvizhka-fluorite-dlya-flutter</link>
      <comments>https://tproger.ru/news/toyota-otkryla-ishodnyj-kod-igrovogo-dvizhka-fluorite-dlya-flutter?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/toyota-otkryla-ishodnyj-kod-igrovogo-dvizhka-fluorite-dlya-flutter</guid>
      <description><![CDATA[<p>Toyota открыла код 3D-движка Fluorite для Flutter: Dart-first архитектура, C++ ECS-ядро и графика Filament для игр и UI</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/toyota-otkryla-ishodnyj-kod-igrovogo-dvizhka-fluorite-dlya-flutter">Toyota открыла исходный код игрового движка Fluorite для Flutter-разработчиков</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Flutter]]></category>
      <category><![CDATA[Dart]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 10 Feb 2026 02:03:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Toyota <a href="https://fosdem.org/2026/schedule/event/7ZJJWW-fluorite-game-engine-flutter/" rel="nofollow">представила</a> Fluorite — 3D-движок, ориентированный на разработчиков, которые работают с Flutter и Dart. И все это open-source!</p><p>Компания позиционирует Fluorite как универсальную платформу для интерактивных приложений. Причем речь не только об играх, но даже об автомобильных интерфейсах.</p><h2>Движок на Flutter, но с С++ под капотом</h2><p>Ключевая идея Fluorite — «Dart-first» архитектура. Логика пишется на Dart и напрямую интегрируется с экосистемой Flutter: виджеты, Hot Reload, Widget Inspector и пакеты из pub.dev работают так же, как в обычных приложениях.</p><p>При этом производительность обеспечивается не Flutter-рендерингом. Вся тяжелая часть скрыта в высокоэффективном ECS-ядре на C++, которое отвечает за симуляцию, сцену и взаимодействие объектов.</p><p>Такой подход позволяет запускать проекты на мобильных устройствах, десктопе, embedded-платформах и даже консолях без переписывания движка под каждую цель.</p><h2>Графика уровня AAA за счет Filament</h2><p>Для рендеринга Fluorite использует Filament — 3D-движок Google с поддержкой физически корректного освещения (PBR). Это дает современное качество картинки без необходимости писать собственный рендерер или жертвовать производительностью ради кроссплатформенности.</p><p>По словам команды, связка Flutter + Filament позволяет разделить ответственность: UI и взаимодействие остаются на Flutter, а графика и сцена — на специализированном движке.</p><h2>Чем Fluorite отличается от конкурентов</h2><p>Главное отличие — ориентация на Flutter-разработчиков. Движок не требует изучать отдельный язык или редактор: сцены, логика и интерфейс живут в привычном стеке.</p><p>За счет этого итерации быстрее, а входной порог ниже, чем у традиционных игровых движков.</p><p>Toyota подчеркивает, что Fluorite — open-source проект и его дальнейшее развитие во многом зависит от сообщества. Судя по архитектуре, компания делает ставку на то, что интерактивные 3D-приложения станут таким же обычным сценарием для Flutter, как мобильные и веб-интерфейсы.</p>]]></content:encoded>
    </item>
    <item>
      <title>*WhatsApp переписал медиадвижок на Rust и выкинул 160 тысяч строк C++</title>
      <link>https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro</link>
      <comments>https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro</guid>
      <description><![CDATA[<p>*WhatsApp переписал медиадвижок на Rust, убрав 160 тыс строк C++, чтобы снизить уязвимости и повысить безопасность медиа</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro">*WhatsApp переписал медиадвижок на Rust и выкинул 160 тысяч строк C++</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 29 Jan 2026 02:14:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>*Meta тихо <a href="https://engineering.fb.com/2026/01/27/security/rust-at-scale-security-whatsapp/">провернула</a> одну из самых крупных миграций на Rust в пользовательском софте.</p><p>*WhatsApp заменил более 160 000 строк C++-кода на Rust в критически важной части приложения — обработке медиафайлов. Новый код уже развернут на миллиардах устройств: от Android и iOS до веба, десктопа и носимых гаджетов.</p><p>Цель проста и прагматична: снизить класс уязвимостей, которые годами преследуют мессенджеры — ошибки управления памятью.</p><h2>Откуда вообще взялась проблема</h2><p>История тянется с 2015 года и уязвимости Stagefright в Android. Тогда выяснилось неприятное: достаточно отправить специально собранный видеофайл и он выполнит код на устройстве жертвы еще до того, как пользователь что-то нажмет.</p><p>Проблема была в системных медиабиблиотеках операционной системы. Именно поэтому приложения вроде *WhatsApp не могли решить ее самостоятельно.</p><p>После этого в *WhatsApp появился собственный C++-модуль wamedia, который проверял медиафайлы на соответствие стандартам, чтобы не скормить ОС заведомо опасный контент.</p><p>Все это работало, но с оговоркой: код автоматически обрабатывал недоверенные данные, а значит сам становился идеальной мишенью для эксплойтов.</p><h2>Почему именно Rust</h2><p>В *WhatsApp довольно рано сделали неприятный, но честный вывод: значительная часть критических багов связаны с банальными ошибками работы с памятью в C и C++. Rust эту категорию проблем убирает на уровне языка.</p><p>Вместо аккуратного «подкручивания гаек», разработчики пошли чуть более радикальным путем: переписали медиабиблиотеку целиком, параллельно поддерживая две реализации — на C++ и на Rust.</p><p>Их прогоняли через дифференциальный фаззинг, тесты и сравнение поведения, пока результаты не совпали.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2026-01-29/fdbeec47-e345-4933-b0d8-8ba73ae9944a.webp" alt="" /></figure><h2>Что получилось на выходе</h2><p>Итог оказался даже лучше ожидаемого. 160 000 строк на C++ превратились примерно в 90 000 строк на Rust. И это уже с тестами.</p><p>Производительность не просела, а потребление памяти в ряде сценариев даже снизилось. Основные сложности были не в коде, а вокруг него: размер бинарников из-за стандартной библиотеки Rust и сборка под десятки платформ.</p><p>Тем не менее, библиотеку полностью выкатили в прод. Сейчас этот Rust-код ежемесячно доставляется на миллиарды устройств, включая *WhatsApp, *Messenger и *Instagram.</p><p>В *Meta прямо называют это крупнейшим клиентским деплоем Rust, о котором им известно.</p><h2>Зачем это пользователю, который «просто шлет мемы»</h2><p>Новая система, внутри компании получившая имя Kaleidoscope, проверяет файлы еще до того, как ими займутся системные библиотеки.</p><p>Она отсекает битые и нестандартные структуры, ловит подмену типов (когда «картинка» на деле исполняемый файл), отдельно помечает рискованные форматы вроде PDF со скриптами и вложениями.</p><p>По сути, это еще один слой защиты. Пользователь его не видит, но это и не нужно.</p>]]></content:encoded>
    </item>
    <item>
      <title>На чём писать в 2026: какой язык программирования выбрать, если хочется обновить стек</title>
      <link>https://tproger.ru/articles/na-chyom-pisat-v-2026--kakoj-yazyk-programmirovaniya-vybrat--esli-hochetsya-obnovit-stek</link>
      <comments>https://tproger.ru/articles/na-chyom-pisat-v-2026--kakoj-yazyk-programmirovaniya-vybrat--esli-hochetsya-obnovit-stek?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/na-chyom-pisat-v-2026--kakoj-yazyk-programmirovaniya-vybrat--esli-hochetsya-obnovit-stek</guid>
      <description><![CDATA[<p>Выбор языка программирования в 2026: объективный анализ Python, C, C++, Java, C#, JavaScript и Visual Basic. В статье вы найдете стратегии перехода между языками, оценку рисков и возможностей, а также дорожную карту для обновления стека.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/na-chyom-pisat-v-2026--kakoj-yazyk-programmirovaniya-vybrat--esli-hochetsya-obnovit-stek">На чём писать в 2026: какой язык программирования выбрать, если хочется обновить стек</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 19 Jan 2026 12:30:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рынок разработки в 2026 году не обнуляется, но заметно перетасовывается. Это среда, где ИИ уже встроен в рабочие процессы, системное программирование снова становится массово востребованным, высокие нагрузки перестают быть экзотикой, требования к безопасности растут, а кроссплатформенность набирает обороты. На этом фоне вопрос обновления стека — важен в контексте сохранения рыночной ценности в ближайшие годы.</p><p>Подборка в этом материале опирается на <a href="https://www.tiobe.com/tiobe-index/">TIOBE Index </a>— международный рейтинг популярности языков программирования, который ежемесячно формируется на основе данных поисковых систем, количества обучающих материалов и активности профессионального сообщества. Некий индикатор того, где сейчас сосредоточен реальный спрос.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-12-22/9a5abb10-371c-4aae-8048-a544c74fa5df.png" alt="" /></figure><p>Разберём на примере семи самых рейтинговых языков, какие из них логично рассматривать в 2026 году (и логично ли) действующим разработчикам, и из каких стеков в них входить быстрее всего.</p><h2>Python в 2026: универсальный усилитель для бэкенда, данных и ИИ</h2><p>В 2026 году Python остаётся языком, который проще всего встроить в уже существующий стек. Он <a href="https://mimo.org/blog/top-ai-programming-languages">живёт </a>в областях, где важны скорость разработки и плотность экспериментов: машинное обучение и прикладные AI-задачи, data engineering и ETL-процессы, автоматизация рутинных операций, разработка девтулов и утилит; а также в бэкенде, где критичнее гибкость, чем низкоуровневая оптимизация.</p><p>Переходить на Python проще всего тем, кто привык мыслить объектно и работать с динамикой. Самый оптимальный вариант — из JS, PHP и Java:</p><ul><li>Разработчики на JavaScript <a href="https://evrone.ru/blog/articles/from-java-to-python">уходят</a> в питон почти бесшовно: есть близкие модели данных, схожая философия быстрого прототипирования и огромная база библиотек.</li><li>PHP-разработчики <a href="https://habr.com/ru/companies/exWargaming/articles/221035/">адаптируются</a> к языку благодаря знакомому подходу к бэкенд-логике и работе с фреймворками, но есть принципиальная разница к подходам с типизацией.</li><li>Преимущества для Java-специалистов в<a href="https://evrone.ru/blog/articles/from-java-to-python"> понятном</a> синтаксисе и лаконичности Python, поэтому переход также возможен.</li><li>Аналитики и тестировщики переходят на Python через <a href="https://habr.com/ru/articles/843520/">практику</a>: скрипты автоматизации быстро превращаются в продуктивные инструменты.</li></ul><p>Порог входа <a href="https://blog.jetbrains.com/pycharm/2025/08/the-state-of-python-2025/">низкий</a>: синтаксис прямолинейный, в экосистеме есть готовые решения почти на каждый случай, а первые практические результаты появляются через считанные недели. Но это же создаёт риски. Так как вход в язык относительно лёгкий (это подтверждает первое место в рейтинге) — конкуренция высокая, особенно в прикладном ML. Кроме того, в <a href="https://www.opennet.ru/openforum/vsluhforumID3/138045.html">высоконагруженных системах</a>, где важна каждая микросекунда, асинхронное программирование и управление памятью требуют глубоких знаний, выходящих за рамки базового синтаксиса.</p><p>Python — не лучший выбор для тех, кто работает в системном программировании, embedded или инфраструктуре на C/C++. В этих задачах важна предсказуемость управления памятью, а не удобство разработчика.</p><h2>C в 2026: опорный язык для embedded, драйверов и систем реального времени</h2><p>В 2026 году С остаётся <a href="https://habr.com/ru/companies/swd_es/articles/508240/">фундаментом</a> там, где железо важнее абстракций. Он работает на микроконтроллерах, в промышленной автоматике, драйверах, прошивках и в RTOS-средах, где критична предсказуемость времени выполнения и полный контроль над ресурсами. Это язык, вокруг которого ещё долго будут строиться системы, способные жить десятилетиями.</p><p>Проще всего переход даётся тем, кто уже держал в руках низкоуровневый стек — в C можно войти из C++ и эмбеда:</p><ul><li>Переход с C++ на C <a href="https://stackoverflow.com/questions/4058496/moving-from-c-to-c">естественен</a> из-за общей модели памяти и необходимости понимать стоимость операций.</li><li>Специалисты по встраиваемым системам (embedded) часто <a href="https://hexly.ru/professiya-info/embedded-programmist">начинают</a> с C/C++ и глубоко понимают аппаратную часть, что делает переход к чистому C логичным.</li></ul><p>Вход кажется простым только внешне. Настоящая работа начинается там, где ответственность лежит за всё — от выделения памяти до обработки ошибок. Минимум встроенных защит и отсутствие автоматического управления ресурсами требуют инженерной дисциплины. Ошибки в C <a href="https://habr.com/ru/articles/883992/">редко проявляются </a>спокойно: они выливаются в падения, утечки, нестабильные устройства и долгие ночи с отладчиком.</p><p>Зато выгода ощутимая. По-прежнему ценится умение работать с ограниченными ресурсами и понимать систему изнутри. Это профессии с высокой инженерной значимостью и долгим жизненным циклом: такие проекты живут годами и переживают несколько поколений языков.</p><p>Не стоит идти в C тем, кто работал только в веб-стеке и никогда не сталкивался с ограничениями железа. <a href="https://skyeng.ru/it-industry/programming/chto-vybrat-dlya-razrabotki-c-ili-python/">В отличие</a> от Python, ориентированного на скорость разработки и обладающего автоматическим управлением памятью, C требует полного низкоуровневого контроля над ресурсами, что создаёт огромный разрыв в парадигмах программирования. Путь в продакшен может превратиться в затяжной стресс вместо профессионального роста.</p><h2>C++ в 2026: высокопроизводительные системы, игры и сложная инженерия</h2><p>В 2026 году C++ <a href="https://devblogs.microsoft.com/cppblog/whats-new-for-cpp-developers-in-visual-studio-2026-version-18-0/">остаётся </a>рабочей лошадкой там, где важны скорость, предсказуемость и возможность вручную управлять каждым уровнем системы. Он используется в игровых движках, графических пайплайнах, симуляторах, системах хранения и в любом ПО, где миллисекунды стоят денег или определяют игровой опыт. Это язык, который не потерял актуальность и вряд ли потеряет — слишком много инфраструктуры на нём держится.</p><p>Проще всего переходят те, кто уже понимает низкоуровневую модель — специалисты по C и Rust:</p><ul><li>Разработчики на C чувствуют себя здесь как дома, ведь не теряют контроль и получают больше инструментов.</li><li>Тем, кто <a href="https://www.linkedin.com/posts/lanceharvie_embeddedsystems-rustlang-cprogramming-activity-7227508999947005953-59ws">пришёл </a>из Rust, знакомы принципы безопасности памяти, хотя в C++ они реализованы иначе.</li></ul><p>Главное преимущество C++ остаётся неизменным: он позволяет строить системы, где скорость и контроль указаны в требованиях. Производительность, доступ к железу, возможность оптимизировать всё вручную — это сильные стороны, благодаря которым язык удерживает позиции в самых сложных доменах. Вместе с этим <a href="https://habr.com/ru/articles/862832/">растёт</a> и планка задач: на C++ редко делают что-то простое, и это превращает язык в сильный показатель инженерной зрелости.</p><p>Минусы есть. Экосистема зачастую <a href="https://habr.com/ru/companies/ruvds/articles/871940/">тяжеловесна</a>, а стандарт развивается быстро, что может осложнять поддержку актуальности проектов. Ошибки стоят дорого: неправильное владение памятью, неоптимальный алгоритм или гонки данных могут превратиться в реальные финансовые или продуктовые потери. C++ вознаграждает за дисциплину и карает за невнимательность.</p><p>Переход оправдан тогда, когда нужна работа в performance-доменах: игровой dev, real-time-системы, графика, симуляции, базы данных. Если задачи требуют скорости и полного контроля над процессом — C++ остаётся одним из самых мощных инструментов для этого уровня.</p><h2>Java в 2026: стабильный корпоративный бэкенд и инфраструктура, которая не рушится</h2><p>В 2026 году Java остаётся одним из самых <a href="https://softjourn.com/insights/is-java-still-used">устойчивых</a> языков для корпоративных систем. Банки, страховые компании, платёжные сервисы, крупные ритейлеры и весь классический enterprise-сегмент продолжают работать на JVM-стеке, потому что он проверен, масштабируется и выдерживает десятки лет развития продукта.</p><p>Переход проще всего даётся тем, кто уже жил в объектно-ориентированной модели — C#, Kotlin.</p><ul><li>C#-спецы попадают почти в привычную среду, где меняются лишь инструменты, но не логика разработки.</li><li>Kotlin-разработчики <a href="https://www.infoworld.com/article/2244227/jetbrains-kotlin-jvm-language-appeals-to-the-java-faithful.html">ощущают </a>Java как чуть более формальную, но узнаваемую основу JVM.</li></ul><p>Java остаётся рабочим языком по очень приземлённым причинам. Объём существующего кода огромный, и его нужно поддерживать, развивать, переписывать и интегрировать с современными сервисами. Стабильность и предсказуемость стека — редкая ценность в отрасли, где технологии меняются каждые пару лет. Java хорошо масштабируется, отлично ложится на корпоративные процессы, <a href="https://evincedev.com/blog/top-java-frameworks-for-web-developement/">имеет </a>зрелые фреймворки и помогает разработчикам быть востребованными в крупных компаниях, где команды десятилетиями развивают один продукт.</p><p>Но у языка есть ограничения. Попасть в экосистему без опыта сложнее, потому что компании ожидают зрелости, аккуратности и умения работать с большими системами. Старт карьеры в Java <a href="https://cpb-runo.ru/news/programming/pochemu-java-luchshiy-yazyk-dlya-starta-v-it-universalnost-i-vostrebovannost-na-rynke/">может</a> быть простым, но рост до уровня enterprise-разработчика требует изучения сложных концепций и фреймворков.</p><p>Язык подойдёт тем, кто хочет развивать крупные платформы, работать с надёжной архитектурой и видеть долгосрочный эффект от своих решений. Если цель — предсказуемый рост, корпоративный бэкенд и инфраструктура, Java в 2026 остаётся одной из самых практичных точек входа.</p><h2>C# в 2026: универсальный стек для бэкенда, геймдева и кроссплатформы</h2><p>В 2026 году C# <a href="https://www.educative.io/blog/is-c-sharp-and-net-still-relevant">уверенно</a> держит позицию одного из самых практичных языков для разработчиков, которым нужен сбалансированный стек: промышленный бэкенд, стабильные корпоративные продукты, кроссплатформенная разработка и <a href="https://nt.ua/ru/advantages-trends-and-prospects-for-development-in-c-sharp-and-dot-net">геймдев</a> на Unity. Это язык, который позволяет работать сразу в нескольких направлениях, не выпадая из экосистемы .NET.</p><p>Чаще всего C# живёт в web-бэкенде, корпоративных приложениях и десктопных продуктах — там, где важны производительность, предсказуемость и хорошая интеграция с инфраструктурой. Unity по-прежнему остаётся главным входом в геймдев для начинающих, и именно через него многие приходят в C#, а не наоборот.</p><p>Переходить сюда проще Java-разработчикам, <a href="https://softjourn.com/insights/c-sharp-vs-java">из-за</a> схожего объектно-ориентированного синтаксиса.</p><p>C# <a href="https://nt.ua/ru/advantages-trends-and-prospects-for-development-in-c-sharp-and-dot-net">усиливается </a>благодаря развитию .NET и всё более уверенной кроссплатформенности. Этому стеку уже не нужно доказывать свою жизнеспособность: он стабильно используется в компаниях разного масштаба, даёт хороший гарантированный спрос на рынке и регулярно обновляется без резких ломок экосистемы.</p><p>Особенно выгодно выбирать C#, если хочется совмещать бэкенд и геймдев — редкое сочетание, которое открывает широкий диапазон карьерных возможностей. Это стек, позволяющий развиваться горизонтально, не меняя язык при переходе между разными индустриями.</p><h2>JavaScript в 2026: опора веба и самый быстрый путь в fullstack</h2><p>В 2026 году JavaScript <a href="https://dev.to/blarzhernandez/what-will-shape-the-next-wave-of-frontend-development-in-2026-backed-by-experts-data-52h3">остаётся</a> одним из главных рабочих языков для продуктовых команд: он ведёт фронтенд, закрывает часть бэкенда через Node.js и работает в мобильных приложениях.</p><p>Перейти сюда проще всего тем, кто уже<a href="https://sky.pro/wiki/html/luchshie-yazyki-dlya-sozdaniya-veb-sajtov-chto-vybrat/"> работал</a> с вебом — PHP и Python:</p><ul><li>PHP-разработчики смогут быстро адаптироваться к асинхронности и современным подходам.</li><li>Python-разработчики оценят низкий порог входа и скорость, с которой можно развернуть рабочий прототип.</li></ul><p>JavaScript остаётся одним из ключевых языков из-за ширины экосистемы и того, что браузер задаёт технические ограничения и возможности для всего фронтенда. Он <a href="https://tobiz.net/support/perspektivy-veb-razrabotki-v-2026-frontend-bekend-i-fullstek/">хорошо</a> масштабируется на фуллстек, что делает его удобным языком для продуктовых команд, которым важен быстрый цикл разработки.</p><p>Главный вызов — JS <a href="https://dev.to/blarzhernandez/what-will-shape-the-next-wave-of-frontend-development-in-2026-backed-by-experts-data-52h3">быстро</a> меняется, и это требует регулярных вложений времени в поддержание компетенций.</p><p>JavaScript — лучший выбор, если нужен быстрый переход в другой домен без полной переучки: от фронтенда к бэкенду, от веба к мобильному приложению, от продуктового стека к созданию собственных инструментов.</p><h2>Visual Basic в 2026: язык, который до сих пор жив</h2><p>В 2026 году Visual Basic — это язык, который держится за счёт огромного слоя легаси-систем, внутренних корпоративных решений и автоматизаций вокруг Office. Он живёт там, где продукт работает много лет и стабильно приносит деньги, но уже <a href="https://www.braintools.ru/article/16792">устаревает</a>.</p><p>Visual Basic всё ещё встречается в старых внутренних продуктах, отчётных системах, инструментах на базе Excel и в корпоративных контурах, которые строились до эпохи массовой веб-разработки.</p><p>Почему язык до сих пор всплывает в индексах и рейтингах? Потому что огромный пласт кода всё ещё выполняется в продакшене. Бизнес выбирает стабильность: если система работает, её не переписывают.</p><p>Входить в Visual Basic с нуля в 2026 году почти никогда не рационально. Это не инвестиция в карьеру, а узкая специализация, завязанная на конкретный контур внутри конкретной компании. Смысл появляется только в одной ситуации: вы уже работаете в организации, которая держит ключевую систему на VB, и переход даёт повышение или расширение роли. Но если слишком хочется, то ориентируйтесь на требования конкретной компании.</p><h2>Почему не стоит слепо доверять общим рейтингам языков</h2><p>Важно сделать оговорку: любые общие рейтинги языков программирования — включая TIOBE — дают лишь приближённую картину и не могут служить прямой инструкцией к выбору стека.</p><p>TIOBE Index строится на анализе поисковых запросов, упоминаний в обучающих материалах и общей видимости языка в сети. Это скорее индикатор узнаваемости и обсуждаемости, чем отражение реального распределения задач, вакансий и индустриальных доменов. Язык может быть высоко в рейтинге, потому что о нём много пишут, спорят или учат, но это не всегда означает, что именно на нём сейчас создаётся больше всего коммерческого продукта.</p><p>Именно поэтому у практикующих разработчиков рейтинги часто вызывают скепсис. В реальной работе языки живут внутри конкретных областей. Геймдев не переезжает на Python или TypeScript, мобильная разработка не отказывается от Swift и Kotlin, системное программирование, embedded и highload по-прежнему требуют C, C++ или Rust. Универсального списка «главных языков года» просто не существует — есть разные наборы под разные задачи.</p><p>Отдельный аргумент — рынок вакансий. Он часто даёт более приземлённую картину спроса, чем глобальные индексы. Например, как сообщает <a href="https://t.me/blog7x">Евгений Красников</a>, разработчик ПО, в лидерах оказываются совсем не те языки, которые традиционно доминируют в международных чартах: высокие позиции занимают 1С, Python, Java, JavaScript, PHP, Go. Это не отменяет глобальных трендов, но показывает, насколько сильно результаты зависят от региона и структуры экономики.</p><p>Ещё одна проблема рейтингов — они плохо учитывают влияние ИИ на разработку. Да, сегодня Python и JavaScript действительно выигрывают за счёт того, что на них проще и быстрее генерировать код с помощью AI-инструментов. Но это не означает, что весь новый софт будет писаться только на них. Языки по-прежнему выбирают под требования к производительности, безопасности, модели исполнения и жизненному циклу продукта — и эти требования никуда не исчезли.</p><p>Поэтому подборка языков в этом материале — не попытка назвать «лучшие языки 2026 года», а способ показать набор устойчивых стеков, которые логично рассматривать при обновлении навыков. Рейтинги здесь — отправная точка для разговора, а не истина в последней инстанции. В реальности язык почти всегда выбирается не по позиции в индексе, а по домену, типу задач и карьерной стратегии разработчика.</p><h2>Как выбрать язык для перехода: дорожная карта</h2><p>Обновление стека приносит пользу только тогда, когда связано с реальными задачами и карьерной траекторией. В 2026 году переходы лучше совершать горизонтально: оставаться в своём направлении, но расширять инструменты, чтобы работать быстрее и закрывать больше типов задач.</p><p>Основой выбора остаются три фактора: текущий стек; домен, в котором вы уже сильны; рынок, куда хотите сместиться (корпорации, международные компании или продуктовые команды).</p><p>Запомните техническое правило: не уходить сразу в область, которая сильно отличается по уровню абстракций или модели исполнения. Такой скачок обычно замедляет прогресс и растягивает срок выхода к офферу.</p><p>Если выбирать наиболее безопасную стратегию, то это переход внутри текущего направления. Например:</p><p>– backend → backend на другом языке;</p><p>– data → data с расширением инструментов;</p><p>– frontend → fullstack как способ увеличить гибкость и ценность в команде.</p><p>Такой подход позволяет нарастить стек, не теряя опыт, и быстрее выйти на уровень, где новый инструмент начинает приносить отдачу (и деньги).</p><p>Ну и напоследок даем совет от Игоря Алентьева, продуктового разработчика и создателя агрегатора IT-вакансий <a href="https://hirify.me">hirify.me</a>.</p><blockquote>Нет никакого смысла учить в 2026 что то кроме питона и js/ts: весь новый софт пишется на них (не в последнюю очередь, потому что на них отлично пишет AI), поэтому если нет исключительной любви к легаси или какому-то определенному языку, просто берите их и не ошибетесь. <br />Если есть любовь к энтерпрайзному софту, всяким банкам/телекомам, то подойти могут java/kotlin/c#. Но это нисходящий тренд на горизонте 5-10 лет. <br />В целом, нужно учиться работать с AI, ведь через какое-то количество лет код не будут писать руками, только проектировать.</blockquote><p>Желаем удачи в переходе на новый язык!</p>]]></content:encoded>
    </item>
    <item>
      <title>Почему уязвимость MongoBleed в MongoDB опаснее, чем кажется</title>
      <link>https://tproger.ru/news/pochemu-uyazvimost-mongobleed-v-mongodb-opasnee--chem-kazhetsya</link>
      <comments>https://tproger.ru/news/pochemu-uyazvimost-mongobleed-v-mongodb-opasnee--chem-kazhetsya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/pochemu-uyazvimost-mongobleed-v-mongodb-opasnee--chem-kazhetsya</guid>
      <description><![CDATA[<p>Почему MongoBleed опаснее, чем кажется: уязвимость MongoDB позволяет читать память сервера без логина и угрожала сотням тысяч баз данных</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/pochemu-uyazvimost-mongobleed-v-mongodb-opasnee--chem-kazhetsya">Почему уязвимость MongoBleed в MongoDB опаснее, чем кажется</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 29 Dec 2025 13:13:47 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>MongoBleed</b> — это критическая уязвимость в MongoDB, официально зарегистрированная как CVE-2025-14847.</p><p>Она затрагивает практически все версии <b>MongoDB</b>, выпущенные <b>с 2017 года</b>. С ее помощью удаленный атакующий может читать произвольные участки памяти сервера.</p><p>Проблема скрывалась в обработке сжатых сообщений zlib на сетевом уровне. Уязвимость уже исправлена в актуальных версиях, но старые релизы — <b>3.6</b>, <b>4.0</b> и <b>4.2</b> — патчей не получат. Все потому что они находятся в статусе EOL.</p><p>На первый взгляд это выглядит как очередной баг в низкоуровневом коде. На деле — одна из <a href="https://bigdata.2minutestreaming.com/p/mongobleed-explained-simply">самых опасных уязвимостей</a> для публично доступных баз данных.</p><h2>В чем суть бага</h2><p>MongoDB использует собственный бинарный протокол и формат BSON. Сообщения могут передаваться в сжатом виде — в таком случае клиент сам указывает размер данных после распаковки.</p><p>Ошибка заключалась в том, что сервер без проверки доверял этому значению. Атакующий мог указать, что сообщение после распаковки весит, например, <b>1 МБ</b>, хотя реально там был <b>1 КБ</b>.</p><p>MongoDB выделяла в памяти большой буфер, распаковывала туда данные и оставляла остальное пространство заполненным «мусором» из неинициализированной памяти.</p><h2>Почему это приводит к утечке данных</h2><p>MongoDB написана на C++, а значит память после malloc не очищается автоматически.</p><p>И в том «мусоре», который заполнил излишек памяти, могут оказаться фрагменты предыдущих операций: пароли, токены, ключи API, пользовательские данные, IP-адреса и конфигурация системы.</p><p>Дальше вступает в игру BSON. Поля в нем хранятся как C-строки с \0 в конце. Если отправить специально сформированное сообщение без нулевого байта, сервер будет читать память дальше — пока не наткнется на первый \0. А затем вернет эту строку в сообщении об ошибке клиенту.</p><p>В итоге сервер сам отдает атакующему куски своей памяти.</p><h2>Эксплуатация без логина и пароля</h2><p>Самое неприятное — уязвимость срабатывает <b>до аутентификации</b>. Разбор входящего сообщения происходит раньше, чем проверка прав доступа. Это значит, что для атаки достаточно сетевого доступа к MongoDB. Логин, пароль и любые учетные данные не нужны.</p><p>С учетом того, что поисковики вроде Shodan находят более 200 000 MongoDB-инстансов, доступных из интернета, масштаб проблемы становится очевиден.</p><h2>Почему 8 лет — это катастрофа</h2><p>По данным исследователей, баг появился еще в 2017 году, начиная с MongoDB 3.6. Он существовал почти 8 лет. Насколько активно его использовали — неизвестно, но с учетом простоты эксплуатации трудно поверить, что им никто не воспользовался.</p><p>Исправление оказалось размером буквально в одну строку. Тем не менее, публичная коммуникация со стороны MongoDB выглядела сдержанной.</p><p>Сначала вышел CVE, затем — патч, а полноценное объяснение появилось позже. В компании заявили, что не нашли признаков эксплуатации, но подтвердить это задним числом практически невозможно.</p><h2>Почему MongoBleed — тревожный сигнал</h2><p>MongoBleed не то чтобы опасна утечкой данных. Она скорее показывает, насколько уязвимыми могут быть низкоуровневые оптимизации, сделанные ради производительности. Один неверный допуск и база данных превращается в источник утечек на уровне памяти.</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft перепишет весь свой C и C++ код на Rust уже к 2030 году</title>
      <link>https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu</link>
      <comments>https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu</guid>
      <description><![CDATA[<p>Microsoft планирует полностью отказаться от C и C++ и переписать ключевые компоненты Windows на Rust к 2030 году, используя ИИ для массового рефакторинга кода</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu">Microsoft перепишет весь свой C и C++ код на Rust уже к 2030 году</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Dec 2025 03:45:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Microsoft намерена полностью отказаться от C и C++ к концу десятилетия. Об этом заявил один из разработчиков компании Галент Хант в <a href="https://www.linkedin.com/posts/galenh_principal-software-engineer-coreai-microsoft-activity-7407863239289729024-WTzf/">публикации</a> на LinkedIn.</p><p>Его формулировка предельно прямолинейна: цель — <b>убрать каждую строку C и C++ к 2030 году и заменить их кодом на Rust</b>.</p><p>Microsoft собирается переписать крупнейшие и самые критичные системы. В том числе компоненты Windows и прочие низкоуровневые продукты.</p><h2>Ставка на ИИ и автоматическую переработку кода</h2><p>Ключевым инструментом в этом процессе станет ИИ. По словам Ханта, Microsoft уже выстроила инфраструктуру, которая <b>объединяет алгоритмы анализа кода и ИИ-агентов</b>.</p><p>Система строит графы зависимостей на уровне миллионов строк исходников, после чего ИИ применяет изменения автоматически и в промышленных масштабах.</p><p>Внутренняя цель проекта звучит амбициозно: <b>«1 инженер, 1 месяц, 1 миллион строк кода»</b>. По утверждению Microsoft, базовая часть этой инфраструктуры уже работает — как минимум для задач на понимание и анализа кода.</p><h2>Почему именно Rust</h2><p>Переход на Rust не стал сюрпризом. Еще в 2023 году Microsoft объявила, что <b>новые компоненты ядра Windows больше нельзя писать на C и C++</b>. Тогда же Марк Русинович, CTO Azure, прямо заявил: компания «полностью делает ставку на Rust».</p><p>Причина банальна — Rust обеспечивает безопасность памяти по умолчанию. Для Microsoft, которая десятилетиями сталкивается с уязвимостями классов use-after-free и buffer overflow, это банально стратегический выбор.</p><h2>Кто будет переписывать код Microsoft</h2><p>Хант уже ищет Principal Software Engineer, который поможет развивать инфраструктуру автоматического перевода C и C++ в Rust.</p><p>Кандидат должен иметь серьезный опыт системного программирования на Rust, а также быть готовым разбираться в компиляторах, операционных системах и низкоуровневой архитектуре.</p><p>Команда входит в группу Future of Scalable Software Engineering внутри Microsoft CoreAI. Ее задача — не только переписать код компании, но и создать инструменты, которые позволят устранять технический долг «в промышленных масштабах».</p>]]></content:encoded>
    </item>
    <item>
      <title>В Linux 6.19 появится поддержка Microsoft C Extensions — спустя 20 лет после первого предложения</title>
      <link>https://tproger.ru/news/v-linux-6-19-poyavitsya-podderzhka-microsoft-c-extensions---spustya-20-let-posle-pervogo-predlozheniya</link>
      <comments>https://tproger.ru/news/v-linux-6-19-poyavitsya-podderzhka-microsoft-c-extensions---spustya-20-let-posle-pervogo-predlozheniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-linux-6-19-poyavitsya-podderzhka-microsoft-c-extensions---spustya-20-let-posle-pervogo-predlozheniya</guid>
      <description><![CDATA[<p>В Linux 6.19 впервые могут добавить поддержку Microsoft C Extensions — флаг -fms-extensions уже включён в ветку kbuild-next ядра</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-linux-6-19-poyavitsya-podderzhka-microsoft-c-extensions---spustya-20-let-posle-pervogo-predlozheniya">В Linux 6.19 появится поддержка Microsoft C Extensions — спустя 20 лет после первого предложения</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 11 Nov 2025 03:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Уже в следующем релизе ядра Linux появится то, чего не было все время существования проекта: <b>поддержка Microsoft C Extensions</b>.</p><p>Два патча с этой функцией уже <a href="https://www.phoronix.com/news/Linux-6.19-Patch-Would-MS-Ext">добавлены</a> в ветку <b>kbuild-next</b>, которая отвечает за сборочную систему ядра. И, по всей видимости, они попадут в <b>окно слияния Linux 6.19</b>.</p><h2>Что изменится</h2><p>Патчи включают глобальный флаг компиляции -fms-extensions для GCC и Clang.</p><p>Эта опция активирует нестандартные расширения C, поддерживаемые компилятором <b>Microsoft Visual C/C++</b>. Например, возможность<b> анонимно встраивать структуры и объединения (struct/union)</b> друг в друга.</p><p>Для разработчиков ядра это значит, что можно будет писать <b>«более элегантный код»</b> и в некоторых случаях даже <b>экономить место в стеке</b>.</p><h2>Почему это важно</h2><p>Ранее предложения включить -fms-extensions всплывали в рассылках разработчиков ядра не раз. Первые упоминания датируются еще 2007 годом. Но все это время они так и не доходили до релиза.</p><p>Теперь же, когда патчи уже в <b>kbuild-next</b>, их шансы попасть в мейнлайн выше, чем когда-либо.</p><p>Разработчик <b>Расмус Виллемоэс</b>, предложивший изменение, объясняет:</p><blockquote>«Каждый раз, когда обсуждается включение <i>-fms-extensions</i>, выясняется, что код можно написать и без него. И получается «не слишком ужасно». Но если, как говорит Линус, просто стиснуть зубы и включить этот флаг раз и навсегда, он будет доступен всякий раз, когда ему найдется применение. И отдельным примерам не придется оправдывать его использование».</blockquote><h2>Что думает Линус Торвальдс</h2><p>Сам Торвальдс, судя по его последним комментариям в рассылке, <b>не возражает</b> против включения Microsoft C Extensions в Linux 6.19.</p><p>Это довольно символично: ядро, десятилетиями противопоставлявшее себя экосистеме Microsoft, теперь официально допускает <b>поведение компилятора из Visual Studio</b>.</p><h2>Что это даст разработчикам</h2><ul><li>возможность использовать <b>вложенные структуры</b> без явных имен;</li><li>немного <b>чище и компактнее код</b> в ряде подсистем;</li><li>унификацию сборки под <b>GCC</b> и <b>Clang</b>;</li><li>потенциальное <b>упрощение кроссплатформенных драйверов</b> и <b>библиотек</b>.</li></ul><p>Не всем идея нравится — часть разработчиков считает неправильным позволять «поведение Microsoft» в коде ядра Linux.</p><p>Но если патчи пройдут ревью, то начиная с <b>Linux 6.19</b> в ядре впервые официально появится <b>поддержка расширений языка C из Visual Studio</b> — шаг, о котором 15 лет назад в рассылке ядра даже не мечтали.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google пообещала, что до конца года все смогут вайб-кодить видеоигры с помощью ИИ</title>
      <link>https://tproger.ru/news/google-poobeshhala--chto-do-konca-goda-vse-smogut-vajb-kodit-videoigry-s-pomoshhyu-ii</link>
      <comments>https://tproger.ru/news/google-poobeshhala--chto-do-konca-goda-vse-smogut-vajb-kodit-videoigry-s-pomoshhyu-ii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/google-poobeshhala--chto-do-konca-goda-vse-smogut-vajb-kodit-videoigry-s-pomoshhyu-ii</guid>
      <description><![CDATA[<p>Google обещает, что до конца 2025 года любой сможет вайб-кодить видеоигры с ИИ — создавать их словами без единой строчки кода</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/google-poobeshhala--chto-do-konca-goda-vse-smogut-vajb-kodit-videoigry-s-pomoshhyu-ii">Google пообещала, что до конца года все смогут вайб-кодить видеоигры с помощью ИИ</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 28 Oct 2025 06:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Google <a href="https://www.bleepingcomputer.com/news/google/google-says-everyone-will-be-able-to-vibe-code-video-games/">заявила</a>, что уже к концу 2025 года любой пользователь сможет вайб-кодить собственные видеоигры — буквально создавать их, просто описывая идею словами.</p><p>Об этом рассказал Логан Килпатрик, продакт-лид Google AI Studio, в посте на X.</p><h2>Что такое вайб-кодинг</h2><p>Термин vibe coding (от англ. vibe — «ощущение», «настроение») появился в 2024 году и описывает подход к программированию, где разработчик не пишет код вручную, а общается с ИИ в свободной форме, задавая лишь общие направления: «сделай RPG про кота-самурая», «добавь погодные эффекты», «пусть враги становятся умнее».</p><p>Пока этот подход работал только с простыми проектами вроде сайтов и мобильных приложений, но Google обещает вывести его на новый уровень.</p><h2>Что умеет новый AI Studio</h2><p>По словам компании, обновленный <b>Google AI Studio</b> «понимает задачу и автоматически подбирает нужные модели, API и инструменты».</p><p>Например, если пользователь захочет сделать приложение, генерирующее изображения по промтам, AI Studio сам подключит соответствующий API (в данном случае — Nano Banana API) и настроит всю инфраструктуру.</p><blockquote><i>«Мы сделали процесс создания мощных, функциональных и ИИ-дополненных приложений максимально простым»,</i> — говорится в блоге Google.</blockquote><p>Теперь платформа сможет не только генерировать код, но и <b>автоматически подключать нужные сервисы, базы данных и библиотеки</b>, превращая процесс в полноценный гибрид no-code подхода с вайб-кодингом.</p><h2>Теперь и для игр</h2><p>Килпатрик уточнил, что уже к концу года пользователи смогут вайб-кодить не только веб-приложения, но и простенькие видеоигры.</p><blockquote><i>«Это откроет путь для новых 100 млн разработчиков. Многие мечтают сделать игру, но спотыкаются о C++, C# и Unreal Engine. Теперь они смогут создавать истории, персонажей и геймплей — без единой строчки кода»,</i> — написал он.</blockquote><p>Разумеется, до уровня <i>Civilization</i> или <i>Baldur’s Gate</i> дело не дойдет. По словам Килпатрика, речь идет о «небольших проектах для друзей», где игроки сами управляют сюжетом и механикой.</p><h2>Скепсис и ожидания</h2><p>Пока даже самые продвинутые ИИ-инструменты едва справляются с генерацией простых 2D-игр вроде <i>Wordle</i> или <i>Flappy Bird</i>.</p><p>Поэтому эксперты воспринимают обещания Google с осторожностью — для по-настоящему автономного вайб-кодинга нужно, чтобы ИИ умел проектировать архитектуру, писать оптимизированный код и тестировать его без участия человека.</p><p>Тем не менее, Google, по слухам, готовит к релизу <b>Gemini 3.0</b>, который может радикально улучшить креативные и кодогенерационные возможности.</p><p>Если планы компании сбудутся, то к концу года видеоигра мечты может начаться не с кода, а с фразы:</p><blockquote><i>«Сделай мне космический шутер, где коты сражаются против пылесосов».</i></blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Space Invaders «с нуля» — часть 4: обработка ввода и механика стрельбы</title>
      <link>https://tproger.ru/articles/space-invaders--s-nulya----chast-4--obrabotka-vvoda-i-mehanika-strelby</link>
      <comments>https://tproger.ru/articles/space-invaders--s-nulya----chast-4--obrabotka-vvoda-i-mehanika-strelby?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/space-invaders--s-nulya----chast-4--obrabotka-vvoda-i-mehanika-strelby</guid>
      <description><![CDATA[<p>Четвёртая часть цикла о создании клонов классических аркадных игр. В этой статье вы узнаете, как реализовать управление игроком с клавиатуры и добавить стрельбу в Space Invaders на C++. Разбираем обработку событий GLFW, движение, столкновения и снаряды.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/space-invaders--s-nulya----chast-4--obrabotka-vvoda-i-mehanika-strelby">Space Invaders «с нуля» — часть 4: обработка ввода и механика стрельбы</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 21 Oct 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это перевод <a href="https://nicktasios.nl/posts/space-invaders-from-scratch-part-4.html">статьи</a> автора Nick Tasios. Мы уже публиковали <a href="https://tproger.ru/articles/space-invaders--s-nulya----chast-1--sozdayom-okno">перевод первой части</a> с настройками окна и контекста, <a href="https://tproger.ru/articles/space-invaders--s-nulya----chast-2--nastraivaem-wejdery-opengl-i-risuem-sprajt-priwelca">перевод второй части</a> с настройкой шедеров и отрисовкой спрайта и <a href="https://tproger.ru/articles/space-invaders--s-nulya----chast-3--sozdayom-klon-igry-s-minimumom-zavisimostej">перевод третьей части</a> про создание клона игры на C++ с минимумом зависимостей. В этой части добавим обработку ввода от игрока с клавиатуры и механику стрельбы снарядами. Код четвёртой части можно посмотреть в <a href="https://github.com/Grieverheart/space_invaders/blob/caac012ff35bd925e788bb972f41a3a1ad14457a/main.cpp">репозитории на Github</a>.</p><h2>Реализация обработки нажатий клавиш в GLFW</h2><p>GLFW использует callback-функции (обратные вызовы) для передачи важных событий — аналогично той, которую мы реализовали ранее для перехвата ошибок. Поэтому неудивительно, что нам нужно создать соответствующую callback-функцию для обработки событий ввода.</p><p>Callback-функция должна иметь следующую сигнатуру:</p><p>и устанавливается с помощью функции GLFW glfwSetKeyCallback.</p><p>Сначала реализуем простую callback-функцию для обработки нажатия клавиши Esc. Когда мы определим, что эта клавиша нажата, игра будет завершаться. Так мы сможем быстро проверить, что обратный вызов работает корректно.</p><p>Для этого добавим глобальную переменную, которая будет использоваться для отслеживания состояния выхода из игры.</p><p>Мы устанавливаем для неё значение true перед запуском основного игрового цикла. Дополнительно, внутри главного цикла мы проверяем, остаётся ли эта переменная равной true.</p><p>Если она изменится (например, после нажатия клавиши Esc), это будет сигналом к завершению работы программы.</p><p>если нет — цикл завершается, происходит корректный выход из игры.</p><p>Наконец, реализуем саму callback-функцию обработки клавиш, которая будет вызываться при каждом событии нажатия или отпускания клавиши.</p><p>Здесь параметр mods указывает, были ли нажаты какие-либо модификаторы клавиш — например, Shift, Ctrl и другие. Scancode — это системный код клавиши, который в данном случае мы не используем.</p><p>И наконец, при инициализации окна мы устанавливаем callback-функцию GLFW, чтобы она вызывалась при каждом событии клавиатуры.</p><p>Если всё сделано правильно, вы сможете выйти из игры, нажав клавишу Esc.</p><h2>Добавляем движение игрока</h2><p>Чтобы сделать игру интереснее, добавим возможность управлять движением игрока с помощью стрелок на клавиатуре — влево и вправо.</p><p>Для начала создадим глобальную переменную, которая будет указывать направление движения игрока.</p><p>Мы делаем это, присваивая значение +1 для стрелки вправо и –1 для стрелки влево.</p><p>Если одна из клавиш нажата, её значение добавляется к move_dir; если отпущена — вычитается. Например, если обе клавиши нажаты одновременно, то move_dir = 0.</p><p>Эту логику реализуем, добавив два дополнительных случая (case) в наш callback функции обработки клавиш.</p><p>В основном цикле, после отрисовки игры, мы добавляем логику для обновления позиции игрока на основе нажатий клавиш.</p><p>Это делается просто: в каждой итерации игрового цикла мы проверяем значение move_dir и изменяем координату player.x в соответствии с направлением движения — например, уменьшая её при движении влево и увеличивая при движении вправо.</p><p>Таким образом, позиция игрока будет постоянно обновляться в зависимости от ввода с клавиатуры.</p><p>Во внутренних операторах if мы сначала проверяем случаи, когда игрок находится близко к границе игрового поля.</p><p>В таком случае мы ограничиваем движение спрайта игрока, чтобы он оставался внутри границ игры.</p><h2>Добавим стрельбу</h2><p>Добавление стрельбы снарядами (пулями) немного сложнее. Как и в предыдущем разделе, мы добавляем глобальную переменную, которая будет указывать, нажата ли кнопка выстрела.</p><p>Привязываем выстрел к клавише пробела (Space), добавив ещё один блок switch case в функцию обработки нажатий клавиш (key callback).</p><p>Существует несколько способов реализовать стрельбу снарядами. Изначально, насколько я помню, в игре мог присутствовать только один снаряд одновременно.</p><p>В данном случае я выбрал вариант, при котором снаряд выпускается каждый раз, когда игрок отпускает кнопку выстрела.</p><p>Затем мы добавляем новую структуру для снарядов (projectiles) — аналогично тому, как ранее создавались структуры для игрока (Player), пришельцев (Aliens) и других игровых объектов.</p><p>Переменная dir указывает направление движения снаряда — вверх (в сторону пришельцев, значение +) или вниз (в сторону игрока, значение -).</p><p>Прошу прощения за то, что в коде я называю снаряды «Bullets» (пули) — это связано с тем, что изначально я использовал именно это обозначение.</p><p>Далее мы определяем максимальное количество снарядов, которые могут одновременно отображаться в игре, и добавляем их в структуру Game, чтобы управлять ими наряду с игроком и пришельцами.</p><p>При инициализации игры мы задаём количество пуль:</p><p>game.num_bullets = 0,</p><p>а также добавляем спрайт для снаряда (projectile), который будет использоваться при его отрисовке на экране.</p><p>Как вы можете видеть, сейчас снаряд отображается в виде небольшой вертикальной линии.</p><p>В основном игровом цикле (main loop) мы отрисовываем снаряды аналогично тому, как ранее рисовали пришельцев, проходя по массиву активных пуль и отображая каждую из них в текущем положении на экране.</p><p>После отрисовки мы обновляем позиции снарядов, добавляя значение dir (направление движения).</p><p>Если какой-то снаряд выходит за пределы игрового поля, мы удаляем его из массива активных объектов. Для этого используется распространённый приём: вместо сдвига всех элементов массива, удаляемый элемент перезаписывается последним элементом массива, а общее количество снарядов (num_bullets) уменьшается на единицу.</p><p>Такой способ позволяет эффективно управлять массивом без избыточных операций копирования и обеспечивает стабильную производительность даже при большом числе активных снарядов.</p><p>Наконец, обработка выстрелов игрока выполняется в конце основного игрового цикла (main loop).</p><p>На этом этапе программа проверяет, нажата ли клавиша стрельбы (в нашем случае — пробел) и есть ли место для добавления нового снаряда в массив пуль. Если оба условия выполнены, создаётся новый объект снаряда: ему присваиваются начальные координаты (позиция игрока), направление движения вверх (dir = +1) и он добавляется в список активных снарядов.</p><p>Так реализуется базовая механика стрельбы, при которой каждый выстрел инициируется действием игрока в конце цикла обновления игры.</p><p>Так мы задаём направление движения снаряда dir = +2.</p><h2>Нам нужно больше пришельцев для вторжения</h2><p>В данный момент снаряды не взаимодействуют с пришельцами — они просто пролетают через ряды инопланетян и исчезают в пустоте. Если мы действительно хотим остановить инопланетное вторжение, нужно сделать наши снаряды более «боевыми». Но прежде чем реализовать столкновения, давайте добавим больше типов пришельцев.</p><p>В оригинальной аркадной игре Space Invaders присутствует три типа пришельцев, отличающихся только спрайтами. Кроме того, мы добавим ещё один тип — «мертвого пришельца», чтобы реализовать анимацию уничтожения.</p><p>В коде это удобно реализовать при помощи перечисления (enum), где каждый элемент будет представлять тип пришельца — например, ALIEN_TYPE1, ALIEN_TYPE2, ALIEN_TYPE3 и ALIEN_DEAD.</p><p>Такое решение делает код более читаемым и упрощает работу с логикой поведения, отрисовки и анимации каждого типа врагов.</p><p>Добавляем флаг в структуру Alien, который указывает тип пришельца.</p><p>Затем мы сохраняем спрайты пришельцев в виде массива, индексируемого по типу пришельца и индексу кадра анимации. Таким образом, каждый тип врага (например, обычный, продвинутый или «мертвый») может иметь собственный набор спрайтов, а также отдельные кадры для анимации движения.</p><p>Такой подход делает код компактным и позволяет легко обновлять внешний вид или поведение конкретного типа пришельца без дублирования логики для каждого спрайта.</p><p>Обратите внимание, что мы также добавили спрайт смерти — изображение, которое будет отображаться, когда пришелец уничтожен.</p><p>Чтобы отслеживать момент гибели каждого пришельца и управлять временем показа этого спрайта, мы создаём массив счётчиков смерти (death counters). Каждый элемент массива соответствует одному пришельцу и хранит значение, показывающее, сколько игровых циклов прошло с момента его уничтожения.</p><p>Это позволит постепенно убирать уничтоженных врагов с экрана после короткой анимации, создавая плавный визуальный эффект, характерный для оригинальных аркадных игр.</p><p>На каждом кадре, если пришелец уничтожен, мы уменьшаем счётчик смерти на единицу. Когда счётчик достигает нуля, пришелец удаляется из игры — то есть больше не отображается и не участвует в логике столкновений.</p><p>При отрисовке пришельцев теперь нужно проверять значение счётчика смерти: если оно больше нуля, значит пришелец недавно погиб, и мы показываем спрайт смерти; если счётчик равен нулю — пришелец полностью исчезает с экрана.</p><p>Таким образом, спрайт смерти отображается примерно 10 кадров, создавая короткую анимацию уничтожения, прежде чем враг полностью исчезнет.</p><p>Обратите внимание, что мы дополнительно обновили цикл отрисовки, чтобы отображать соответствующий спрайт пришельца в зависимости от его типа.</p><p>Счётчики смерти (death counters) обновляются в отдельном цикле, который выполняется до обновления снарядов.</p><h2>Взрывы</h2><p>Теперь у нас наконец-то есть всё необходимое, чтобы реализовать самый зрелищный элемент Space Invaders — взрывы пришельцев!</p><p>Чтобы добавить эту механику, нам нужно проверять столкновения пуль с живыми пришельцами во время обновления их позиций. Если снаряд попадает в активного пришельца, мы фиксируем попадание, запускаем анимацию смерти и засчитываем уничтожение цели.</p><p>Мы перебираем всех пришельцев в цикле и используем функцию sprite_overlap_check, чтобы определить, перекрываются ли два спрайта.</p><p>Проверка выполняется простым способом — мы сравниваем прямоугольные области спрайтов и определяем, есть ли пересечение между ними.</p><p>Если спрайт пули перекрывается со спрайтом пришельца, мы удаляем пулю из игры и изменяем тип пришельца на ALIEN_DEAD.</p><p>Обратите внимание: мы используем упрощённый способ выравнивания спрайта смерти, поскольку в игре пока не реализована корректная обработка центрирования спрайтов.</p><p>Если вы скомпилируете код, представленный в этом разделе, вы сможете взорвать парочку пришельцев!</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-10-21/6ea6b4ed-d0be-4fe5-b6c9-fabc4d9fecaa.png" alt="" /></figure><h2>Заключение</h2><p>В этом разделе мы настроили самый важный элемент, который делает игру — игрой: интерактивность. С помощью GLFW мы привязали клавиши управления для движения игрока и стрельбы снарядами.</p><p>Хотя игра пока находится на ранней стадии и далека от завершения, уже сейчас можно получать удовольствие, отстреливая пришельцев. Получать удовольствие от процесса — важнейшая часть разработки игр, ведь именно она порождает эксперименты и новые идеи.</p><p>Мы увидели, что можно создать прототип игры на низкоуровневом языке программирования с минимальными усилиями. Более того, этот код легко переиспользовать для других 2D-проектов.</p><p>В следующем посте мы добавим инструменты для вывода текста на экран и научимся отслеживать и отображать счёт игрока.</p>]]></content:encoded>
    </item>
    <item>
      <title>Space Invaders «с нуля» — Часть 3: создаём клон игры с минимумом зависимостей</title>
      <link>https://tproger.ru/articles/space-invaders--s-nulya----chast-3--sozdayom-klon-igry-s-minimumom-zavisimostej</link>
      <comments>https://tproger.ru/articles/space-invaders--s-nulya----chast-3--sozdayom-klon-igry-s-minimumom-zavisimostej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/space-invaders--s-nulya----chast-3--sozdayom-klon-igry-s-minimumom-zavisimostej</guid>
      <description><![CDATA[<p>В третьей части серии «Space Invaders с нуля» мы переходим от основ к геймплею: добавляем игрока и рои пришельцев, вводим анимацию спрайтов и делаем игровой цикл на фиксированном шаге времени с V-sync. Пошагово разбираем, как структурировать данные и оживить игровую сцену на C++.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/space-invaders--s-nulya----chast-3--sozdayom-klon-igry-s-minimumom-zavisimostej">Space Invaders «с нуля» — Часть 3: создаём клон игры с минимумом зависимостей</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[OpenGL]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 16 Oct 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это перевод <a href="https://nicktasios.nl/posts/space-invaders-from-scratch-part-3.html">статьи</a> автора Nick Tasios. Мы уже публиковали <a href="https://tproger.ru/articles/space-invaders--s-nulya----chast-1--sozdayom-okno">перевод первой части</a> с настройками окна и контекста и <a href="https://tproger.ru/articles/space-invaders--s-nulya----chast-2--nastraivaem-wejdery-opengl-i-risuem-sprajt-priwelca">перевод второй части</a> с настройкой шедеров и отрисовкой спрайта. В этой части создадим клон классической аркадной игры Space Invaders на C++, используя минимум зависимостей.</p><p>В этой части мы сделаем несколько ключевых шагов:</p><ul><li>реализуем игровой цикл с фиксированным временным шагом,</li><li>добавим игрока и пришельцев,</li><li>и, наконец, добавим анимацию спрайтов.</li></ul><p>Этот этап превращает наш базовый прототип в настоящую игру — с управлением, движением врагов и визуальной динамикой. Код третьей части можно посмотреть в<a href="https://github.com/Grieverheart/space_invaders/blob/2d5007b62ef044f9e47b8660d26810d9ea6de636/main.cpp"> репозитории на Github</a>.</p><h2>Добавление игрока и роя пришельцев</h2><p>Прежде чем добавить игрока и рой пришельцев, создадим два агрегата данных — то есть структуры (struct):</p><p>И у структуры игрока, и у структуры пришельца есть координаты позиции x и y, заданные в пикселях относительно нижнего левого угла окна. В структуру Player также добавляется поле с количеством жизней игрока.</p><p>В классических аркадных играх Space Invaders существует три типа пришельцев, которые отличаются только своими спрайтами. Этот параметр мы кодируем в поле type.</p><p>Кроме того, мы вводим отдельную структуру, предназначенную для хранения всех переменных, связанных с состоянием игры.</p><p>Это включает ширину и высоту игры в пикселях, объект игрока и массив пришельцев, выделяемый динамически.</p><p>Как и ранее, мы добавляем спрайт для игрока, закодированный в виде растрового изображения (bitmap).</p><p>Затем мы создаём и инициализируем структуру Game.</p><p>Мы задаём количество пришельцев равное 55 — как в оригинальной аркадной игре, — даём игроку 3 жизни и размещаем его рядом с нижней центральной частью экрана. Затем инициализируем позиции пришельцев, выбрав для них разумные координаты.</p><p>Наконец, в основном игровом цикле мы отрисовываем игрока и всех пришельцев.</p><p>Получаем вот такой результат:</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-10-16/b18012d2-4d3e-4faf-81e9-02f622b2ce40.png" alt="" /></figure><p>Это уже начинает напоминать Space Invaders, но пока всё довольно статично!</p><h2>Анимация спрайтов</h2><p>Чтобы сделать игру более динамичной, нам, конечно, нужно реализовать ввод от игрока, но также требуется способ анимировать спрайты. Анимация спрайтов в видеоиграх достигается заменой текущего спрайта последовательностью спрайтов один за другим. Поэтому мы создаём структуру данных для хранения различной информации об анимации спрайта.</p><p>Структура SpriteAnimation по сути представляет собой массив Sprite. Здесь мы используем тип «указатель на указатель» для хранения спрайтов, чтобы их можно было шарить (совместно использовать). Если хочется повысить эффективность, спрайты можно упаковать в атласы (spritesheets). Кроме того, мы добавляем флаг, указывающий, нужно ли зацикливать анимацию или воспроизводить её лишь один раз, интервал между последовательными кадрами и время, проведённое в текущем экземпляре анимации. Зная число кадров и желаемую длительность анимации, интервал между кадрами легко вычислить. Ниже мы вводим дополнительный спрайт для нашего инопланетянина…</p><p>…и создаём двухкадровую анимацию, используя два спрайта пришельца.</p><p>Обратите внимание: чтобы упростить задачу, мы измеряем длительность кадра и время в игровых циклах — то есть в количестве итераций игрового цикла. Чтобы это работало корректно, нужно зафиксировать частоту кадров. Для простой игры, подобной нашей, можно использовать V-sync — опцию, при которой обновления видеокарты синхронизируются с частотой обновления монитора.</p><p>Большинство современных мониторов имеют частоту обновления 60 Гц, что означает обновление экрана 60 раз в секунду. Включив V-sync, мы получим частоту кадров 60 FPS или кратное значение, синхронизированное с частотой дисплея.</p><p>Однако есть и недостаток: на мониторах с более высокой частотой обновления, например, 120 Гц или 240 Гц, игра будет работать быстрее. Чтобы включить V-sync, вызывается функция GLFW:</p><p>В конце каждого кадра мы обновляем все анимации, увеличивая значение времени.</p><p>Если анимация дошла до конца, мы либо удаляем её, либо сбрасываем время обратно в 0, если это зацикленная анимация.</p><p>Обратите внимание, что на данный момент у нас есть только одна анимация, которую нужно обновлять.</p><p>В основном цикле, где происходит отрисовка пришельцев, мы изменяем цикл рисования так, чтобы отображался соответствующий кадр анимации.</p><p>Нужный кадр вычисляется на основе времени, прошедшего с начала анимации, и длительности одного кадра.</p><p>Чтобы сделать процесс более интересным, мы также добавляем простое движение игрока, введя переменную, которая управляет направлением его движения…</p><p>…и обновляем положение игрока в конце каждого кадра в зависимости от значения этой переменной.</p><p>Условия if выполняют простую проверку столкновений спрайта игрока с границами игрового поля, гарантируя, что игрок остаётся внутри этих границ.</p><p>Выше вы можете видеть анимированный GIF с результатом.</p><h2>Заключение</h2><p>В этом посте мы создали несколько структур (struct), чтобы логически сгруппировать данные для игры, игрока и пришельцев. Ещё важнее то, что мы заложили основу для анимации спрайтов. Для этой простой версии Space Invaders мы используем фиксированные игровые циклы, задав постоянную частоту кадров с помощью включения вертикальной синхронизации (V-sync). Это позволяет нам выполнять анимацию спрайтов в игровых циклах, а не в реальном времени.</p><p>Единственное, что остаётся сделать, прежде чем игра станет играбельной, — реализовать обработку пользовательского ввода. Источников ввода может быть много, но в нашем случае мы ограничимся клавиатурой.</p>]]></content:encoded>
    </item>
    <item>
      <title>Space Invaders «с нуля» — Часть 2: настраиваем шейдеры OpenGL и рисуем спрайт пришельца</title>
      <link>https://tproger.ru/articles/space-invaders--s-nulya----chast-2--nastraivaem-wejdery-opengl-i-risuem-sprajt-priwelca</link>
      <comments>https://tproger.ru/articles/space-invaders--s-nulya----chast-2--nastraivaem-wejdery-opengl-i-risuem-sprajt-priwelca?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/space-invaders--s-nulya----chast-2--nastraivaem-wejdery-opengl-i-risuem-sprajt-priwelca</guid>
      <description><![CDATA[<p>Как написать собственный клон Space Invaders на C++ с помощью OpenGL: создание буфера, работа с шейдерами, текстурами и спрайтами. Подробное руководство для начинающих гейм-девелоперов и энтузиастов графики.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/space-invaders--s-nulya----chast-2--nastraivaem-wejdery-opengl-i-risuem-sprajt-priwelca">Space Invaders «с нуля» — Часть 2: настраиваем шейдеры OpenGL и рисуем спрайт пришельца</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[OpenGL]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Oct 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это перевод <a href="https://nicktasios.nl/posts/space-invaders-from-scratch-part-2.html">статьи</a> автора Nick Tasios. <a href="https://tproger.ru/articles/space-invaders--s-nulya----chast-1--sozdayom-okno">Перевод первой части</a> мы уже публиковали: там настроили окно и контекст. Во второй части настроим шейдеры OpenGL, чтобы отрисовать спрайт пришельца! Спрайт (sprite) — это двумерное графическое изображение, которое используется для отображения объектов в играх и интерфейсах. Если проще — картинка персонажа, предмета или эффекта, которая выводится на экран поверх фона. Код для действий этой части можно посмотреть в <a href="https://github.com/Grieverheart/space_invaders/blob/10c9f24eec222d66a22ee1868ae598a6803eea1d/main.cpp">репозитории на GitHub</a>.</p><h2>Рендеринг на стороне CPU</h2><p>GPU отлично справляется с обработкой больших объёмов данных, но программировать графический процессор сложнее, чем CPU. Для простого клона Space Invaders, который я создаю здесь, проще выполнять всю отрисовку на центральном процессоре (CPU), используя буфер — участок памяти, представляющий собой пиксели игрового экрана. Затем этот буфер можно передать на GPU в виде текстуры и вывести на экран компьютера.</p><p>Буфер имеет определённую ширину и высоту. Мы представляем каждый пиксель в виде значения типа uint32_t, что позволяет хранить четыре 8-битных компонента цвета для каждого пикселя. В нашем случае мы будем использовать только 24 бита — по 8 бит для красного (red), зелёного (green) и синего (blue) каналов. Можно возразить, что логичнее было бы использовать uint8_t, но я применяю 32-битное значение, потому что так проще работать с индексами при обращении к элементам массива. Чтобы использовать эти типы целых чисел с фиксированной разрядностью, необходимо подключить стандартный заголовочный файл:</p><p>Чтобы упростить определение цветов в виде значений типа uint32_t, мы создадим следующую функцию:</p><p>Эта функция устанавливает три старших байта (24 бита) в значения r, g и b соответственно.</p><p>Оставшиеся 8 младших битов заполняются значением 255 — хотя, как упоминалось ранее, альфа-канал (прозрачность) в нашем случае не используется. Далее мы создаём функцию, которая очищает буфер, заполняя его указанным цветом.</p><p>Эта функция проходит по всем пикселям буфера и устанавливает для каждого заданный цвет.</p><p>Теперь, в главной функции (main), мы инициализируем буфер — то есть создаём область памяти, где будут храниться все пиксели экрана:</p><p>Этот код создаст буфер с шириной buffer_width и высотой buffer_height, а также заполнит его цветом clear_color, то есть зелёным.</p><h2>Шейдеры OpenGL</h2><p>После того как мы создали буфер, нам нужно настроить OpenGL, чтобы иметь возможность вывести его содержимое на экран. В современном OpenGL большая часть обязанностей, которые раньше выполнял драйвер, теперь ложится на разработчика. Он должен сам писать небольшие программы, которые выполняются на видеокарте (GPU) — такие программы называются шейдерами (shaders).</p><p>OpenGL определяет конвейер рендеринга — последовательность этапов, через которые проходит изображение перед выводом на экран. Шейдеры могут выполняться на разных стадиях этого конвейера.</p><p>Старый OpenGL иногда называют fixed pipeline — «фиксированный конвейер», поскольку его этапы были заранее определены и не могли быть изменены программистом.</p><p>В современном OpenGL почти все этапы программируемы, и основные среди них два:</p><ul><li>Vertex Shader (вершинный шейдер) — обрабатывает данные вершин, обычно выполняет трансформацию объектов в координаты экрана.</li><li>Fragment Shader (фрагментный шейдер) — работает с пикселями, полученными после растеризации. Он определяет их цвет, глубину и, при необходимости, трафаретные значения (stencil).</li></ul><p>Эти два шейдера — минимально необходимые для работы любого рендеринга в OpenGL.</p><p>Хотя с помощью шейдеров можно создавать невероятно сложные визуальные эффекты, в этом проекте мы построим два простых шейдера, которые просто выведут содержимое нашего буфера (из предыдущего шага) на экран.</p><p>Обычно для отображения изображения нужно создать квад (quad), который покрывает весь экран. Однако существует известный трюк — можно сгенерировать полноэкранный треугольник, не передавая в шейдер вообще никаких вершинных данных.</p><p>Для фрагментного шейдера нам просто нужно считать значение из текстуры буфера и вывести результат этого выборочного чтения.</p><p>Обратите внимание, что выходное значение вершинного шейдера TexCoord теперь используется как вход для фрагментного шейдера. Хотя вершинному шейдеру не требуется передавать какие-либо данные о вершинах, мы всё же должны указать, что будем рисовать три вершины. Для этого создаётся объект вершинного массива (VAO).</p><p>Если упростить, VAO (Vertex Array Object) — это структура в OpenGL, которая хранит формат вершинных данных вместе с самими данными вершин. Наконец, оба шейдера нужно скомпилировать в код, понятный GPU, а затем связать их в единый шейдерный программный объект.</p><p>В приведённом выше фрагменте кода шейдерная программа сначала создаётся с помощью функции <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glCreateProgram.xhtml">glCreateProgram</a>. Отдельные шейдеры создаются функцией <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glCreateShader.xhtml">glCreateShader</a> и компилируются с помощью <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glCompileShader.xhtml">glCompileShader</a>. После этого они присоединяются к программе через glAttachShader, после чего сами объекты шейдеров можно удалить.</p><p>Программа связывается вызовом <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glLinkProgram.xhtml">glLinkProgram</a>. Во время компиляции OpenGL выводит различную информацию — аналогично тому, как это делает компилятор C++. Однако, чтобы получить эти сообщения, их нужно перехватывать вручную. Для этого созданы две простые функции: validate_shader и validate_program.</p><h2>Текстура буфера</h2><p>Для передачи данных изображения на GPU используется текстура OpenGL. Как и в случае с VAO, текстура также объект, который вместе с данными изображения содержит информацию о формате этих данных. Сначала текстура создаётся с помощью функции <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glGenTextures.xhtml">glGenTextures</a>.</p><p>Затем задаём формат изображения, а также некоторые стандартные параметры, определяющие поведение выборки текстуры.</p><p>Здесь мы указываем, что изображение должно использовать 8-битный RGB-формат для внутреннего представления текстуры. Последние три параметра вызова <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml">glTexImage2D</a> определяют формат пикселей данных, которые мы передаём в текстуру: каждый пиксель находится в формате RGBA и представлен четырьмя беззнаковыми 8-битными целыми числами.</p><p>Два первых вызова <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glTexParameter.xhtml">glTexParameteri</a> сообщают GPU не применять фильтрацию (сглаживание) при чтении пикселей. Два последних указывают, что при попытке чтения за пределами текстуры будет использоваться значение на границе.</p><p>Теперь нам нужно привязать текстуру к uniform-переменной sampler2D во фрагментном шейдере. В OpenGL существует несколько текстурных единиц, к которым может быть привязан uniform. Мы получаем расположение uniform-переменной в шейдере (его можно рассматривать как своего рода «указатель») с помощью <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glGetUniformLocation.xhtml">glGetUniformLocation</a> и устанавливаем её на текстурную единицу 0 с помощью вызова <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glUniform.xhtml">glUniform1i</a>.</p><h2>Отображение буфера</h2><p>Наконец, мы настроили всё необходимое, чтобы вывести буфер на экран. Непосредственно перед запуском игрового цикла мы отключаем тест глубины и привязываем созданный ранее объект вершинного массива (VAO).</p><p>Если теперь вызвать:</p><p>То содержимое созданного окна должно отобразиться зелёным цветом.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-10-08/c93c2af0-fd33-483f-a745-434e6836636e.png" alt="" /></figure><h2>Отрисовка спрайта</h2><p>В предыдущем посте мы уже создали окно и вывели на экран цвет. Заканчивать эту часть на том же этапе было бы скучно — так что теперь давайте что-нибудь нарисуем.</p><p>Сначала я определяю простой спрайт:</p><p>Это просто участок данных, размещённых в куче, вместе с указанием ширины и высоты спрайта. Сам спрайт представлен в виде битовой карты (bitmap) — то есть каждый пиксель кодируется одним битом, где значение 1 означает, что пиксель спрайта включён (“on”).</p><p>Далее мы создаём функцию, которая отрисовывает спрайт в буфере с заданным цветом.</p><p>Функция просто проходит по пикселям спрайта и рисует активные (“on”) пиксели по указанным координатам, если они находятся в пределах границ буфера.</p><p>Альтернативно можно представить спрайт так же, как и буфер — то есть каждый пиксель хранится как 32-битное RGBA-значение, где альфа-канал используется для прозрачности или смешивания.</p><p>В главной функции (main) мы создаём спрайт пришельца (alien sprite).</p><p>Чтобы нарисовать красный спрайт в позиции (112, 128), вызываем:</p><p>Чтобы подготовиться к следующим шагам, мы очищаем буфер и рисуем спрайт на каждом кадре игрового цикла. Для обновления текстуры OpenGL вызываем функцию <a href="https://registry.khronos.org/OpenGL-Refpages/gl4/html/glTexSubImage2D.xhtml">glTexSubImage2D</a>.</p><p>Если скомпилировать и запустить финальный код из этого поста, то вы увидите красную текстуру в центре зелёного фона.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-10-08/9fa3aee4-f307-4890-9603-a857e74c1bad.png" alt="" /></figure><p>В этом посте мы подготовили всё необходимое, чтобы отрисовывать спрайты на CPU и выводить их в окно, созданное ранее. В современном OpenGL это требует определённого объёма работы — мы затронули такие темы, как объекты вершинных буферов, шейдеры и текстуры.</p><p>Теперь, когда базовые функции отрисовки готовы, можно переходить к более интересной части — программированию игровой логики. Разберём это в следующей статье.</p>]]></content:encoded>
    </item>
    <item>
      <title>Space Invaders «с нуля» — Часть 1, создаём окно</title>
      <link>https://tproger.ru/articles/space-invaders--s-nulya----chast-1--sozdayom-okno</link>
      <comments>https://tproger.ru/articles/space-invaders--s-nulya----chast-1--sozdayom-okno?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/space-invaders--s-nulya----chast-1--sozdayom-okno</guid>
      <description><![CDATA[<p>Старт серии по созданию клона Space Invaders на C++: настраиваем окно и контекст OpenGL 3.3 с GLFW и GLEW, собираем проект и запускаем первый «красный» кадр.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/space-invaders--s-nulya----chast-1--sozdayom-okno">Space Invaders «с нуля» — Часть 1, создаём окно</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[OpenGL]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Xcode]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 02 Oct 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это перевод <a href="https://nicktasios.nl/posts/space-invaders-from-scratch-part-1.html">статьи</a> автора Nick Tasios.</p><p>Автор написал клон классической аркады Space Invaders на C++, опираясь всего на пару зависимостей. В этой части мы подготовим окно и контекст OpenGL 3.3, используя GLFW и GLEW — это единственные внешние библиотеки, которые понадобятся на старте.</p><h2>Что такое Space Invaders</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-10-01/491e2f60-9c59-4936-bd1e-0932e65000be.png" alt="" /></figure><p>Space Invaders — аркадная игра 1978 года. Это 2D-шутер с горизонтальным управлением: игрок двигает пушку вдоль нижней границы экрана и стреляет по строю инопланетян. За каждого сбитого врага начисляются очки. Периодически по верхней части экрана пролетает НЛО — если сбить, получите бонусные очки. По мере уничтожения инопланетян игра ускоряется. Враги тоже стреляют случайно, приближаясь к низу экрана; попадание по игроку отнимает жизнь. Пушку частично прикрывают бункеры, но они постепенно разрушаются как под выстрелами врагов, так и самим игроком. После зачистки волны появляется новая, а бункеры восстанавливаются. Игра заканчивается, если бункеры полностью разрушены, инопланетяне достигли низа экрана или у игрока закончились жизни.</p><h3>Постановка целей</h3><p>Важно определить цели до начала проекта. Мы не собираемся дотошно воссоздавать оригинал — сделаем «space-invaders-like» прототип с базовыми элементами. В геймдеве обычно сначала собирают «грубый» прототип, чтобы проверить ядро механик, а «полировать» будем позже.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-10-01/721c66cf-7153-45fb-90a7-655561da422e.png" alt="" /></figure><p>В прототипе нужны:</p><ul><li>управляемая игроком пушка;</li><li>волны инопланетян, которые постепенно движутся к пушке;</li><li>стрельба у обеих сторон.</li></ul><p>НЛО и бункеры на первом этапе опустим (их несложно добавить потом).</p><p>Почти любую игру можно разложить на базовые элементы (очень советую <a href="https://www.youtube.com/watch?v=zyVTxGpEO30">доклад</a> Raph Koster). В Space Invaders это движение и стрельба (а значит — детекция столкновений). Даже простой клон поможет прокачать понимание геймлупа, коллизий и правил игры.</p><p>Поехали!</p><h2>Hello Window</h2><p>Окно можно создать по-разному: нативные API (Cocoa/X11/WinAPI) или кроссплатформенные библиотеки (Qt, GLFW). Нативный путь даёт полный контроль, но ради простоты и кроссплатформенности возьмём GLFW: лёгкая, простая C-API.</p><p>Подключим заголовки (стандартный ввод/вывод и GLFW):</p><p>Это откроет окно 640×480 с заголовком Space Invaders и контекстом OpenGL. Два последних параметра glfwCreateWindow — монитор для фуллскрина и «шаринг» контекста между окнами. При неудаче вызываем glfwTerminate(). Важно: нужно «привязать» контекст текущему потоку (glfwMakeContextCurrent), чтобы последующие вызовы OpenGL применялись к нему.</p><p>По умолчанию версия контекста не гарантируется — попросим минимум 3.3 Core (задать до создания окна):</p><p>Почему нужен загрузчик функций OpenGL. OpenGL — это спецификация; реализация зависит от GPU/драйвера/ОС. Множество функций нужно загружать в рантайме. Делать это вручную неудобно, поэтому используют лоадеры. Здесь — GLEW (можно и GLAD, но в статье выбран GLEW).</p><p>Важно: подключаем GLEW до glfw3.h:</p><h2>Игровой цикл (Game loop)</h2><p>Если запустить код сейчас, окно мигнёт и программа завершится. Нужен бесконечный game loop, где мы обрабатываем ввод, обновляем состояние и рисуем кадр:</p><ul><li>Буферы. Современный OpenGL рисует в «задний» буфер, а «передний» отображается на экране. glfwSwapBuffers() меняет их местами.</li><li>События. glfwPollEvents() вынимает накопившиеся события (клавиатура, мышь, закрытие окна).</li><li>Выход. glfwWindowShouldClose() станет true, если пользователь нажал «крестик».</li></ul><p>В конце корректно освобождаем ресурсы:</p><h2>Компиляция</h2><p>Ниже — команды из оригинала (C++11), плюс современные примечания.</p><p>Обратите внимание, что позже мы будем использовать некоторые функции C++11, поэтому компилируем с помощью -std=c++11. В обоих случаях убедитесь, что у вас установлен GLFW 3. В Linux, в зависимости от вашего дистрибутива, вы можете использовать менеджер пакетов. Например, в Ubuntu GLFW можно установить с помощью следующей команды:</p><p>На Mac OS X автор предпочитает использовать <a href="https://brew.sh/">Homebrew</a>:</p><p>Возможно, <a href="https://www.monocilindro.com/2017/02/14/how-to-install-glfw-library-on-visual-studio-c-2015/">эта статья</a> поможет вам настроить проект GLFW в Visual Studio.</p><p>Если всё собрано успешно, вы увидите красное окно с заголовком Space Invaders.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-10-01/49e56b4a-e080-4074-91b4-b289af58fba1.png" alt="" /></figure><h2>Итоги</h2><p>Даже просто «поднять окно» с контекстом OpenGL на C++ — задача не из быстрых, несмотря на помощь GLFW. Мы пока ничего не рисуем; настройка простейшего рендера в современном OpenGL тоже требует подготовки. Хорошая новость — делать это придётся один раз, а дальше вы переиспользуете базу в следующих частях (шейдеры, VBO/VAO, спрайты, коллизии и т. д.).</p><p>Вторая часть статьи — <a href="https://tproger.ru/articles/space-invaders--s-nulya----chast-2--nastraivaem-wejdery-opengl-i-risuem-sprajt-priwelca">здесь</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Мое видение универсального языка программирования</title>
      <link>https://tproger.ru/articles/moe-videnie-universalnogo-yazyka-programmirovaniya</link>
      <comments>https://tproger.ru/articles/moe-videnie-universalnogo-yazyka-programmirovaniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Миша Разаков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/moe-videnie-universalnogo-yazyka-programmirovaniya</guid>
      <description><![CDATA[<p>Рассмотрим теоретическое создание универсального языка программирования. Плавно перейдем к идее языка-конструктора. Вас ждет погружение в модульную архитетуру, лямбда-исчисления, байткод, расширяемое программирование

</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/moe-videnie-universalnogo-yazyka-programmirovaniya">Мое видение универсального языка программирования</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Архитектура ПО]]></category>
      <category><![CDATA[Haskell]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 30 Aug 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Предисловие</h2><p>В этой статье будет много моих выводов, гипотез и идей. Это моя первая статья, поэтому буду рад услышать аргументированную критику. В статье часто используется псевдокод, чей синтаксис напоминает смесь C#, C++ и Python.</p><h2>Немного о терминологии</h2><p>Много времени я программирую на C#, и в этом языке существуют некоторые термины, которые могут ввести в заблуждение программистов на C++:</p><ul><li>Под словом коллекция я подразумеваю любой набор элементов: список, массив, стек, куча, итератор, множество и т.п.</li><li>Говоря список, я подразумеваю динамический массив</li></ul><h2>Язык программирования – инструмент</h2><p>Языки можно поделить на две большие группы: предметно-ориентированные языки (aka DSL) и языки общего назначения (ЯОП). DSLи точно можно назвать инструментами, так как они по определению решают конкретную задачу. С языками общего назначения все несколько сложнее. ЯОПы имеют техническую возможность реализовать любой алгоритм, то есть полны по Тьюрингу. Но это не значит, что для каждой задачи будет эффективно использовать язык X, ведь язык Y может подходить для решения каких-то задач лучше.</p><p>Под словом “эффективно” я подразумеваю, что программистам будет морально приятно писать код на языке для решения конкретной задачи, а также, что код будет написан за минимальное количество времени.</p><p>Рассмотрим банальный пример. C# лучше использовать для написания бекенда сайтов, чем Си. Используя C#, вы делаете вклад в возможность поддержки проекта, уменьшаете порог входа в проект, пишете платформо-независимый код. Си лучше использовать в задачах, где важна производительность или низкоуровневый доступ к ресурсам. Например при написании runtime библиотеки языка, игрового движка или кода под микроконтроллеры с небольшими ресурсами.</p><p>Также некоторые языки имеют хорошую поддержку сообщества в каких-то специфических областях. Например C# и C++ – доминируют в создании игр, Python и R – преобладают в data science, JavaScript и PHP – в создании сайтов и т.п. В силу своих реализаций не все ЯОП могут решать задачи друг друга эффективно. Интерпретируемый язык никак не может быть также быстр в исполнении, как статически компилируемый, но может выигрывать в скорости кодирования.</p><p>В итоге приходим к выводу, что язык программирования, даже общего назначения, – это просто инструмент, который умеет выполнять задачи эффективно только из своей области.</p><h2>А в чем проблема?</h2><p>Проблемы начинаются тогда, когда мы обнаружим, что используемый язык программирования по какой-то причине не умеет решать специфическую задачу своей области эффективно. Например C# не всегда бывает лаконичен: иногда не хватает функциональной парадигмы или нет возможностей сократить лишний синтаксис при композиции. В таких случаях придется смириться и реализовывать функционал через костыли, например, создавая лишние интерфейсы, нужные чтобы обойти запреты языка.</p><p>Python не станет быстрым, C++ не будет хорошо подходить для написания скриптов, а Fortran не получит современный синтаксический сахар.</p><p>Если вы программировали на C# и Unity, возможно, вы писали какие-нибудь математические функции или методы-расширения. Я с разочарованием для себя обнаружил, что Unity использует C# 9-той версии, в которой нет обобщенной арифметики (ее введут в C# 11). Скорее всего, красиво и лаконично реализовать какой-нибудь метод SquareMagnitude не получится: придется писать одну и ту же реализацию для каждого типа по отдельности (дженерики не помогут: нет обобщающего интерфейса).</p><p>Помимо этих реализаций, было бы неплохо иметь реализацию с типами: byte, sbyte, ushort, uint, ulong, decimal. Хорошо, что метод SquareMagnitude достаточно маленький, но если бы это был большой метод, код стал бы еще хуже. Принцип DRY (don’t repeat yourself) плачет в сторонке.</p><h2>Extensible Programming</h2><p>Решением видится расширяемое программирование (<a href="https://en.wikipedia.org/wiki/Extensible\\_programming">Extensible Programming</a>) – это парадигма программирования, когда расширяемость возводится в абсолют. Возможности языка не фиксированы, а могут быть расширены. Программист пишет не только расширяемые модульные программы, но и программирует на расширяемом языке. Программист имеет возможность изменять синтаксис языка, исполняемый движок (компилятор/интерпретатор/JIT’а и т.п.), среду исполнения (environment) – все то, что мы называем Toolchain’ом языка. Эта парадигма позволяет кастомизировать язык программирования, добавлять eDSL (embedded DSL, встроенные в язык. Как пример: LINQ в C#). Зачастую кастомизация даже представляется как одно из основных средств программирования. Например, на расширяемом языке есть возможность добавлять новые синтаксические конструкции, изменять AST, байткод, контролировать процесс компиляции, изменять среду исполнения и т.п. Самые известные из расширяемых языков: Ruby, Lisp, Lua.</p><p>Предлагаю посмотреть <a href="https://habr.com/ru/articles/571182/">эту статью</a> на хабре, в которой демонстрируется пример написания простенького генератора кода для элегантных лямбд на Lua. Это пример расширяемого синтаксиса языка. Ruby тоже имеет расширяемый синтаксис, например для него написана библиотека <a href="https://rubygems.org/gems/superators19">superators19</a>, позволяющая <a href="https://stackoverflow.com/questions/11874579/define-custom-ruby-operator">добавлять новые операторы</a> в язык.</p><p>Конечно, расширяемое программирование нужно не всем, но эта парадигма – мощный инструмент для сложных систем, которым важны какие-то аспекты языка, которые не идут из коробки. Не всегда в языке не хватает каких-нибудь мелочей по типу лаконичности синтаксиса, но и таких важных механизмов, как верифицируемости корректности исполнения, формального распараллеливания и т.п. Используя расширения, можно добавлять такие механизмы, которые не были реализованы ранее или улучшать уже имеющиеся имплементации. Подобные фичи – достаточно сложные и реализовать их на уровне, например, препроцессора, невозможно. Приходится использовать более глубокое внедрение в используемый язык.</p><h2>Моя модель идеального языка программирования</h2><p>Идея заключается в возможности построить микро-язык на модульной архитектуре, который будет содержать в себе ядро и несколько дополнительных модулей для его комфортного расширения. Сам микро-язык будет не очень полезен, но на его основе можно будет сделать диалекты, которые уже можно будет считать полноценными языками общего назначения. При надобности, программист сможет отключать, модифицировать или добавлять модули в язык. Так язык превратится в набор модулей, буквально конструктор. Чтобы внести изменения в язык, будет достаточно понимать его работу в целом, а также понимать работу только тех модулей, с которыми предстоит работать.</p><p>Например, представим что JavaScript сделан по данной идее, и хочется добавить в язык рантайм-проверку типов (на минуту забудем про существование TypeScript). Можно было бы написать модуль, который добавляет немного нового синтаксиса в объявление переменных, обрабатывает AST (т.е. использует модуль парсера) и добавляет в каждое использование переменной/поля/т.п. проверку на ее тип.</p><p>Псевдо-код реализации модуля мог бы выглядеть как-то так:</p><h2>Абстрактные детали реализации</h2><p>Итак, какие задачи языка мы имеем на данный момент? ЯП должен:</p><ul><li>иметь возможность расширять свои frontend, middle-end, backend</li><li>иметь простой API для расширения</li><li>поддерживать большинство парадигм (функциональное, декларативное программирование)</li></ul><p>Сначала разберемся с первыми двумя задачами. Как уже было сказано ранее, архитектура языка будет модульной. Значит нужно просто для каждого модуля предусмотреть возможность интеграции с другими модулями. При этом желательно предоставить интуитивный API для доступа к различным частям модуля. Кроме того, каждому модулю не плохо иметь свое краткое описание работы, ведь для написания своих модулей придется иметь понимание всех модулей, которые должны использоваться.</p><p>Рассмотрим пример с созданием простейшего фронтенда. Простой фронтенд может быть разделен на небольших модуля: лексер и парсер. Допустим, программист захотел добавить препроцессор перед лексером. Какой удобный API можно предоставить? По моему мнению, хорошо подходят события. Пусть лексер и парсер имеют события OnPreprocess и OnPostprocess. Таким образом, например, программист будет иметь возможность обработки последовательности лексем уже после ее генерации. Также программист сможет изменять AST уже после его генерации.</p><p>Но как добавлять новые правила построения дерева или лексемизации текста? Можно создать методы по типу AddLexerRule, AddParserRule, которые будут принимать в себя экземпляры классов, имплементирующих интерфейсы ILexerNodeBuilder и IParserNodeBuilder. Но стоит учесть, что в большинстве языков грамматика не самая простая, а значит, что парсер желательно делать по мощности LR(k), LALR(k) или ALL(*). Возможно стоит сделать небольшой DSL для этих модулей, так как это сильно упростит поддержку языка в дальнейшем (или использовать уже готовый, такой как ANTLR). DSL поможет программистам не погружаться в технические подробности реализации и достаточно просто добавлять изменения в грамматику.</p><p>Но как же коллизии имен? Конечно, они будут возникать гораздо чаще, поэтому стоит предусмотреть некое подобие namespace’ов. Например, если в начале файла написано use parser.math, то парсер активирует дополнение к текущей грамматике, добавляющее математические операторы.</p><h2>Модули</h2><p>Что, если язык окажется сложным? Например, парсер будет очень тяжелым, язык будет использовать супероптимизаторы или просто модуль окажется проприетарным. В таком случае желательно иметь возможность разбросать модули по разным физическим местам. Например, чтобы разместить супероптимизатор в облаке, парсер поставить на компьютер с бОльшим количеством оперативной памяти, а доступ к проприетарному модулю давать только через web-request’ы (чтобы нельзя было получить исходный код).</p><p>Хорошим решением оказывается представлять модули как web-сервисы. Это делает модули гораздо более гибкими. Плюсы модулей как веб-сервисов:</p><ul><li>можно расположить в разных физических местах</li><li>IDE будет способна контролировать все процессы языка – особенно удобно, если нужно глубокое понимание языка, например просмотр промежуточных представлений</li><li>при возникновении потребности можно легко использовать утиную типизацию над модулями</li><li>можно использовать вообще любые языки программирования и технологии</li><li>модули гораздо проще воспринимать как логически разделенные части – повышается гибкость системы и уменьшается ее связность</li></ul><p>Буквально получается язык программирования на микросервисах. Возможно, сначала покажется, что такой подход сильно замедлит процесс компиляции, но, скорее всего, это скажется достаточно незначительно. На моем слабеньком ноутбуке запросы к локальным веб-серверам почти никогда не превышали 10мс, а значит чтобы добиться задержки хотя бы в половину секунды, придется сделать 50 запросов. Стоит учитывать, что общение между модулями происходит не очень часто, поэтому, думаю, беспокоиться о сильном замедлении не стоит.</p><p>Стоит заметить, что я предлагаю использовать модули как веб-сервисы исключительно на этапе компиляции. Конечно, модули, которые используются в рантайме должны быть сделаны эффективно, чтобы не создавать серьезного замедления исполнения.</p><h2>Парадигмы</h2><p>Язык программирования должен поддерживать большинство существующих парадигм. Но основными являются императивное и функциональное программирование. С возможностью написания модулей, из них строятся все остальные парадигмы.</p><p>Рассмотрим поддержку функционального программирования. Как известно, сердце функциональной парадигмы – это лямбда-исчисления. Думаю, что как ядро языка – отлично подойдут чистые нетипизированные лямбда-исчисления. Уже с помощью модулей можно дополнять λ-исчисления до system F, λ-исчислений с зависимыми типами или других исчислений. То есть достраивать ядро до нужной мощности и уже на имеющейся основе строить язык. Также фишка такого подхода в том, что, используя синтаксический сахар и монады, в язык можно добавить лаконичное императивное программирование. Но стоит быть аккуратным с чистыми функциями. Нужно учесть, что функция не будет чистой, если внутри себя она использует платформозависимые функции или вызывает внешние нечистые функции.</p><p>Но язык, ядром которого будут лямбда-исчисления, скорее всего, не будет иметь возможности быть оптимально скомпилирован под популярные архитектуры (x86-64, ARM, RISC-V). Для языков, которым важна производительность, размер программы, потребление памяти и т.п., предлагаю ввести иное ядро. Это ядро должно быть универсальным для любого императивного языка программирования, а также должно иметь возможность глубоких оптимизаций.</p><p>У ядра на лямбда-исчислениях есть еще некоторые проблемы: я не придумал, как устранить зависимости между модулями в такой реализации, поэтому, возможно, будет хорошо эмулировать работу исчислений на байткоде императивного языка. Будет написан еще один модуль, превращающий промежуточное представление лямбда-исчислений в байткод (не скупимся на количество IR’ов ради гибкости и удобства).</p><h2>Байткод императивного языка</h2><p>Итак, ядро императивного языка программирования, конечно, будет представлять собой байткод. Сначала я думал использовать какую-нибудь видоизмененную машину Тьюринга, но решил, что она слишком сильно оторвана от текущих процессоров и нет смысла даже пытаться адаптировать ее под современные системы. Самая сложная задача проектирования байткода – он должен подходить под любой императивный язык, но при этом иметь возможность оптимизировать выходной код настолько, насколько это возможно. Сразу же хочется добавить поддержку LLVM для статической компиляции, а также компиляцию в dotnet bytecode, java bytecode для поддержки JIT компиляции. Если тщательно формализовать байткод, то даже есть надежда написать супероптимизатор на middle-end уровне.</p><p>Сделать один универсальный байткод, конечно, невозможно. Снова прибегнем к модульной архитектуре. Пусть инструкция байткода представляет собой такой тип:</p><p>То есть кортеж из типа байткодовой инструкции и трех списков. Изначально байткод будет иметь только один тип инструкции: call. Массивы содержат только <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BB%D0%B5%D0%B3%D0%B0%D1%82_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)">делегаты</a> на функции (указатель + сигнатура + доп. информация). Байткод буквально представляет собой <a href="https://ru.wikipedia.org/wiki/%D0%A8%D0%B8%D1%82%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4">шитый код</a> (threaded code) – массив вызовов функций (но не обязательно чистых). Массивы различаются лишь порядком применения операций. В массив [0] добавляются делегаты, которые должны быть исполнены перед делегатами массивов [1] и [2]. Грубо говоря получаем делегаты, которые обязательно должны быть исполнены перед или после исполнения других делегатов. Зачем это нужно, рассмотрим позже. Стоит отметить, что вместо таких массивов подошел бы также multiset&lt;(float, delegate)&gt; делегатов (отсортированный список по приоритету вызовов).</p><p>Существует несколько видов байткода: стековый, регистровый и в SSA форме. Для упрощения будем использовать стековый байткод, так как он легко переводится в регистровую и SSA форму. Да и сам по себе, гораздо более абстрактный. Регистровый байткод имеет привязку к количеству регистров, а байткод должен не зависеть от архитектурных особенностей. SSA форма – удобный вариант, но он более сложный. При разработке модулей он может сильно помешать, так как придется “жанглировать” передачами регистров, строить CFG.</p><h2>Продолжение байткода</h2><p>Представим ситуацию. Мы уже имеем минималистичный язык программирования: уже существуют локальные переменные, метки, вызовы внешних функций и другой примитивный функционал. Сейчас типизация динамическая, но хочется внедрить рантайм проверки типов, как в примере с JavaScript. Реализация примерно такая же: добавляем новое правило в лексер, обходим узлы AST с использованием переменной, внедряем assert как ноду перед использованием переменной. Но вдруг программист обнаруживает, что ему не хватает структур в языке. Обычных базовых структур, которые просто хранят значения, в которых нет даже методов (их можно добавить, но без методов проще). Итак, программист написал модуль с поддержкой подобного синтаксиса:</p><p>который превращается в подобный байткод:</p><p>Главная проблема в том, что ни на этапе AST, ни на этапе байткода инструкции LoadField и SetField не получается распознать, как использование переменной. Конечно, на уровне AST невозможно распознать такую конструкцию, так как создаются новые типы нод. А вот с байткодом есть возможность подружиться, если продумать типы инструкций. Можно сказать, что тип инструкции байткода – это ее тег. Первая мысль – делать строгие инструкции, например SetLocal, LoadGlobal, LoadMethodReference и другие. Но проблема таких типов в том, что они слишком конкретны.</p><p>Постараемся развить абстракции. Оставим только инструкции Set и Get, которые будут оперировать интерфейсами (точнее классами/структурами, имплементирующими их) ISettable и IGettable. Чтобы вызвать эти методы, нужны экземпляры классов. Для этого перед каждой установкой или чтением значения будем класть на стек ссылку-обертку на значение. Ссылка, в данном контексте, это не всегда указатель на ячейку памяти. Это абстрактный указатель на само значение. Класс, имплементирующий ISettable и IGettable. Ссылка может быть регистром, реальным указателем или быть ячейкой словаря (map’ы). Рассмотрим пример:</p><p>Как видно, логика написана достаточно абстрактно, нет никакой конкретики. Как работает ISettable – неясно, да и не нужно. Наша задача – написать относительно простой, максимально обобщенный код.</p><p>Инструкции байткода также могут возвращать значения. Первая мысль реализации: как и в обычных функциях, возвращаем значение через return. Но в байткоде встречаются такие инструкции, как swap. Они принимают два значения и возвращают два значения. Поэтому, для удобства, стоит возвращать значения через аргументы-ссылки, предназначенные только для записи (в C# – ключевое слово out). Например:</p><p>Возвращаясь к проблеме типизации и структур, теперь модуль типизации может вставлять проверки перед каждой инструкций типа Set/Get, а модуль структур будет генерировать код установки и получения значений именно через Set и Get. Тут нам и пригодятся три списка делегатов в инструкции. Проверка типов обязана исполнятся перед тем, как основная инструкция будет выполнена, поэтому проверку стоит поместить в нулевой список делегатов. Также плюсом будет то, что модули работают на уровне байткода, а не AST. Это позволит без боли менять фронтенд языка и не переписывать большинство модулей.</p><p>Теперь, понимая смысл трех списков, можем дать им названия: pre-ops, main-ops, post-ops – делегаты, исполняемые, соответственно, до, во время и после совершения основной операции.</p><p>В результате реализации байткода, придерживаясь таких идей, удастся убрать зависимость между модулями. Модуль типизации может ничего не знать о модуле структур. Аналогично модуль сборщика мусора ничего не будет знать о модуле синтаксического сахара.</p><h2>Перфоманс байткода</h2><p>Скорее всего, сложилось ощущение, что при компиляции такого байткода получится очень неэффективный ассемблерный код. В принципе, так и есть. При компиляции без некоторых оптимизаций итоговый код не уберет абстракции, не уберет виртуальные вызовы методов и в принципе не заметит некоторые паттерны, которые можно было бы упростить. Поэтому, если временем компиляции можно немного пожертвовать в пользу перфоманса, нужно в первую очередь (то есть перед всеми остальными оптимизациями) инлайнить все методы шитого кода. Уже после инлайнинга этих методов производить оптимизации. Снова рассмотрим пример:</p><p>Как видно, при достаточно глубоком инлайнинге (2-3 шага) можно сильно упростить код. Уже после инлайнинга, оптимизатор паттернов может сильно упростить некоторые под-коды. Например можно научить оптимизатор распознавать обращение к классу VariableWrapper</p><p>и заменять обращения на их быстрые аналоги (как было показано в примере, переменная была размещена в регистре rax, а не в словаре). Аналогично можно применить и другие оптимизации. А те инструкции, для которых оптимизатор не смог сгенерировать оптимизированный код, будут исполняться как обычно, в лоб. Если написано обращение к словарю, то просто вызываем переданную функцию. Такой подход позволяет писать как высокопроизводительные коды, благодаря оптимизаторам, так и универсальные, если оптимизаторы, например, не умеют компилировать код под какую-то платформу.</p><p>Конечно, качественная компиляция такого байткода – долгий процесс. Поэтому можно контролировать уровни оптимизации. Отключив инлайнинг, свертку констант и т.п., можно добиться достаточно глупой, но быстрой компиляции. Код просто будет представлять собой вызовы функций. И наоборот, задав глубину инлайнинга, включив свертку констант, аллоцируя структуры в регистрах или на стеке, векторизуя обработку данных, можно достичь высокой скорости исполнения.</p><p>Обсуждаемый байткод легко перевести в байткод виртуальной машины dotnet или JVM. Также не сложно перевести в LLVM IR, чтобы уже этот фреймворк применял сильные оптимизации.</p><h2>Рассматриваем узкие места</h2><h2>Дебаггинг</h2><p>Возможно отладка станет проблемой при фиксе ошибок компиляции байткода. Не плохой идеей кажется отслеживание, какие инструкции байткода были сгенерированы какими модулями, чтобы потом искать ошибку именно в них. Реализовать это можно достаточно просто через инкапсуляцию логики в классе коллекции байткода. Аналогичное замечание относится и к AST, ассемблерному листингу и другим промежуточным представлениям. Также хорошо добавить логирование почти каждого действия при изменении промежуточных представлений. Для совершенствования процесса отладки можно написать простенький интерпретатор этого байткода.</p><h2>Зависимости между модулями</h2><p>В худшем случае, количество зависимостей будет O(n^2), где n – количество модулей. Байткод специально был спроектирован так, чтобы зависимость между модулями была минимальной. Но даже с этим условием все еще стоит стараться делать модули абстрактными и подумать заранее о написании других модулях, которые смогут расширять его исходные возможности. Когда будет написан модуль с типизацией, нужно подумать, как улучшить имеющиеся абстракции для потенциальных будущих модулей с ее улучшением (вспомним <a href="https://ru.wikipedia.org/wiki/%D0%9B%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0-%D0%BA%D1%83%D0%B1">лямбда-куб</a>).</p><h2>Общее API модулей</h2><p>Также мне нравится идея с веб-сервисами тем, что модулям придется общаться через json’ы. Это сразу заставит продумать API создаваемого модуля. Мучаться с бинарной совместимостью не придется, так как обмен информацией достаточно высокоуровневый и многие проблемы решают такие протоколы как, например, http.</p><h2>Заключение</h2><p>Не думаю, что когда-нибудь будет создан один универсальный язык программирования, который подойдет для решения всех задач. Но, скорее всего, именно удобное окружение и продуманная архитектура поможет создавать языки как конструктор для нужных задач. Нельзя допустить роста множества DSL’ей, где один язык решает одну проблему, чтобы не пришлось каждый день учить новый инструмент, но база модулей помогла бы иметь гораздо более полезный эффект. Не хватает высокоуровневого программирования в системном языке? Подключите модуль с zero-cost абстракциями. Не хватает функционального программирования в ООП языке? Подключите модуль с синтаксическим сахаром, оператором |&gt;, ленивыми вычислениями и <a href="https://en.wikipedia.org/wiki/Uniform_function_call_syntax">unified calls</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>xAI представила grok-code-fast-1 — свою первую ИИ-модель для кодинга и агентных задач</title>
      <link>https://tproger.ru/news/--xai-predstavila-grok-code-fast-1---svoyu-pervuyu-ii-model-dlya-kodinga-i-agentnyh-zadach</link>
      <comments>https://tproger.ru/news/--xai-predstavila-grok-code-fast-1---svoyu-pervuyu-ii-model-dlya-kodinga-i-agentnyh-zadach?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--xai-predstavila-grok-code-fast-1---svoyu-pervuyu-ii-model-dlya-kodinga-i-agentnyh-zadach</guid>
      <description><![CDATA[<p>xAI выпустила grok-code-fast-1 — первую модель для кодинга и агентных задач. Она поддерживает TypeScript, Python, Java, Rust, C++ и Go, интегрирована в IDE и CLI, работает быстро (до 160 ток/с) и стоит дешевле конкурентов</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--xai-predstavila-grok-code-fast-1---svoyu-pervuyu-ii-model-dlya-kodinga-i-agentnyh-zadach">xAI представила grok-code-fast-1 — свою первую ИИ-модель для кодинга и агентных задач</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Aug 2025 11:10:09 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания xAI <a href="https://x.ai/news/grok-code-fast-1">анонсировала</a> <b>grok-code-fast-1</b>. Это первая модель компании, ориентированная на программирование и агентные сценарии.</p><p>Модель создана с нуля, обучена на реальных пулл-реквестах и задачах из практики. Она уже доступна в IDE.</p><h2>Новая глава в «вайб-кодинге»</h2><p>Модель grok-code-fast-1 от xAI позиционируется как конкурент решениям от OpenAI, Google и Anthropic. Она оптимизирована для разработки на <b>TypeScript</b>, <b>Python</b>, <b>Java</b>, <b>Rust</b>, <b>C++</b> и <b>Go</b>, а значит покрывает большинство реальных кейсов в современной разработке.</p><p>Модель уже интегрирована в <i>IDE</i> и <i>CLI</i> вроде <b>GitHub Copilot</b>, <b>Cursor</b>, <b>Cline</b>, <b>Roo Code</b>, <b>Kilo Code</b>, <b>OpenCode</b> и <b>Windsurf</b>. В ближайшее (но ограниченное) время она будет доступна бесплатно.</p><h2>Быстрая, дешевая и довольно-таки умная</h2><p>xAI делает ставку на цену, скорость и удобство. Стоимость использования grok-code-fast-1:</p><ul><li><b>$0,20</b> за 1 млн входных токенов</li><li><b>$1,50</b> за 1 млн выходных токенов</li><li><b>$0,02</b> за 1 млн кэшированных входных токенов</li></ul><p>Во внутреннем бенчмарке <b>SWE-Bench-Verified,</b> модель показала результат <b>70,8%</b>, но независимых тестов пока нет — их ждут в ближайшие недели.</p><p>В xAI утверждают, что при создании модели основное внимание уделялось <b>практическому использованию и удобству в реальных задачах</b>. Якобы разработчики оценили grok-code-fast-1 как «быструю и надежную» при повседневной работе с кодом.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-08-29/0ff28520-4f6d-495d-bb2e-78175b8e78f2.jpeg" alt="" /></figure><h2>До 160 токенов в секунду и 90% кэш-хитов</h2><p>Команды xAI по инференсу и суперкомпьютингу применили ряд новых приемов, чтобы <b>ускорить генерацию до 160 токенов в секунду</b>. Особенно это ощущается в IDE, где задержка — критический параметр.</p><p>Кроме того, реализовано <b>кэширование подсказок</b>, которое обеспечивает <b>до 90% попаданий</b> при работе с GitHub Copilot и другими интеграциями. Это позволяет существенно сократить задержки и стоимость использования.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пробелы, табы и ничего больше: как работает язык программирования Whitespace</title>
      <link>https://tproger.ru/news/probely--taby-i-nichego-bolwe--kak-rabotaet-yazyk-programmirovaniya-whitespace</link>
      <comments>https://tproger.ru/news/probely--taby-i-nichego-bolwe--kak-rabotaet-yazyk-programmirovaniya-whitespace?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/probely--taby-i-nichego-bolwe--kak-rabotaet-yazyk-programmirovaniya-whitespace</guid>
      <description><![CDATA[<p>Язык Whitespace состоит только из пробелов, табов и переводов строк — код невидим, но полностью исполняем и даже может быть полиглотом</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/probely--taby-i-nichego-bolwe--kak-rabotaet-yazyk-programmirovaniya-whitespace">Пробелы, табы и ничего больше: как работает язык программирования Whitespace</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 25 Jul 2025 15:11:40 GMT</pubDate>
      <content:encoded><![CDATA[<p>В Whitespace — одном из самых странных языков программирования — код состоит только из пробелов, табуляций и переводов строки. Все остальные символы игнорируются и используются только как комментарии.</p><p>Это позволяет вставлять работающий код Whitespace <b>в пробелы любого другого кода</b> — и таким образом делать полиглоты: один и тот же файл может одновременно быть, например, Python-скриптом и Whitespace-программой.</p><h2>Как это работает</h2><p>Whitespace — это стековый императивный язык. Он умеет:</p><ul><li>класть числа в стек,</li><li>выполнять арифметику (сложение, вычитание, деление),</li><li>обращаться к куче (heap),</li><li>работать с вводом-выводом,</li><li>прыгать по меткам и вызывать подпрограммы.</li></ul><p>Каждая команда кодируется последовательностью из пробелов (S), табов (T) и переводов строки (L). Например, последовательность T S S (таб, пробел, пробел) складывает два числа из стека.</p><p>Числа кодируются в двоичном формате: S — это 0, T — 1, а знак задаётся первым символом: S — плюс, T — минус. Например, число 75 в Whitespace выглядит так:</p><h2>Кто его придумал</h2><p>Язык придумали <b>Эдвин Брейди</b> и <b>Крис Моррис</b> в 2002 году — те самые, кто позже создали языки <b>Idris</b> и <b>Kaya</b>. Презентовали Whitespace 1 апреля. И многие решили, что это шутка. Которая, по всей видимости, вышла из-под контроля.</p><p>Идея использовать только пробельные символы появилась ещё раньше: в 1997 году <b>Бьёрн Страуструп</b>, автор C++, предложил это также в шутку — как абсурдную эволюцию C++.</p><h2>«Hello, world!» на Whitespace</h2><p>Вот как выглядит программа, которая выводит Hello, world!:</p><p>В этой записи S — пробел, T — табуляция, L — перевод строки. Для людей такая программа полностью невидима: она выглядит как пустой файл, но её можно запустить через интерпретатор.</p><h2>Зачем всё это</h2><p>Whitespace — язык из категории <b>эзотерических</b>.</p><p>Его не используют в продакшене — он создан для развлечения, экспериментов и изучения того, <b>где границы читаемого и исполнимого кода</b>.</p><p>Кроме того, это отличный способ спрятать код в самом неожиданном месте.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что по экологии? Сколько углеродного следа оставляет ваш код</title>
      <link>https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod</link>
      <comments>https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod</guid>
      <description><![CDATA[<p>Узнайте, сколько CO₂ генерирует ваш код в 2025 году и как снизить углеродный след в IT. Практические советы по оптимизации архитектуры, выбору «зеленых» технологий и реальные кейсы компаний. Экологичное программирование — новый тренд для разработчиков и бизнеса.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-po-ekologii--skolko-uglerodnogo-sleda-ostavlyaet-vaw-kod">Что по экологии? Сколько углеродного следа оставляет ваш код</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сбер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 10 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году IT-индустрия потребляет больше энергии, чем крупная европейская страна  в 2010. <a href="https://www.iea.org/">По данным IEA</a> (International Energy Agency), дата-центры и телекоммуникационные сети уже отвечают за 3,7% глобальных выбросов CO₂ — это больше, чем производит авиация.</p><p>Казалось бы, код — это просто текст. Но каждый запрос к API, каждая компиляция и даже холостой цикл требуют энергии. Например, обучение GPT-4 в 2023 году «съело» столько же электричества, сколько 120 домохозяйств за год. А теперь представьте, что таких моделей тысячи, а серверов — миллионы.</p><p>Почему это важно? Во-первых, <a href="https://digital-strategy.ec.europa.eu/">регуляторы ужесточают требования</a>: в ЕС с 2025 года IT-компании обязаны раскрывать углеродный след своих продуктов. Во-вторых, инвесторы все чаще смотрят на ESG-рейтинги — показатели экологического и ответственного производства. В-третьих, оптимизация кода снижает затраты на инфраструктуру.</p><p>Эта статья — не манифест экоактивистов, а руководство для разработчиков, архитекторов и технических директоров компаний (СТО), которые стремятся более эффективные и экологичные проекты.</p><h2>Углеродный след кода: что скрывается за строчками</h2><p>Программное обеспечение — не виртуальный конструктор. Каждая операция требует электричества, а серверы, на которых работает код, часто питаются от невозобновимых источников энергии — например, угля и газа.</p><h3>Откуда берутся выбросы</h3><p>Когда мы говорим об углеродном следе ПО, важно понимать: код не существует в вакууме. Каждая строка, каждый запрос и каждая операция требуют физических ресурсов — электричества, серверного оборудования, систем охлаждения. В 2025 году эта цепочка стала еще сложнее из-за взрывного роста облачных вычислений и ИИ.</p><p>Прямые выбросы — это энергия, которую потребляют серверы при выполнении вашего кода. Например, один средний веб-сервер на AWS EC2 (тип t3.large) в год вырабатывает около 400 кг CO₂ — как небольшой автомобиль, проехавший 2000 км. При этом нагрузка на серверы постоянно растет: с 2020 по 2025 год энергопотребление дата-центров увеличилось на 35%.</p><p>Косвенные выбросы часто упускают из виду. Производство серверного оборудования — процесс крайне энергоемкий. Для создания одной только микросхемы памяти DDR5 требуется около 200 кВт⋅ч энергии — столько же, сколько средний холодильник потребляет за год. А после выхода оборудования из строя лишь 20% компонентов перерабатывается должным образом (<a href="https://globalewaste.org/">Global E-Waste Monitor 2024</a>).</p><p>Системы охлаждения — еще один скрытый источник выбросов. Современные дата-центры работают 24/7, и даже с использованием жидкостного охлаждения на поддержание температуры уходит до 40% всей потребляемой энергии. В жарких странах, ОАЭ или Сингапуре, этот показатель может достигать 50%.</p><p>Яркий пример — крупные языковые модели. Если в 2023 году обучение GPT-4 потребовало ~10 ГВт⋅ч (эквивалент годового потребления 120 домохозяйств), то к 2025 году из-за увеличения размеров моделей этот показатель вырос в 1,5 раза. Один запрос к такому ИИ теперь генерирует около 2 г CO₂ — как если бы вы проехали 10 метров на бензиновом автомобиле.</p><p>Но проблема не только в ИИ. Обычное веб-приложение с посещаемостью 100 000 пользователей в месяц может производить до 1 тонны CO₂ в год — и это без учета мобильных клиентов и API. При этом <a href="https://www.webpagetest.org/eco/">30% этой нагрузки приходится на неоптимизированный фронтенд</a>: тяжелые изображения, избыточные JavaScript-библиотеки и частые запросы к серверу.</p><p>Ситуацию усугубляет географический фактор. Дата-центр в Норвегии, где 98% энергии поступает от ГЭС, будет «чище», чем такой же центр в Польше, где угольные электростанции дают 70% энергии. <a href="https://app.electricitymaps.com/">Разница</a> в углеродном следе может быть 20-кратной для идентичных операций.</p><p>При этом стандарты измерения все еще остаются разрозненными. PUE (Power Usage Effectiveness), который используют Google и Microsoft, учитывает только эффективность инфраструктуры, но не источник энергии. Новый стандарт CUE (Carbon Usage Effectiveness), разработанный в 2024 году, уже включает эти данные, но его поддерживают менее 30% провайдеров.</p><h2>Где код тратит энергию впустую</h2><p>Некоторые части систем особенно вредны для экологии. Главные «пожиратели» ресурсов:</p><ul><li>Неоптимизированные алгоритмы. Сортировка пузырьком (O(n²)) на большом массиве данных может потреблять в 100 раз больше энергии, чем быстрая сортировка (O(n log n)).</li><li>Микросервисный хаос. Архитектура из сотен микросервисов увеличивает нагрузку на сеть. Каждый вызов API между сервисами — это дополнительные 0,5–1 Вт⋅ч.</li><li>Облачные провайдеры. Не все одинаково зеленые. AWS и Google используют 60–70% ВИЭ (возобновляемых источников энергии), но в Азии и Африке их дата-центры часто работают на угле.</li></ul><h3>Как измерить углеродный след</h3><p>В 2025 году появились инструменты, которые помогают оценить влияние кода:</p><ul><li>Cloud Carbon Footprint — анализирует выбросы AWS, GCP и Azure.</li><li>Scaphandre — мониторит энергопотребление серверов в реальном времени.</li><li>Greenframe.io — симулирует нагрузку на веб-приложение и считает CO₂.</li></ul><p>Климатические инициативы в IT больше не просто красивые слова в корпоративных отчетах. В 2025 году за неэффективный код можно получить не только порицание сообщества, но и вполне реальный штраф.</p><p>Европейский союз уже ввел санкции против пяти крупных SaaS-компаний за превышение углеродных квот, а Amazon Web Services выплатила 2,7 млн евро штрафа за неоптимизированные алгоритмы в своих сервисах.</p><h2>Как изменились подходы к разработке</h2><p>Эти тренды нацелены на долгосрочное действие и в перспективе должны полностью изменить текущую концепцию в разработке.</p><h3>Экологичный DevOps — новая реальность</h3><p>Современные системы автоматического масштабирования стали умнее. Kubernetes Horizontal Pod Autoscaler теперь учитывает не только нагрузку на CPU, но и текущий углеродный след дата-центра. Если в регионе пиковое потребление энергии и работают угольные электростанции, система сознательно ограничивает масштабирование.</p><p><a href="https://cloud.google.com/blog">Технология, разработанная Google</a> в партнерстве с WattTime, уже снижает выбросы CO₂ на 27-33% по сравнению с традиционным подходом.</p><p>CI/CD-цепочки тоже стали «зеленее». Вместо запуска полного набора тестов при каждом коммите, современные системы определяют, какие именно модули затронуты изменениями.</p><p><a href="https://carbonrunner.io/features/github-action-runners">GitHub Actions представил Carbon-Aware Runner</a>, который планирует выполнение задач на время максимальной доступности возобновляемой энергии в регионе. По данным Microsoft, это сокращает углеродный след тестирования на 40%.</p><h3>Языки программирования: война за эффективность</h3><p>Rust продолжает набирать популярность не только из-за безопасности, но и благодаря энергоэффективности. Тесты Benchmarks Game показывают, что один и тот же алгоритм обработки данных на Rust потребляет на 38-42% меньше энергии, чем на Python. В 2025 году Rust вошел в топ-5 языков для enterprise-решений, вытеснив Java в 17% крупных проектов.</p><p>Но настоящим открытием стал <a href="https://ziglang.org/documentation/master/">Zig </a>— язык, который сочетает производительность C с простотой синтаксиса. Его компилятор потребляет в 3 раза меньше ресурсов, чем LLVM-бэкенд Rust, что делает его идеальным выбором для встраиваемых систем.</p><h3>ИИ на грани: когда меньше значит лучше</h3><p>TinyML-революция набирает обороты. Современные нейросети для микроконтроллеров занимают менее 256 КБ памяти, но справляются с задачами, которые раньше требовали облачных вычислений.</p><p>Например, новые датчики Nest анализируют звук прямо на устройстве, определяя не только дым, но и тип возгорания. Это экономит до 150 МБ трафика в месяц на одно устройство.</p><p>На фронте больших языковых моделей тоже произошли изменения. Meta* выпустила LLaMA-3 Nano — модель с 500 млн параметров, которая работает на смартфоне и по качеству ответов не уступает GPT-3.5. Ее углеродный след при обучении в 1200 раз меньше, чем у GPT-4.</p><p><i>(*Компания запрещена в РФ)</i></p><h3>Новые правила игры: регуляторы и бизнес</h3><p>С января 2025 года в Евросоюзе действует Углеродный налог на цифровые продукты (Digital Carbon Border Tax). Теперь любое ПО, продающееся в ЕС, должно иметь сертификат углеродной эффективности.</p><p>Для крупных enterprise-решений максимально допустимый углеродный след составляет 500 г CO₂ на 1000 пользователей в месяц. Нарушители платят 7% от оборота продукта в регионе.</p><p>Венчурные фонды радикально изменили подход к инвестициям. <a href="https://www.pwc.com/gx/en/services/sustainability/publications.html">Согласно отчету PwC</a>, 43% фондов требуют ESG-отчетность перед заключением сделки, а 28% вообще не рассматривают стартапы без «зеленой» стратегии. В Кремниевой долине появился первый акселератор Carbon Neutral Startups, который дает бонусы в $50 000 проектам с нулевым углеродным следом.</p><p>Корпорации тоже не остались в стороне. <a href="https://www.microsoft.com/sustainability">Microsoft ввела внутренний углеродный налог</a> — теперь каждое подразделение платит $100 за каждую тонну CO₂, связанную с его продуктами. Эти деньги идут на развитие возобновляемой энергетики.</p><p>Но самое интересное происходит на рынке труда. Разработчики с навыками «зеленого» программирования получают на 15-20% больше предложений. Появилась появилась новая категория навыков — «Устойчивая разработка ПО», а спрос на таких специалистов вырос на 300% за последний год.</p><h2>Как писать «зеленый» код</h2><p>Каждая лишняя операция в коде — это не только миллисекунды процессорного времени, но и реальные граммы CO₂. В 2025 году энергоэффективность кода перестала быть теоретической концепцией и превратилась в конкретный навык, который влияет на карьеру разработчика. Рассмотрим три ключевых направления оптимизации.</p><h3>Оптимизация запросов к базе данных</h3><p>Типичный пример — использование SELECT * вместо явного перечисления полей. Когда приложение запрашивает все поля таблицы users (включая редко используемые avatar_blob или metadata_json), сервер БД тратит дополнительные ресурсы на чтение и передачу этих данных. В крупных системах с миллионами запросов в день это приводит к значительному перерасходу вычислительных ресурсов.</p><p>Современные ORM типа Prisma и Drizzle добавили автоматическую оптимизацию запросов. Теперь при использовании select() они анализируют, какие поля действительно нужны на клиенте, и генерируют оптимальный SQL. В тестах это снижает нагрузку на БД на 12-18%.</p><h3>Работа с циклами и алгоритмами</h3><p>Классическая ошибка — продолжать перебор массива после нахождения нужного элемента. В 2025 году статический анализатор кода в WebStorm и VS Code автоматически предупреждает о таких ситуациях. Особенно критично это для мобильных приложений: лишние итерации цикла на слабых устройствах увеличивают энергопотребление на 5-7%.</p><p>Новые версии JavaScript и TypeScript ввели оптимизированные методы для массивов. Например, array.findLast() работает в 1,5 раза эффективнее ручной реализации с циклом. Для сложных алгоритмов появились «зеленые» библиотеки вроде EcoCollections для Java, которые минимизируют энергопотребление при работе с структурами данных.</p><h3>Сжатие и передача данных</h3><p>Формат Brotli стал новым стандартом для API: он обеспечивает лучшее сжатие, чем gzip, особенно для JSON-ответов. Компания Cloudflare провела эксперимент: после перехода на новую версию Brotli нагрузка на их серверы снизилась на 18%, что эквивалентно годовому потреблению энергии 2000 домохозяйств.</p><p>Но сжатие — не панацея. Грамотное проектирование API может дать больший эффект. GraphQL-подход, где клиент запрашивает только нужные данные, в среднем почти вдвое уменьшает объем передаваемой информации по сравнению с REST. А технология Server-Sent Events (SSE) для реального времени потребляет в 3 раза меньше ресурсов, чем WebSockets, когда не нужна двусторонняя связь.</p><p>Современные фреймворки начали учитывать энергоэффективность. Next.js 15 <a href="https://nextjs.org/blog">представил «зеленый» режим компиляции</a>, который оптимизирует сборку под минимальное энергопотребление. В тестах это дало 8% экономии на процессоре при работе приложения. А Deno 2.0 автоматически кэширует зависимости на уровне ОС, сокращая число повторных загрузок.</p><p>Эти изменения кажутся мелкими, но в масштабах индустрии они имеют огромное значение. Если бы все репозитории на платформе применили базовые оптимизации, глобальное энергопотребление дата-центров сократилось бы на несколько процентов. Для отрасли, которая потребляет 700 ТВт⋅ч в год, это десятки миллионов долларов и тысячи тонн CO₂.</p><h2>Выбор технологий</h2><p>В 2025 году выбор стека технологий влияет не только на производительность, но и на экологичность проекта. Разберем ключевые аспекты, которые помогут снизить углеродный след вашего приложения.</p><h3>Языки программирования: баланс между скоростью и эффективностью</h3><p>Rust и Go продолжают доминировать в высоконагруженных системах. Тесты показывают, что веб-сервер на Rust потребляет на 35-40% меньше энергии при одинаковой нагрузке по сравнению с Node.js. Особенно заметна разница в облачных средах, где каждый ватт на счету.</p><p>C++ остается выбором для задач, где важна предсказуемая производительность. Новый стандарт C++26 добавил энергоэффективные режимы работы алгоритмов STL, что особенно важно для встраиваемых систем.</p><p>Python по-прежнему хорош для прототипирования, но в продакшене его лучше заменять на компилируемые языки. PyPy 8.0 сократил энергопотребление интерпретатора на 25%, но даже с этими улучшениями Python проигрывает Rust в 3-4 раза по эффективности.</p><h3>Базы данных: от малого к большему</h3><p>SQLite — идеальный выбор для небольших проектов и edge-устройств. Его новая версия 3.45 добавила режим «энергосбережения», который снижает потребление на 15% при фоновых операциях.</p><p><a href="https://www.postgresql.org/docs/17/release-17.html">PostgreSQL 17</a> сделал большой шаг в энергоэффективности. Функция автоматического партиционирования теперь учитывает не только производительность, но и энергопотребление. В тестах это дало 20% экономии на крупных аналитических запросах.</p><p>Для высоконагруженных систем появилась альтернатива — ScyllaDB 5.0. Эта Cassandra-совместимая СУБД потребляет втрое раза меньше энергии при аналогичной нагрузке, благодаря полному переписыванию на Rust.</p><h2>Кейсы: что работает, а что нет</h2><p>Российские компании тоже внедряют экологичные IT-решения. МТС разработала мобильное приложение, где пользователи получают бонусы за раздельный сбор мусора — их можно обменять на подписки или скидки. За первый год проект привлек 500 тысяч участников и сократил количество непереработанных отходов в регионах присутствия.</p><p>НИУ ВШЭ, совместно с Росприроднадзором, автоматизировал сбор экологической отчетности с помощью ИИ. Нейросеть анализирует данные с датчиков и заполняет формы вместо специалистов. Это сократило время обработки с 100 до 10 часов в месяц и уменьшило количество ошибок.</p><p>Некоторые архитектурные решения приносят больше вреда, чем пользы. Один московский стартап без необходимости разбил монолитную систему на 50 микросервисов — в результате затраты на инфраструктуру выросли в 3 раза, а углеродный след увеличился на 180%.</p><p>Проблемы возникают и на уровне зависимостей. История с left-pad повторилась в 2024 году, когда один npm-пакет потянул за собой 80 МБ ненужных библиотек. Теперь крупные компании проверяют каждую зависимость через Bundlephobia и устанавливают лимит на размер node_modules.</p><h2>Что нас ждет</h2><p>В 2025 году отрасль стоит на пороге радикальных изменений, которые перевернут наши представления о «зеленом» программировании.</p><p>Супероблака — следующий этап эволюции распределенных вычислений. В отличие от традиционных облачных провайдеров, эти системы автоматически переносят нагрузку между дата-центрами в зависимости от доступности возобновляемой энергии.</p><p><a href="https://cloud.google.com/sustainability">Google уже тестирует эту технологию</a> в Северной Европе: когда в Норвегии дует сильный ветер и ветряные электростанции работают на пике, система переносит вычисления именно туда. По предварительным оценкам, это снижает углеродный след на 18-22% по сравнению со статичным распределением.</p><p>Но настоящий прорыв ожидается в сегменте квантовых вычислений. Хотя современные квантовые компьютеры потребляют колоссальное количество энергии (система IBM Quantum System One требует около 25 кВт⋅ч для работы одного кубита), их потенциал для оптимизации классических алгоритмов огромен.</p><p>В 2024 году исследователи из ЦЕРНа <a href="https://www.nature.com/articles/s41534-024-00859-0">предложили квантовый алгоритм</a>, который сокращает время сложных расчетов в 1000 раз при той же точности. Когда такие решения станут массовыми (прогноз — 2028-2030 годы), энергопотребление дата-центров может сократиться на 30-40%.</p><p>Государственное регулирование становится строже. В 2025 году в силу вступает EU Digital Product Passport — требование указывать углеродный след для всего ПО, продающегося в Европе.</p><p>Компании, которые не смогут предоставить эти данные, столкнутся с дополнительными налогами до 7% от оборота. В ответ на это крупнейшие IT-корпорации создали Carbon Neutral Software Alliance — консорциум по разработке единых стандартов измерения.</p><p>Не отстает и аппаратная часть. Производители чипов переходят на новые техпроцессы: TSMC анонсировала 2-нм процесс, который на 30% энергоэффективнее предыдущего поколения. А стартапы вроде британской ZeroPoint Technologies разрабатывают память с нулевым энергопотреблением в режиме ожидания — технология может сократить энергопотребление серверов на 15%.</p><p><b>Но главный тренд </b>— децентрализация вычислений. Edge-устройства (от смартфонов до промышленных датчиков) становятся мощнее и берут на себя часть нагрузки. Например, новый алгоритм Apple для обработки фото на iPhone 16 выполняет 90% операций локально, а не в облаке. По оценкам компании, это экономит сотни тысяч тонн CO₂ в год только для пользователей в США.</p><p>Однако остаются и <b>проблемы</b>. Бум генеративного ИИ привел к взрывному росту энергопотребления: одна тренировка модели Gemini Ultra потребляет столько же энергии, сколько небольшой город за месяц. OpenAI и Anthropic уже работают над более эффективными архитектурами, но прорыва пока не случилось.</p><p>В ближайшие 3-5 лет нас ждет:</p><ul><li>массовый переход на углеродно-нейтральные дата-центры — к 2027 году их доля превысит 60%;</li><li>внедрение AI-оптимизаторов кода, которые автоматически сокращают энергопотребление;</li><li>появление «зеленых» рейтингов для приложений — аналог энергоэффективности для бытовой техники.</li></ul><p>Компании, внедрившие принципы устойчивого развития в IT, уже в 2025 году получают на больше инвестиций и быстрее проходят аудит регуляторов. Экологичность перестала быть затратой — теперь это конкурентное преимущество.</p><p>Технологии будущего уже здесь. Вопрос в том, насколько быстро мы сможем их адаптировать. Как сказал Дженсен Хуанг из NVIDIA на последней конференции GTC:</p><blockquote>«Следующее десятилетие определит, станет ли IT частью климатического решения или останется проблемой. Выбор за нами».</blockquote><h2>Итоги</h2><p>Экологичность в IT — не благотворительность и не актуальная повестка, а реальная экономия. Плюс работа на перспективу. Оптимизация кода снижает счета за облака и повышает производительность.</p><p>С чего начать? Начните с малого:</p><ol><li>Запустите аудит через Cloud Carbon Footprint.</li><li>Уберите «мусор» из зависимостей.</li><li>Выберите хостинг с ВИЭ.</li></ol><p>Как говорил Дональд Кнут, автор книги «Искусство программирования»:</p><blockquote>«Преждевременная оптимизация — корень всех зол. Но и запоздалая — тоже».</blockquote><p>В 2025 году это актуально как никогда.</p>]]></content:encoded>
    </item>
    <item>
      <title>Микросервисная архитектура: от монолита к гибкой системе</title>
      <link>https://tproger.ru/articles/mikroservisnaya-arhitektura--ot-monolita-k-gibkoj-sisteme</link>
      <comments>https://tproger.ru/articles/mikroservisnaya-arhitektura--ot-monolita-k-gibkoj-sisteme?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/mikroservisnaya-arhitektura--ot-monolita-k-gibkoj-sisteme</guid>
      <description><![CDATA[<p>«Монолит или микросервисы» — вопрос, который до сих пор вызывает споры в IT. СТО Сервисной цифровой платформы в Газпромбанке делится личным опытом перехода к микросервисной архитектуре, разбирает реальные кейсы и объясняет, почему однозначного ответа не существует.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/mikroservisnaya-arhitektura--ot-monolita-k-gibkoj-sisteme">Микросервисная архитектура: от монолита к гибкой системе</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Ретро]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Архитектура приложений]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 27 Jun 2025 08:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет! Меня зовут Андрей Бирюков, я СTO Сервисной цифровой платформы в Газпромбанке. За свою карьеру поработал в нескольких компаниях — от стартапов до крупных корпораций — и видел разные архитектурные подходы.</p><p>И вот начала копиться усталость от обсуждения, что использовать — монолиты или микросервисы. Этот вопрос стал преследовать меня на конференциях, в офисе, в личных сообщениях. Я потратил столько времени на обсуждение этой темы, что иногда хочется просто распечатать какой-нибудь емкий ответ на футболке и ходить в ней на все митапы.</p><p>Шутки шутками, но тема действительно важная. Я прошел путь от классических монолитных приложений до сложных микросервисных, проектировал системы, которые работают под большой нагрузкой, и пришел к выводу, что однозначного ответа здесь не существует. И вообще, «монолит или микросервисы» — это неправильная постановка вопроса.</p><p>Недавно сходил с Витей на запись <a href="https://vkvideo.ru/video-145457488_456239831">подкаста</a> на эту тему и настолько преисполнился, что решил в текстовом виде формализировать свое отношение к теме (я гнался за вами три дня, чтобы сказать, как вы мне безразличны, ага), обобщить то, о чем говорили, и попытаться дать ответ на вопрос «когда микросервисы действительно помогают и как не сойти с ума, если вы с ними работаете». Порассуждаю о проектировании, поддержке, DevOps-культуре и попробую немного заглянуть в микросервисную архитектуру.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-27/98a19000-c584-440e-bf7a-af36d4409a2a.png" alt="" /><figcaption>Подкаст «Техно.Логично»</figcaption></figure><h2>Микросервисы: зачем они нужны и в чем их плюсы</h2><h3>Архитектура приложений: немного базы</h3><p>Под капотом современных приложений обычно скрываются три основные части:</p><ul><li>множество библиотек и зависимостей;</li><li>единый store, в котором живут состояние и данные;</li><li>компоненты, которые нужно собрать, чтобы сделать из них приложение.</li></ul><p>Собрать это все можно по-разному. Можно сложить в монолит, а можно попробовать модульный подход.</p><p>Монолитное приложение — старое доброе приложение, которое, как правило, создают один или несколько разработчиков, потом его дорабатывает армия джунов, синьоров и всех, кто оказался рядом. Каждый «чуть-чуть поправил», и вот уже никто не понимает, почему оно работает, — но трогать страшно. Монолиты пишут и сейчас — все зависит от бизнеса. Если нужно приложение для небольшого проекта, микросервисы могут и не понадобиться.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-27/02011912-2de9-4c86-9de2-44865eb93fab.png" alt="" /><figcaption>Как выглядит монолит</figcaption></figure><p>Однако наступает момент, когда бизнес расширяется, аудитория растет, нагрузка увеличивается — а масштабировать монолит становится все сложнее. Тогда и приходят на помощь микросервисы.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-06-27/739de2ec-05c4-4f68-bf1a-356380611028.png" alt="" /><figcaption>А вот приложение с микросервисной архитектурой</figcaption></figure><p>Масштабировать можно и монолиты, но у них всегда остается какая-то единая точка отказа — например, база данных. Особенно если это реляционная СУБД, завязанная на Oracle или PostgreSQL. Когда база достигает сотен гигабайт или даже терабайт, масштабировать такую штуку становится дорого, больно и ненадежно.</p><h3>Микросервисы — панацея? Не совсем</h3><p>Тренд на микросервисный подход появился в начале 2010-х годов, вместе с проникновением интернета в широкие слои населения. Первый iPhone вышел в 2007 году, люди стали гораздо ближе к интернету, к данным, к информации. Бизнес захотел дотянуться до этой аудитории, и тогда началась диджитализация, сложность систем стала повышаться. Особенно остро это почувствовали крупные организации вроде банков: функциональность увеличивалась, и монолит начал «трещать» не только технически по инфраструктуре, но и по возможностям команд разработки, которые с ним работали.</p><p>Плюсы микросервисов очевидны: масштабируемость, независимая разработка, изоляция компонентов. Но вместе с этим пришли новые проблемы — усложнились мониторинг и поддержка, стали требоваться все новые инструменты, чтобы обеспечивать работу огромной инфраструктуры. Так появился DevOps.</p><h2>Распространение DevOps-культуры и инструменты оркестрации</h2><p>Раньше разработчик писал код, собирал артефакт и перекидывал его через забор в поддержку. Коллеги за забором его деплоили, запускали — и разработчику можно было больше не думать про плоды своей работы.</p><p>В новой реальности количество артефактов, которые нужно перекидывать через забор, кратно выросло. Вместе с этим появилась и стала распространяться DevOps-культура: понимание, что за качественную раскатку в проде отвечает не только команда поддержки, но и разработчики.</p><p>Важно учитывать еще и то, что сложность поддержки кратно увеличилась. Если монолит можно было отдебажить, просто заглянув в логи, то с сотней микросервисов так не получится. Поэтому появились такие инструменты, как централизованное логирование, распределенный трейсинг — и сотни, если не тысячи других, связанных в первую очередь с observability. В таких обстоятельствах DevOps-культура стала особенно важна.</p><h2>Проектируем микросервисы без боли: от стандартов до DDD</h2><h3>Стандартизация — наше все</h3><p>Если каждый микросервис пишет логи в своем формате и использует свои библиотеки, получается зоопарк. Нужно, чтобы были выровнены стек и CI/CD pipeline, существовали одинаковые библиотеки логирования и формат.Микросервисы дают свободу писать на разных языках, но с ней приходит и ответственность: под каждый язык придется придумывать и поддерживать разные инструменты. А это приведет к еще большему увеличению сложности. Так что с языком тоже лучше соблюдать стандартизацию: если пишете на Java, то и решать все проблемы стоит с помощью этого языка.</p><p>При этом иногда другой язык вполне оправдан. Например, просто потому, что Java не может работать с такой высокой скоростью, какая нужна. В некоторых случаях даже на Java приходится писать особым образом, либо можно использовать C++, Go или Rust. Но это скорее исключение из правила.</p><p>Инженеры — натуры увлекающиеся и любят паттерн CV driven development, когда хочется новую технологию потрогать и внедрить у себя. А потом похвастаться этим на каком-нибудь ивенте по принципу «just because I can» («просто потому что могу»). При этом может оказаться, что бизнесу технология особо и не была нужна. Чтобы избегать таких ситуаций, необходим технологический радар — список того, что можно использовать в компании, а что нет. И исключения из такого радара должны приниматься и допускаться очень взвешенно.</p><h2>DDD: как правильно нарезать сервисы</h2><p>Одна из опасностей при проектировании микросервисов — скатиться в очень мелкую гранулярность, когда логика нарезается чуть ли не по отдельной функции на микросервис (на отдельный deployment unit). Это может привести к такой сложности, которой потом будет очень трудно управлять. Такая проблема была, например, у Uber в начале их пути, и им пришлось пересматривать свою архитектуру. Избежать этого помогает Domain-driven design (DDD) — предметно-ориентированное проектирование.</p><p>Вместо того чтобы пилить отдельные сервисы для авторизации, логирования и уведомлений, команда может подумать вот над чем: все это части одного бизнес-контекста — пользовательского доступа. И целесообразно оставить их в одном сервисе. Это и есть DDD в действии.</p><p>Существует и еще одна проблема, с которой DDD помогает справиться, — неправильная нарезка сервисов с точки зрения бизнесовой функциональности. Если не понимать бизнес-контекста, можно получить «распределенный монолит»: будет много отдельно стоящих сервисов, но профита никакого, только все сложности микросервисов плюс проблемы монолита с масштабируемой базой данных. Особенно остро это проявляется, когда изменения в одной части бизнес-процесса (в одном сервисе) влекут за собой изменения еще в трех-четырех-пяти других сервисах.</p><p>DDD помогает выделить bounded context — согласованные по бизнесу участки. Они позволяют более или менее правильно нарезать большой бизнес-функционал на отдельные части.</p><p>Еще один важный принцип правильной архитектуры микросервисов — у каждого микросервиса должна быть своя независимая маленькая база данных (если она вообще нужна).</p><p><b>Два эмпирических правила, которые касаются размера сервисов и помогают понять, правильно ли они спроектированы:</b></p><ul><li>Если вы не можете переписать сервис за две недели, значит, возможно, он неправильно нарезан, и его нужно декомпозировать.</li><li>Если вам страшно браться за переписывание сервиса, значит, он точно кандидат на декомпозицию.</li></ul><p>Внедрение микросервисов: с чего начать?</p><p>С микросервисным подходом есть проблема — нет четкого ответа, куда идти и что делать, чтобы научиться его создавать. Это одна из главных сложностей микросервисной архитектуры, особенно когда только начинаешь с ней работать. Если хочется изучить Spring или Oracle, можно почитать официальную документацию. А к такой большой и необъятной теме, как микросервисы, даже и непонятно, с какой стороны подступиться. Туториала к ней нет, есть только куча статей, подходов и практик. Причем одни практики подойдут конкретной команде, а другие — нет.</p><p>И вот тут возникает реальная сложность, особенно когда вы только начинаете, — глаза разбегаются. Здесь Kubernetes, здесь ELK, здесь Grafana, здесь observability, здесь всякие паттерны отказоустойчивости, CAP-теорема и прочее. Непонятно, куда бежать. И каждый день появляются новые инструменты, которые так или иначе упрощают жизнь.</p><p>Совет: задавайте себе вопрос о каждом инструменте, который вы хотите внедрить (будь то Kubernetes, OpenTelemetry с Jaeger или любой другой) — какую проблему мы решаем, втаскивая его в свою инфраструктуру? Ответ на этот простой вопрос может дать много инсайтов и просветлений.</p><p>Чтобы в первом приближении ознакомиться с темой, можно почитать материалы <a href="https://sre.google/books/">SRE</a> от Google, также будут полезны статьи и книги в<a href="https://martinfowler.com/"> блоге</a> Мартина Фаулера, в том числе <a href="https://martinfowler.com/microservices/">Microservices Guide</a>. Если вам нужна практика, можно попробовать пойти на тот же Udemy, где есть множество курсов по микросервисной архитектуре с хорошими рейтингами и отзывами.</p><p>И вот что важно: при проектировании и внедрении микросервисов лучше избегать «велосипедостроения». Если индустрия уже решила проблему, нет смысла изобретать новое логирование или оркестрацию. Собственное решение вряд ли будет работать лучше, а сил, времени ресурсов на него можно потратить очень много.</p><h2>Поддержка микросервисной архитектуры</h2><p>Мы каждый день используем разные приложения — например, мобильный банк. Если в магазине длинная очередь, а на кассе у вас вдруг вылетает ошибка, — это раздражает. Поэтому у бизнеса нет права на ошибку: мониторинг должен срабатывать раньше, чем клиент успеет заметить, а инциденты необходимо устранять за минуты.</p><p>В крупных организациях микросервисов могут быть сотни: например, в некоторых системах насчитывается почти 700 микросервисов на продакшене. Каждый инстанс еще масштабирован — это тысячи подов, которые постоянно обрабатывают клиентский трафик. И при этом в современных условиях нужно стремиться к доступности системы на уровне четырех девяток (99,99%), то есть к простою всего в несколько минут в год.</p><p>Если вы хотите достичь того, чтобы простой вашего приложения был минимальным, приходится продумывать много разных подходов, приемов и инструментов.</p><h3>Паттерны отказоустойчивости</h3><p>Микросервисы — это не про «разбили монолит», это про то, что сбой одного сервиса не должен валить весь продукт. Поэтому если какой-то важный сервис упал, то максимум, который нужно сделать, — чтобы клиент не увидел упавший кусочек функционала приложения.</p><p>Еще один хороший вопрос: как мониторить аварии? Необходимо очень быстро находить точку отказа. Для этого, собственно, и нужен observability-подход, трейсинг. Нужно смотреть, где какой RPS (число запросов в секунду), не произошло ли резкого скачка трафика, важно следить за latency (задержками).</p><p>Бывали случаи, когда из-за бага в мобильном приложении трафик внезапно удваивался, и системы не выдерживали такой нагрузки. Любая малейшая задержка в самом незначительном компоненте может привести к тому, что по цепочке пойдет отказ, — будут копиться потоки, соединения, и рано или поздно упадет вообще все. Чтобы подготовиться к таким ситуациям, важно изучить хотя бы <a href="https://sre.google/sre-book/monitoring-distributed-systems/">четыре «золотых сигнала» мониторинга</a> из SRE от Google.</p><p>Совет: возьмите на вооружение парадигму проектирования на отказ. Исходите из того, что в любой момент что угодно может пойти не так. Сеть будет нестабильной, железо начнет падать, интеграции станут работать неправильно. Если изначально придерживаться этого принципа, вы здорово подстрахуете себя завтрашнего. Это всегда спасает, особенно когда получаешь по наследству что-то, что не было спроектировано с учетом этого принципа.</p><p>Сейчас часто используют паттерны, которые помогают поддерживать отказоустойчивость системы:</p><ul><li><b>Circuit Breaker</b> — если сервис спамит ошибками, лучше временно прекратить попытки до него достучаться. Для клиента ничего не изменится, он как получал ошибки, так и будет получать. Но, по крайней мере, можно дать системе возможность восстановиться. А еще лучше — позволить ей переключиться на какой-то резервный канал, например сходить в кэш с неактуальными данными.</li><li><b>Rate Limiter</b> — абсолютно банальная, но необходимая вещь. Нужно ограничивать входящий поток на примерно максимальном уровне от того, который ожидается. Чтобы все не развалилось, если произойдет резкий скачок трафика.</li><li><b>Blue-Green Deployment</b> — значительно снижают на продакшене количество аварий и проблем, связанных с кривыми релизами. Можно не раскатывать новую фичу сразу на все 100 подов, а выкатить ее только на 1% трафика и проверить.</li></ul><p>И это только малая часть паттернов.</p><p>Все это must have для абсолютно любой системы. Даже если у вас низкая нагрузка, она когда-нибудь увеличится. Лучше вовремя предусмотреть это, заранее потратив чуть больше времени и реализовав эти паттерны.</p><h3>Как эффективно работать с инцидентами</h3><p>Начало всех начал в траблшутинге — мониторинг. Здорово, когда разработчики понимают, как устроена их система, и уже вложились в мониторинг: есть дашборд, где можно посмотреть по уровням абстракций основные точки отказа.</p><p>Первый уровень — это application-слой, сами сервисы, которые в подах крутятся в Kubernetes. Нужно проверить, все ли у них хорошо по точкам интеграции — нет ли тайм-аутов. Все ли в порядке у них по железу — по CPU, по памяти, по дискам.</p><p>Если на первом уровне все нормально, нужно опуститься на уровень ниже — либо на виртуалки, на которых Kubernetes развернут, либо на железки, если он развернут на Bare-metal. Недавно мы столкнулись с интересным случаем: виртуалка показывала нормальную загрузку CPU, но физический гипервизор, на котором она крутилась, был загружен на 99%. Естественно, виртуалка страдала, но уровнем выше этого не было видно.</p><p>Совет: если вы вдруг нашли что-то, что еще не мониторится, — это повод поскорее добавить эту метрику, начать ее мониторить и ретроспективно отслеживать.</p><p>Еще одна важная вещь в работе с инцидентами — культура постмортемов. Ретроспективы по каждой аварии пишутся не просто так — их можно свести по категориям и понять, из-за чего чаще всего происходят аварии: например, из-за протухших сертификатов либо человеческого фактора в конфигурации. Категорий причин отказа обычно не так много. С постмортемами проще выработать стратегию технического инженерного развития.</p><p>Вообще, человеческий фактор — это отдельная боль. Все привыкли менять что-нибудь руками: заходить в виртуалки, поправлять конфиг. Чтобы такого было как можно меньше, важно вкладываться в infrastructure as a code и даже everything as a code. В идеале следует стремиться к zero access production — нулевому доступу к продакшену — и все раскатывать через Git, через конфигурации, включая политики безопасности.</p><h2>Культура ответственности и изменение ролей в команде</h2><p>Представим, что происходит инцидент — падают 15 микросервисов. Как должна быть устроена система, которая позволит оперативно справляться с авариями?</p><p>Организационно все достаточно просто — хотя не так просто на земле, при устранении инцидента. Все сервисы должны быть каталогизированы, сгруппированы по командам или продуктовым стримам. Необходима матрица эскалации, позволяющая найти по зоне ответственности человека, которому можно позвонить и попросить подключить необходимых инженеров.</p><p>Подобную конструкцию важно поддерживать в актуальном состоянии. Это часть процесса непрерывности, и в нее надо вкладываться. В крупных компаниях этим занимаются целые отделы, в небольших организациях — отдельный человек, но такая информация всегда должна быть в общем доступе. Иначе время «отскока» после инцидента увеличится кратно.</p><p>Желательно, чтобы в компании был специальный ситуационный центр, в котором сразу можно создать конференцию, если случилась авария, и поделиться информацией, чтобы все подключились к решению проблемы.</p><p>Однако эти организационные моменты еще не гарантируют быстрого решения проблемы. Ключевой фактор — культура компании. На людей часто нападает отстраненность — авария случилась, и все думают: «Кто-нибудь другой разрулит. Я разработчик, ну, что я там сделаю?»</p><p>Многие привыкли жить по старой парадигме: написали код, потестировали, отдали поддержке и забыли. Но культура в команде должна дорасти до такого уровня, когда каждый понимает: я не только разрабатываю или тестирую код, но еще и отвечаю за него на продакшене.</p><p>Из-за этого разрыва в осознании между командами поддержки и разработки возникают конфликты. У каждой разные цели, и зачастую одна команда не понимает, чего хочет другая. Чтобы лучше понять природу этих конфликтов, важно вспомнить про DevOps-культуру и SRE. В их парадигме разработчики не только пишут код, но и деплоят в продакшен.</p><p>Проще говоря, есть два варианта взаимодействия с поддержкой: классический, когда она административно отделена, и SRE-подобный, когда сотрудники «второй линии» прямо интегрированы в команду разработки. Могу сказать, что второй эффективнее.</p><p>При этом не обязательно сливать всех в одну плоскую структуру на уровне административного деления. Достаточно, чтобы люди, даже находясь в разных административных юнитах, работали как команда и коммуницировали постоянно, а не от случая к случаю. Важно, чтобы все были проактивными — если что-то случилось, сразу подрывались и по инструкции пытались устранить проблему.</p><p>Это то самое SRE, о котором пишет Google. Но людей нужно долго обучать такой культуре — это не дело одного месяца. Благодаря такому подходу инженеры, которые раньше были просто разработчиками или аналитиками, глубже осознают свою ответственность за стабильность продакшена. И это действительно правильное направление развития. Потому что и DevOps, и SRE — это в первую очередь культура, а уже во вторую — набор инструментов.</p><h3>Будущее микросервисов: тренд на AI Ops</h3><p>Разработчики уже используют AI как copilot — и это очень мощный инструмент в умелых руках. Он не заменяет инженера, но сильно экономит ему время. Эту помощь от нейросетей очень хочется растянуть и на инфраструктуру, и на эксплуатацию, чтобы получить крутой AI Ops.</p><p>Нейросеть будет находить протухшие сертификаты внутри инфраструктуры, работать инструментом для early warning, подсвечивать риски.Кажется, что все инструменты для этого есть уже сейчас. Надо только, чтобы кто-то сложил этот пазл в рабочее решение.</p><p>Есть прототипы — например, Big Panda или Moocsoft (который был недавно куплен Dell), но пока это точечные решения. Возможно, на горизонте 5–7 лет (скорее 5, чем 10) они станут серьезной частью индустрии и очень мощным прорывом, который упростит разработчикам жизнь.Кроме того, важно, чтобы развивались и более «приземленные» технологии: инструменты контейнеризации, оркестрации, observability, а также APM — Application Performance Monitoring.</p><h3>Инженер остается в центре всего</h3><p>Никакие микросервисы, Kubernetes и AI Ops не спасут, если за системой не стоит инженер, который думает головой, правильно работает руками и отвечает за результат. Важны его навыки, кругозор и культура работы. Именно такие люди превращают набор сервисов в работающий продукт. Все остальное — только инструменты.</p><p>P. S. Если интересно, как мы решаем эти задачи на практике, <a href="https://technologichno.mave.digital/">слушайте </a>(и <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fvkvideo.ru%2Fvideo-145457488_456239831&amp;postId=1982175">смотрите</a>) наш подкаст «Техно.Логично» — там регулярно обсуждаем самое актуальное в IT-сфере.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 инструментов, которые используют айтишные команды</title>
      <link>https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy</link>
      <comments>https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy</guid>
      <description><![CDATA[<p>Показываем, какими инструментами пользуются внутри айтишных команд и какие можно использовать для себя здесь и сейчас или внедрить в свою команду.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy">5 инструментов, которые используют айтишные команды</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Статистика]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Adobe]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В статье собрали 5 решений — от трекеров задач и онлайн-досок до комплексных платформ для управления проектами. Инструменты помогут закрывать горящие дедлайны, ускорять разработку и четко распределять задачи — все то, что используют в больших командах. Рассказываем, что делать с этими фичами и как их использовать.</p><h2>1. МояДоска</h2><p><a href="https://moyadoska.com/">«МояДоска»</a> — это российский SaaS-сервис для совместной работы и визуализации идей. У онлайн-доски бесконечный размер: это значит, что вы можете размещать сколько угодно элементов и никогда не упретесь в границу. Так, команды, преподаватели и креативные специалисты могут проводить брейнштормы, планирования, презентации и обучение в одном пространстве.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/4fe2215f-6b29-4d0c-a490-281b2d045ddc.jpeg" alt="" /></figure><h3>Что под капотом</h3><p>Фронт написан на React + PixiJS, а бэк — Node.js + PostgreSQL. Это обеспечивает быстрый и понятный интерфейс и стабильную работу даже при большом объёме объектов на доске. Команда выпускает обновления несколько раз в месяц, а о новинках можно узнать в <a href="https://t.me/moyadoska">Telegram-канале</a> сервиса. Например, в недавнем апдейте появилась возможность превратить фрейм в таблицу или тетрадь за пару кликов, а еще задать нужное число столбцов, колонок, толщину границ и цвет.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/0f1a8489-ffe3-4003-8ecc-09d25bbba3b3.png" alt="" /></figure><p><b>Из главных функций:</b></p><ul><li>Понятный интерфейс</li><li>Совместная работа в реальном времени</li><li>Привычные инструменты: фигуры, стрелки, стикеры, текст, загрузка файлов, маркер, карандаш</li><li>Обрезка фото прямо на доске, воспроизведение аудио, поддержка PDF</li><li>Гибкое управление доступом</li><li>Возможность повторного использования шаблонов</li><li>Поддержка фреймов и создание логичных пространств для разных задач</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/21a6ecbd-a6b5-40c9-ae19-71a85b919c46.png" alt="" /></figure><h3>Переезд на сервис</h3><p>«МояДоска» интегрируется в процессы на разных этапах, упрощая жизнь команде. Например, сама команда сервиса перешла с Miro на свою доску для стратегического планирования. С помощью стикеров и стрелок они построили дерево решений, чтобы лучше расставить приоритеты. А одно маркетинговое агентство перевело все документы и сессии планирования на доску, отказавшись от Google Docs и таблиц. Это ускорило принятие решений: сотрудники работали с данными в одном формате, точно собрались в одном кабинете перед маркерной доской.</p><h2>2. METEOR</h2><p><a href="https://u-meteor.ru">METEOR</a> — инструмент управления проектами. Это трекер задач с дашбордами, досками канбан, диаграммами Ганта и API, который работает в виде веб-приложения как в облаке, так и на своих серверах. Продукт создавался как универсальный центр управления задачами: он объединяет в себе все — от разработки и тестирования до маркетинга и поддержки. Сейчас его используют более 250 команд и свыше 2000 пользователей ежедневно.</p><h3>Что под капотом</h3><p>В основе — стек Ruby on Rails, React и TypeScript, PostgreSQL и Redis, плюс современная инфраструктура на Docker и Kubernetes.</p><p>Система разбита на микросервисы — за фоновую обработку, нотификации и работу с файлами отвечает отдельный функционал. Авторизация построена через OAuth 2.0 (Google, Yandex), а для аналитики используется Posthog и ELK-стек. Мониторинг реализован на Prometheus + Grafana. Обновления выходят каждую неделю, а обратная связь приходит разработчикам METEOR через Telegram-бот.</p><p><b>Вот главные функции:</b></p><ul><li>Гибкие доски задач (Kanban, Scrum) — 6 видов.</li><li>Списки задач с группировками и иерархией.</li><li>Автоматические отчеты (ежедневные/еженедельные сводки).</li><li>Умные напоминания (Telegram-бот, email).</li><li>Глубокая аналитика (время выполнения задач, загрузка команды).</li><li>Потоковая автоматизация процессов</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/60e0eb0a-c1b1-473b-b343-1c4fb1b3fbd6.png" alt="" /><figcaption>Упрощенная схема сущностей системы</figcaption></figure><p>METEOR — мощный инструмент для автоматизации процессов, с триггерами, серверными функциями и ИИ-аналитикой. Он позволяет гибко настраивать сложные операции.</p><p>Все данные анализируются, и внутри самого сервиса можно понять, как работает команда: кто загружен, сколько времени уходит на задачи, где стопперы в процессе.</p><p>Разработчики используют METEOR для линковки задач с pull-requests и контроля бэклога. Менеджеры получают отчеты автоматически и не тратят часы, чтобы собрать всю информацию вручную. QA ведут тест-кейсы и баги в удобных досках, а DevOps отслеживают инциденты и шаги деплоя. Даже HR подключаются — через систему проходят кандидаты и стажеры.</p><h3>Переезд на сервис</h3><p>После внедрения METEOR команды замечают, что продуктивность их работы сильно повышается:</p><ul><li>скорость выполнения задач увеличивается в среднем на 25% — благодаря автоматическим напоминаниям и чётким процессам;</li><li>количество потерянных задач снижается на 70% — исчезают хаотичные чаты и забытые письма;</li><li>на составление отчетов и сбор метрик уходит не 5 часов, а всего 30 минут в неделю;</li><li>а экономия времени — около 75 часов в месяц на команду из 10 человек.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/f3f086f0-5846-4a35-adba-dc4fbe17f1c0.png" alt="" /><figcaption>Карточка задачи</figcaption></figure><p>METEOR не просто помогает контролировать задачи — он становится частью операционного «ядра» команды, избавляя от хаоса, ускоряя работу и делая все немного спокойнее.</p><h2>3. Gitlife</h2><p><a href="https://gitlife.ru">GitLife</a> — это универсальная платформа для хостинга репозиториев и построения полного DevOps-процесса внутри компании. Разработана с прицелом на закрытые контуры, импортозамещение и гибкость — подходит как для современных Git-проектов, так и для инфраструктур, где все еще используется SVN.</p><p>Помимо самого Gitlife, разработчики делают Gitlife AI, в котором есть доступ к топовым ИИ-моделям и инструментам, чтобы разрабатывать ИИ-решения.</p><h3>Что под капотом</h3><p>Внутри Gitlife собраны модули для:</p><ul><li>Кода — репозитории, ветвление.</li><li>Задач — бэклоги, спринты, дашборды.</li><li>Документации — совместное редактирование документов, управление правами.</li><li>Аналитики — карты потока ценности, качество кода, метрики по инженерам.</li><li>Пайплайны — модуль «Конвейер» управляет сборками и CI/CD.</li></ul><p>Gitlife используется ИТ-отделами и R&amp;D-подразделениями в компаниях с высокими требованиями к информационной безопасности. Подходит как для небольших команд, так и для распределённых корпораций с десятками проектов.</p><p>Что решает:</p><ul><li>Безопасный и полностью локальный хостинг исходного кода (Git + SVN)</li><li>Управление задачами и CI/CD в одном месте</li><li>Централизованный доступ, права, аудиты и история изменений</li><li>Полная поддержка DevOps-процессов на российском ПО</li><li>Альтернатива GitHub, GitLab и Bitbucket в условиях ограниченного доступа и санкционных рисков</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/bb3f815f-ce07-4c9d-9243-7ace4b14d5ba.png" alt="" /><figcaption>Создание пайплайна</figcaption></figure><h3>Переезд на сервис</h3><p>Инструмент подходит практически всем командам — от инди-разработчиков до крупных проектов с множеством ролей. Например, гейм-девелопер может разрабатывать персональный проект и хранить код бесплатно, стартап — разрабатывать MVP, а крупный бизнес — управлять большими командами и проектами максимально безопасно.</p><h2>4. Cerebro</h2><p><a href="https://cerebrohq.com/ru/">Cerebro</a> — профессиональная система для совместной работы и управления проектами. Она помогает ставить задачи, планировать этапы, следить за выполнением, обмениваться файлами и комментировать их прямо в системе. Особенно полезна для команд, которые делают VFX, 3D, анимацию или дизайн — но при этом легко адаптируется и под другие команды.</p><p>Платформа охватывает полный цикл — от первых идей и планирования до комментирования финальных шотов (отдельных сцен или кадров в видео/анимации) и соблюдения дедлайнов. Такой подход помогает команде ускорить работу на 20%, сократить время на правки и держать весь процесс под контролем — от начала до сдачи проекта.</p><p>Cerebro подходит для команд от 1 до 1000+ человек с задачами на проекте от 1 до 10000+. Сервис работает с 2009 года, сейчас им пользуются более 400 команд в России и СНГ.</p><h3>Что под капотом</h3><p>Cerebro поддерживает десктоп (Windows, Mac и Linux), веб-версию и мобильное приложение, локальное, облачное и гибридное развертывание. Инструмент построен на клиент-серверной архитектуре — она гибкая, поэтому можно настраивать конфиги исходя из потребностей бизнеса.</p><p>Из технологий:</p><ul><li><b>Backend:</b> C, C++, Python, SQL</li><li><b>Frontend:</b> JS, TypeScript, ReactJS, Qt, PyQt</li><li><b>Мобильные клиенты:</b> React Native</li><li><b>БД: </b>PostgreSQL с проприетарными расширениями + SQLite</li><li><b>Файловое хранилище:</b> Cargador</li><li><b>Плагины: </b>Tentaculo (встраивается в производственные программы)</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/d51c709f-2b9c-4e0b-95c0-2b78d61f5c1e.png" alt="" /></figure><p>Cerebro покрывает весь пайплайн — от идеи до финала. Вот основные возможности сервиса:</p><ul><li>Множественные уровни вложенности задач — подходит для сложных иерархий продакшена</li><li>Планирование с помощью диаграммы Ганта и специального инструмента «План»</li><li>Канбан-доска для визуального контроля задач</li><li>Инструмент «Моё пространство» — для персонализированной фильтрации и отбора задач</li><li>Уровни доступа и ролевое управление</li><li>Расширенная статистика по проектам, командам, сотрудникам</li><li>Совместная работа над большими файлами (видео, изображения, 3D) — Mirada позволяет комментировать, делать подрисовки, оставлять голосовые заметки</li><li>Интеграция с пакетами Adobe, Autodesk и мессенджерами, возможность встраивать в любые пайплайны</li><li>Удобное подключение фрилансеров</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/5411ad9d-a74b-46ed-9774-61d60ff69885.png" alt="" /><figcaption>Навигатор и форум</figcaption></figure><h3>Переезд на сервис</h3><p>Обычно внедрение начинается еще на этапе препродакшена — во время разработки концепции и четкого плана действий. Затем система сопровождает проект на всех стадиях, вплоть до постпродакшена (финального тестирования и релиза), где она закрывает 80-100% задач. Cerebro позволяет собирать всё в одном месте: задачи, правки, сроки, бюджеты, загрузку сотрудников и статус проекта в целом.</p><p>После переезда снимается много рутинных задач: больше не нужно вручную назначать исполнителей, комментировать медиаконтент, передавать файлы между программами и так далее. В среднем проекты выполняются на 20% быстрее, без потери качества. В больших студиях объем выпускаемых шотов может вырасти до 20+ тысяч — это уже работает у других клиентов, среди которых СберМаркетинг, Sinners, Black Point и другие. Cerebro также помогает переехать с других такс-трекеров и систем для управления проектами.</p><h2>5. Replit Teams</h2><p><a href="https://replit.com/teams">Replit Teams</a> — это платформа для совместной разработки в реальном времени. По сути, это интегрированная IDE + git-репозиторий + система управления задачами — и все доступно через браузер. Подходит как для командной работы в стартапах, так и для образовательных проектов, хакатонов и небольших продуктовых команд.</p><p>А главная фишка — встроенный ИИ, к которому можно обращаться прямо во время написания кода. Инструмент разработан с акцентом на простоту входа, командную работу и быстрое прототипирование. Поддерживает более 50 языков программирования и позволяет запускать полноценные веб-приложения в облаке.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/70b00e25-9ec7-4858-911c-b2d7a181104e.png" alt="" /></figure><h3>Что под капотом</h3><p>Внутри Replit Teams есть интерфейсы для:</p><ul><li>Кода — редактор с автокомплитом, подсветкой синтаксиса, терминалом и интеграцией с Git.</li><li>Задач — встроенный таск-менеджер с распределением задач по участникам.</li><li>Общения — встроенные комментарии в коде, возможность ревью и обсуждений.</li><li>CI/DevOps — запуск и отладка приложений без настройки окружения.</li><li>Доступа — гибкие роли, приглашения по ссылке, настройки приватности.</li></ul><h3>Переезд на сервис</h3><p>Replit Teams позволяет моментально начать работу: не нужно ставить зависимости, конфигурировать CI или закупать сервера. Подходит как для быстрой прокачки навыков, так и для реальных командных проектов в продакшене.</p><p>Сейчас инструмент активно используют в стартапах — для быстрого MVP, парного программирования, хакатонов и удаленных командах — как замена локальным IDE и конфигурациям.</p><p>Рассказывайте в комментариях, какими сервисами пользуетесь вы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</title>
      <link>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</link>
      <comments>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</guid>
      <description><![CDATA[<p>Эпохи развития программирования в России и в мире. Какие стадии прошли разработчики и к чему пришли в настоящий момент. Прогнозы на будущее. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov">Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние 20 лет программирование изменилось до неузнаваемости. Если в 2005 году разработчики писали код на PHP 4.0 под мерцание CRT-экранов, то в 2025-м нейросети помогают им генерировать целые модули, а квантовые компьютеры становятся частью исследовательских проектов.</p><p>Эта статья — подробная хроника эволюции программистов: какие языки и технологии они осваивали, как менялись их рабочие места, методы обучения и даже само восприятие профессии. Мы разберем ключевые этапы, от первых веб-гигантов до эпохи совместного программирования с ИИ, и попробуем представить, что ждет нас дальше.</p><h2>2005-2009: Эпоха авторских решений и первых веб-фреймворков</h2><p>В середине 2000-х типичный рабочий инструмент программиста — это громоздкий системный блок с процессором Intel Pentium 4 или новеньким Core 2 Duo. Мониторы с ЭЛТ-трубкой постепенно уступали место LCD-экранам с разрешением 1024×768 — именно на таких дисплеях создавались первые версии Wikipedia и набирающих популярность соцсетей. Оперативная память в 1-2 ГБ считалась нормой, а жесткие диски на 80-160 ГБ часто заполнялись до отказа — проекты редко весили меньше нескольких гигабайт.</p><p>Серьезная разработка велась преимущественно на стационарных компьютерах. Ноутбуки только начинали входить в обиход — их брали в офис, но для реальной работы предпочитали мощные десктопы. Операционная система Windows XP доминировала на рабочих станциях, в то время как серверы чаще всего крутили на Linux — Red Hat Enterprise или Debian.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/d5fca723-5450-4b72-8e8d-4cd57627fb99.jpg" alt="" /></figure><p>Среды разработки того времени сегодня кажутся архаичными. Eclipse и NetBeans потребляли гигабайты памяти, Visual Studio 2005 требовала серьезных ресурсов. Многие разработчики предпочитали простые текстовые редакторы вроде Notepad++, а для отладки использовали примитивные методы вроде вывода значений переменных через print. Контроль версий только начинал входить в практику — Git появился в 2005 году, но большинство команд продолжали использовать SVN или вообще заливали файлы по FTP напрямую на продакшен.</p><p>Языковая экосистема этого периода вращалась вокруг трех основных технологий. PHP версий 4 и 4.3 доминировал в веб-разработке — на нем работало около 80% всех сайтов в интернете. Однако его объектно-ориентированные возможности были крайне ограничены до выхода PHP 5 в 2004 году.</p><p>Java в лице J2EE оставалась стандартом для корпоративных решений — банковских систем, крупных порталов и ERP-комплексов. Spring Framework только начинал набирать популярность, а Hibernate упрощал работу с реляционными базами данных. C++ сохранял свои позиции в разработке игр (особенно с использованием Unreal Engine), драйверов и высоконагруженных сервисов.</p><p>Фронтенд-разработка в те годы была невероятно простой по современным меркам. Верстали преимущественно таблицами, а всю динамику реализовывали через jQuery, который появился в 2006 году и быстро вытеснил нативный JavaScript из повседневной практики. AJAX-запросы казались революционной технологией, позволяющей обновлять части страницы без ее полной перезагрузки.</p><p>Обучение программированию в этот период кардинально отличалось от современных подходов. Онлайн-курсы практически отсутствовали. Основными источниками знаний служили бумажные книги:</p><ul><li>«Философия Java» Брюса Эккеля;</li><li>«Совершенный код» Стива Макконнелла;</li><li>«PHP и MySQL. Разработка веб-приложений» Люка Веллинга.</li></ul><p>Русскоязычное сообщество активно обсуждало вопросы разработки на форумах RSDN.ru и CyberForum.ru. В 2008 году появился Stack Overflow, который постепенно стал главной площадкой для профессиональных обсуждений.</p><p>Университетское образование давало хорошую теоретическую базу — алгоритмы, структуры данных, принципы ООП. Однако практическим навыкам приходилось учиться самостоятельно, методом проб и ошибок. Документацию часто скачивали в формате CHM-файлов или читали непосредственно на сайтах вроде php.net и MSDN.</p><p>Типичный стек начинающего разработчика в 2009 году:</p><ul><li>HTML/CSS с jQuery для фронтенда;</li><li>PHP или Ruby on Rails для бэкенда;</li><li>MySQL в качестве базы данных.</li></ul><p>ORM-технологии еще не получили широкого распространения, поэтому SQL-запросы писали вручную. Многие проекты представляли собой монолитные приложения, где весь код хранился в единой кодовой базе без четкого разделения на модули.</p><p><b>Показательный кейс</b>:</p><p>В 2007 году разработчик PHP-приложений из МЭСИ (Москва) столкнулся с типичной для того времени проблемой — SQL-инъекциями. Вместо стандартных решений он создал DLAC (Data Logic Access Component) — обертку для работы с базой данных, которая автоматически экранировала параметры запросов. Это выглядело революционно на фоне типичного кода того периода, где строки запросов часто собирали через конкатенацию с пользовательским вводом.</p><p>Компонент использовал новую для 2005 года технологию Generics в C#. Он генерировал параметризованные запросы, что резко снижало риски взлома.</p><p><i>Разработчики в университетской среде тогда редко задумывались о безопасности — многие проекты содержали уязвимости вроде  </i>SELECT * FROM users WHERE name = ‘.$_POST[‘name’]<i>. </i></p><p><i>DLAC стал локальным спасением для внутренних систем МЭСИ, пока в 2009 году не появился NHibernate — порт популярного Java-фреймворка Hibernate.</i></p><p>Этот кейс хорошо иллюстрирует дух эпохи: отсутствие готовых безопасных решений заставляло программистов изобретать велосипеды. Многие подобные наработки позже легли в основу ORM-библиотек, но тогда они рождались в муках — через пробелы в безопасности и километры самописного кода.</p><h2>2010-2014: Мобильная революция и рассвет JavaScript</h2><p>Начало нового десятилетия ознаменовалось стремительным ростом мобильных технологий. Выход iPhone 4 в 2010 году и Android 2.3 Gingerbread задал новые стандарты мобильной разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/7b640694-b2cd-4f03-a68f-51ed138557b2.jpg" alt="" /></figure><p>Программисты массово переходили на MacBook Pro — не столько из-за преимуществ macOS, сколько благодаря появлению Retina-дисплеев в 2012 году, которые кардинально улучшили качество отображения кода.</p><p>Железо продолжало стремительно эволюционировать. Твердотельные накопители (SSD) начали вытеснять традиционные жесткие диски в рабочих станциях. Облачные платформы вроде AWS и Heroku стали реальной альтернативой локальным серверам, которые раньше часто стояли прямо под рабочими столами в офисах. Оперативная память в 8 ГБ стала стандартом для комфортной разработки, а четырехъядерные процессоры ускорили сборку крупных проектов.</p><p>Языковая палитра этого периода значительно расширилась. Objective-C стал основным языком для iOS-разработки и оставался таковым до появления Swift в 2014 году. Python 3 начал набирать популярность благодаря веб-фреймворку Django и научным библиотекам NumPy и Pandas, которые открыли дорогу для анализа данных в массовом сегменте.</p><p>JavaScript пережил настоящий ренессанс — после выхода AngularJS в 2010 и Node.js в 2009 году он перестал быть просто «языком для анимаций на сайте», превратившись в полноценную платформу для fullstack-разработки.</p><p><b>Важный факт</b>. В 2011 году разработчик из Сан-Франциско Райан Даль представил Node.js — среду выполнения JavaScript на стороне сервера. За первые 24 часа после релиза проект собрал 10 000 звезд на GitHub, что для того времени стало рекордом. Многие скептически относились к идее использовать JavaScript вне браузера, но уже через год такие компании как LinkedIn и Walmart перевели части своего бэкенда на Node.js, получив прирост производительности в 2-3 раза по сравнению с традиционными решениями на Java и Ruby.</p><p>Образовательная сфера претерпела значительные изменения. В 2011 году запустилась Coursera с первым массовым курсом по программированию — Machine Learning от Эндрю Ына. В 2012 году в Кремниевой долине открылся Hack Reactor, ставший прототипом современных coding bootcamps (интенсивов по программированию). Эти форматы предложили альтернативу традиционному университетскому образованию, сделав акцент на практических навыках.</p><p>Параллельно в России:</p><ul><li>В 2012 году появился Hexlet — одна из первых русскоязычных платформ с практико-ориентированными курсами по программированию. Особенность: выполнение заданий в реальной среде разработки через браузер. Платформа до сих пор работает: на текущий момент 80% выпускников трудоустраиваются в IT, <a href="https://ru.hexlet.io/blog/posts/hse-research">согласно исследованию ВШЭ</a>. В 2012 этот показатель был еще выше.</li><li>«Нетология» (основана в 2011) к 2013 году запустила курсы по веб-разработке с акцентом на JavaScript и Python, сотрудничая с российскими tech-компаниями. Их модель включала менторство и проектные работы.</li><li>В 2013 году стартовал Stepik — платформа с открытыми курсами от ведущих вузов (ИТМО, МФТИ). Особенность: интерактивные задачи с автоматической проверкой кода, что было прорывом для местного рынка.</li></ul><p>Курс «Введение в Linux» от Stepik (2014) за полгода собрал 50 тыс. студентов — рекорд для Рунета. Задания включали настройку виртуальных серверов, что сразу применялось в работе.</p><p>Эти проекты заложили основу для бума EdTech в России после 2015 года, доказав, что онлайн-формат может давать актуальные навыки быстрее вузов.</p><p>Типичный разработчик среднего уровня в 2014 году:</p><ul><li>понимал принципы REST API;</li><li>начинал осваивать основы DevOps с появлением Docker в 2013;</li><li>экспериментировал с микроконтроллерами вроде Arduino или Raspberry Pi, создавая собственные IoT-устройства.</li></ul><p>В профессиональной среде начал формироваться консенсус о том, что PHP устаревает для сложных коммерческих проектов.</p><h2>2015-2019: Эра больших данных и облачных технологий</h2><p>Аппаратные возможности сделали очередной рывок вперед. Многоядерные процессоры Intel i7 и AMD Ryzen стали стандартом для рабочих станций. 16 ГБ оперативной памяти перестали быть роскошью, а мониторы с разрешением 4К стали доступны широкому кругу разработчиков. В 2015 году появился Visual Studio Code, который быстро обогнал по популярности Sublime Text и Atom благодаря удачному сочетанию функциональности и производительности.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/c92b70be-b3eb-4924-a40a-587ed3d43592.png" alt="" /></figure><p>Языковая экосистема продолжила развитие. TypeScript, представленный в 2014 году, предложил решение проблемы масштабируемости JavaScript-кода в крупных проектах. Go от Google, созданный еще в 2009, нашел свою нишу в разработке микросервисов и инструментов оркестрации вроде Kubernetes (2015). Rust от Mozilla начал завоевывать доверие системных программистов благодаря уникальной системе владения памятью.</p><p>JavaScript-сообщество столкнулось с первыми серьезными проблемами. В 2016 году инцидент с пакетом left-pad показал уязвимость экосистемы npm — удаление одного небольшого модуля привело к сбоям в работе тысяч проектов по всему миру. Это заставило разработчиков задуматься о зависимости от сторонних библиотек.</p><p>Типичный senior-разработчик в 2019:</p><ul><li>разбирался в микросервисной архитектуре и понимал, как избежать vendor lock-in (привязки к поставщику) при работе с облачными провайдерами;</li><li>имел опыт работы с React или <a href="http://vue.js">Vue.js</a>;</li><li>знал, что понимание принципов работы алгоритмов становится менее важным, чем развитие soft skills для работы в команде.</li></ul><p>Ключевые технологии этого периода включали Kubernetes, который стал стандартом де-факто для оркестрации контейнеров, а также TensorFlow (2015) и PyTorch (2016), открывшие эру машинного обучения для широкого круга разработчиков. Появились первые серьезные инструменты для работы с большими данными — Apache Spark, Hadoop.</p><p><i>Ключевой момент. В 2016 году Netflix раскрыл детали своего перехода на облачную инфраструктуру AWS. Компания полностью перенесла все сервисы — от рекомендательной системы до биллинга — в облако за семь лет. Главным триггером стала катастрофа 2008 года, когда три дня простоя дата-центра оставили 8,4 млн подписчиков без доступа к сервису. Миграция потребовала перепроектирования архитектуры: инженеры разбили монолит на 500 микросервисов и внедрили Chaos Monkey — инструмент для тестирования отказоустойчивости, который случайно отключал серверы в продакшене.</i></p><p>Этот кейс стал хрестоматийным примером cloud-native подхода. Облачные технологии стали активно использоваться в разработке, а обращение с ними — обязательным навыком для прогеров.</p><h2>2020-2024: AI-assisted разработка и новые парадигмы</h2><p>Пандемия COVID-19 ускорила переход на удаленную работу. Программисты по достоинству оценили макбуки на чипах M1 (2020) за их энергоэффективность и производительность. Домашние офисы оснащались 32-дюймовыми 4К-мониторами и механическими клавиатурами, ставшими своеобразным профессиональным стандартом.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/65ba41e0-844c-419f-8656-e78905e93540.jpg" alt="" /></figure><p>Языковая палитра продолжала обогащаться. Rust официально вошел в ядро Linux в 2022 году, подтвердив свой статус системного языка нового поколения. Zig появился как современная альтернатива «C» с акцентом на безопасность. WebAssembly (Wasm) позволил запускать ресурсоемкие приложения прямо в браузере, открыв новые возможности для веб-разработки.</p><p>Искусственный интеллект начал проникать в повседневную работу программистов. GitHub Copilot на базе GPT-3, представленный в 2021, изменил сам процесс написания кода, предлагая контекстные подсказки. Low-code платформы вроде Retool упростили создание внутренних инструментов для бизнеса.</p><p>Типичный lead-разработчик в 2024 году:</p><ul><li>умел эффективно работать в гибридных командах (офис + удаленка);</li><li>автоматизировал рутинные задачи через ChatGPT API;</li><li>следил за развитием квантовых вычислений, хотя практическое применение пока оставалось ограниченным.</li></ul><p><i>Ключевой момент. В 2023 году GitHub Copilot, разработанный совместно с OpenAI, стал катализатором перемен в индустрии. За первый год после релиза инструмент использовали более 1,3 млн разработчиков — каждый десятый подписчик GitHub. Система анализировала контекст кода и предлагала целые функции: например, при написании SQL-запроса она автоматически генерировала соответствующую модель данных на Python. Amazon внедрил аналогичный инструмент Amazon Q Developer для внутренних команд — по заявлению CEO Энди Джесси, это сэкономило компании 4,500 человеко-лет работы и $260 млн ежегодно.</i></p><p><i>Но были и курьезы. В 2024 году разработчик из Берлина случайно отправил в продакшен код, полностью сгенерированный Copilot. Система использовала фрагмент из GPL-лицензированной библиотеки, что нарушило политику компании по открытому ПО. Инцидент заставил пересмотреть процессы ревью: теперь 78% команд требуют ручной проверки AI-кода перед мержем (слиянием).</i></p><p><i>Параллельно выяснилось, что Copilot в 40% случаев предлагает уязвимый код при работе с СУБД — это привело к взлому API стартапа через SQL-инъекцию. Такие кейсы показали, что ИИ пока не заменяет программистов, а требует от них новых навыков — критического анализа машинных предложений и понимания юридических аспектов кода.</i></p><h2>2025: Современное состояние профессии</h2><p>Современные рабочие станции программистов оснащены ноутбуками с процессорами Apple M4 (3 нм) или Windows-машинами на Snapdragon X Elite. Мониторы с разрешением 8К используются для разработки AR-приложений, а OLED-экраны с HDR стали стандартом для работы с графикой. Появляются первые экспериментальные IDE с нейроинтерфейсами, способные предсказывать код на основе анализа мозговой активности.</p><p>Среди языков программирования выделяется Mojo (2023) — «Python для GPU», набирающий популярность в сфере машинного обучения. Carbon как потенциальный наследник C++ пока остается в тени Rust. Квантовые языки вроде Q# и Cirq интересуют в основном энтузиастов и исследователей.</p><p>Профессия претерпела значительные изменения. ИИ стал не конкурентом, а помощником — по некоторым оценкам, около 60% рутинного кода в 2025 году (тесты, документация) генерируется автоматически. Знание английского языка стало важнее знания сложных алгоритмов — без него невозможно эффективно работать с современными AI-инструментами. Понятие «fullstack-разработчик» трансформировалось — теперь оно подразумевает владение фронтендом, одним бэкенд-языком и основами машинного обучения.</p><p>За два десятилетия программисты прошли путь от одиночек за CRT-мониторами до участников глобальных распределенных команд. Если в 2005 ключевым навыком было умение написать работающий код, то в 2025 главное — способность эффективно взаимодействовать с ИИ-ассистентами. Однако основы профессии остались неизменными — логическое мышление, способность к абстракции и желание автоматизировать рутинные задачи.</p><p>Будущее обещает новые трансформации. К 2030 году нейроинтерфейсы смогут заменить традиционные устройства ввода, а квантовые компьютеры — перевернуть основы криптографии. Но пока актуальными остаются проверенные временем принципы: изучать перспективные технологии (вроде Rust и Mojo), осваивать работу с ИИ и, конечно, совершенствовать главный навык любого программиста — умение быстро и грамотно гуглить.</p><p>Ты уже программист, если читаешь это! Больше о кодинге <a href="https://t.me/+ezugB7gnIEsxNGMy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик развеял мифы о чистом коде, трендах и идеальном программировании</title>
      <link>https://tproger.ru/news/--razrabotchik-razveyal-mify-o-chistom-kode--trendah-i-idealnom-programmirovanii-255770</link>
      <comments>https://tproger.ru/news/--razrabotchik-razveyal-mify-o-chistom-kode--trendah-i-idealnom-programmirovanii-255770?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--razrabotchik-razveyal-mify-o-chistom-kode--trendah-i-idealnom-programmirovanii-255770</guid>
      <description><![CDATA[<p>Разработчик развеял мифы о чистом коде и трендах — почему идеальное программирование не всегда оправдано в реальных проектах</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--razrabotchik-razveyal-mify-o-chistom-kode--trendah-i-idealnom-programmirovanii-255770">Разработчик развеял мифы о чистом коде, трендах и идеальном программировании</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[WordPress]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 12 May 2025 03:42:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>В мире разработки часто звучат советы писать чистый код, использовать TDD и быть в курсе последних технологий. Однако Амрит Пандей — разработчик с многолетним опытом, работавший как с модными фреймворками, так и с «устаревшими» технологиями — <a href="https://amritpandey.io/programming-myths-we-desperately-need-to-retire/">развеял</a> несколько мифов об идеальном программировании.</p><p>Больше новостей — в нашем тг-канале «<a href="https://t.me/your_tech">Представляешь»</a></p><p>Он отмечает, что многие советы кажутся логичными на бумаге, но в реальной работе теряют свою ценность.</p><p>Например, философия чистого кода, популяризированная дядей Бобом, действительно помогает писать понятный и поддерживаемый код, но её применение может быть сложным в старых, нагруженных легаси-системах. Многие из них были созданы задолго до появления современных принципов, и переписывать их просто ради красоты — не всегда оправданно.</p><h2>Тренды не всегда важны</h2><p>Ещё один миф — необходимость следовать последним технологическим трендам. Разработчик напоминает, что PHP, которому часто предрекают конец, всё ещё используется на большинстве сайтов, включая WordPress. А Java и C/C++ продолжают работать в критически важных системах и управляют миллиардами устройств:</p><blockquote><i>«Новые технологии, такие как Rust или Next.js, действительно крутые, но это не значит, что работа с устаревшими системами делает вас менее ценным специалистом»</i></blockquote><h2>Производительность не главное</h2><p>Автор также развенчивает культ оптимизации. Многие разработчики стремятся к максимальной скорости кода, забывая, что для большинства бизнес-систем надёжность и стабильность важнее скорости.</p><p>Например, банкоматы работают на старых финансовых системах, и никто не требует от них микросекундной реакции — главное, чтобы деньги выдавались исправно.</p><h2>Масштабируемость — не всегда приоритет</h2><p>Разработчик подчёркивает, что большинство стартапов не требуют архитектур, готовых к миллионам пользователей. Стремление проектировать системы для гипотетических нагрузок часто приводит к усложнению кода и потере фокуса на реальных задачах бизнеса.</p><h2>ИИ не заменит программистов</h2><p>И наконец, автор отрицает миф о том, что ИИ заменит разработчиков. По его словам, ИИ может помочь автоматизировать рутинные задачи, но не заменит людей, которые понимают бизнес-логику и умеют принимать сложные архитектурные решения.</p>]]></content:encoded>
    </item>
    <item>
      <title>JetBrains сделала CLion бесплатным для некоммерческого использования</title>
      <link>https://tproger.ru/news/jetbrains-sdelala-clion-besplatnym-dlya-nekommercheskogo-ispolzovaniya</link>
      <comments>https://tproger.ru/news/jetbrains-sdelala-clion-besplatnym-dlya-nekommercheskogo-ispolzovaniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/jetbrains-sdelala-clion-besplatnym-dlya-nekommercheskogo-ispolzovaniya</guid>
      <description><![CDATA[<p>JetBrains сделала CLion бесплатным для некоммерческого использования — теперь студенты и разработчики могут использовать IDE без оплаты</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/jetbrains-sdelala-clion-besplatnym-dlya-nekommercheskogo-ispolzovaniya">JetBrains сделала CLion бесплатным для некоммерческого использования</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[Хобби]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 08 May 2025 12:39:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>JetBrains <a href="https://blog.jetbrains.com/clion/2025/05/clion-is-now-free-for-non-commercial-use/">объявила</a>, что IDE для работы с C и C++ — CLion — теперь доступна бесплатно для некоммерческого использования. Это расширение модели лицензирования, которую компания ранее внедрила для других продуктов — RustRover, Rider и WebStorm.</p><p>Больше новостей — в нашем тг-канале «<a href="https://t.me/your_tech">Представляешь»</a></p><p>Теперь студенты, авторы open-source проектов, создатели контента и хобби-разработчики смогут использовать CLion без оплаты, если их работа не приносит коммерческой выгоды.</p><h2>Почему это важно</h2><p>CLion — популярная среда разработки для C и C++, известных своей сложностью и строгими требованиями к качеству кода. По словам JetBrains, новое предложение поможет снизить барьер для изучения этих языков, которые остаются ключевыми для системного и встраиваемого программирования.</p><p>Решение сделать CLion бесплатным для некоммерческого использования основано на стремлении компании поддерживать сообщество разработчиков. JetBrains надеется, что это изменение сделает её продукты более доступными и поможет программистам развиваться без лишних финансовых барьеров.</p><h2>Условия использования</h2><p>Лицензия распространяется на использование в образовательных целях, open-source проектах и хобби-разработках, но не допускает коммерческого применения. При этом пользователи с некоммерческой подпиской не могут отказаться от сбора анонимных статистических данных, которые компания использует для улучшения своих продуктов.</p><p>Для активации бесплатной лицензии достаточно установить CLion, войти в свой JetBrains-аккаунт и выбрать опцию «Не для коммерческого использования» в настройках программы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Нужен ли сеньору второй язык программирования? Опытом поделился разработчик с 18 годами стажа</title>
      <link>https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha</link>
      <comments>https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha</guid>
      <description><![CDATA[<p>Нужен ли сеньору второй язык программирования? Опыт и выводы разработчика с 18 годами стажа — когда и зачем изучать новые языки</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha">Нужен ли сеньору второй язык программирования? Опытом поделился разработчик с 18 годами стажа</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 06 May 2025 06:04:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>В айтишных чатах нередко звучит мнение: хороший сеньор должен уметь программировать на любом языке.</p><p>Оскар — разработчик с 18-летним стажем. Он решил <a href="https://www.architecture-weekly.com/p/why-we-should-learn-multiple-programming">разобраться</a>, насколько утверждение про необходимость знать множество языков правдива.</p><p>Сам Оскар за свою карьеру успел поработать с C#, Java, C++, Python, Ruby, JavaScript, Perl и прочими языками. Но не потому что стремился к полиглотству, а потому что так сложилось — проекты, клиенты, задачи.</p><p>По его мнению, изучение новых языков не просто расширяет кругозор. Это помогает иначе смотреть на архитектуру и подходы к решению задач. Даже если вы продолжаете писать на своем основном языке, знакомство с другими помогает вырасти ментально.</p><h2>Синтаксис — это не все</h2><p>Проблема в том, что многие изучают новый язык на уровне «выучил синтаксис — значит, могу писать». Но это часто приводит к «Java-коду на Go» или «C#-архитектуре в TypeScript». Новички в языке переносят привычные паттерны, не понимая, как использовать сильные стороны новой платформы.</p><p>Чтобы писать идиоматично, нужно время. Неделя — чтобы освоить синтаксис. Пару месяцев — чтобы почувствовать экосистему. Год — чтобы писать как носитель языка.</p><h2>Когда стоит добавлять новый язык в стек</h2><p>Оскар выделяет три повода:</p><ul><li>Бизнес-задача. Например, для тяжелых расчетов стоит взять язык быстрее JavaScript.</li><li>Кадровый вопрос. Иногда проще найти разработчиков под Node.js, чем под Java.</li><li>Карьерный рост. Умение работать с востребованным стеком открывает больше возможностей.</li></ul><p>Но главное — не делать выбор из любопытства. Однажды Оскару пришлось переписать модуль с F# на C#, потому что никто не хотел его поддерживать. В другом проекте Python-модуль оказался узким горлышком и потребовал переделки. Эти эксперименты дорого обошлись бизнесу.</p><h2>Архитектору — особенно важно</h2><p>Если вы архитектор, то знание языков — не просто плюс, а необходимость. Без этого вы будете опираться на чужие слова и чужие слайды, а не на собственный опыт. Лучшие архитекторы, по словам Оскара, регулярно пишут код — пусть и не фуллтайм.</p><h2>Баланс между глубиной и гибкостью</h2><p>Итак, должен ли сеньор уметь писать на любом языке? Не обязательно. Но он должен уметь быстро адаптироваться, понимать принципы, а не только синтаксис. И главное — не бояться признать, что его любимый язык не всегда лучший выбор.</p><p>Языки — это инструменты. Хороший разработчик остается таковым вне зависимости от того, на чем он пишет.</p>]]></content:encoded>
    </item>
    <item>
      <title>С++: все самые важные материалы от Tproger</title>
      <link>https://tproger.ru/articles/s----vse-samye-vazhnye-materialy-ot-tproger</link>
      <comments>https://tproger.ru/articles/s----vse-samye-vazhnye-materialy-ot-tproger?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/s----vse-samye-vazhnye-materialy-ot-tproger</guid>
      <description><![CDATA[<p>Гайд по C++ для новичков и продвинутых программистов. Рассказываем о теории и делимся практическими советами. Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/s----vse-samye-vazhnye-materialy-ot-tproger">С++: все самые важные материалы от Tproger</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 03 May 2025 10:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>C++ — один из самых мощных языков, который не всем под силу. В этом гайде собрали самые полезные статьи по C++ от Tproger, чтобы помочь вам разобраться в языке и уверенно применять его в своих проектах. Подойдет как новичкам, так и опытным прогерам. Не забудьте сохранить подборку!</p><ul><li><a href="https://tproger.ru/articles/python-vs-c----kakoj-yazyk-bystree-najdet-vse-prostye-chisla-do-milliarda">Python vs C++: какой язык быстрее найдет все простые числа до миллиарда</a> — сравниваем производительность Python и C++ на задаче поиска простых чисел и показываем код, графики и выводы. В качестве метода использовали решето Эратосфена. Если вы думаете, что ответ очевиден — вы заблуждаетесь.</li><li><a href="https://tproger.ru/articles/instrukciya-k-pogruzheniyu-v-s-i-bolee-10-besplatnyh-resursov-dlya-nachinayushhih">10 бесплатных ресурсов по C++ для начинающих</a> — подборка качественных и бесплатных ресурсов для изучения C++ — курсы, книги, сайты и видео. Среди рекомендаций — изучение STL, структур данных, многопоточности и написания эффективного кода с практикой чтения чужого.</li><li><a href="https://tproger.ru/articles/jelektronnye-chasy-multimedijnaja-biblioteka-sfml-dlja-razrabotki-igr-na-c">Электронные часы, мультимедийная библиотека SFML для разработки игр на C++</a> — это практический проект на C++ и SFML: создаем электронные часы с отрисовкой и анимацией. Внутри — базовые возможности SFML для разработки игр, например, работа с окнами и графикой и обработка событий.</li><li><a href="https://tproger.ru/articles/isklyucheniya-v-c-garantii-bezopasnosti-i-specifikacii">Исключения в C++: безопасность, спецификации, бенчмарки / Tproger</a> — разбираем спецификации исключений, влияние на безопасность и производительность. Внутри — примеры и бенчмарки, которые показывают, как исключения могут замедлять код при неправильном использовании.</li><li><a href="https://tproger.ru/articles/pishem-programmu-dlja-testirovanija-s">Создаём программу для составления тестов на С++</a> — Создаем приложение для генерации тестов с вопросами и ответами, структура проекта и код на C++. Описываем работу с файлами (например, сохранение в TXT) и интерфейс командной строки — так можно легко освоить ввод-вывод и структурирование кода.</li><li><a href="https://tproger.ru/articles/kak-nastroit-mnogopotochnuju-obrabotku-soobshhenij-v-s">Настройка многопоточной обработки сообщений в С++</a> — здесь рассказываем о пошаговой настройке многопоточной обработки данных в C++, используем библиотеку &lt;thread&gt;, мьютексы (std::mutex) и очереди (std::queue). Пример: клиент-серверное приложение с синхронизацией через std::condition_variable.</li><li><a href="https://tproger.ru/articles/iskljuchenija-v-cpp-tipy-sintaksis-i-obrabotka">Исключения в C++: типы, синтаксис и обработка / Tproger</a> — рассказываем, что такое исключения в C++, как их использовать, какие типы бывают и как правильно обрабатывать.</li><li><a href="https://tproger.ru/articles/interesnye-osobennosti-ukazatelja-this">Интересные особенности указателя this</a> — объясняем роль указателя this в C++: связь с текущим объектом, использование для разрешения конфликтов имен и возврата объекта (return *this). А еще внутри — про ограничения, например, недоступность this в статических методах.</li><li><a href="https://tproger.ru/articles/kak-obrabatyvat-oshibki-v-konstruktorah-bez-iskljuchenij">Как в С++ обрабатывать ошибки в конструкторах без исключений?</a> — показываем альтернативные способы обработки ошибок в конструкторах C++ без исключений: возвращаемые коды ошибок, флаги состояния объекта или другие техники, чтобы обеспечить надежность и избежать накладных расходов.</li></ul><p>Кстати, мы уже делали подобные гайды. Здесь можно почитать про <a href="https://tproger.ru/articles/bolwoj-gajd-po-python-ot-tproger--topovye-instrumenty-dlya-raznyh-napravlenij">Python</a>, <a href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">React</a> и <a href="https://tproger.ru/articles/bolwoj-gajd-po-mobilnoj-razrabotke-ot-tproger--poleznye-stati--praktiki-i-sovety">мобильную разработку</a>.</p><p>А еще! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft: 30% кода внутри компании уже написано ИИ. К 2030 это будет 95%</title>
      <link>https://tproger.ru/news/microsoft--30--koda-vnutri-kompanii-uzhe-napisano-ii--k-2030-eto-budet-95-</link>
      <comments>https://tproger.ru/news/microsoft--30--koda-vnutri-kompanii-uzhe-napisano-ii--k-2030-eto-budet-95-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft--30--koda-vnutri-kompanii-uzhe-napisano-ii--k-2030-eto-budet-95-</guid>
      <description><![CDATA[<p>Глава Microsoft заявил, что ИИ уже пишет до 30% кода в компании. К 2030 году его доля может достичь 95%, особенно в Python</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft--30--koda-vnutri-kompanii-uzhe-napisano-ii--k-2030-eto-budet-95-">Microsoft: 30% кода внутри компании уже написано ИИ. К 2030 это будет 95%</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 30 Apr 2025 04:33:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Генеральный директор Microsoft Сатья Наделла заявил, что от 20% до 30% кода в репозиториях компании уже пишется с помощью ИИ. Об этом он рассказал на конференции LlamaCon, отвечая на вопросы Марка Цукерберга.</p><h2>ИИ уверенно занимает место в разработке</h2><p>По словам Наделлы, доля ИИ-сгенерированного кода различается в зависимости от языка: наибольший прогресс достигнут в Python, меньше — в C++.</p><p>Тем не менее, Microsoft уже уверена в направлении развития: технический директор компании Кевин Скотт ожидает, что к 2030 году 95% всего кода будет генерироваться ИИ.</p><h2>Не только Microsoft</h2><p>Цифры Microsoft — не единственные на рынке.</p><p>На прошлой неделе Сундар Пичаи, CEO Google, сообщил, что более 30% кода в компании тоже создается ИИ. Но как именно измеряется эта доля — ни Microsoft, ни Google не раскрывают.</p><p>Разница в подходах может быть значительной, поэтому такие данные стоит воспринимать с осторожностью.</p><p>Пока все обсуждают новости, мы сделали то, что реально экономит часы: <a href="https://tprg.ru/LN8a">гайд по 70+ ИИ-инструментам</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Язык Julia: что это и почему он популярен в научных вычислениях</title>
      <link>https://tproger.ru/articles/yazyk-julia--chto-eto-i-pochemu-on-populyaren-v-nauchnyh-vychisleniyah</link>
      <comments>https://tproger.ru/articles/yazyk-julia--chto-eto-i-pochemu-on-populyaren-v-nauchnyh-vychisleniyah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/yazyk-julia--chto-eto-i-pochemu-on-populyaren-v-nauchnyh-vychisleniyah</guid>
      <description><![CDATA[<p>Что такое язык Julia. Показываем сравнение языка Джулия с другими. Рассматриваем преимущества и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/yazyk-julia--chto-eto-i-pochemu-on-populyaren-v-nauchnyh-vychisleniyah">Язык Julia: что это и почему он популярен в научных вычислениях</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Apr 2025 14:20:31 GMT</pubDate>
      <content:encoded><![CDATA[<p>Согласно <a href="https://www.tiobe.com/tiobe-index/">индексу TIOBE</a>, Julia входит в топ-50 самых актуальных языков программирования в 2025 году и занимает в рейтинге 34-ю строчку.</p><p>Julia получил признание благодаря универсальности, скорости, понятному синтаксису и множеству других достоинств, о которых мы расскажем в статье. Этот идеальный вариант для научных вычислений в любых отраслях — от анализа огромных массивов данных до расчетов прочности архитектурных объектов.</p><p>Узнаем, каковы особенности и преимущества языка программирования Julia, почему он популярен в научных вычислениях, чем отличается от других топовых языков и где применяется.</p><h2>Основные особенности языка Julia</h2><p>Язык программирования с романтическим женским именем был создан в 2012 году профессором Массачусетского технологического института Аланом Эдельманом в сотрудничестве с группой студентов. Инструмент изначально разрабатывался с прицелом на использование в научных вычислениях. По замыслу команды, язык должен был занять нишу, в которой находились MATLAB с его многочисленными клонами и R, а также совместить удобство и простоту Python с производительностью С++ и Fortran.</p><p>Растущая популярность Julia демонстрирует, что планы разработчиков были по большей части реализованы. И хотя этот язык еще продолжает развиваться и совершенствоваться, уже сейчас его возможности широко используются для сложных математических вычислений, анализа данных и машинного обучения. Последнее направление приобретает все большую актуальность, поскольку нейросети и технологии на основе ИИ внедряются во все нашей сферы жизни и нуждаются в корректном, эффективном и быстром обучении.</p><p>Julia действительно устраняет разрыв между высокоуровневыми интерпретируемыми и низкоуровневыми компилируемыми языками, демонстрируя высокую производительность без утраты простоты применения и продуктивности. В числе других достоинств языка — поддержка многопоточности и параллелизма.</p><p>Рассмотрим более подробно главные плюсы Julia.</p><h2>Скорость и производительность</h2><p>Скорость, которая напрямую определяет производительность, входит в число ключевых преимуществ языка. Показатель в первую очередь обусловлен наличием компилятора, работающего в формате Just-In-Time. Это позволяет создавать эффективный нативный код, который обеспечивает работу сложных алгоритмов на реальном оборудовании.</p><p>Как это реализуется на практике? Представьте, что вам нужно перемножить две огромные матрицы или промоделировать климат в Московской области на 50 лет вперед. На Python это может занять часы, на C — требует тонн низкоуровневого кода. Julia справляется с такими задачами почти так же быстро, как C, но с лаконичностью Python.</p><p>Julia не интерпретирует код построчно, как Python, а сразу компилирует его в эффективный машинный код, как это делает C. Это дает ускорение в 10–100 раз в сравнении с чисто интерпретируемыми языками.</p><p>Скорость особенно актуальна в  машинном и глубоком обучении. Ускоренная обработка обширных массивов данных и такие же быстрые сложные вычисления существенно ускоряют разработку инструментов на основе нейросетей.</p><p>Вот несколько фактов, чтобы вы не сомневались в производительности Julia:</p><ul><li>NASA использует Julia для моделирования полетов — код работает в 15 раз быстрее, чем предыдущая версия на Python + Cython.</li><li>В тестах линейной алгебры Julia обгоняет Python (NumPy) в 2–3 раза, а с нативными типами — почти догоняет C.</li><li>Пакет DifferentialEquations.jl решает сложные уравнения в 100 раз быстрее SciPy (Python).</li></ul><ul><li>Обучение нейросетей (Flux.jl) ускоряется в 3–5 раз против Python + TensorFlow/PyTorch.</li><li>Анализ геномов в биоинформатике занимает минуты вместо часов.</li></ul><p>При этом скорость Julia не наносит ущерба удобству применения.</p><h2>Гибкость</h2><p>Качество языка, которое часто называют «дружелюбием», позволяет юзерам без особых проблем осваивать и использовать Julia для решения самого широкого круга задач. Тем, кто знаком с Python или MATLAB, перейти на Джулию еще проще.</p><p>При этом высокоуровневый синтаксис позволяет выражать сложные алгоритмы минимальными средствами. Лаконичность языка делает его предельно доступным для изучения.</p><p>В Julia можно присваивать переменные, не объявляя их тип, при этом язык поддерживает все широко используемые алгоритмические структуры и способы хранения данных (словари, матрицы). Для работы со сложными типа данных есть бесплатные библиотеки.</p><h2>Мощная экосистема пакетов</h2><p>Для Julia создано огромное количество библиотек и фреймворков, существенно расширяющих ее функциональность.</p><p>Обратите внимание на эти инструменты:</p><ul><li>Flux, MLJ и Knet — написанные на Julia пакеты для глубокого обучения. Позволяют создавать многослойные нейросети и модели непосредственно на этом языке.</li><li>DataFrames.jl — набор фреймворков для работы с данными. Выполняет те же задачи, что и Pandas для Python. Включает полезные и высокоэффективные инструменты для управления данными и их анализа.</li><li>JuliaImages — пакет библиотек для работы с изображениями. Включает инструменты для загрузки, обработки и трансформации картинок.</li><li>Jump.jl — специализированный язык моделирования, интегрированный в Julia. Предназначен для математической оптимизации с использованием линейного, нелинейного и комбинированного программирования.</li></ul><p>Это лишь несколько примеров специальных пакетов. На практике можно найти десятки других инструментов в зависимости от поставленных задач.</p><h2>Поддержка многопоточности и параллельных вычислений</h2><p>Многопоточность обеспечивает языку Julia мощность без сложностей. Если требуется выполнить масштабные вычисления, можно задействовать все ядра процессора одновременно. Julia делает это настолько просто, что даже новичок сможет ускорить свой код в разы.</p><p>В отличие от Python, где многопоточность требует сложных библиотек, в Julia она встроена в сам язык. Чтобы запустить этот процесс, достаточно одной строки:</p><p>Что дает языку многопоточность «из коробки»:</p><ul><li>Ускорение в N раз (где N — число ядер). Например, на 8-ядерном процессоре тяжелый цикл выполнится почти в 8 раз быстрее.</li><li>Никаких заморочек с разделением памяти — Julia сама позаботится о корректности.</li></ul><p>Кроме того, Julia умеет распределять задачи даже между несколькими серверами. Это полезно в машинном обучении для параллельной обработки датасетов, в физическом моделировании, в финансовой сфере — обеспечивает моментальный анализ рисков для тысяч инвестиционных портфелей.</p><p>Благодаря параллелизму Джулия существенно опережает в скорости R/MATLAB. Даже в специализированных математических пакетах параллельные вычисления часто требуют сложной настройки. В Julia это 2–3 строки кода.</p><h2>Развитое сообщество</h2><p>Когда вы только начинаете работать с новым языком, важно знать, что у вас есть поддержка — и тут Julia выигрывает у многих конкурентов. За последние 10 лет вокруг языка сформировалось активное сообщество ученых, инженеров и разработчиков, которые не только пишут код, но и помогают новичкам.</p><p>Вот почему это важно:</p><ul><li>Быстрая помощь. На <a href="https://discourse.julialang.org/">официальном форуме</a> и в чатах вам ответят даже на базовые вопросы — без снисходительности, характерной для некоторых других языков.</li><li>Готовые решения. В <a href="https://juliapackages.com/">реестре пакетов</a> уже есть 7 000+ библиотек для всего — от машинного обучения до астрофизики.</li><li>Открытость. Создатели Julia сами участвуют в обсуждениях, а многие пакеты разрабатываются университетами (MIT, Stanford) и компаниями (NASA, IBM).</li></ul><p>Пример: если вы застряли с дифференциальными уравнениями, просто спросите в чате — и с вероятностью 90% вам ответит либо автор пакета DifferentialEquations.jl, либо кто-то, кто уже решил такую же проблему.</p><p>Сообщество Julia — это редкий случай, когда «экспертность» не означает «закрытость». Здесь ценят и новичков, потому что каждый когда-то начинал с “Hello World”.</p><h2>Почему Julia популярен в научных вычислениях</h2><p>Представьте язык, который понимает ваши математические формулы буквально с полуслова. Julia родился именно таким — как универсальный инструмент для ученых, уставших выбирать между «понятно» и «быстро».</p><p>Вот что делает его особенным:</p><ul><li>пишете, почти как в тетради: 2x + 3y вместо 2*x + 3*y;</li><li>получаете скорость как у Фортрана, без головной боли с компиляцией;</li><li>матричные операции летают в разы быстрее, чем в Python;</li><li>сложные дифференциальные уравнения решаются за пару секунд.</li></ul><p>Секрет успеха — в продуманной начинке:</p><ul><li>встроенные суперспособности для математики;</li><li>может растягивать вычисления на все ядра процессора;</li><li>легко подключает библиотеки Python, R и даже C.</li></ul><p>При этом Julia универсален: подходит биологам для анализа ДНК, физикам, моделирующим квантовые системы, архитекторам, вычисляющим прочностные параметры конструкций. Библиотека Flux.jl строит нейросети быстрее PyTorch, а DataFrames.jl обрабатывает гигабайты данных без тормозов.</p><p>Это не просто язык — это турбодвигатель для научных открытий. Хотите говорить с компьютером на языке математики? Julia станет вашим переводчиком.</p><h2>Сравнение Julia с другими языками</h2><p>Чтобы в полной мере оценить особенности языка Julia, сравним его с ближайшими конкурентами.</p><h2>Julia vs Python</h2><p>Python по праву считается универсальным языком программирования — он прост в освоении, обладает огромным количеством библиотек и поддерживается многомиллионным сообществом разработчиков. Однако когда речь заходит о сложных численных расчетах и высокопроизводительных вычислениях, Julia предлагает ряд неоспоримых преимуществ.</p><p>Главное достоинство Julia — его фокусировка на научных задачах. Этот язык создавался специально для работы с большими объемами данных и сложными математическими операциями. Хотя комьюнити Julia пока меньше python-сообщества, оно состоит преимущественно из специалистов в области Data science, физики и математического моделирования.</p><p>При этом Julia не исключает использование Python. Напротив, благодаря встроенным инструментам взаимодействия — таким как PyCall, разработчики могут комбинировать сильные стороны обоих языков. Использовать Julia для ресурсоемких вычислений, а Python — для других компонентов системы. Такой симбиоз позволяет достичь максимальной эффективности в научных проектах.</p><p>При этом Julia превосходит Python в скорости, имеет более удобный для математиков синтаксис. Параллелизм в Джулия встроенный — для Питона придется использовать сторонние библиотеки.</p><h2>Julia vs R</h2><p>R уже много лет остается верным помощником статистиков — его создавали специально для работы с данными, и в этом он действительно хорош. Но сегодня на сцену выходит Julia — современный язык, который сочетает удобство R с невероятной скоростью работы.</p><p>Те же операции с таблицами данных Julia выполняет в несколько раз быстрее. Если R справляется с задачей за минуту, Julia сделает это за 15-30 секунд. А когда дело доходит до сложных расчетов — разница становится еще заметнее.</p><p>Что действительно выделяет Julia:</p><ul><li>Это не просто язык для статистики, а полноценная платформа для научных вычислений.</li><li>Можно работать с искусственным интеллектом, физическими моделями и даже квантовыми вычислениями.</li><li>При этом сохраняется доступ ко всем привычным R-библиотекам.</li></ul><p>Для тех, кто только начинает погружаться в анализ данных, Julia — отличный выбор. Вам не придется сначала осваивать R для простых задач, а потом переучиваться на другие языки для сложных вычислений. Все есть в одном месте — от базовой статистики до работы с большими данными.</p><h2>Julia vs MATLAB</h2><p>MATLAB долгие годы был как дорогой швейцарский нож для ученых и инженеров — удобный, но привязанный к лицензии. А теперь представьте, что появился инструмент с теми же возможностями, но бесплатный и который можно модифицировать под свои нужды. Это Julia.</p><p>Скорость работы — первое, что замечают при переходе. Типичные расчеты в Julia идут на пятую-треть быстрее. А когда дело доходит до сложных проектов, разница становится еще заметнее.</p><p>Но главная магия — в экосистеме:</p><ul><li>7000+ бесплатных пакетов вместо платных тулбоксов;</li><li>возможность заглянуть «под капот» любого алгоритма;</li><li>сообщество, которое постоянно добавляет что-то новое.</li></ul><p>Синтаксис намеренно сделали похожим на MATLAB — переход ощущается как смена автомобиля той же марки на новую модель. Все знакомо, но едет быстрее и без ограничений по пробегу.</p><p>Для студентов это просто подарок — мощный инструмент без дорогой подписки. А для научных групп — возможность делиться кодом без оглядки на лицензии. Julia не просто догоняет MATLAB, она задает новые стандарты в научных вычислениях.</p><h2>Julia vs C++</h2><p>Если снова воспользоваться сравнением из автомобильной тематики, то C++ — это ручная коробка передач в мире программирования. Можно выжать максимум скорости, но каждая строчка кода требует ювелирной работы с памятью и указателями. Julia предлагает другой подход — это автоматическая трансмиссия, которая разгоняется почти так же быстро, но без головной боли.</p><p>Секрет Julia — умный переводчик (JIT-компилятор), который:</p><ul><li>в реальном времени превращает ваш код в машинные инструкции;</li><li>сам решает, как оптимально использовать память;</li><li>не заставляет вас ковыряться в низкоуровневых деталях.</li></ul><p>Разница особенно заметна в математических задачах. В Джулии не нужно приписывать все детали реализации в отличие от C++.</p><h2>Примеры кода на Julia</h2><p>Эти примеры демонстрируют все преимущества Julia в сфере математических вычислений.</p><h2>Вычисление факториала</h2><p>Это действительно просто:</p><p>Для больших чисел (n &gt; 20) стоит использовать factorial(big(n)), что автоматически переключает вычисления на длинную арифметику.</p><h2>Матричные операции</h2><p>Julia создан для работы с матрицами и линейной алгеброй. Вот несколько примеров, демонстрирующих его выразительность и производительность.</p><p>Базовые операции с матрицами:</p><p>Решение системы линейных уравнений:</p><p>Julia предоставляет удобные инструменты для параллельных вычислений. Вот как можно легко распараллелить задачи:</p><h2>Где применяется Julia</h2><p>Сферы использования Julia в науке, бизнесе, ИТ и других отраслях практически не ограничены. Рассмотрим наиболее актуальные направления.</p><h2>Научные исследования</h2><p>Julia активно используется в фундаментальных и прикладных науках благодаря своей скорости и удобству для математических расчетов:</p><ul><li>В физике с его помощью моделируют квантовые системы (например, в пакете QuantumOptics.jl) и решают дифференциальные уравнения (DifferentialEquations.jl).</li><li>В биоинформатике Julia применяют для анализа ДНК и белковых структур.</li><li>В астрономии — для обработки данных телескопов и симуляции галактик. Например, NASA использует Julia для расчета траекторий космических аппаратов.</li></ul><h2>Финансовые вычисления</h2><p>В финансах Julia ценят за высокую производительность при работе с большими массивами данных. Банки и брокеры применяют его для:</p><ul><li>Алгоритмического трейдинга — быстрого тестирования стратегий.</li><li>Риск-анализа — моделирования кризисных сценариев.</li><li>Оптимизации портфелей — решения задач линейной алгебры с миллионами переменных.</li></ul><p>Пакеты вроде JuliaQuant и Temporal.jl делают его отличной альтернативой Python (Pandas) и R.</p><h2>Искусственный интеллект и машинное обучение</h2><p>Хотя Python все еще доминирует в ML, Julia набирает популярность в этой сфере благодаря:</p><ul><li>скорости — обучение моделей в Flux.jl (аналог PyTorch) иногда в 2–3 раза быстрее;</li><li>гибкости — можно легко комбинировать нейросети с численными методами.</li></ul><p>Например, Julia используют для обработки изображений в реальном времени. Пакет MLJ объединяет сотни алгоритмов в едином интерфейсе.</p><h2>Анализ данных и обработка больших массивов информации</h2><p>Julia идеален для работы с Big Data:</p><ul><li>DataFrames.jl предоставляет инструменты, знакомые пользователям Pandas/R, но работает быстрее.</li><li>Поддержка многопоточности и распределенных вычислений (через интерфейс DistributedArrays.jl) позволяет обрабатывать терабайты данных.</li></ul><p>Компании используют Julia для анализа страховых рисков, а ученые — для обработки огромного количества данных, полученных в процессе исследований.</p><h2>Итоги</h2><p>Julia — это не просто язык для академиков. Он уже используется в реальной сфере везде, где важны скорость, точность и масштабируемость. Уже сейчас мы наблюдаем, как MATLAB-разработчики массово переходят на Julia, устав от закрытой экосистемы, а научные группы выбирают Julia для сложных вычислений там, где Python слишком медленный.</p><p>Тренд только набирает обороты. Добавляются новые функции типа встроенной поддержка GPU, а количество вакансий для разработчиков на Julia, особенно в сфере машинного обучения, постоянно растет.</p><p>Ты точно программист, если читаешь это! Больше мемов, инсайтов и боли кодеров <a href="https://t.me/+ajgz7pDecB4xZTI6">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>С++: разбираешься ли ты в управлении памятью?</title>
      <link>https://tproger.ru/quiz/s----razbiraewsya-li-ty-v-upravlenii-pamyatyu-</link>
      <comments>https://tproger.ru/quiz/s----razbiraewsya-li-ty-v-upravlenii-pamyatyu-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/quiz/s----razbiraewsya-li-ty-v-upravlenii-pamyatyu-</guid>
      <description><![CDATA[<p>Память — штука непростая, но очень важная. Даже в C++. Проходи квиз и проверяй свои знания!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/quiz/s----razbiraewsya-li-ty-v-upravlenii-pamyatyu-">С++: разбираешься ли ты в управлении памятью?</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Викторины]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 06 Apr 2025 08:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>С большой силой приходит большая ответственность. Это мы, кстати, про управление памятью в C++. Да, язык дает огромную свободу в этом плане, но цена ошибки тоже высока: утечки, сегфолты и бесконечные дебаги. В этом квизе мы проверим, насколько ты разбираешься в управлении памятью и сможешь ли ты избежать типичных ошибок.</p><p>А вот несколько статей про C++:</p><ul><li><a href="https://tproger.ru/articles/memory-model">Модель памяти в языках программирования</a></li><li><a href="https://tproger.ru/articles/jelektronnye-chasy-multimedijnaja-biblioteka-sfml-dlja-razrabotki-igr-na-c">Электронные часы, мультимедийная библиотека SFML для разработки игр на C++</a><br /></li><li><a href="https://tproger.ru/articles/instrukciya-k-pogruzheniyu-v-s-i-bolee-10-besplatnyh-resursov-dlya-nachinayushhih">Инструкция к погружению в С++ и более 10 бесплатных ресурсов для начинающих</a><br /></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Если бы я хотел стать разработчиком на Rust в 2025, с чего бы я начал?</title>
      <link>https://tproger.ru/articles/esli-by-ya-hotel-stat-razrabotchikom-na-rust-v-2025--s-chego-by-ya-nachal-</link>
      <comments>https://tproger.ru/articles/esli-by-ya-hotel-stat-razrabotchikom-na-rust-v-2025--s-chego-by-ya-nachal-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/esli-by-ya-hotel-stat-razrabotchikom-na-rust-v-2025--s-chego-by-ya-nachal-</guid>
      <description><![CDATA[<p>Гайд по Rust. Показываем, что нужно знать, чтобы научиться языку программирования Раст. Рассматриваем пошаговую инструкцию и практические примеры ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/esli-by-ya-hotel-stat-razrabotchikom-na-rust-v-2025--s-chego-by-ya-nachal-">Если бы я хотел стать разработчиком на Rust в 2025, с чего бы я начал?</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Haskell]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Apr 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Rust — язык общего назначения, который ориентирован на высокую производительность и безопасное управление памятью. На нем можно писать софт практически для любого направления: CLI-утилиты, высоконагруженные сервера, десктопные приложения, мобильные приложения (с некоторыми оговорками), игры и игровые движки, прошивки для микроконтроллеров, операционные системы, драйвера и даже браузерные приложения (через компиляцию в WebAssembly).</p><p>В рейтинге языков программирования TIOBE Rust занимает 14 место. Для сравнения — в прошлом марте он был на 17 позиции. Вместе с экспертами <a href="https://solvery.io/?utm_source=article&amp;utm_medium=partner&amp;utm_term=tproger&amp;utm_content=rust_2025&amp;utm_campaign=main_page">Solvery</a> <a href="https://solvery.io/ru/mentor/bondiano?utm_source=article&amp;utm_medium=partner&amp;utm_term=tproger&amp;utm_content=rust_2025&amp;utm_campaign=vasiliy_kuzenkov">Василием Кузенковым</a>, full-stack разработчиком в Web3 стартапе, и <a href="https://solvery.io/ru/mentor/belyaev_dmitry?utm_source=article&amp;utm_medium=partner&amp;utm_term=tproger&amp;utm_content=rust_2025&amp;utm_campaign=belyaev_dmitriy">Дмитрием Беляевым</a>, Rust developer в Wildberries, разбираемся, как стать разрабом на Расте в 2025 году.</p><h2>Немного об особенностях</h2><p>Если вы до этого программировали на ООП языках, то вам, возможно, бросалось в глаза отсутствие привычных классов. Вместо них здесь алгебраические типы данных и трейты для решения expression problem. Их механизм куда больше похож на typeclasses из Haskell, что также будет для вас новой концепцией при построении крупных приложений, и нужно будет перестраивать мышление.</p><blockquote>Также когда стартуешь, немного непривычно работать с move-семантикой, RAII, borrow checker’ом и лайф-таймами. Но компилятор сыпет довольно подробными ошибками, которые можно легко поправить, если разобраться.</blockquote><p>А еще у Rust очень строгая типизация и очень мощная система типов, а сами типы построены так, чтобы предоставлять некоторые гарантии программисту. Например, ссылки в Rust всегда ссылаются на объект, гарантировано существующий в памяти, а стандартные строки содержат только валидный UTF-8. При этом в подавляющем большинстве случаев тип необязательно указывать явно, компилятор способен выводить типы, анализируя контекст функции целиком. Кроме того, Rust следует идеологии «компилируется, значит, работает». От логических ошибок, конечно, Раст не спасёт, но тем не менее очень большой пласт багов можно отловить на этапе кодинга. Да, это сложно, но лучше помучиться при разработке, чем потом разбираться почему упал прод.</p><p>Ещё одна отличительная фишка — абстракции с нулевой стоимостью. Rust позволяет писать высокоуровневый и понятный код, который при этом будет иметь ту же производительность, что и более низкоуровневый оптимизированный вручную вариант.</p><blockquote>Хороший пример здесь — итерация по различным коллекциям. Многие языки позволяют использовать итераторы с их абстракциями вроде map или filter. Только такой код, как правило, будет в несколько раз медленнее, чем если то же самое переписать на циклы. Компилятор Rust способен развернуть такой итератор в обычные циклы сам, и производительность будет сравнима, а порой даже лучше, так как программисты часто при написании низкоуровневого кода заставляют процессор делать много лишних вычислений.</blockquote><h2>Сложно ли переходить на Rust</h2><p>У Rust достаточно нетривиальная кривая входа, и без понимания некоторых важных принципов сложно написать код, который хотя бы будет компилироваться. Это относится не только к полным новичкам в программировании, но и к людям, которые уже владеют другим языком.</p><blockquote>На рынке фактически все вакансии требуют уже какого-то опыта в разработке. И сложность перехода сильно разнится от вашего текущего стека. Для Go-программиста переход будет средне-сложным, а язык, возможно, покажется перегруженным. Для С++ — менее сложным, но язык покажется местами ограничивающим. Я переходил на него с JS/TS’а и столкнулся со множеством низкоуровневых концепций, о которых раньше мог не задумываться. Но если у вас есть опыт в системном программировании — переходить будет в разы проще.</blockquote><p>Однако Rust прививает программисту очень много хороших привычек, которые меняют подход к написанию кода и на других языках. Это однозначно хороший выбор в качестве первого языка, но при условии, что у вас есть достаточно времени и терпения на освоение.</p><blockquote>В моей практике менторства много успешных кейсов перехода на Rust с самых разных языков, но проще всего он даётся тем, кто раньше писал на современном C++ и уже понимает такие концепции, как move-семантика и RAII. Много привычного здесь обнаружат и те, кто писал на функциональных языках (Haskell  или OCaml). Но в целом, для остальных тоже нет никаких проблем, даже если вы совсем новичок.</blockquote><h2>С чего начать изучать Rust</h2><p>Вместе со стартом в изучении языка с The Rust Book — бесплатной официальной книгой по Rust’у — стоит углубить свои знания в более низкоуровневых вещах: в чем разница стека и кучи, что такое разметка памяти и адресация в памяти, как работает процессор, подходы и проблемы многопоточного программирования, плюс почитать про операционные системы и сети. Если вы решили осознанно применять Rust, оно вам пригодится.</p><blockquote>Начать можно даже имея только самую базу в программировании: переменные, ветвления, циклы, функции. Крайне желательно разобраться в устройстве памяти, что такое стек и куча, а так же какие области памяти бывают помимо них.</blockquote><p>Вот примерный список того, что нужно учить на старте:</p><ul><li><b>Переменные.</b> Они по умолчанию неизменяемые (let x). Чтобы x стал изменяемым, нужно указать это явно через let mut. Константы (const) и статические переменные (static) вам будут нужны редко, они имеют свои особенности.</li><li><b>Типы.</b> Стоит разобраться с составными типами, такими как массивы и кортежи, а также с пользовательскими объявляемыми конструкциями struct (тип-произведение) и enum (тип-сумма). Также типы данных в Расте есть стандартные: bool, i32, u64 и прочие числовые, но строки могут удивить, так как их видов сильно больше.</li><li><b>Match.</b> Нужно понять такую вещь, как pattern-matching, познакомиться с оператором match, а также осознать, что pattern-matching применяется не только в нём, а везде, где возможно объявление переменных.</li></ul><p>Таким образом, вы можете сразу проверить что-то и присвоить результат в переменную:</p><p>Здесь мы сразу проверили и присвоили:</p><p>Тут нам потребовалась дополнительная изменяемая переменная.</p><h2>Что такое Cargo</h2><p>Cargo —  это консольная утилита, которая устанавливается вместе с компилятором языка. Она служит одновременно для управления зависимостями, сборки проекта и запуска тестов. Плюс для Cargo есть расширения, например, в поставке по умолчанию уже есть форматтер и линтер clippy.</p><p>Cargo рассчитан на то, что вы будете запускать его через терминал, самые полезные команды это:</p><ul><li>cargo new — создаёт новый шаблонный проект в указанной папке;</li><li>cargo build — собирает проект;</li><li>cargo run — собирает проект и запускает получившийся исполняемый файл;</li><li>cargo check — dry-run сборки, делает все проверки компилятора, но ничего не собирает, что заметно быстрее полноценной сборки;</li><li>cargo test — собирает проект со всеми тестами и запускает их;</li><li>cargo fmt — форматирует проект в общепринятый стиль кода;</li><li>cargo clippy — запускает линтер, очень полезно, можно подсказать более оптимальные варианты кода, найти некоторые потенциальные логические ошибки;</li><li>cargo install — устанавливает пакет, содержащий исполняемые файлы;</li><li>cargo clean — очищает все артефакты сборки.</li></ul><p>Cargo позволяет описать структуру, настройки (профили сборки, описание крейта) и зависимости вашего крейта или даже монорепозитория (с помощью workspace). Кроме непосредственного запуска через терминал, многие вещи могут запускаться через средства интеграции в IDE, такие как rust-analyzer для VSCode.</p><h2>Как работать с ownership, borrowing и lifetimes?</h2><p>Для многих новичков системы владения (ownership), заимствования (borrowing) и времен жизни (lifetimes) выливаются в борьбу с компилятором раста. Эти механизмы нужны в первую очередь для безопасности памяти без сборщика мусора. Общее правило владения такое:</p><p><i>Каждое значение в Rust имеет переменную, которая называется его <b>владельцем</b>. В каждый момент времени может быть только <b>один владелец</b>. Когда владелец выходит из области видимости, значение уничтожается.</i></p><p>Когда значение перемещается (передается другой переменной или функции), владение переходит, и исходная переменная становится недействительной.</p><p>Для типов, реализующих трейт Copy (например, целые числа, булевы значения), значения копируются автоматически:</p><p>Для более сложных типов нужно использовать метод clone(), чтобы создать глубокую копию. В местах программы, где производительность не так важна — использование clone() не возбраняется.</p><p>Если же у вас критичный к производительности кусок кода, то вам также понадобится заимствоватние и лайфтаймы.</p><p>Заимствование позволяет использовать значение без получения владения через ссылки (&amp; и &amp;mut). Для мутабельных ссылок `&amp;mut` есть дополнительные ограничения: в каждый момент времени может существовать только одна изменяемая ссылка на значение.</p><p>Нельзя иметь изменяемую ссылку, если уже есть неизменяемая ссылка на то же значение.</p><p>Времена жизни же гарантируют, что ссылки действительны на протяжении всего времени их использования.</p><p>Аннотация 'a указывает, что возвращаемая ссылка будет жить как минимум столько же, сколько кратчайшая из входных ссылок.</p><p>Общие советы по заимствованию здесь такие:</p><ul><li>Используйте ссылки, когда не нужно владение.</li><li>Возвращайте значения из функций для передачи владения обратно.</li><li>Используйте клонирование для создания новых экземпляров (с пониманием стоимости).</li><li>Используйте типы с трейтом Copy, когда это возможно.</li><li>Еще полезно не забывать о контейнерах. Rc&lt;T&gt; позволяет иметь несколько владельцев одного значения через счетчик ссылок, а RefCell&lt;T&gt; обеспечивает проверку правил заимствования в рантайме.</li></ul><h2>О структурах, перечислениях, модулях и функциях, замыканиях, итераторах</h2><p>Структуры (structs) в Rust позволяют создавать пользовательские типы данных, объединяющие связанные значения и выступающие типом произведения.</p><p>Перечисления (enum) позволяют определить тип, перечисляя все возможные варианты значений.</p><p>Перечисления в Rust являются типами суммы, поскольку значение может быть одним из вариантов:</p><p>Тип Shape представляет объединение (сумму) всех возможных вариантов. И к этому есть мощное сопоставление с образцом для работы с ADT:</p><p>Модули позволяют организовать код и контролировать видимость элементов. Определяются они через синтаксис mod &lt;name&gt; {} и могут быть вложенны друг в друга:</p><p>Также модули могут быть организованы в различных файлах (имя файла в таком случае будет именем модуля):</p><p>Импорт модуля осуществляется через ключевое слово use:</p><p>Функции в Rust определяются через ключевое слово fn:</p><p>Можно делать функции высшего порядка и передавать в них, как обычные, так и анонимные функции:</p><p>Еще одним элементом функционального программирования в Rust выступает итератор:</p><p>Здесь мы создаем собственный итератор Counter, реализуя стандартный трейт Iterator. Он используется для многих встроенных коллекций, таких как Vec или HashMap. Этот трейт особенно удобен из-за различных функциональных комбинаторов из стандартной библиотеки:</p><p>Трейт Iterator предоставляет множество методов адаптеров, таких как enumerate, filter или map, которые возвращают новый итератор. Методы адаптеров ленивые, они не запускают итерацию. Также есть методы исполнители, которые итерируют пока не закончатся значения, например, collect, fold или count.</p><p>Большинство коллекций (и ссылки на них) реализуют трейт IntoIterator (способность кастоваться в Iterator). Также IntoIterator автоматически реализуется для любого Iterator (ничего не стоящий каст сам в себя). Цикл for в Rust работает только с объектами, реализующими IntoIterator.</p><h2>Как обрабатывать ошибки в Rust</h2><p>В Rust принято разделять ошибки на 2 вида: паники и результаты операций:</p><ul><li><b>Паники</b> используются для непредвиденных ситуаций и ошибок программиста, например, деление целочисленного типа на 0 или выход за границу массива. И хотя паники можно отловить, стандартное и рекомендуемое поведение при них — программа упадёт, будет напечатан стектрейс.</li><li><b>Результаты операций</b> выражаются типом Result&lt;T, E&gt;, который является перечислением из двух вариантов — Ok(T) и Err(E). Такой подход гарантирует, что все ошибки строго типизированы, а без обработки ошибки невозможно извлечь результат операции.</li></ul><p>Option&lt;T&gt; используется для представления значения, которое может отсутствовать:</p><p>Result&lt;T, E&gt; используется для операций, которые могут завершиться ошибкой:</p><p>Для удобства проброса ошибок наверх существует оператор ?, который пишется после любого выражения, возвращающего Result, и возвращает Ok вариант. В случае Err варианта будет выход из функции с возвращением ошибки.</p><p>Обычно все ошибки описываются в перечислениях, а для уменьшения шаблонного кода используются крейты вроде <a href="https://google.github.io/comprehensive-rust/error-handling/thiserror.html">thiserror</a>.</p><h2>Про асинхронное программирование</h2><p>Асинхронное программирование в Rust строится вокруг трейта Future— его реализуют для типов, представляющих значение, которое будет доступно в будущем.</p><p>Также в Rust есть синтаксис async/await. Ключевым словом async могут быть отмечены функции и блоки кода — они будут возвращать анонимный тип, реализующий Future. Async-блоки также могут захватывать окружение подобно замыканиям. Внутри async-блоков и функций возможно использовать ключевое слово await на любом выражении, возвращающем Future или IntoFuture (способность кастоваться к Future). В отличие от других языков с подобным синтаксисом, await записывается через точку после выражения, что очень удобно для построения цепочек вычислений.</p><p>Для исполнения асинхронного кода необходим рантайм, но стандартная библиотека такого рантайма не предоставляет, поэтому приходится использовать сторонние библиотеки. Самым популярным рантаймом является библиотека tokio.</p><blockquote>В асинхронное программирование на Rust я рекомендую приходить уже после углубленного изучения языка, первых пет-проектов и небольшой работы с многопоточным кодом. Хотя синтаксис и общие правила работы с асинхронным кодом покажутся знакомыми тем, кто знает JS или C#, из-за более низкоуровневой природы языка работать с ним немного сложнее.</blockquote><h2>Что еще должен знать новичок в Rust</h2><p>Вот примерный список:</p><ul><li>Очень желательно погрузиться в устройство памяти процесса, узнать, что помимо стека и кучи существуют и другие области (например, исполняемый машинный код так же отражён на память, а static-переменные хранятся не в стеке и не в куче, а в своей собственной области). Неплохо было бы и разобраться с тем, что у типов помимо размера есть выравнивание. Что в Rust бывают ZST (zero size type) — типы, размер которых честный 0, и DST (dynamic size type) — типы, размер которых неизвестен во время компиляции.</li><li>Обязательно разобраться, как Rust освобождает память, не используя сборщик мусора. Почитать, что такое RAII. Понять, как работает трейт Drop.</li><li>Избавится от стереотипов о Rust. Rust — не самый сложный язык, как только вы поймёте, как он работает. Плюс платят за Rust, как правило, больше, чем на аналогичных позициях на других языках.</li><li>Оставить свои привычки из других языков (за исключением разве что Haskell/OCaml). Здесь не получится писать, как на C++/Java/Go и т.д. Привыкайте к хорошему и станете лучше, чем были до освоения Rust.</li></ul><h2>Что изучать, если есть вся база: чек-лист</h2><ul><li>Макросы и метапрограммирование</li><li>Unsafe Rust для низкоуровневого контроля</li><li>Интеграция с C/C++ через FFI</li><li>Разработка встраиваемых систем</li><li>WebAssembly</li><li><a href="https://doc.rust-lang.org/nomicon/">rustnomicon</a></li><li>Undefined Behavior</li><li>unsafe-код</li></ul><h2>Тренды на 2025 год</h2><p>На Rust’е пишут все. Более полный список можно посмотреть тут: <a href="https://github.com/rust-unofficial/awesome-rust">https://github.com/rust-unofficial/awesome-rust</a></p><p>Вот несколько топовых фреймворков и библиотек:</p><ul><li>serde — фреймворк для сериализации/десериализации</li><li>tokio, futures — для асинхронного программирования</li><li>clap — парсер аргументов командной строки</li><li>anyhow, thiserror — удобная работа с ошибками</li><li>chrono — работа с датой и временем</li><li>dashmap — многопоточная hashmap</li><li>bytes — эффективная работа с сырыми байтами</li><li>log, tracing — для логирования</li><li>reqwest — для http запросов</li><li>axum — для http сервера и REST api</li><li>mockall, test-case — упростит написание тестов</li><li>bevy — игры</li><li>clippy — линтер</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Хакеры уходят от C++ — вирусы на Haskell и Delphi труднее анализировать</title>
      <link>https://tproger.ru/news/--hakery-uhodyat-ot-c-----virusy-na-haskell-i-delphi-trudnee-analizirovat</link>
      <comments>https://tproger.ru/news/--hakery-uhodyat-ot-c-----virusy-na-haskell-i-delphi-trudnee-analizirovat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--hakery-uhodyat-ot-c-----virusy-na-haskell-i-delphi-trudnee-analizirovat</guid>
      <description><![CDATA[<p>Хакеры пишут вирусы на Haskell, Delphi и Rust — такие вредоносы труднее анализировать и обнаружить традиционным антивирусам</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--hakery-uhodyat-ot-c-----virusy-na-haskell-i-delphi-trudnee-analizirovat">Хакеры уходят от C++ — вирусы на Haskell и Delphi труднее анализировать</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Haskell]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Lisp]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Хакеры]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 31 Mar 2025 12:43:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>Исследователи из университетов Греции и Нидерландов <a href="https://www.theregister.com/2025/03/29/malware_obscure_languages/">обратили</a> внимание: всё больше вредоносов создаются не на привычных C или C++, а на менее популярных языках — Haskell, Delphi, Rust и даже Lisp.</p><p>Это не мода, а стратегия: так вирусы проще скрываются от антивирусов и сложнее поддаются анализу.</p><p>Когда антивирус ищет угрозы, он часто использует статический анализ — проверку кода без запуска. Но если вирус написан на редком языке, инструменты просто не понимают, что с ним делать. Они не видят знакомых шаблонов и не могут оценить поведение — вирус остаётся незамеченным.</p><h2>Чем реже язык — тем выше шансы обойти защиту</h2><p>Классика вроде C и C++ всё ещё в ходу, но всё чаще встречаются варианты: Python, Go, Delphi, Rust. Например, группировка APT29 использовала Python, Go и даже смесь из Delphi и C#. Hive и Akira перешли на Rust, а BlackByte — на Go.</p><p>Такие языки часто компилируются нестандартно: код получается сложным и запутанным. Даже простой вирус на Go может выглядеть, как серьёзная программа с кучей функций. Это затрудняет проверку и делает автоматический анализ почти бесполезным.</p><h2>Не только язык, но и компилятор играет роль</h2><p>Авторы изучили почти 400 тыс вредоносных файлов и выяснили: важен не только язык, но и компилятор.</p><p>Инструменты вроде Delphi или Tiny C создают такой код, который антивирусы практически не узнают. Причина простая — слишком мало обучающих примеров, чтобы построить надёжные сигнатуры.</p><p>Даже если вирус делает то же самое, что на C++, его версия на Haskell может пройти мимо всех систем защиты — просто потому, что она выглядит иначе и не совпадает с известными шаблонами.</p><h2>Вредоносы становятся всё разнообразнее</h2><p>С каждым годом злоумышленники используют всё более необычные языки и технологии. Это усложняет жизнь аналитикам: чем реже встречается технология, тем сложнее её анализировать вручную, а автоматические системы почти бессильны.</p><p>Исследователи призывают не игнорировать эту тенденцию: чем больше экзотики в арсенале хакеров, тем выше риск, что очередной вирус окажется невидимкой. Нужно учиться замечать и такие угрозы — иначе даже простой вирус сможет проскочить под носом у самой продвинутой защиты.</p>]]></content:encoded>
    </item>
    <item>
      <title>Конвейер DevOps, часть 2: пользуемся Fedora Core и mise</title>
      <link>https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-mise</link>
      <comments>https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-mise?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Олег Филон]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-mise</guid>
      <description><![CDATA[<p>В этой серии статей Олег Филон, ментор Эйч Навыки, рассказывает, как прийти к крутому CI/CD пайплайну. Сегодня разбираемся, как выбрать ВМ и настроить облака с помощью Fedora Core и инструмента mise.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-mise">Конвейер DevOps, часть 2: пользуемся Fedora Core и mise</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 31 Mar 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Я — Олег Филон,<a href="https://h.careers/curators/oleg-philon"> ментор Эйч Навыки</a> и Senior DevOps Engineer.<b> </b>В этой статье расскажу, что такое Fedora Core и mise и как с помощью них настроить облака.</p><p><b></b>Дисклеймер! Перед прочтением настоятельно рекомендую ознакомиться с <a href="https://tproger.ru/articles/konvejer-devops--chast-1--kak-organizovat-rabochee-mesto-i-nastroit-oblako-iz-kvm-libvirt">первой частью</a> статьи.</p><p>Если вы знакомы с FreeBSD, вы уже знаете её достоинства и недостатки по сравнению с Linux. Просуммирую некоторые отличия, важные для выбора облачной ВМ.</p><ul><li>FreeBSD не поддерживает контейнеры в привычном понимании — ни docker, ни podman пока не портированы.</li><li>FreeBSD использует свою собственную лицензию <a href="https://www.freebsd.org/copyright/freebsd-license/">The FreeBSD Copyright</a>, позволяющую не раскрывать derivative work. Оценить распространённость FreeBSD иногда затруднительно, возможно, часть её кода используется и в Windows(C), и в MacOS(C). Только иногда разработчики сами признают её использование, например, <a href="https://habr.com/ru/companies/itglobalcom/articles/662415/">Евгений Гаврилов, руководитель проекта vStack</a>.</li><li>Метод разработки FreeBSD ближе к академическому стилю. Есть базовый набор пакетов base, включающий не только ядро, но и достаточно инструментов для сборки остальной системы, именуемой ports. Развитие системы управляется <a href="https://docs.freebsd.org/en/books/faq/#responsible">elected Core Team</a> — сейчас в команде 9 человек.</li><li>Во FreeBSD давно используется система snapshots/rollback, позволяющая откатить изменения, если что-то сломалось.</li></ul><p>Существует дистрибутив Linux, у которого есть некоторые из перечисленных особенностей — это Fedora Core.</p><h2>Что такое Fedora Core и как с ней работать</h2><p>Изначально эти идеи возникли в другом дистрибутиве — RedHat CoreOS.</p><p>Во-первых, система ориентирована на использование в облаках: в ней предоставляются образы для всех возможных систем виртуализации и форматов дисков. Во-вторых, она разделена на базовую систему, часть из которой монтируется только в режиме чтения (ro:read only), и остальное, доступное через контейнеры.</p><p>Обновление системы возможно автоматически, появилась особая утилита rpm-ostree, и можно откатить на предыдущую версию, если что-то не так. Таким образом, CoreOS становится иммутабельной, изменения базовой части системы невозможны в обход коммитов rpm-ostree.</p><p>Я как-то провел эксперимент: установил в Yandex Cloud версию FedoraCore 35, выпущенную в конце 2021 года, с включённым по умолчанию сервисом zincati, который автоматически обновляет базовую систему (у него стабильные релизы). Посчитал, сколько коммитов сделано с тех пор: да, как и в git, здесь используется CAS (content-addressable storage), уже привычные нам хэши. ВМ обновилась и рестартанула 8 раз, если я не пропустил какой-либо рестарт:</p><p>Теперь можно сравнить с этой же системой, установленной из свежего имиджа — как и ожидалось, системы не отличались, хэши коммитов одинаковы. Это то, что имеется ввиду под иммутабельностью ОС. Кроме иммутабельности и смонтированных только по чтению некоторых каталогов, есть и другие меры безопасности. Используется версия Security-Enhanced Linux, никаких логинов по умолчанию, настройки пользователя либо через утилиту cloud-init, либо специальная утилита butane и так называемый ignition file.</p><p>У <a href="https://docs.fedoraproject.org/en-US/docs/">проекта Fedora</a> есть подробнейшая документация — в ней лежит самое авторитетное <a href="https://docs.fedoraproject.org/en-US/fedora-coreos/tutorial-setup/">руководство по установке</a>. Тем не менее у меня возникла пара вопросов:</p><ul><li>Во-первых, для преобразования .yaml файла в ignition, который по сути обычный .json файл, используется особый инструмент butane, написанный на языке Go. Судя по размеру образа 130M, он довольно увесистый, но никак не упоминаются другие утилиты для конвертациии .yaml в .json.</li><li>Во-вторых, в простейшем случае для первого логина вообще не нужны ни butane, ни .yaml. Вот пример минимального ignition.json файла, который создаётся руками:</li></ul><p>Скопируем этот файл в каталог /tmp, он нужен один раз для первого входа, не содержит секретов, к нему нужно будет указать полный путь. Как и ранее, скачиваем свежий образ для libvirt/qemu: <a href="https://fedoraproject.org/coreos/download?stream=stable#arches">выбираем нужную архитектуру и формат диска</a>, проверяем контрольные суммы и цифровые подписи. Команды для создания ВМ будут немного отличаться от уже опробованных из прошлой статьи — сначала сделаем для нашего ignition.json опцию, которую понимает virt-install:</p><p>Затем распаковываем образ в стандартный каталог и создаём ВМ:</p><p>Созданная заранее переменная шелл использована как "${IGN[@]}". virt-install выдаст интереснейший лог процесса инсталяции, а в самом конце — перед приглашением — покажет IP-адрес вновь созданной ВМ. Переходим в другую консоль и проверяем наш ssh-ключ: ssh -v core@192.168.100.2 в моём случае. После успешного логина выполняем первоочерёдные проверки и настройки:</p><p>Теперь ВМ можно остановить и сделать финальные настройки нашего персонального облака для этой ВМ. Добавим MAC- и статический IP-адреса в dnsmasq.conf и зададим имя новой ВМ в сети (пример есть в прошлой статье). Откроем в virt-manager окно overview, затем откроем вкладку XML и в самом конце удалим конфиг для qemu — целиком вот этот фрагмент:</p><p>Далее кнопка Apply. Возможно, virt-manager попросит сначала установить Edit → Preferences → General → Enable XML editing. То же самое можно сделать из командной строки: sudo virsh edit fc41stab. Ignition-файл нужен только для установки, далее эту ВМ можно донастраивать, клонировать, копировать её образ куда угодно, в том числе в большие облака.</p><p>А мы продолжим знакомство с этой необычной системой, как её рекламирует проект Федора:</p><p>Fedora CoreOS — это автоматически обновляемая, минимальная, монолитная, ориентированная на контейнеры операционная система, разработанная для кластеров, работоспособная автономно, оптимизированная для Kubernetes.</p><p>Проверим, что dnsmasq обновился, и начнём по порядку.</p><p>Далее выполняем команды внутри ВМ. Основное, к чему придётся привыкнуть, — что часть каталогов смонтированы readonly, запись в них в обход утилиты rpm-ostree невозможна даже судоерам:</p><p>Я специально грепнул только реальные устройства, потому что кроме них смонтированы ещё 19 виртуальных — пока углубляться не будем. Как видно, в режиме rw смонтированы /etc и /var. Даже стандартый home — это линк /home → var/home.</p><p>За автоматические обновления отвечает сервис zincati. Если его отключить, обновления можно запускать вручную: rpm-ostree --bypass-driver upgrade. После рестарта проверяем новое состояние системы:</p><p>rpm-ostree rollback позволяет откатить обновления к предыдущему комиту. Другие полезные команды:</p><ol><li>rpm-ostree db diff — список обновлённых пакетов между комитами</li><li>rpm-ostree db list — список и версии пакетов в комитах</li></ol><p>А как же устанавливать пакеты привычным dnf? Это своевременный вопрос. Посмотрим сначала что уже стоит:</p><p>Это напоминает FreeBSD base, но важно, что набор включает podman, docker, git — для остального есть утилита toolbox. Она делает доступными все пакеты федоры, упакованные в контейнер. Заглянем в toolbox:</p><p>Мы оказались внутри контейнера — об этом говорит изменившееся приглашение $PS1. Если снова посмотреть mount, увидим ещё больше хитро подмонтированных каталогов — этакий оверлей из базовой и контейнерной ФС. Но зато работает dnf, поэтому можно устанавливать любые пакеты. Добавим привычные, без них неуютно в новой системе:</p><p>Как видим, пакеты доступны, но желательно иметь их вне контейнера. Нет проблем: скопируем их в свой ~/bin каталог, он одинаков и внутри, и снаружи контейнера:</p><p>Выйдем из контейнера и проверим:</p><h2>А теперь серьезно: настраиваем Fedora Core сервер для команды разрабов</h2><p>Для начала настроим полноценный dev env: репозиторий кода, образы контейнеров, инструменты для сборки и сервер приложений.</p><p>Обычно в команде есть один админ или несколько. Уже созданный пользователь core — это админ, у него есть права sudo, плюс ему доступен контейнер tbox. В нашей Федоре каталог с секретами устроен особым образом:</p><p>Первоначально обычный файл authorized_keys назывался ignition и располагался в каталоге ~/.ssh/authorized_keys.d, что подразумевает, что можно ещё добавить ключей, назвав их никами других админов. Так же можно поступить с разрабами — настроить для всех один dev env.</p><p>Создадим нового пользователя без прав sudo:</p><p>Как мы уже знаем, мелкие утилиты можно просто скопировать из тулбокса в ~/bin или /usr/local/bin. Для языков программирования и прочих инструментов есть замечательная программа <a href="https://mise.jdx.dev/">mise</a>. Сейчас мы её установим для dev и немного познакомимся. Свой ключ я уже добавил в ~dev/.ssh/authorized_keys.d/, так что логинимся и настраиваем инструменты для команды разрабов.</p><p>mise позволяет устанавливать и использовать различные версии языков программирования, инструментов и библиотек. Другие менеджеры версий, например, <a href="https://github.com/aquaproj/aqua">aqua</a>, <a href="https://github.com/asdf-vm/asdf">asdf</a>, <a href="https://github.com/houseabsolute/ubi">ubi</a> — собрали репозитории таких инструментов, и mise их использует в качестве <a href="https://mise.jdx.dev/dev-tools/backends/">бэкендов</a>. Огласим весь список:</p><p>Да, список великоват: сохранил в файл — 883 штук, и он постоянно растёт. Это только названия пакетов, поиск версий, а команда mise ls-remote python выдала 911 вариантов для python.</p><p>Зато теперь можно настраивать пайплайны для наших разработчиков. А в следующей статье разберемся, как работать с пайплайнами и хуками в git.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что такое хэш-таблицы и как их использовать</title>
      <link>https://tproger.ru/articles/chto-takoe-hew-tablicy-i-kak-ih-ispolzovat</link>
      <comments>https://tproger.ru/articles/chto-takoe-hew-tablicy-i-kak-ih-ispolzovat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-takoe-hew-tablicy-i-kak-ih-ispolzovat</guid>
      <description><![CDATA[<p>Что такое хэш-таблицы. Показываем основные преимущества хэш-таблиц в программировании. Рассматриваем пошаговую инструкцию и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-takoe-hew-tablicy-i-kak-ih-ispolzovat">Что такое хэш-таблицы и как их использовать</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Связные списки]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 21 Mar 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Представьте, что вам нужно мгновенно находить нужные данные среди миллионов записей —  например, определять, есть ли пользователь в базе, или быстро подсчитывать количество посещений страницы. Обычный массив или список справится с этим за O(n), а хэш-таблица —  за O(1) в среднем.</p><p>Но как устроена эта мощная структура данных? Почему программисты так активно используют её в Python, Java и C++? И какие нюансы нужно учитывать при работе с хэш-таблицами, чтобы избежать коллизий и потерь производительности?</p><p>В этом материале разберем, как работает хеш-таблица, какие у неё преимущества и недостатки, и как её эффективно использовать в своих проектах.</p><h2>Как работают хэш-таблицы?</h2><h3>Принцип хэширования: что такое хэш-функция и как она работает</h3><p>Ключевая идея хэш-таблицы — преобразование ключа в индекс с помощью специальной функции, называемой хэш-функцией.</p><p><b>Хэш-функция</b> — алгоритм, который берет входные данные (например, строку) и преобразует их в числовое значение фиксированной длины. Это значение называется хэш.</p><p>Пример работы хэш-функции:</p><p><i>В этом коде мы берем сумму ASCII-кодов символов ключа, а затем берем остаток от деления на размер таблицы:</i></p><ol><li>Ключ (например, строка “Python”) передается в хэш-функцию.</li><li>Функция вычисляет индекс (например, 6), куда будет помещено значение.</li><li>Если нужно найти значение по ключу, хэш-функция снова вычислит индекс и возвратит нужные данные.</li></ol><p>Такой подход позволяет избежать перебора всех элементов, как это происходит в списках, и сразу обращаться к нужному индексу.</p><h3>Структура: массив и связка ключ-значение</h3><p>Хэш-таблицы устроены достаточно просто: в основе лежит массив, в котором хранятся пары ключ-значение. Именно эта структура данных позволяет использовать хэширование для быстрого доступа к элементам.</p><ul><li>Ключ — уникальный идентификатор элемента, который передается в хэш-функцию.</li></ul><ul><li>Значение — информация, привязанная к ключу (например, число, строка или объект).</li></ul><ul><li>Хэш-функция —  преобразует ключ в индекс массива, по которому будет храниться значение.</li></ul><p>Представим, что у нас есть хэш-таблица на 5 ячеек:</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-03-18/f3311182-cfff-460e-8f55-ff9b340f12c3.png" alt="" /></figure><p><i>Если мы захотим получить имя "user15", хэш-функция найдет индекс 2, и поиск займет O(1).</i></p><p>Использование массива позволяет быстро находить нужное значение. В отличие от списков, где поиск требует O(n) операций, в хэш-таблицах поиск идет за O(1) мгновенно.</p><p>Но если происходит коллизия (два ключа получают один индекс), приходится использовать дополнительные структуры, например, связные списки.</p><h2>Основные операции с хэш-таблицами</h2><p>Хэш-таблицы используют три основные операции:</p><ul><li>Вставка элемента (Insert). Добавление новой пары ключ-значение.</li></ul><ul><li>Поиск элемента (Search). Быстрый доступ к значению по ключу.</li></ul><ul><li>Удаление элемента (Delete). Удаление пары ключ-значение.</li></ul><p>Рассмотрим, как работает каждая из них.</p><h3>Вставка элемента (Insert)</h3><p>Когда мы создаем новую запись в хэш-таблице, происходит следующее:</p><ol><li>Хэш-функция вычисляет индекс для ключа;</li><li>Если ячейка свободна, значение записывается в массив;</li><li>Если ячейка занята (коллизия), используется стратегия разрешения коллизий.</li></ol><p>В Python использовать хэш-таблицы просто: достаточно добавить элемент в dict:</p><p><i>Здесь “user42” </i><i>—</i><i> ключ, а “Алексей” </i><i>—</i><i> значение. Python автоматически рассчитывает индекс и записывает значение. </i></p><h2>Поиск элемента (Search)</h2><p>Поиск <i>—</i> одна из главных причин использовать хэш-таблицы. В отличие от списков, где поиск требует O(n), в хэш-таблицах он занимает O(1).</p><p>Как работает поиск:</p><ol><li>Хэш-функция вычисляет индекс для ключа;</li><li>По индексу извлекается значение;</li><li>Если индекс занят другим ключом (из-за коллизии), выполняется проверка (например, в связанном списке).</li></ol><p>Пример:</p><p><i>Использование get() позволяет избежать ошибки, если ключ отсутствует.</i></p><h3>Удаление элемента (Delete)</h3><p>При удалении элемента:</p><ol><li>Находится индекс по хэш-функции;</li><li>Элемент удаляется, а ячейка либо помечается как пустая, либо применяется специальная стратегия (например, сдвиг элементов).</li></ol><p>Пример:</p><p><i>Если ключа нет, del вызовет ошибку. Поэтому можно использовать pop(): </i></p><h2>Преимущества и недостатки хэш-таблиц</h2><p>Хэш-таблицы — мощная структура данных, но у нее есть как сильные, так и слабые стороны.</p><h3>Быстрые операции (в среднем O(1))</h3><p>Главное преимущество хэш-таблиц — быстродействие. Вставка, поиск и удаление элементов происходят в среднем за O(1). Это означает, что независимо от количества элементов, доступ к данным остается мгновенным.</p><p>Например, если в обычном списке для поиска элемента придется перебрать все элементы (O(n)), то в хэш-таблице достаточно вычислить хэш и сразу найти нужное значение.</p><h3>Простота использования</h3><p>В Python использовать хэш-таблицы легко: стандартный dict уже реализует все основные операции:</p><p>В отличие от других структур, здесь не нужно заботиться о реализации алгоритмов поиска и хранения.</p><h3>Возможные коллизии</h3><p>Несмотря на эффективность, у хэш-таблиц есть слабое место — коллизии.</p><p>Коллизия возникает, когда разные ключи получают одинаковый хэш и пытаются занять одно и то же место в массиве:</p><p><i>Из-за плохой хэш-функции “cat” и “dog” получили одинаковый хэш, и одно значение затерло другое. </i>Чтобы избежать коллизий, используют методы вроде цепочек (связных списков) или открытой адресации.</p><h3>Необходимость в эффективной хэш-функции</h3><p>Чем лучше хэш-функция, тем меньше вероятность коллизий.</p><p>Хорошая хэш-функция должна:</p><ul><li>Распределять данные равномерно по таблице;</li><li>Быть быстрой в вычислениях;</li><li>Минимизировать число одинаковых хэшей для разных ключей.</li></ul><h3>Затраты на память</h3><p>Хэш-таблицы требуют больше памяти, чем массивы или списки.</p><p>Чтобы избежать коллизий и обеспечивать O(1)-доступ, хэш-таблицы используют больше места, чем реально хранят данных. Например, если таблица заполнена на 70-80%, скорость работы снижается, и приходится увеличивать размер массива (ресайзинг).</p><h2>Примеры использования хэш-таблиц</h2><p>Хэш-таблицы широко применяются в программировании благодаря их скорости и удобству. Рассмотрим несколько популярных сценариев их использования в реальных задачах.</p><h3>Кеширование данных (Memoization)</h3><p>Хеш-таблицы помогают ускорить вычисления, сохраняя уже найденные результаты. Это особенно полезно при решении задач динамического программирования.</p><p>Пример — ускоренное вычисление чисел Фибоначчи:</p><h3>Подсчет частоты слов в тексте</h3><p>Хэш-таблицы удобно использовать для анализа текстов, например, для подсчета количества повторений слов.</p><p>Пример  — частотный словарь:</p><p><i>В хеш таблицу сразу записываются все слова с их количеством — никакие циклы в массиве не нужны.</i></p><h3>Уникальные элементы в списке</h3><p>Хэш-таблицы можно использовать для удаления дубликатов в массиве.</p><p>Пример:</p><h3>Проверка наличия элементов (поиск в больших массивах)</h3><p>Хэш-таблицы часто используют для быстрой проверки, содержится ли элемент в массиве.</p><p>Пример <i>—</i> проверка наличия логина:</p><h2>Хэш-таблицы в популярных языках программирования</h2><p>Хэш-таблицы —  неотъемлемая часть многих языков программирования, и реализация может отличаться в зависимости от выбранного инструмента. Рассмотрим, как таблицы устроены в Python, Java и C++, а также сравним особенности.</p><h3>Python: dict</h3><p>В Python стандартная хэш-таблица реализована через встроенный тип dict. Это одна из самых оптимизированных структур данных в языке, обеспечивающая O(1) доступ к элементам в среднем случае.</p><p>Пример использования:</p><p>Особенности dict в Python:</p><ul><li>Основан на открытой адресации для разрешения коллизий;</li><li>Гарантирует порядок вставки (с версии Python 3.7+);</li><li>Автоматически увеличивает размер при заполнении;</li><li>Поддерживает defaultdict из collections для значений по умолчанию.</li></ul><h3>Java: HashMap</h3><p>В Java для реализации хэш-таблицы чаще всего используют класс HashMap. Он не гарантирует порядок элементов, но обеспечивает быструю вставку и поиск.</p><p>Пример использования:</p><p>Особенности HashMap в Java:</p><ul><li>Использует цепочечное хэширование (chaining) для обработки коллизий;</li><li>Не сохраняет порядок элементов (используйте LinkedHashMap, если порядок важен);</li><li>Может хранить null в качестве ключа;</li><li>В Java 8+ при большом числе коллизий список заменяется на дерево, что улучшает производительность.</li></ul><h3>C++: unordered_map</h3><p>В C++ стандартная хэш-таблица представлена контейнером unordered_map, который входит в STL (Standard Template Library).</p><p>Пример использования:</p><p>Особенности unordered_map в C++:</p><ul><li>Использует цепочечное хэширование (chaining) для обработки коллизий;</li><li>Не сохраняет порядок элементов;</li><li>Позволяет определять собственные хэш-функции;</li><li>В среднем обеспечивает O(1) на поиск, вставку и удаление.</li></ul><p><b>Если сравнивать особенности реализации, то:</b></p><ul><li>Когда нужен порядок вставки → Python dict или Java LinkedHashMap.</li><li>Когда важна скорость без дополнительных затрат → unordered_map в C++.</li></ul><ul><li>Когда нужна безопасность при большом числе коллизий → Java HashMap (начиная с Java 8+ использует деревья для баланса).</li></ul><h2>Советы по использованию хэш-таблиц</h2><p>Хэш-таблицы — мощный инструмент для быстрого доступа к данным, но их эффективность во многом зависит от контекста использования, выбора хэш-функции и грамотного управления памятью. В этом разделе разберем основные рекомендации.</p><h3>Когда стоит использовать хэш-таблицы?</h3><p>Использование хэш-таблиц оправдано в ситуациях, где важны:</p><ul><li>Быстрый поиск  — доступ к элементу в O(1) (в среднем).</li><li>Частая модификация  — вставка и удаление быстрее, чем в массивах и сбалансированных деревьях.</li><li>Ассоциативные отношения  — когда данные хранятся в формате «ключ-значение».</li></ul><p>Но когда НЕ стоит использовать хэш-таблицы:</p><ul><li>Если важен порядок элементов (лучше использовать TreeMap в Java или OrderedDict в Python).</li><li>Если хеш-таблица будет сильно заполнена (может возникнуть деградация до O(n) при поиске).</li><li>Если требуется эффективный диапазонный поиск (лучше использовать деревья, например, std::map в C++).</li></ul><h3>Как выбрать или написать свою хэш-функцию?</h3><p>Хорошая хэш-функция должна обладать следующими свойствами:</p><ul><li>Равномерное распределение — минимизация коллизий;</li><li>Быстродействие — должна вычисляться за O(1);</li><li>Детерминированность — один и тот же ключ всегда дает один и тот же хэш.</li></ul><p>Оптимальным вариантом здесь будет:</p><ul><li>Если используете таблицы в Python — стандартная хэш-функция hash() в сочетании с dict.</li><li>В Java можно переопределить метод hashCode() в классах.</li><li>В C++ можно задать свою std::hash&lt;&gt; или использовать криптографические методы (SHA-256, MD5).</li></ul><h2>Учет размера хэш-таблицы и предотвращение избыточного заполнения</h2><p>Хэш-таблицы динамически увеличиваются, но важно следить за балансом между скоростью работы и расходом памяти.</p><p><b>Основные правила:</b></p><p>Коэффициент загрузки (Load Factor) — отношение заполненных ячеек к общему размеру таблицы.</p><ul><li>В Python dict увеличение происходит при заполнении на 2/3.</li><li>В Java HashMap по умолчанию увеличение происходит при загрузке более 75%.</li><li>В C++ unordered_map поведение зависит от конкретной реализации.</li></ul><p>Также используйте простые числа для размеров таблицы — это снижает количество коллизий.</p><p>Если таблица работает медленно, проверьте коллизии:</p><ul><li>Возможно, стоит заменить хэш-функцию.</li><li>Или использовать TreeMap (Java) или std::map (C++) при частых коллизиях.</li></ul><p>Если следовать этим рекомендациям, хэш-таблицы станут мощным инструментом в вашем арсенале!</p>]]></content:encoded>
    </item>
    <item>
      <title>Rust: насколько хорошо ты знаешь, как управлять памятью?</title>
      <link>https://tproger.ru/quiz/rust--naskolko-horowo-ty-znaew--kak-upravlyat-pamyatyu-</link>
      <comments>https://tproger.ru/quiz/rust--naskolko-horowo-ty-znaew--kak-upravlyat-pamyatyu-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/quiz/rust--naskolko-horowo-ty-znaew--kak-upravlyat-pamyatyu-</guid>
      <description><![CDATA[<p>Проходи наш квиз и проверяй свои навыки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/quiz/rust--naskolko-horowo-ty-znaew--kak-upravlyat-pamyatyu-">Rust: насколько хорошо ты знаешь, как управлять памятью?</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Викторины]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 16 Mar 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Rust сейчас может легко посоревноваться даже c C++: если в скорости они примерно равны, то в плане безопасности Rust одерживает уверенную победу. А управление памятью — одна из самых крутых фишек этого языка. Проходите квиз и чекайте свои навыки!</p>]]></content:encoded>
    </item>
    <item>
      <title>«Хаос и беспорядок»: эксперт назвал минусы микросервисной архитектуры</title>
      <link>https://tproger.ru/news/-haos-i-besporyadok---ekspert-nazval-minusy-mikroservisnoj-arhitektury</link>
      <comments>https://tproger.ru/news/-haos-i-besporyadok---ekspert-nazval-minusy-mikroservisnoj-arhitektury?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/-haos-i-besporyadok---ekspert-nazval-minusy-mikroservisnoj-arhitektury</guid>
      <description><![CDATA[<p>Микросервисы — это не всегда решение. Эксперт разобрал главные минусы: хаос в архитектуре, рост затрат, сложная отладка и непредсказуемость системы</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/-haos-i-besporyadok---ekspert-nazval-minusy-mikroservisnoj-arhitektury">«Хаос и беспорядок»: эксперт назвал минусы микросервисной архитектуры</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Mar 2025 05:30:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>Микросервисная архитектура обещала упростить жизнь разработчикам: независимое масштабирование, ускорение релизов, гибкость.</p><p>Однако на практике многие компании сталкиваются с лавинообразным ростом сложности, перегруженными бюджетами на инфраструктуру и постоянными сбоями в продакшене.</p><p>Эксперт с 25-летним опытом в IT <a href="https://medium.com/mr-plan-publication/microservices-the-architectural-cult-thats-bankrupting-your-sanity-and-your-startup-877e33453785">разобрался</a>, почему микросервисы часто становятся проблемой, когда они действительно оправданы и как можно избежать ненужных усложнений.</p><h2>Почему микросервисы приводят к хаосу</h2><h2>Рост сложности</h2><p>Микросервисы заменяют понятные связи внутри монолитного приложения на хаотичную сеть распределённых систем.</p><p>Отладка становится настоящим испытанием: теперь поиск одной ошибки требует глубокого погружения в распределённые логи и сложные инструменты мониторинга.</p><h2>Высокие затраты на инфраструктуру</h2><p>Монолитное приложение можно развернуть на одном сервере или в простом контейнере.</p><p>В случае с микросервисами требуются десятки вспомогательных инструментов: Kubernetes, сервис-меши, системы распределённых логов, очереди сообщений. Всё это приводит к значительному росту расходов.</p><p>Пример: стартап из 12 человек использовал 87 микросервисов. В результате 60% бюджета уходило на AWS для поддержки этой сложной архитектуры.</p><h2>Низкая предсказуемость работы</h2><p>Каждый дополнительный сервис создаёт новую точку отказа. В распределённых системах отказ одного компонента может вызвать цепную реакцию, приводящую к полному падению приложения.</p><h2>Когда микросервисы действительно оправданы</h2><ol><li><b>Глобальные сервисы</b> – Netflix, Amazon, Google используют микросервисы из-за огромного количества пользователей и высоких требований к масштабируемости.</li><li><b>Разные технологии в одной системе</b> – если одна часть системы требует Python, другая – C++, третья – Java, разделение на микросервисы может быть оправдано.</li><li><b>Сильная изоляция сервисов</b> – если разные команды разрабатывают независимые части продукта, микросервисы помогают снизить конфликты в коде.</li></ol><p>Во всех остальных случаях разделение монолита может привести к необоснованному росту сложности.</p><h2>Как избавиться от избыточных микросервисов</h2><ol><li><b>Аудит архитектуры</b> – если сервис не изменялся 6 месяцев, возможно, он не нужен.</li><li><b>Оценка альтернатив</b> – вместо нового микросервиса можно реализовать модуль, библиотеку или просто улучшить код монолита.</li><li><b>Оптимизация инфраструктуры</b> – сокращение количества сервисов снижает нагрузку на DevOps и упрощает отладку.</li></ol><h2>Вывод</h2><p>Микросервисная архитектура не является универсальным решением.</p><p>В большинстве случаев компаниям выгоднее работать с хорошо структурированным монолитом, чем раздувать сложность ради тренда. Если новый микросервис не приносит очевидной бизнес-ценности, лучше от него отказаться.</p>]]></content:encoded>
    </item>
    <item>
      <title>Python vs C++: какой язык быстрее найдет все простые числа до миллиарда</title>
      <link>https://tproger.ru/articles/python-vs-c----kakoj-yazyk-bystree-najdet-vse-prostye-chisla-do-milliarda</link>
      <comments>https://tproger.ru/articles/python-vs-c----kakoj-yazyk-bystree-najdet-vse-prostye-chisla-do-milliarda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/python-vs-c----kakoj-yazyk-bystree-najdet-vse-prostye-chisla-do-milliarda</guid>
      <description><![CDATA[<p>Рассказываем, какие есть алгоритмы для поиска простых чисел и реализуем наиболее популярный и простой на Python и C++. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/python-vs-c----kakoj-yazyk-bystree-najdet-vse-prostye-chisla-do-milliarda">Python vs C++: какой язык быстрее найдет все простые числа до миллиарда</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PyCharm]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Mar 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Баттлы языков — извечная тема, которая никогда себя не изживет. Понятно, что язык программирования нужно выбирать под конкретные цели. Но если мы только учимся, можно попробовать решить какую-нибудь задачку с помощью двух разных инструментов — хотя бы для того чтобы понять, какой нравится больше.</p><p>Сегодня будем искать все простые числа до миллиарда с помощью кода на Python и C++. Если вы думаете, что результат совсем очевиден, то это не так.</p><p>Напоминание: простые числа — те, которые имеют два различных делителя. Простыми словами, они делятся только сами на себя и на единицу. Например: 2, 3, 5, 7 и так далее.</p><h2>Для начала: быстро окунемся в математику</h2><p>Есть несколько алгоритмов, которые помогут найти все простые числа до N. Это материал для отдельной статьи, поэтому пробежимся по основным.</p><h3>Решето Эратосфена</h3><p>Один из самых древних и известных алгоритмов, чтобы найти простые числа до N. Плюс он понятный, не занимает слишком много памяти (если речь не идет об очень больших N). Работает так:</p><ol><li>Создается список чисел от 2 до N.</li><li>Все кратные числа кратные 2 (4, 6, 8, ...) помечаются как составные.</li><li>Переходим к 3 и вычеркиваем все числа, кратные ему.</li><li>То же самое повторяем со всеми числами из списка до N</li><li>Так до тех пор, пока не проверятся все числа до N.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-03-11/8466855f-2da2-46d1-8909-a34038f42911.png" alt="" /></figure><h3>Решето Сундарама</h3><p>Этот алгоритм работает немного по другой логике:</p><ol><li>Создается список чисел от 1 до (N-1)/2.</li><li>Исключаются числа типа i + j + 2ij, где i и j — натуральные числа, и i &lt;= j.</li><li>Оставшиеся числа умножаются на 2 и увеличиваются на 1 — так получаем простые числа.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-03-11/ab4a7c6c-33b2-4dab-a225-357ea26415ec.png" alt="" /></figure><p>Этот алгоритм занимает меньше памяти, чем решето Эратосфена, поскольку работает только с половиной диапазона. Но при этом он сложнее в плане понимания и реализации.</p><h3>Решето Аткина</h3><p>Это уже современный алгоритм (появился в начале 21 веке). Он использует более сложные математические концепции и работает так:</p><ol><li>Создается список чисел от 1 до N.</li><li>Используются квадратичные формы, чтобы предварительно отсеять составные числа.</li><li>Затем составные числа просеиваются финально для полного исключения.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-03-11/cc0e9ecb-d8d1-4f41-8d7c-95b8e7535408.png" alt="" /></figure><p>Решето Аткина более эффективно, когда речь идет об огромных числах, по сравнению с первыми двумя алгоритмами. Оно тоже не простое в реализации, плюс может быть медленнее при работе с небольшим N.</p><p>Это три основных алгоритма для поиска простых чисел до N. Сейчас существуют различные оптимизации этих методов, например, колесная факторизация (оптимизированный алгоритм Эратосфена).</p><h2>Ищем простые числа до миллиарда на Python и C++</h2><p>Python — не самый быстрый язык для таких операций. Если не использовать библиотеки, то программа выдает ограничение и не может завершиться. Например, вот код на чистом Питоне с алгоритмом Эратосфена:</p><p>PyCharm с ограничением 1 000 000 000 не завершает программу. Если же поставить лимит = 100 000 000, то получим такой результат (почти 8 секунд!):</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-03-11/d2086e6c-85d5-41de-95e9-88aa65628a1a.png" alt="" /></figure><p>Теперь попробуем проделать то же самое с библиотекой numpy, которая как раз подходит для работы с большими числами:</p><p>Результат будет таким:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-03-11/14794680-eb0d-456e-8966-64abc5818d50.png" alt="" /><figcaption>Учитывайте, что мы искали здесь числа до миллиарда!</figcaption></figure><p>Давайте попробуем сделать то же самое на С++:</p><p>Эта программа будет выполняться больше минуты:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-03-11/4631c3ff-2fb6-48ad-b3fd-0731d0a31cb8.png" alt="" /></figure><p>Чтобы оптимизировать программу, можно использовать сегментированное решето Эратосфена:</p><p>Время выполнения уменьшилось на 20 секунд:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-03-11/09b3746b-ebac-403a-85da-354744d06079.png" alt="" /></figure><h2>Итоги</h2><p>В нашей задачке numpy действительно может оказаться быстрее, чем обычная реализация на C++. На то есть несколько причин:</p><ol><li>Если в NumPy используется эффективный векторизованный алгоритм — в нашем случае решето Эратосфена, — преимущества SIMD-операций (одновременное выполнение одной операции над множеством данных) могут сильно ускорить вычисления.</li><li>Неоптимизированная реализация решета на C++ с обычными циклами может быть медленнее оптимизированной векторизованной реализации в NumPy.</li><li>NumPy использует внутренне оптимизированные C/C++ библиотеки, в которых есть куча оптимизаций для работы с массивами.</li></ol><p>Но эффективно оптимизированный код на C++ (например, с использованием SIMD-инструкций, оптимизации кэш-памяти, параллелизма) почти всегда будет быстрее любой реализации на Python/numpy. Правда, такой код будет занимать сотни строк.</p><p>Производительность зависит от конкретных алгоритмов, поэтому так себе метод на C++ проиграет хорошему на numpy. Во многих задачах по работе с большими данными плюсы будут более быстрыми, но для типичного пользования numpy — отличная альтернатива.</p>]]></content:encoded>
    </item>
    <item>
      <title>Количество кода от ИИ в российских компаниях увеличится втрое в ближайшее время</title>
      <link>https://tproger.ru/news/kolichestvo-koda-ot-ii-uvelichitsya-vtroe-v-blizhajwee-vremya</link>
      <comments>https://tproger.ru/news/kolichestvo-koda-ot-ii-uvelichitsya-vtroe-v-blizhajwee-vremya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/kolichestvo-koda-ot-ii-uvelichitsya-vtroe-v-blizhajwee-vremya</guid>
      <description><![CDATA[<p>Объем ИИ-кода растёт: к 2027 году 25% строк будет написано нейросетями. Разработчики превращаются в архитекторов, а компании внедряют ИИ-инструменты</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/kolichestvo-koda-ot-ii-uvelichitsya-vtroe-v-blizhajwee-vremya">Количество кода от ИИ в российских компаниях увеличится втрое в ближайшее время</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 11 Mar 2025 10:45:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>ИИ-инструменты становятся неотъемлемой частью разработки: уже сейчас <b>8% кода в системах МТС</b> создается при помощи искусственного интеллекта, а к <b>2027 году</b> этот показатель может достичь <b>25%</b>.</p><h2>Как ИИ меняет процесс разработки</h2><p>По <a href="https://www.vedomosti.ru/technology/articles/2025/03/11/1097183-neiroset-skoro-budet-pisat-vtroe-bolshe-koda-za-razrabotchikov">данным</a> <b>Ведомостей</b>, рост использования нейросетей ускоряет цифровую трансформацию компаний.</p><p>По прогнозам <b>МТС</b>, к 2030 году <b>более 90% программистов</b> будут применять ИИ-инструменты для написания и проверки кода.</p><p>На данный момент:</p><ul><li><b>В среднем на рынке</b> ИИ выполняет <b>5–10% рутинных задач</b>.</li><li><b>Нейросети заменяют функционал джуниор-разработчиков</b>.</li><li><b>Роль программистов</b> постепенно трансформируется в <b>архитектора решений</b>.</li><li><b>В 25% стартапов Y Combinator</b> ИИ уже написал <b>95% кода</b>.</li></ul><p>Несмотря на такие темпы развития, пока <b>код, сгенерированный ИИ, не идеален</b> и требует проверки. Полного замещения разработчиков в ближайшее время не ожидается.</p><h2>Какие решения внедряют компании</h2><ul><li><b>МТС</b> развивает <b>DevX-платформу</b> и <b>Kodify</b>, которые помогают ускорить разработку на <b>55%</b>.</li><li><b>Яндекс</b> представил <b>SourceCraft Code Assistant</b>, который генерирует более <b>250 тыс строк кода в неделю</b> для своих разработчиков. Поддерживаются <b>30+ языков</b>, включая <b>C++</b>, <b>Go</b>, <b>Kotlin</b>, <b>Python</b> и другие.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Энтузиасты научились самостоятельно портировать игры с Xbox 360 на ПК — без эмуляции</title>
      <link>https://tproger.ru/news/--entuziasty-nauchilis-samostoyatelno-portirovat-igry-s-xbox-360-na-pk---bez-emulyacii</link>
      <comments>https://tproger.ru/news/--entuziasty-nauchilis-samostoyatelno-portirovat-igry-s-xbox-360-na-pk---bez-emulyacii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--entuziasty-nauchilis-samostoyatelno-portirovat-igry-s-xbox-360-na-pk---bez-emulyacii</guid>
      <description><![CDATA[<p>Фанаты портировали Sonic Unleashed с Xbox 360 на ПК без эмуляции. Технология позволяет переносить другие игры с Xbox 360 в нативный формат</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--entuziasty-nauchilis-samostoyatelno-portirovat-igry-s-xbox-360-na-pk---bez-emulyacii">Энтузиасты научились самостоятельно портировать игры с Xbox 360 на ПК — без эмуляции</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Xbox]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 03 Mar 2025 05:33:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Группа фанатов <a href="https://www.tomshardware.com/video-games/xbox/full-xbox-360-decompilation-for-pc-debuts-with-sonic-unleashed-recompiled">смогла</a> <b>запустить Sonic Unleashed на ПК без эмуляции</b>, полностью перекомпилировав код с Xbox 360 в нативный ПК-формат.</p><p>Это стало возможным благодаря инструментам <b>XenonRecomp</b> и <b>XenosRecomp</b>, позволяющим преобразовывать <b>PowerPC-код</b> в <b>x86-совместимый C++</b>, а <b>Xenos-шейдеры</b> — в <b>HLSL</b>.</p><p>Проект получил название <b>Unleashed Recompiled</b>.</p><h2>Почему Sonic Unleashed ждали на ПК</h2><p>Но самое главное — эта технология теоретически позволяет портировать <b>любую игру с Xbox 360 на ПК</b>, даже если она <b>не поддерживается в рамках обратной совместимости</b> на современных консолях Xbox.</p><p>Sonic Unleashed давно считается <b>«белым китом»</b> для фанатов и моддеров. Основная причина — отсутствие официального порта на ПК.</p><p>До появления обратной совместимости на Xbox Series S/X единственным способом <b>запустить уровни Unleashed в 60 FPS</b> была модификация <b>Unleashed Project</b> для ПК-версии <b>Sonic Generations</b>, но она охватывала только дневные этапы.</p><p>С развитием эмуляторов <b>Xenia (Xbox 360) и RPCS3 (PS3)</b> стало возможно играть в оригинальную версию на ПК, но из-за <b>оверхеда эмуляции </b>производительность оставляла желать лучшего.</p><h2>Что даёт Unleashed Recompiled</h2><p>Теперь же, благодаря <b>Unleashed Recompiled</b>, проект впервые получил <b>полноценный ПК-порт</b>, который поддерживает:</p><ul><li><b>Неограниченное разрешение</b> и гибкие настройки графики</li><li><b>Моды и пользовательские патчи</b> через HedgeModManager</li><li><b>Функцию Music Attenuation</b>, приглушающую внутриигровую музыку при воспроизведении внешнего аудио</li><li><b>FPS выше 60</b> (хотя из-за багов физики рекомендуется использовать Lossless Scaling или Frame Generation от видеокарты)</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Яндекс представил SourceCraft — свой аналог GitHub</title>
      <link>https://tproger.ru/news/--yandeks-predstavil-sourcecraft---svoj-analog-github</link>
      <comments>https://tproger.ru/news/--yandeks-predstavil-sourcecraft---svoj-analog-github?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--yandeks-predstavil-sourcecraft---svoj-analog-github</guid>
      <description><![CDATA[<p>Яндекс запустил SourceCraft — аналог GitHub с CI/CD, ИИ-ассистентом и интеграцией с Yandex Cloud. Платформа уже доступна в тестовом режиме</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--yandeks-predstavil-sourcecraft---svoj-analog-github">Яндекс представил SourceCraft — свой аналог GitHub</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 26 Feb 2025 08:55:16 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Yandex B2B Tech</b> <a href="https://yandex.ru/company/news/01-26-02-2025">запустила</a> <b>SourceCraft</b> — платформу для совместной разработки программных продуктов.</p><p>Это инструмент для командной работы над кодом, в котором есть <b>автоматизация CI/CD, умная навигация</b> и <b>встроенный ИИ-ассистент</b>.</p><p>Пока что сервис работает в тестовом режиме — доступ можно получить по заявке.</p><h2>Что умеет SourceCraft</h2><p>SourceCraft предлагает знакомый интерфейс и удобную навигацию, напоминающую IDE. Разработчики могут искать код по <b>ключевым словам, файлам и структуре проекта</b>, что особенно полезно при работе с большими <b>пул-реквестами</b>.</p><p>Одним из главных элементов платформы стал <b>ИИ-ассистент SourceCraft Code Assistant</b>. Он поддерживает <b>более 30 языков программирования</b> (C++, Go, Java, Kotlin, Python и др), предлагает <b>автодополнение кода</b> и вскоре получит <b>режим чата</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-02-26/b6ac74dc-c49a-406a-88ea-67adf22de1a8.jpeg" alt="" /></figure><p>Инструмент уже протестировали тысячи пользователей, а также он доступен как плагин для <b>VSCode</b> и <b>JetBrains</b>.</p><blockquote>Мы создавали платформу с нуля и даже разрабатывали её последние версии внутри самой SourceCraft. Теперь мы готовы открыть тестирование для внешних пользователей и продолжим развивать платформу с учётом их обратной связи.</blockquote><h2>Будущее платформы</h2><p>Сейчас SourceCraft доступен через веб-интерфейс, но в будущем появится <b>глубокая интеграция с Yandex Cloud</b> — развернуть проект в облаке можно будет «по нажатию кнопки».</p><p>Отдельный фокус сделан на <b>безопасность</b>. В ближайших обновлениях появятся:</p><ul><li><b>Автоматическое сканирование секретов</b>, чтобы избежать утечек данных.</li><li><b>Поиск уязвимостей в цепочках поставок</b> для защиты от компрометированных зависимостей.</li><li><b>Улучшенные инструменты автоматизации</b>, критически важные для работы с <b>крупными кодовыми базами</b>.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Курсы Unreal Engine: топ лучших курсов по разработке игр на Unreal Engine</title>
      <link>https://tproger.ru/articles/kursy-po-razrabotke-na-unreal-engine</link>
      <comments>https://tproger.ru/articles/kursy-po-razrabotke-na-unreal-engine?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анастасия Шишкина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kursy-po-razrabotke-na-unreal-engine</guid>
      <description><![CDATA[<p>Сборник лучших онлайн-курсов по Unreal Engine. Сравнение платных и бесплатных курсов обучения разработке и созданию игр на Unreal Engine 4 и 5 с нуля. Рейтинг онлайн-школ</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kursy-po-razrabotke-na-unreal-engine">Курсы Unreal Engine: топ лучших курсов по разработке игр на Unreal Engine</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 23 Feb 2025 17:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Желающим разрабатывать компьютерные игры помогут Unreal Engine курсы. Учеба проводится по всем аспектам, заложенным в программном обеспечении одноименного движка от компании Epic Games. Это самый востребованный на сегодняшний день набор инструментов, с помощью которых формируется геймплей на основе физики, графика, герои и NPC, окружение. Возможности движка также используются при создании макетов архитектурных объектов, конструировании, анимации, в киноиндустрии.</p><p>Вместе с экспертами <a href="https://kursfinder.ru/">Kursfinder</a> я проанализировала более 60 предложений. В итоге были отобраны 28 лучших курсов разработчика Unreal Engine. В статье они распределены по подборкам для удобства навигации. В начале я расскажу про 10 лучших учебных программ на мой взгляд. Затем вы найдете дополнительный список из 5 курсов, которые могут стать отличной альтернативой, если ни один из первых вам не подойдет. Далее представлены 5 программ, посвященных изучению Unreal Engine 5, а после них — 4 курса Unreal Engine 4. В завершение я собрала подборку бесплатных материалов. Полный список <a href="https://kursfinder.ru/search/?q=Unreal+Engine">курсов Unreal Engine</a> ищите в каталоге Kursfinder.</p><h2>ТОП-10 лучших курсов по Unreal Engine в 2026 году</h2><ol><li><a href="https://experts2.ru/FqutBy?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=1">Разработка игр на Unreal Engine с нуля</a> от Нетологии — лучший учебный курс от первых шагов в профессии до уровня разработчика игр.</li><li><a href="https://experts2.ru/kSveKs?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=2">Разработчик игр на Unreal Engine 5 с нуля</a> от Skillbox.ru — программа с максимальным уклоном на практику.</li><li><a href="https://experts2.ru/qbEauC?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=3">Профессия Разработчик игр на Unreal Engine с нуля до Middle</a> от Skillbox.ru — курс для освоения движка Unreal Engine и языка С++ и дальнейшего поиска работы..</li><li><a href="https://experts2.ru/IzoviK?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=4">Профессия Разработчик на Unreal Engine</a> от GeekBrains — практический курс с живым общением на онлайн-занятиях.</li><li><a href="https://experts2.ru/cbxIyW?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=5">Unreal Engine Game Developer. Basic</a> от OTUS.ru — лучшее дистанционное обучение по созданию шутеров.</li><li><a href="https://experts2.ru/TBxfoh?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=6">Unreal Engine Game Developer. Professional</a> от OTUS.ru — программа для повышения уровня квалификации и подтверждения его документально.</li><li><a href="https://experts2.ru/twcJDz?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=7">Разработчик игр на Unreal Engine</a> от XYZ School — онлайн-курс для развития навыков пользователя с нуля до уровня Junior Unreal Engine.</li><li><a href="https://experts2.ru/pthBnR?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=8">Геймплей-программирование</a> от XYZ School — продвинутый курс для разработчиков игр с опытом.</li><li><a href="https://experts2.ru/JHsfnb?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=9">Unreal engine 4</a> от Coddy School — программа для подростков 12–16 лет с индивидуальными и групповыми онлайн-занятиями.</li><li><a href="https://experts2.ru/kibnNL?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=10">Unreal Engine для новичков</a> от Хохлова Сабатовского — лучший авторский курс для освоения Unreal Engine.</li></ol><p>Особенность изучения Unreal Engine заключается в том, что потребуется знание языка программирования С++. Это несложно. Слушатели обычно осваивают его за пару занятий. Инструменты позволяют сделать игру под любую ОС и платформу (ПК, Андроид, iOS). Освоенные навыки пригодятся в любой сфере деятельности — от инженерии до индустрии развлечений. Другие названия профессии — режиссер и монтажер видеоконтента, мастер по анимации — как нельзя лучше определяют востребованность специалиста на рынке.</p><h2>Онлайн-курсы по Unreal Engine</h2><p><b>1.</b> <a href="https://experts2.ru/FqutBy?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=1">Разработка игр на Unreal Engine с нуля</a> | <b>Нетология</b></p><p>Полный и очень информативный курс для старта в профессии. Преподаватели помогут освоить игровой движок с нуля, научат создавать игры без написания кода. По окончании обучения в портфолио появится профессионально сделанная игра в жанре приключения с видом от третьего лица в формате 3D и несколькими игровыми уровнями.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/83d6cec4-44fd-4072-8cd4-650dc8ca3a8b.png" alt="" /></figure><ul><li>Стоимость: 2 575 руб./мес.</li><li>Длительность: 4,5 месяца</li><li>Формат обучения: общеразвивающая теоретическая программа с уроками по расписанию, практические занятия, онлайн-вебинары (запись остается в личном кабинете), итоговый проект</li><li>Сертификат: сертификат о прохождении программы</li></ul><p><b>Кому подойдет: </b>для начинающих</p><p><b>Преимущества:</b></p><ul><li>сложность итогового задания выбирается самостоятельно;</li><li>можно получить работу через 3 месяца после начала учебы;</li><li>бонусы — основы гейм-дизайна, софт скиллс, английский деловой язык, руководство по оформлению самозанятости.</li></ul><p><b>Недостатки:</b></p><ul><li>обучение стартует с конкретной даты и заканчивается строго в установленный срок.</li></ul><p><b>Программа обучения:</b></p><ul><li>основные алгоритмы;</li><li>балансировка адвенчур с видом от третьего лица;</li><li>объекты, наполнение, игровые элементы;</li><li>игровые уровни, локации и миры в Unreal Engine.</li></ul><p><a href="https://experts2.ru/FqutBy?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=1">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>2. </b><a href="https://experts2.ru/kSveKs?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=2">Разработчик игр на Unreal Engine 5 с нуля</a> | <b>Skillbox.ru</b></p><p>Для этого курса характерно изучение новинок Unreal Engine 5. В частности, редактора для реалистичных человекообразных персонажей MetaHuman, 10 тысяч реальных объектов в пакете MegaScans, системы для автоматической отрисовки сложных моделей Nanite, инструмента для создания динамического освещения Lumen. Здесь писать код на С++ в нужном объеме для создания игр.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/1fd92025-d33b-4c77-8d4c-e424494b94bd.png" alt="" /></figure><ul><li>Стоимость в месяц: 7 394 руб./мес.</li><li>Длительность: 12 месяцев</li><li>Формат обучения: видео, практика (65 заданий), общение с кураторами, еженедельные эфиры с геймдейв-экспертами</li><li>Сертификат: сертификат установленного гос. образца</li></ul><p><b>Кому подойдет: </b>для всех, кто занимается разработкой игр, хочет научиться этому или повысить свое мастерство.</p><p><b>Преимущества:</b></p><ul><li>через 7 месяцев учебы можно смело брать коммерческие заказы;</li><li>помощь с трудоустройством;</li><li>создание 4-х разноплановых игр для портфолио;</li><li>курс по нейросетям в подарок;</li><li>доступ к личному кабинету и чату в Telegram навсегда.</li></ul><p><b>Недостатки:</b></p><ul><li>отмечается сложная подача информации.</li></ul><p><b>Программа обучения:</b></p><ul><li>процесс разработки игр;</li><li>азы геймдизайна;</li><li>код на С++;</li><li>инструменты Unreal Engine 5;</li><li>система визуального скриптинга Blueprints.</li></ul><p><a href="https://experts2.ru/kSveKs?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=2">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>3. </b><a href="https://experts2.ru/qbEauC?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=3">Профессия Разработчик игр на Unreal Engine с нуля до Middle</a> | <b>Skillbox.ru</b></p><p>Авторы курса разработчика Unreal Engine учат работать на движке, программировать на С++ и Blueprints, разным подходам к написанию кода. Всех ждет подробный разбор инструментов для постановки света, анимации, съемки и визуальных эффектов. Отдельное внимание будет уделено методу Kanban для грамотной организации рабочего процесса и работы в команде.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/7215960e-93b4-486a-a8b0-9c92b4aa88e8.png" alt="" /></figure><ul><li>Стоимость: 6 094 руб./мес.</li><li>Длительность: до 8 месяцев</li><li>Формат обучения: видеоуроки, вебинары, домашнее задание с поддержкой от кураторов, 4 итоговые игры</li><li>Сертификат: сертификат установленного образца</li></ul><p><b>Кому подойдет: </b>новичкам, мечтающим быстро дойти до среднего уровня и повысить ценник на услуги.</p><p><b>Преимущества:</b></p><ul><li>геймджемы для отработки навыков;</li><li>закрытые воркшопы для общения с профи и полезных знакомств;</li><li>портфолио из 4 игр разных жанров;</li><li>бонусный курс по использованию нейросетей в играх;</li><li>первый заработок через полгода + помощь с трудоустройством по окончанию обучения.</li></ul><p><b>Недостатки:</b></p><ul><li>высокая полная цена.</li></ul><p><b>Программа обучения:</b></p><ul><li>теоретическая часть с введением в разработку игр;</li><li>работа с Unreal Engine + стажировка в практической лаборатории GameBox;</li><li>как дорасти до уровня Middle-разработчика игр.</li></ul><p><a href="https://experts2.ru/qbEauC?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=3">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>4. </b><a href="https://experts2.ru/IzoviK?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=4">Профессия Разработчик на Unreal Engine </a>| <b>GeekBrains</b></p><p>Курс-практикум, состоящий из онлайн-занятий в мини-группах от 5 до 10 человек. В компании намного интереснее изучать разработку игровых проектов для ПК, Android и iOS, программировать на С++ и овладевать визуальным скриптингом на Blueprints. Здесь научат создавать собственные плагины, применять принципы ООП и паттернов для личного геймдева, работать с интеллектуальной надстройкой для улучшения структур и статического анализа. Для портфолио будут подготовлены аркада, 2D игра, парочка платформеров в стиле стелс и ретро. Командный проект со стажировки в профессиональной студии также можно приобщить списку собственных достижений.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/236fbd6d-bcb2-447d-a394-cdeefe836204.png" alt="" /></figure><ul><li>Стоимость: 3 386 руб./мес.</li><li>Длительность: 12 месяцев</li><li>Формат обучения: комбинирование живых уроков с теоретическими лекциями в записи, практика и геймджемы, домашние задания с проверкой в течение 24 часов</li><li>Сертификат: официальный сертификат от школы на основании государственной лицензии об образовании</li></ul><p><b>Кому подойдет: </b>всем, кто ищет свое призвание в геймдеве, кино, дизайне, промышленности, хочет работать над высоко бюджетными проектами в студии или стать высокооплачиваемым фрилансером.</p><p><b>Преимущества:</b></p><ul><li>4+ разноплановых проекта в портфолио;</li><li>помогают с трудоустройством;</li><li>стажировка в профессиональной студии по разработке игр;</li><li>каждые 3 месяца проводится отбор для работы над реальными заказами.</li></ul><p><b>Недостатки:</b></p><ul><li>дедлайн из-за онлайн-уроков, нужно успевать вовремя подключиться к занятию, чтобы задать интересующие вопросы экспертам.</li></ul><p><b>Программа обучения:</b></p><ul><li>введение в разработку игр;</li><li>базовый уровень;</li><li>продвинутый уровень;</li><li>дополнительный курс по видеопродакшену.</li></ul><p><a href="https://experts2.ru/IzoviK?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=4">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>5. </b><a href="https://experts2.ru/cbxIyW?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=5">Unreal Engine Game Developer. Basic</a> | <b>OTUS.ru</b></p><p>На этом онлайн-обучении Unreal Engine учат создавать динамичные шутеры. Для начала слушатели знакомятся с разработкой на Unreal Engine 5. Они научатся скрипте на Blueprints и программированию на С++, объединению анимации, визуальных эффектов, персонажей и других элементов в формат игры. Специальных навыков не требуется, но будет плюсом знание хотя бы одного языка программирования и принципов ООП.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/f0e9f314-5fc6-4867-aeb7-de58905f4a5f.png" alt="" /></figure><ul><li>Стоимость: от 6 667 руб./мес.</li><li>Длительность: 5 месяцев</li><li>Формат обучения: только вебинары без предзаписанных занятий, живое общение с преподавателями в формате «вопрос-ответ», много практики, итоговый проект — шутер с видом от третьего лица</li><li>Сертификат: именной сертификат о прохождении курса</li></ul><p><b>Кому подойдет: </b>желающим освоить разработку игр с нуля или сменить профессию на геймдев.</p><p><b>Преимущества:</b></p><ul><li>создание и пополнение портфолио;</li><li>помощь с карьерой;</li><li>размещение резюме в базе OTUS.</li></ul><p><b>Недостатки:</b></p><ul><li>старт обучения закреплен за календарной датой;</li><li>дедлайн из-за расписания онлайн-занятий.</li></ul><p><b>Программа обучения:</b></p><ul><li>создание игровых персонажей и NPC;</li><li>система стрельбы и отдачи;</li><li>крафтинг и сохранение инвентаря, арсенала;</li><li>пользовательский интерфейс;</li><li>работа с мультиплеером;</li><li>устранение ошибок и багов.</li></ul><p><a href="https://experts2.ru/cbxIyW?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=5">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>6. </b><a href="https://experts2.ru/TBxfoh?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=6">Unreal Engine Game Developer. Professional</a> |<b> OTUS.ru</b></p><p>Для поступления на этот курс потребуются базовые знания основ Unreal Engine, одного из языков программирования, опыт работы с Blueprints. Новичкам будет сложно освоить программу без этих основ. После обучения студенты смогут заниматься разработкой исходного кода движка, создавать не только локальные, но и многопользовательские игры, расширять редактор Unreal Engine, делать плагины, модули, звуковые и визуальные эффекты.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/fbee2179-a591-4410-a9ae-5af9058ff297.png" alt="" /></figure><ul><li>Стоимость: 5 500 руб./мес.</li><li>Длительность: 5 месяцев</li><li>Формат обучения: онлайн-вебинары, записи которых сохраняются в свободном доступе, живое общение с преподавателями, домашние задания с проверкой, много практики, защита итогового проекта в виде онлайн-презентации</li><li>Сертификат: сертификат установленного образца, свидетельство о повышении квалификации</li></ul><p><b>Кому подойдет: </b>новичкам в геймдеве. знакомым с основами программирования, начинающим гейм-мастерам.</p><p><b>Преимущества:</b></p><ul><li>помощь с трудоустройством + рекомендательное письмо;</li><li>активное комьюнити в закрытом Telegram-чате;</li><li>размещение резюме в базе OTUS;</li><li>разработка для портфолио многопользовательской игры.</li></ul><p><b>Недостатки:</b></p><ul><li>онлайн-занятия проводятся в среду и пятницу с 20:00 по МСК, а значит, придется планировать время, чтобы успеть подключиться к уроку.</li></ul><p><b>Программа обучения:</b></p><ul><li>тестирование и выстраивание логики игры;</li><li>разработка плагинов и модулей;</li><li>задумка и развитие персонажа;</li><li>дизайн уровней;</li><li>мультиплеер.</li></ul><p><a href="https://experts2.ru/TBxfoh?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=6">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>7. </b><a href="https://experts2.ru/twcJDz?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=7">Разработчик игр на Unreal Engine</a> | <b>XYZ School</b></p><p>Один из лучших курсов по разработке игровых интерфейсов, программирования на С++, реализации механики движения и стрельбы, настройки основных и неигровых персонажей. Можно записываться даже не имея никакой предварительной подготовки. 5 авторов-практиков учат с нуля и доводят до уровня Junior Unreal Engine-разработчика. В процессе обучения каждый слушатель придумает и сделает собственный инди-проект для портфолио.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/840bff2a-7957-44ef-8a1a-fe6cc8440ae5.png" alt="" /></figure><ul><li>Стоимость: 5 800 руб./мес. в рассрочку;</li><li>Длительность: 9 месяцев;</li><li>Формат обучения: фидбэк от профессионалов (один урок + 1 домашнее задание), лекции, стримы, чек-листы и доп. материалы — в личном кабинете, итоговый проект</li><li>Сертификат: сертификат об обучении</li></ul><p><b>Кому подойдет: </b>геймерам, мечтающим самостоятельно разрабатывать игры; желающим найти работу в игровой индустрии; тестировщикам, гейм-дизайнерам и другим «смежникам», которые хотят расширить круг компетенций.</p><p><b>Преимущества:</b></p><ul><li>обучение в комфортном темпе;</li><li>поддержка куратора;</li><li>заморозка обучения, если не хватает времени.</li></ul><p><b>Недостатки:</b></p><ul><li>высокая интенсивность подачи материала и много практики, которую не всегда успеваешь сделать.</li></ul><p><b>Программа обучения:</b></p><ul><li>программирование на С++;</li><li>реализация игровой механики;</li><li>разработка интерфейса;</li><li>создание движка для игр в формате 2D;</li><li>дерево поведения и карта передвижений персонажей;</li><li>код-ревью для устранения ошибок.</li></ul><p><a href="https://experts2.ru/twcJDz?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=7">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>8.</b> <a href="https://experts2.ru/pthBnR?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=8">Геймплей-программи­рование</a> | <b>XYZ School</b></p><p>Этот курс придумали 2 практикующих автора — Александр Шумейко и Александр Баклашкин. Они предлагают программу на собственном опыте в области разработки игр на движке Unreal Engine. Для поступления потребуется знание хотя бы одного языка программирования и опыт геймдева.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/f46e1dc9-5197-4f89-a7fc-089b3d5c3def.png" alt="" /></figure><ul><li>Стоимость: 5 327 руб./мес.</li><li>Длительность: 5 месяцев</li><li>Формат обучения: урок, домашние задания для закрепления материала раз в неделю, фидбэк от преподавателей, стримы, дипломный проект</li><li>Сертификат: сертификат школы</li></ul><p><b>Кому подойдет:</b> тем, кто знает хотя один язык программирования; хочет креативить в игровой студии, создавая собственные проекты, а также желающим повысить навыки в геймдеве.</p><p><b>Преимущества:</b></p><ul><li>учись, когда удобно, делай паузу в обучении, если нужно;</li><li>личный куратор, поддержка и модерация;</li><li>доступ в геймдев-сообщество № 1 на территории СНГ.</li></ul><p><b>Недостатки:</b></p><ul><li>программу не освоить новичкам, не имеющим опыта.</li></ul><p><b>Программа обучения:</b></p><ul><li>вводная часть, знакомство с интерфейсом;</li><li>работа над созданием персонажа от внешнего вида до контроля за движением;</li><li>наполнение арсенала + возможность прокачки оружия;</li><li>использование ИИ для NPC в шутерах;</li><li>геймплей, сохранение результатов, переход на следующие уровни.</li></ul><p><a href="https://experts2.ru/pthBnR?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=8">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>9. </b><a href="https://experts2.ru/JHsfnb?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=9">Unreal engine 4</a> | <b>Coddy School </b></p><p>Авторская группа, состоящая из преподавателей онлайн-школы, разработала специальный курс Unreal Engine 4 для детей от 12 до 16 лет. По мнению специалистов, именно в этом возрасте, а не раньше, лучше всего усваивается язык программирования С++. Но в данном случае кодирование не понадобится. Учитывая массовое увлечение подростков геймдевом, спикеры подробно и доступно расскажут о разработке игр без написания кода, помогут наработать практические навыки. На выходе у каждого ребенка будет собственноручно изготовленная игра.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/365edd23-b552-4926-a1db-28b15a4899b3.png" alt="" /></figure><ul><li>Стоимость: 6 800 руб.</li><li>Длительность: 6 месяцев</li><li>Формат обучения: индивидуальные и групповые занятия (до 8 человек) в онлайн/офлайн формате</li><li>Сертификат: именной сертификат от школы</li></ul><p><b>Кому подойдет: </b>курс заявлен, как школьный, для детей 12–16 лет.</p><p><b>Преимущества:</b></p><ul><li>бесплатное пробное занятие;</li><li>используется собственная система скриптинга, более доступная для понимания;</li><li>не требуется знание языка С++.</li></ul><p><b>Недостатки:</b></p><ul><li>есть системные требования к компьютеру;</li><li>потребуется установка конкретных программ (школа предоставляет ссылки и инструкции).</li></ul><p><b>Программа обучения:</b></p><ul><li>знакомство с интерфейсом Unreal Engine;</li><li>принципы работы в 3D формате;</li><li>освоение Material Editor;</li><li>визуальное программирование в Blueprints;</li><li>игровые персонажи, объекты, карты.</li></ul><p><a href="https://experts2.ru/JHsfnb?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=9">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>10. </b><a href="https://experts2.ru/kibnNL?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=10">Unreal Engine для новичков</a> | <b>Хохлов Сабатовский</b></p><p>Авторский курс, охватывающий основные аспекты быстрого освоения Unreal Engine. Здесь закладываются первичные знания, дается необходимая база для дальнейшего развития в геймдеве. Дмитрий Шпатов разработал учебный план на основе собственного опыта. Когда-то он тоже начинал с разработчика игр, а сейчас выступает в качестве технического лида в Федеральном центре доп. образования России.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2025-02-13/b1cbf71c-0a46-4d75-be00-e5c9c7cbaf3c.png" alt="" /></figure><ul><li>Стоимость: 3 763 руб./мес.</li><li>Длительность: 9 недель</li><li>Формат обучения: урок + домашнее задание к нему, практические работы для сборки личного проекта в портфолио</li><li>Сертификат: не предусмотрен</li></ul><p><b>Кому подойдет: </b>для тех, кто хочет попасть в геймдев или киноиндустрию, желает научиться создавать графику и визуальные миры, а также больше зарабатывать.</p><p><b>Преимущества:</b></p><ul><li>приобретение навыков;</li><li>начало карьеры геймдева;</li><li>проект в портфолио.</li></ul><p><b>Недостатки:</b></p><ul><li>системные требования к компьютеру;</li><li>есть дедлайн из-за установленного расписания.</li></ul><p><b>Программа обучения:</b></p><ul><li>освоение Unreal Engine;</li><li>создание виртуальных миров;</li><li>анимация сцен;</li><li>оптимизация проекта и вывод в формате видео.</li></ul><p><a href="https://experts2.ru/kibnNL?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=10">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><h2>Еще 5 курсов по Unreal Engine</h2><p>Если вышеперечисленные курсы вам не подошли, рекомендую обратить внимание на следующие программы, которые получили положительные отзывы от участников.</p><ul><li><a href="https://experts2.ru/nXlcBi?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Курс Unreal Basics</a> от Unrealskills — это вводный курс для освоения движка с нуля, разработанный Даниилом Лихомановым. Начать можно бесплатно, чтобы затем купить по специальной цене. В первой части дается доступ только к первому блоку, в котором предусмотрены знакомство с движком и созданию простенького проекта. В платной части эксперт научит манипулировать объектами, работать с редактором, создавать собственные PBR- и Parallax материалы, запекать свет в текстуры и другим фишкам. Явным плюсом является то, что автор не игнорирует пользователей и регулярно общается со всеми в закрытой группе VK.</li><li><a href="https://experts2.ru/BMxfwm?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Курс Unreal Engine</a> от Айтигенио (itgen.io) — программа направлена на формирование навыков для реализации самых креативных идей в геймдеве. Здесь научат свободно ориентироваться и пользоваться интерфейсом движка, создавать сцену со всеми визуальными эффектами и 2D-объектами, работать с ландшафтом, воплощать задумки по материалам и освещению, наполнять игру звуковым сопровождением, анимировать персонажей и программировать на BluePrints.</li><li><a href="https://experts2.ru/fvuXBq?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Разработчик игр (Unreal Engine)</a> от IT Avenue — трехмесячный онлайн-курс для освоения базовых навыков геймдева. Преподают геймдизайн, С++, игровую логику. Научат создавать и анимировать персонажей, настраивать звуки, эффекты и освещение, тестировать готовый продукт.</li><li><a href="https://experts2.ru/KphsTb?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Base. Unreal engine</a> от XRschool — практический интенсив, состоящий из 21 занятия и работой над итоговым игровым проектом. Научат разрабатывать анимированные сцены, создавать собственные материалы и текстуры, настраивать звук и освещение, подбирать спец.эффекты. В конце выдается удостоверение о повышении квалификации.</li><li><a href="https://experts2.ru/QcgjKp?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Unreal Engine — полное руководство по разработке на С++</a> от Udemy — учебно-практический курс с основ до полноценного игрового продукта. Рассматриваются все ключевые концепты движка, учат писать коды на С++. В процессе собирается материал для собственной игры. На выходе слушатель получает в портфолио шутер с видом от третьего лица.</li></ul><h2>Еще 5 курсов по Unreal Engine 5</h2><p>Обновленный движок Unreal Engine 5 — это возможность создавать сотни персонажей, отличающихся лицом, одеждой, аксессуарами. Версия позволяет разработчикам использовать сетки с высокой детализацией процессов и динамическую глобальную систему освещения. Программное обеспечение уже оценили архитекторы, графические дизайнеры и другие специалисты, работающие над созданием виртуальных объектов.</p><ul><li><a href="https://experts2.ru/yjqsBS?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Unreal Engine 5 для дизайнеров и архитекторов</a> от Специалист.ru — курс рассчитан на специалистов, работающих в сфере 3D-моделирования. Учат ориентироваться в интерфейсе, переносить объекты из 3dsMax вместе с материалами, освещением, анимацией, работать с библиотеками, настраивать свойства 3D-моделей в условиях движка, оптимизировать процесс с помощью Nanite, создавать и редактировать материалы.</li><li><a href="https://experts2.ru/rFsnYq?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Уроки Unreal Engine</a> от itProger — программа для новичков, желающих освоить обновленный движок. Научат работать с интерфейсом, делать красивую дизайн-среду, пользоваться возможностями встроенного магазина. Расскажут об особенности написания кода и возможности использовать <a href="https://itproger.com/news/kak-programmirovat-bez-koda-ili-chto-takoe-no-code-i-low-code">No Code или Low Code</a> подход, а также познакомят с работой Blueprints.</li><li><a href="https://experts2.ru/kSveKs?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Разработчик игр на Unreal Engine 5</a> от Teachmeskills — 9-месячный полный курс с нуля до трудоустройства. В программе — изучение системы визуального программирования Blueprints, языка С++, особенностей данной версии движка, проектирование и создание игр, освоение работы VFX, анимациями, звуками, левел дизайном.</li><li><a href="https://experts2.ru/vWksYx?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Unreal Engine 5</a> от Arhiteach — это курс архитектурной визуализации для профи. Слушатели получают сертификат международного образца по окончании обучения, более 160 уроков и сотни практических заданий для наполнения портфолио, живые вебинары с моментальной обратной связью, навыки для создания высокооплачиваемых кейсов.</li><li><a href="https://experts2.ru/WPrcwk?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Разработка игр на Unreal Engine 5</a> от Scream School — курс для программистов, желающих создавать собственные игровые проекты. За несколько месяцев здесь научат полностью использовать потенциал движка для разработки креативных и коммерчески значимых проектов.</li></ul><h2>Еще 4 курса по Unreal Engine 4</h2><p>Курсы Unreal Engine 4 остаются самыми востребованными у желающих освоить разработку компьютерных и мобильных игр, архитектурных рендеров и других виртуальных моделей.</p><ul><li><a href="https://experts2.ru/DhloXw?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Создание игр на Unreal Engine 4 </a>от Михаила Русакова — авторский видеокурс из 184 обучающих роликов продолжительностью около 41 часа. У издателя есть блог и группа в ВК, но для продажи данного учебного пособия создан сайт. Материал разбит на 12 блоков. Каждый модуль посвящен отдельной теме с лекциями и практическими примерами. К каждому уроку разработано упражнение, которое необходимо выполнить. Обратная связь возможна только на страничках в соцсетях.</li><li><a href="https://experts2.ru/UbivGd?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Unreal Engine 4 - Реалистичный Рендер Кухни-Гостиной</a> от Udemy.com — курс для продвинутых пользователей, рассчитанный на 14 часов. Потребуются знания 3D Studio Max, Photoshop. Научат работать с 3D объектами с помощью инструментов Unreal Engine.</li><li><a href="https://experts2.ru/JKpnyi?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Архитектурная визуализация в UE4</a> от CGTarian — онлайн-курс для тех, кто уже в профессии и хочет расширить уровень компетенций. Продолжительность — 2 месяца, старт назначается 1 раз в 3 месяца. Программа состоит из лекций, практических занятий с инструктором. Слушателю придется выделять 5–10 часов в неделю на обучение.</li><li><a href="https://experts2.ru/tHwybM?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Шутер на Unreal Engine 4</a> от itProger — это видеоурок по созданию шутера с помощью инструментов Unreal Engine 4. Научат настраивать камеру, шкалу жизни и доспехов персонажа, нанесение урона, прокачку навыков, оружия, снаряжения, стрельбу и прицеливание, анимацию, врагов, ИИ и другие элементы.</li></ul><h2>Бесплатные курсы по Unreal Engine</h2><p>Есть возможность не тратить деньги и попробовать свои силы в разработке игр на бесплатных курсах. Программы достаточно насыщенные, поэтому базовые навыки получить можно.</p><p><b>1. </b><a href="https://experts2.ru/BlexmK?sub1=tproger-kf&amp;sub2=unreal-engine-kursy&amp;sub4=netop">Создание игр на Unreal Engine</a> — <b>Stepik</b></p><p>Обучающий курс включает практику работы с обновленным движком UE5. В программе заявлены 125 теоретических урока, 103 теста для закрепления знаний, 163 интерактивные задачи.</p><p><b>Главное о курсе: </b></p><ul><li>предназначен для новичков и продвинутых пользователей;</li><li>желательно знать английский язык на уровне чтения технической литературы;</li><li>практика по созданию офлайн и онлайн игр;</li><li>базовое изучение С++;</li><li>обзор и применение основных функций Unreal Engine 5.</li></ul><p><b>2. </b><a href="https://www.youtube.com/watch?v=CdV4sG_bY5w">Unreal Engine 5 + Blender</a> — <b>«Мультодей»</b></p><p>Это видео-учебник по игровому дизайну для начинающих геймдевов. Он состоит из видеофильма, в котором развернуто рассказывается обо всех нюансах работы с движком. Особое внимание уделяется написанию собственного прототипа и сценария игры. В конце обучения вы научитесь создавать 3D-активы.</p><p><b>Главное о курсе: </b></p><ul><li>программа включает все этапы разработки игр (пре-продакшн, прототипирование, создание реквизитов и персонажей в Blender);</li><li>6-часовое видео разбито на эпизоды для удобной навигации;</li><li>в видео включены отзывы о движке от разработчиков игр.</li></ul><p><b>3.</b> <a href="https://www.youtube.com/watch?v=4GTnx459XnA">Базовый курс по Unreal Engine</a> — <b>AdQuantumDesign</b></p><p>Это 3-часовой видеофильм по работе в Unreal Engine 4 на примерах создания рекламных роликов для мобильных игр. Это пошаговая инструкция всего процесса и рекомендации, как достичь желаемого результата. Рассматриваются типовые вопросы, возникающие при установке движка и использовании инструментов.</p><p><b>Главное о курсе: </b></p><ul><li>подробный обзор интерфейса и режимов;</li><li>установка плагинов;</li><li>карты высот, каналы освещения, принципы работы с материалами;</li><li>анимация и настройки рендера.</li></ul><p><b>4.</b> <a href="https://www.youtube.com/watch?v=3RlnclPo-3U">Game Animation Sample Project 5.5 Updates</a> —<b> Unreal Engine</b></p><p>Стрим, первый прямой эфир которого завершился 17 января 2025 года. Он посвящен разбору особенностей версии Unreal Engine 5.5. В нем появились обновления для движка, некоторых типовых проектов и анимации. В данном видео они рассматриваются на конкретном игровом проекте.</p><p><b>Главное о курсе: </b></p><ul><li>стримы проводятся раз в неделю;</li><li>работает чат, в котором можно задавать вопросы авторам и его гостям;</li><li>авторы проекта — команда профессиональных создателей анимационных объектов;</li><li>на главной странице канала можно найти массу материалов о предыдущих версиях Unreal Engine.</li></ul><h2>Разработчик игр на Unreal Engine</h2><h2>Род деятельности</h2><p>Специалист по разработке игр занимается не только созданием отдельных элементов, но и собирает их воедино. Его задача обеспечить удобное управление персонажем, логичное проявление визуальных эффектов. Немаловажную роль играет анимация объектов. Она должна полностью соответствовать игровому процессу, не диссонировать с окружающей средой.</p><h2>Навыки</h2><ul><li>освоение языка программирования С++ для написания кодов;</li><li>знания игровых жанров и их особенностей;</li><li>английский язык, т.к. не все программы переведены на языки пользователей;</li><li>знания основных законов физики, математики, логики.</li></ul><h2>Где учиться</h2><p>Этой специализации обучают только на курсах, поскольку в учебных заведениях она пока не представлена. Один из вариантов — получить образование программиста, а затем самостоятельно освоить разработку игр на Unreal Engine.</p><h2>Уровень заработной платы</h2><p>Разработчики на Unreal Engine востребованы в различных сферах, включая гейм-девелопмент, архитектурную визуализацию и VR/AR. Средняя зарплата начинающего специалиста составляет около 60–80 тысяч рублей в месяц, а опытные разработчики могут зарабатывать от 150 до 300 тысяч рублей.</p><p>Рассмотрим несколько активных вакансий на <a href="https://hh.ru/search/vacancy?text=%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5+%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D0%B8+%D0%BD%D0%B0+Unreal+Engine&amp;salary=&amp;ored_clusters=true&amp;area=1&amp;area=2023&amp;hhtmFrom=vacancy_search_list&amp;hhtmFromLabel=vacancy_search_line">hh.ru</a>:</p><ul><li><a href="https://hh.ru/vacancy/115090315?query=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA+%D0%B8%D0%B3%D1%80+%D0%BD%D0%B0+Unreal+Engine&amp;hhtmFrom=vacancy_search_list">Программист / Разработчик Unreal Engine 4/5 Developer (C++ / Blueprints)</a> с опытом работы от 3 до 6 лет — до 200 000 руб. на руки;</li><li><a href="https://hh.ru/vacancy/115567703?query=%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5+%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D0%B8+%D0%BD%D0%B0+Unreal+Engine&amp;hhtmFrom=vacancy_search_list">Blender-специалист со знаниями Unreal Engine 5</a> — от 250 000 до 300 000 руб. до вычета налогов;</li><li><a href="https://hh.ru/vacancy/113850785?query=%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5+%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D0%B8+%D0%BD%D0%B0+Unreal+Engine&amp;hhtmFrom=vacancy_search_list">Технический дизайнер / Technical artist (Unreal Engine)</a> — от 80 000 до 120 000 руб. на руки</li><li><a href="https://hh.ru/vacancy/115835841?query=%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5+%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D0%B8+%D0%BD%D0%B0+Unreal+Engine&amp;hhtmFrom=vacancy_search_list">Cinematic Artist/Level Designer/Environment Artist/Layout Artist</a> — от 100 000 руб. на руки.</li></ul><h2>Заключение</h2><p>Профессия разработчика игр востребована на рынке. Практически каждый человек имеет по несколько любимых виртуальных игрушек, загруженных в компьютер или смартфон. Есть отдельная категория людей, постоянно ищущих новинки гейм-индустрии. Специалисты, способные создавать разные игровые жанры, качественную анимацию, интересный контент нужны в этой области, как воздух. Поэтому уровень их заработной платы достаточно высок. Об этом можно судить по размещенным на <a href="https://hh.ru/search/vacancy?text=%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5+%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D0%B8+%D0%BD%D0%B0+Unreal+Engine&amp;salary=&amp;ored_clusters=true&amp;area=1&amp;area=2023&amp;hhtmFrom=vacancy_search_list&amp;hhtmFromLabel=vacancy_search_line">hh.ru</a> вакансиях. Стоит заметить, что в публикации они держатся недолго. Поэтому настоятельно рекомендую обратить внимание на Unreal Engine курсы, которые предлагают помощь в трудоустройстве.</p><p><b>Подборки по схожим темам:</b><b></b></p><ol><li><a href="https://tproger.ru/articles/top-35-kursov-po-sozdaniyu-sajtov--onlajn-obuchenie-po-razrabotke-sajtov-s-nulya" rel="nofollow">Лучшие курсы по созданию сайтов</a></li><li><a href="https://tproger.ru/articles/top-61-kursov-veb-razrabotchika--luchwee-onlajn-obuchenie-programmirovaniyu-besplatno-i-platno" rel="nofollow">Лучшие курсы веб-разработчика</a></li><li><a href="https://tproger.ru/articles/kursy-verstki-html-i-css-253340" rel="nofollow">Лучшие курсы HTML и CSS</a></li><li><a href="https://tproger.ru/articles/kursy-c---i-c-" rel="nofollow">Лучшие курсы по языкам программирования</a></li></ol><p><i>Информация о курсах постоянно меняется, обновляется, дополняется. Если вы обнаружили какую-нибудь неточность или нашли в интернете новое интересное предложение, сообщите об этом в комментариях. Я внесу изменения, а также дополню список.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Разработка игр для начинающих: с чего начать?</title>
      <link>https://tproger.ru/articles/razrabotka-igr-dlya-nachinayushhih--s-chego-nachat-</link>
      <comments>https://tproger.ru/articles/razrabotka-igr-dlya-nachinayushhih--s-chego-nachat-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ксения Андреева]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/razrabotka-igr-dlya-nachinayushhih--s-chego-nachat-</guid>
      <description><![CDATA[<p>В этой статье рассмотрим основные шаги и этапы в разработке игр, независимо от того, хотите вы создать игру «для себя» для монетизации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/razrabotka-igr-dlya-nachinayushhih--s-chego-nachat-">Разработка игр для начинающих: с чего начать?</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Unity]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Работа со звуком]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Epic Games]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Бета]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 06 Feb 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня создать свою игру может почти каждый, но у новичков в геймдеве неизбежно возникает множество вопросов. Какие инструменты использовать? Какую платформу выбрать? Какие навыки развивать в первую очередь? И, самое главное, как сделать игру, которая действительно понравится многим?</p><p>В этой статье рассмотрим основные шаги и этапы в разработке, независимо от того, хотите вы создать игру «для себя» или  для монетизации.</p><h2>Выбор платформы и инструментов</h2><p>Это первый и, пожалуй, самый важный шаг. Всё зависит от выбранного типа игры, ваших навыков, и платформы, на которой игра будет размещена.</p><ol><li><b>Unity</b> — самый популярный движок, известный своей гибкостью и возможностью создавать как 2D и 3D игры. На Unity можно клипать игры для ПК, консолей и мобильных устройств. Более половины всех игр созданы с этим движком.</li><li><a href="https://www.unrealengine.com">Unreal Engine</a> — движок от Epic Games, известный своей классной графикой и детализацией. Unreal Engine используют для создания ААА-игр за счёт работы на Blueprints. Кстати, многие крупные геймдев-компании предпочитают именно Unreal Engine.</li><li><a href="https://godotengine.org/">Godot</a> — открытый исходный код движка, который набирает популярность благодаря лёгкости освоения. У Godot есть свой язык, GDScript, который даёт возможность перейти к созданию игр без сложных настроек.</li></ol><p><b>Есть два способа создания игр:</b> программирование и визуальное программирование. И если с «обычным» программированием всё понятно, то с помощью Blueprints в Unreal Engine можно создавать сложные логические структуры; а GDScript — более традиционный способ программирования, но с упрощённым синтаксисом.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-01-23/64f771ee-c98f-4b36-9826-abe26749fc87.jpg" alt="" /><figcaption>Игра Into the Stars была создана полностью на базе Unreal Blueprints, вообще без кода.</figcaption></figure><p>Сообщество геймдева, кстати, активно поддерживает разработчиков через форумы (например,<a href="https://gamedev.ru/"> gamedev.ru</a>). Там вы сможете найти советы и истории разработки от профессионалов сферы.</p><h2>Основы игрового дизайна</h2><p><b>Первый шаг — идея. </b>А именно: мозговой штурм, анализ трендов и оценка ваших интересов и навыков. В первую очередь должна быть реализуемой, а не уникальной. Здесь на помощь придут сайты по типу<a href="https://www.gamasutra.com/"> Gamasutra</a> для поиска «вдохновения» и анализа тенденций.</p><p><b>Второй шаг — разработка простого геймплея и механик. </b>Геймплей — буквально сердце вашей игры, именно он определяет, как пользователь будет взаимодействовать с приложением. Основные элементы здесь — определение целей игры, правил и системы вознаграждений. Классно разработанный геймплей будет удерживать игроков.</p><p><b>Третий шаг — тестирование MVP. </b>Это тестирование идей и механик ещё до публикации игры. С помощью простых прототипов вы сможете проверить, как работает геймплей без необходимости полного погружения в разработку.</p><p>Кстати, с помощью Unity или Godot Engine можно быстро создавать базовые версии игр и проводить альфа/бета-тесты с небольшой группой пользователей. Так вы получите фидбек от пользователей и сэкономите время на поиске багов вручную.</p><h2>Базовые навыки в геймдеве</h2><p>Сюда относится <b>программирование, работа с визуалом и звуком, основы физики и анимации.</b></p><p>Без кода игра не будет работать так, как задумывалось (<i>спасибо, кэп</i>). <b>Самыми популярными языками программирования для разработки игр считаются C#, Python и C++.</b></p><p>C# широко используется благодаря движку Unity, который стал де-факто стандартом в геймдеве для инди-разработчиков и больших студий. Простота синтаксиса и широкая поддержка сообщества — вот за что выбирают C#.</p><p>Python обычно не используется для больших коммерческих проектов из-за ограничений по производительности. Но всё-таки он идеально подходит для обучения и создания простых прототипов. Всё благодаря его (относительной) лёгкости в теории и на практике.</p><p>C++ — ещё один популярный язык в индустрии геймдева, особенно когда речь идёт о проектах, которые требуют высокой производительности. Используется на базе Unreal Engine.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-01-23/69ca0d41-1a11-485c-8491-c0ed01d415ee.png" alt="" /></figure><p><b>Графика и звук очень важны в создании «атмосферности».</b> Именно с помощью них пользователи полностью погружаются в процесс игры.</p><ul><li>Начните с освоения базовых инструментов работы с графикой по типу Фотошопа или GIMP для 2D-графики и Blender или Maya для 3D-моделирования. Не забывайте про основы текстурирования и освещения — так сцены будут более реалистичными.</li><li>Работа со звуком — создание и поиск подходящей музыки и звуковых эффектов. С этим помогут программы по типу Audacity или FL Studio, а ещё сайт <a href="https://www.looperman.com/">Looperman</a>, где можно найти бесплатные сэмплы. Звук существенно влияет на восприятие игры пользователями — от тревожной музыки до ярких звуков во время победы.</li></ul><p><b>Начните изучение физики в играх с простых законов Ньютона</b>, чтобы понять, как объекты должны двигаться в игре.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-01-23/63e793f2-7ede-49c1-b4a3-8cab7af61b54.jpeg" alt="" /></figure><p><b>Анимация тоже важна.</b> Здесь имеется в виду движение персонажей и объектов в самой игре. С этим поможет Spine для 2D-анимации и Adobe After Effects.</p><h2>Что ещё важно</h2><p><b>На первых порах важно выбрать простую и реализуемую концепцию без сложных механик. </b>Попробуйте начать с разработки платформеров и пазлов, они отлично подходят для новичков. Так вы сможете сконцентрироваться на базовых механиках игрового процесса без сложной графики.</p><p>Платформеры хороши своей лёгкостью в реализации базовых механик прыжка и бега. К платформам можно отнести всем известный Super Mario или Terraria. Начать можно с создания простых уровней и изучения основ физики.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-01-23/eea7e6be-bdc1-4b11-8cd6-42e069ffd326.jpg" alt="" /><figcaption>Игра Life Goes On: Done to Death</figcaption></figure><p>А создание игр в жанре пазлов и головоломок помогут разработчикам сосредоточиться на логических задачах и интерактиве игры. А после публикации игры вы получите первые отзывы и поймёте, чего реально хочет аудитория.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-01-23/87008ac5-0053-4d66-8bea-ac8d9cbe66e7.jpg" alt="" /><figcaption>Сложная в реализации, но всё-таки головоломка и просто классная игра — Portal 2.</figcaption></figure><p><b>Прототипирование — критически важный этап,</b> на котором вы проверяете ваши идеи на жизнеспособность и получаете первые результаты:</p><ol><li><b>Определите ключевые элементы вашей игры.</b> Например, если вы делаете платформер, сосредоточьтесь на механике прыжков и взаимодействии с препятствиями.</li><li><b>Используйте Photoshop или GIMP для создания спрайтов </b>вашего персонажа и окружения.</li><li><b>Для программирования выбирайте игровые движки: Unity, Unreal Engine или Godot.</b> У каждого из этих движков большой набор инструментов для начинающих. А в интернете можно найти подробную документацию и руководства по созданию игры.</li><li><b>Создайте тестовый игровой уровень, </b>на котором вы и протестируете основные механики.</li></ol><p><b>Далее наступает время тестирования.</b> Это может быть либо самостоятельное тестирование, либо альфа/бета-тесты с привлечением небольшого пула игроков — так вы буквально сможете увидеть игру глазами ваших пользователя. А они укажут на элементы в игре, которые вы могли не заметить во время разработки.</p><p>После того, как получили первые отзывы на этапе тестов, <b>важно доработать игру:</b></p><ul><li>Исправьте выявленные ошибки;</li><li>Усильте графику, анимацию и звуковое сопровождение;</li><li>Добавьте новые уровни или усложните уже существующие.</li></ul><h2>Рекомендации</h2><p>Геймджемы и хакатоны — классная возможность прокачать свои геймдев-навыки в короткие сроки. На таких мероприятиях участники объединяются в команды и за короткое время создают игру на заданную тему. Так вы не только прокачаете навык быстрого и эффективного прототипирования, но и сможете завести полезные знакомства.</p><p>Среди самых известных геймджемов — Ludum Dare, который проводится с 2002 года. Многие игры, впервые созданные на LD, далее превращались в полноценные коммерческие проекты: например, игра <a href="https://partnerkin.com/blog/kejsy/history-of-two-developers">Druid</a>, <a href="https://stopgame.ru/game/broforce">Broforce</a>, <a href="https://www.pony-island.com/">Pony Island</a> (от создателей <a href="https://www.inscryption.com/">Inscription</a>).</p><p>А с помощью открытого исходного кода вы, как создатель игры, сможете изучить лучшие практики от опытных разработчиков и «забрать» их себе. На GitHub можно запросто найти много игр с открытым исходным кодом: от простых 2D-головоломок до сложных 3D-приключений.</p><p>Не забывайте и о постоянном самообразовании. В этом вам помогут специализированные курсы как на русском языке, так и на английском. С помощью них вы сможете набить руку и лучше понимать, какие практики стоит добавлять в игру, а какие нет.</p><p>И помните: многие игры создавались в одиночку. И при этом достигали большого успеха: Sally Face, Plague Inc, Papers, Please. И, конечно же, любимый многими разрабами Stardew Valley :)</p><p>Ручки чешутся, чтобы создать игру, а мозг пока не совсем готов? Заходите в наш <a href="https://t.me/+JR4NEBk3UWFiOTYy">тг по геймдеву</a>, обязательно поможем!</p>]]></content:encoded>
    </item>
    <item>
      <title>Основы работы с массивами и списками: что нужно знать каждому</title>
      <link>https://tproger.ru/articles/osnovy-raboty-s-massivami-i-spiskami</link>
      <comments>https://tproger.ru/articles/osnovy-raboty-s-massivami-i-spiskami?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/osnovy-raboty-s-massivami-i-spiskami</guid>
      <description><![CDATA[<p>Что такое массив и список. Показываем основы работы с данными в программировании. Рассматриваем пошаговую инструкцию ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/osnovy-raboty-s-massivami-i-spiskami">Основы работы с массивами и списками: что нужно знать каждому</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 21 Jan 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Массивы и списки — фундаментальные структуры данных, без которых не обходится ни один язык программирования. Они помогают хранить, обрабатывать и организовывать большие объемы информации, будь то пользовательские данные, результаты вычислений или элементы интерфейса. В этой статье разберем ключевые отличия массивов от списков, их преимущества и недостатки, а также рассмотрим базовые операции.</p><p><b>Массив</b> — структура данных фиксированного размера. Его элементы должны быть одного типа. Например: [10, 12, 85, 27]. Массивы статичны: нельзя изменить размер или тип элементов после объявления.</p><p><b>Список</b> — динамическая структура данных. В нем можно хранить элементы разных типов. Такая структура есть в Python. Пример списка: [0,”red”, 8.5, False].</p><p>Создание массивов и связанных списков отличается в зависимости от языка программирования. Рассмотрим примеры на Python, Java и C++.</p><h2>Объявление и создание</h2><p>В C++ память под массив выделяется статически, размер фиксируется на этапе компиляции. В Python и Java коллекции динамические — можно менять их размер во время выполнения программы.</p><p>В Python список обозначается квадратными скобками:</p><p>В Java и C++ массивы объявляются с указанием типа данных, их значения заключаются в фигурные скобки:</p><h2>Операции с массивами и списками</h2><p>Основные операции для работы с массивами и списками:</p><ul><li>чтение и запись элементов по индексу,</li><li>добавление новых элементов,</li><li>удаление элементов,</li><li>поиск элемента,</li><li>сортировка.</li></ul><h3>Чтение и запись</h3><p>Чтение и запись осуществляется с помощью <b>индексов</b> — целочисленных значений, указывающих позицию элемента. Индексация начинается с 0. Первый элемент имеет индекс 0, второй — индекс 1 и т. д.</p><p>Запись элемента в Python выполняется с присваиванием значения по индексу:</p><h3>Отрицательные индексы</h3><p>При обращении к элементам списка важно следить за границами индексов.</p><p>В Python допустимо обращение к элементам через отрицательные индексы:</p><p>В C++ технически возможно обратиться к элементу массива по отрицательному индексу, но делать этого не рекомендуется. При попытке получить доступ к индексу, выходящему за пределы выделенной памяти, можно повредить другие переменные.</p><p>Выход за пределы массива в C++ — неопределенное поведение. Все, что хранится за границами массива при обращении перезаписывается новым значением.</p><p>Java не поддерживает отрицательные индексы.</p><h3>Добавление новых элементов</h3><p>Добавление и удаление элементов зависит от используемого языка. В Python для этого есть встроенные методы:</p><p>В Java и C++ для добавления и удаления элементов массива нужно создавать новый массив. Процесс можно упростить с помощью динамических структур данных — класса ArrayList в Java или vector в C++.</p><h3>Итерации и циклы</h3><p>Самый распространенный способ обработки массивов и списков — циклы.</p><p><b>Цикл for</b> позволяет обрабатывать элементы по порядку:</p><p><b>Цикл while </b>полезен, когда нужно выполнять итерации до выполнения некоторого условия или когда количество итераций заранее неизвестно:</p><p>Итерации по массивам и спискам используются для различных операций с элементами — подсчета, фильтрации и преобразования данных.</p><p>Пример подсчета элементов, значение которых больше 300:</p><p>Пример фильтрации списка:</p><p>В новый список попали только четные числа (те, которые делятся на 2 без остатка).</p><p>Пример преобразования данных путем возведения каждого значения в 3-ю степень:</p><h2>Расширенные методы работы со списками</h2><p>Python предоставляет множество методов для работы со списками.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-01-21/a49de94f-a7c5-45c3-9cac-8d0c9cebf8ea.jpg" alt="Что такое массив, Что такое список в программировании" /><figcaption>Основные методы работы со списками в Python</figcaption></figure><p>Для более эффективной работы с данными можно использовать библиотеку NumPy. Она предоставляет инструменты для работы с многомерными массивами и матрицами. NumPy позволяет выполнять быстрые математические операции, преобразования данных, статистические вычисления и многое другое.</p><h2>Указатели и ссылки при работе с массивами в C++</h2><p>В C++ при работе с динамическими массивами нужно использовать указатели и ссылки.</p><p><b>Указатель</b> — переменная, которая хранит адрес другой переменной.</p><p><b>Ссылка</b> — альтернативное имя для существующего объекта.</p><p>Пример использования указателей для работы с массивами в C++:</p><h2>Различия в реализации в языках программирования</h2><h3>Массивы в C++ vs списки в Python</h3><p>В C++ работа с массивами происходит на низком уровне. Нужно следить за выделением и освобождением памяти, индексами и переполнением массива. В Python используются высокоуровневые списки, которые хранят ссылки на объекты в динамической памяти.</p><h4>Типизация</h4><p>В C++ массивы должны содержать элементы одного типа, который указывается при объявлении массива. Например, массив int может содержать только целые числа.</p><p>В Python списки работают с разными типами данных. Разрешено одновременное хранение чисел, строк, логических значений и даже других списков.</p><h4>Размер</h4><p>Размер массива в C++ фиксируется при объявлении и не может быть изменен во время выполнения программы. Для изменения размера массива требуется создать новый и скопировать элементы.</p><p>В Python есть два типа коллекций: списки и кортежи. Списки имеют динамический размер и могут увеличиваться или уменьшаться по мере необходимости. Можно добавлять или удалять элементы без необходимости явного выделения памяти. Кортежи, в отличие от списков, неизменяемые — после создания на их размер и содержимое нельзя повлиять.</p><h4>Производительность</h4><p>Массивы в C++ хранятся в непрерывной области памяти, поэтому операции с элементами выполняются быстрее, чем в Python. Однако в В C++ разработчик несет ответственность за выделение и освобождение памяти.</p><p>Python при доступе к элементу списка сначала получает ссылку из внутреннего массива, а затем уже обращается к самому объекту — это дополнительные операции по сравнению с прямым доступом к элементам массива в C++.</p><p>В основе Python есть механизм автоматического управления памятью (сборщика мусора). Разработчику не нужно явно выделять и освобождать память для списков.</p><h4>Методы и функциональность</h4><p>Массивы в C++ имеют ограниченный набор встроенных операций и функций. Для выполнения более сложных операций требуется реализация собственных алгоритмов или использование внешних библиотек (например, STL).</p><p>Списки в Python предоставляют широкий набор встроенных методов и функций — добавление, удаление, сортировка, поиск и многое другое.</p><h3>Массивы в Java vs списки в Python</h3><p>Массивы в Java и списки в Python также имеют некоторые различия.</p><h4>Типизация</h4><p>Массивы в Java должны содержать элементы одного типа. Тип элементов указывается при объявлении массива.</p><p>Списки в Python могут работать с элементами разных типов.</p><h4>Размер</h4><p>Размер массива в Java фиксируется при его создании и не может быть изменен. Для смены размера требуется создание нового массива и копирование элементов.</p><p>Списки в Python имеют динамический размер: могут увеличиваться или уменьшаться по мере необходимости.</p><h4>Методы и функциональность</h4><p>Массивы в Java имеют ограниченный набор встроенных методов и операций. Для выполнения, например, сортировки или поиска требуется использование классов Arrays или Collections.</p><p>В основе Python есть набор встроенных методов для списков. В их числе добавление, удаление, сортировка, поиск, фильтрация и многое другое.</p><h4>Производительность</h4><p>Массивы в Java обеспечивают быстрый доступ к элементам по индексу и могут быть более эффективными при выполнении некоторых операций, особенно при работе с большими объемами данных.</p><p>Списки в Python медленнее по сравнению с массивами в Java, но предоставляют больше удобства и гибкости в использовании.</p><h2>Советы по оптимизации и частые ошибки</h2><p>При работе с массивами и списками следует учитывать некоторые моменты для оптимизации кода и избежания распространенных ошибок.</p><h3>Избежание переполнения массива</h3><p>При доступе к элементам массива важно следить за границами массива, чтобы избежать переполнения и обращения к несуществующим элементам. Переполнение массива может привести к неправильному поведению программы или ошибкам сегментации.</p><h3>Оптимизация времени выполнения операций</h3><p>При работе с массивами и списками рекомендуется использовать следующие подходы:</p><ul><li>Использовать фиксированные и динамические массивы для конкретной задачи. Например, хранить дни недели в фиксированном массиве и пользователей в динамическом.</li><li>Сократить количество операций изменения размера массива или списка до минимума.</li><li>Выделять памяти для массивов заранее, если известен их размер.</li></ul><h3>Устранение ошибок индексирования</h3><p>Ошибки индексирования могут возникать при неправильном использовании индексов для доступа к элементам массива или списка. Чтобы избежать таких ошибок, следует:</p><ul><li>Проверять границы массива или списка перед доступом к элементам.</li><li>Использовать соответствующие условия и циклы для итерации по элементам.</li><li>Быть внимательным при работе с индексами, особенно при изменении размера массива или списка.</li></ul><p>Пример доступа к элементам массива с проверкой границ на C++:</p><h3>Что запомнить</h3><ul><li>Массивы и списки используются для хранения и управления коллекциями элементов.</li><li>NumPy в Python предоставляет инструменты для работы с многомерными массивами и матрицами, упрощая реализацию сложных алгоритмов. В других языках программирования есть аналоги: Eigen для C++ и Parallel Colt для Java.</li><li>При работе с динамическими массивами в C++ необходимо использовать указатели и ссылки для выделения и освобождения памяти.</li><li>Массивы в C++ и Java типизированные и имеют фиксированный размер. Списки в Python могут содержать элементы разных типов и имеют динамический размер.</li><li>Во избежание ошибок индексирования необходимо проверять границы массива/списка перед доступом к элементам.</li></ul><p>Желаем удачи в работе с массивами и списками!</p>]]></content:encoded>
    </item>
    <item>
      <title>Предпочитаю чистый код. Топ сервисов для оценки и улучшения качества кода</title>
      <link>https://tproger.ru/articles/predpochitayu-chistyj-kod--top-servisov-dlya-ocenki-i-uluchweniya-kachestva-koda</link>
      <comments>https://tproger.ru/articles/predpochitayu-chistyj-kod--top-servisov-dlya-ocenki-i-uluchweniya-kachestva-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Oksana Karelina]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/predpochitayu-chistyj-kod--top-servisov-dlya-ocenki-i-uluchweniya-kachestva-koda</guid>
      <description><![CDATA[<p>Обзор лучших инструментов для оценки качества программного кода! Эксперты подготовили подробную статью о том, для чего необходимо проводить валидацию кода, и подобрали лучшие сервисы</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/predpochitayu-chistyj-kod--top-servisov-dlya-ocenki-i-uluchweniya-kachestva-koda">Предпочитаю чистый код. Топ сервисов для оценки и улучшения качества кода</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 15 Jan 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Качество кода — это тема, которая, пожалуй, родилась вместе с программированием и разработкой IT-продуктов. Однако если для большинства продуктов есть общие стандарты, ГОСТы, ISO и многое другое, то для кода ничего такого нет. При этом качество кода – важнейший критерий оценки работы любого программиста.</p><p>Разумеется, если код работает — это уже хорошо, но также он должен быть очищен от «мусора», быть логичным и понятным для других разработчиков. Словом, как сказали бы те, кто читали знаменитую книгу Роберта Мартина, — чистым.</p><p>Как правило, в компаниях ревью кода доверяют сеньорам, а иногда – даже ИИ. Ни для кого не секрет, что ресурс сеньоров дорогой, а ИИ <a href="https://medium.com/code-your-own-path/ai-as-an-assistant-how-technology-helps-but-doesnt-replace-in-code-review-4bf9aa2badc1">может</a> лишь помочь, но точно не заменить живых ревьюеров – прежде всего, <a href="https://codepeer.com/blog/ai-sucks-at-code-reviews">из-за</a> ложных срабатываний и ограниченного контекста кодовой базы.</p><p>Помочь избавить ревьюеров от нагрузки и прийти на выручку начинающему разработчику в процессе самостоятельного оттачивания кода могут специальные сервисы.</p><p>О них сегодня и поговорим.</p><figure><img src="https://media.tproger.ru/user-uploads/105012/2025-01-14/46dc3c74-2622-4aa9-8496-530d5d451a58.png" alt="" /></figure><p>Меня зовут Оксана, я работаю в Бегете, веду этот блог и решила разобраться, какие инструменты помогают оценивать качество кода. Для этого я опросила наших штатных разработчиков, опробовала несколько онлайн-инструментов для проверки кода и прошерстила, кажется, весь интернет – и в итоге собрала топ-5 сервисов, которые могут помочь сохранять качество кода на высоком уровне, и теперь хочу поделиться этой подборкой с вами.</p><p>Прежде всего, этот материал пригодится начинающим программистам, которые стремятся к чистому коду или просто хотят облегчить ревью кода сеньору, а также всем, кто так или иначе причастен к разработке и заинтересован в качестве кода.</p><p>Устраивайтесь поудобнее и наливайте себе кружечку чая — перехожу к подборке сервисов для оценки и улучшения качества кода 🙂</p><h2>SonarQube</h2><p>Этот популярный инструмент для анализа качества кода способен выдавать результаты для более 30 языков программирования. SonarQube подходит для выявления ошибок, уязвимостей и проблем с безопасностью в коде, поддерживает поиск ошибок согласно правилам стандартов MISRA C, MISRA C++, MITRE/CWE и CERT Secure Coding Standards.</p><p>Он измеряет буквально всё:</p><ol><li>качество кода;</li><li>потенциальные ошибки;<br /></li><li>форматирование;<br /></li><li>объявления переменных;<br /></li><li>обработку исключений;<br /></li><li>повторения участков кода и многое другое.<br /></li></ol><p>Сервис позволяет анализировать проекты, написанные на разных языках программирования, может быть интегрирован в конвейеры CI/CD, цикл сборки Maven и Gradle. Загрузить SonarQube можно с <a href="https://www.sonarsource.com/products/sonarqube/downloads/">официального сайта</a>.</p><h2>ESLint</h2><p>ESLint — это инструмент для анализа и улучшения кода, написанного на JavaScript и ECMAScript. Он помогает выявлять синтаксические ошибки, проблемы в шаблонах проектирования и отклонения от стиля кодирования, а еще, как и другие линтеры, способен «причесывать» код на основании заданных правил.</p><p>Отличительная особенность ESLint состоит в том, что он позволяет настраивать правила проверки, использовать готовые плагины и создавать собственные правила, что делает его гибким и мощным инструментом для поддержания качества кода. О создании собственных правил для ESLint есть <a href="https://tproger.ru/articles/sozdajom-sobstvennye-pravila-dlja-eslint">статья</a> и на этом сайте 🙂</p><p>Среди преимуществ ESLint:</p><ul><li><b>Настраиваемость.</b> Можно настроить правила проверки валидности кода под конкретные нужды проекта, обеспечивая единообразие стиля кода в команде, например, нам ESLint позволяет всем разработчикам писать код в едином стиле и придерживаться описанных в конфиге правил.</li><li>Поддержка современных стандартов. Инструмент поддерживает новейшие стандарты JavaScript и популярные фреймворки (React, Vue.js, Node.js, TypeScript и др.), что помогает предотвратить использование устаревших/некорректных конструкций.</li><li>Интеграция с редакторами кода и CI/CD. Можно интегрировать ESLint в редакторы кода и автоматические системы сборки для проверки HTML-кода на ошибки на каждом шаге разработки. Поддержка плагинов и расширений: можно расширять функционал с помощью плагинов и выполнять онлайн-проверку HTML-кода на основании специфичных для проекта или фреймворка правил.</li></ul><p>Последняя выпущенная на данный момент версия сервиса – <a href="https://eslint.org/blog/2024/12/eslint-v9.17.0-released/">ESLint v9.17.0</a>.</p><h2>Codacy</h2><p><a href="https://www.codacy.com/bookdemo">Codacy</a> — это сервис для автоматического анализа и мониторинга качества исходного кода, который помогает командам разработчиков выявлять и устранять проблемы в коде, поддерживать высокие стандарты и обеспечивать непрерывную интеграцию и развертывание.</p><p>Инструмент подходит для проверки кода на Java, Python, JavaScript, PHP и более 30 других языках, а еще с помощью искусственного интеллекта он может автоматически исправлять код, делая процесс его написания максимально эффективным.</p><p>Среди особенностей Codacy:</p><ul><li>возможность интеграции с GitHub, GitLab, Bitbucket и другими CI/CD-инструментами для автоматизации проверок;</li><li>отслеживание прогресса — за счет метрик и наглядных отчетов о качестве кода и техническом долге;</li><li>упрощение командной работы — благодаря добавлению комментариев и замечаний в pull request;</li><li>поддержка интеграции с трекерами задач — например, с Jira, Trello и т. д.;</li><li>универсальность — сервис подходит для проверки кода в облаке (например, его можно использовать совместно с облачной базой данных MySQL) или на локальном сервере.</li></ul><h2>Psalm</h2><p>Данный инструмент статического анализа для PHP от компании Vimeo позволяет выявлять ошибки, улучшать типизацию и обеспечивать высокое качество кода. Этот сервис проверки кода подходит как для небольших, так и для крупных проектов, помогая улучшить их качество и надежность.</p><p>Вот несколько возможностей Psalm:</p><ul><li><b>Раннее выявление ошибок.</b> Сервис анализирует код без его выполнения и находит ошибки еще на этапе разработки, таким образом, можно предотвратить баги в продакшене;</li><li><b>Поддержка строгой типизации.</b> Psalm работает с аннотациями типов в PHPDoc, что упрощает работу с типами данных и минимизирует ошибки, связанные с неправильными типами;</li><li><b>Обнаружение устаревшего кода. </b>С этим инструментом легко находить и удалять неиспользуемые методы, переменные и классы, улучшая читаемость и производительность проекта;</li><li><b>Совместимость с популярными IDE и плагинами. </b>Например, PhpStorm, что обеспечивает удобный процесс исправления ошибок, а поддержка самых разных плагинов (Symfony, Laravel, Doctrine и др.) позволяет настроить Psalm для анализа специфичных случаев или интеграции с другими инструментами.</li></ul><p>В Бегете мы используем этот инструмент для поддержания качества кода, снижения количества ошибок и обеспечения согласованности стиля кодирования в разных проектах. Psalm поддерживает настройку уровней строгости анализа, поэтому его можно адаптировать под потребности конкретного проекта, что довольно удобно. При этом сервис легко настраивается для работы в системах непрерывной интеграции, таких как GitHub Actions, GitLab CI или Jenkins, то есть проверка кода может выполняться автоматически.</p><p>Документация Psalm доступна на <a href="https://psalm.dev/docs/">официальном сайте</a>, также есть <a href="https://github.com/vimeo/psalm/">страница</a> на GitHub.</p><h2>Code Climate</h2><p>Этот сервис предназначен для анализа кода и мониторинга качества ПО — он помогает выявлять ошибки в исходном коде, обеспечивать соответствие кодовой базы установленным стандартам и правилам.</p><p>Переоценить значимость Code Climate для разработки сложно: инструмент производит статический и автоматизированный анализ кода на уязвимости, нарушения стиля и другие проблемы без участия разработчика, а затем предоставляет выводы в виде детализированных отчетов о состоянии кода с предложениями по улучшению.</p><p>А еще Code Climate помогает:</p><ul><li>анализировать технический долг — сервис предлагает пути для его сокращения, таким образом, можно улучшать поддерживаемость и читаемость кода в долгосрочной перспективе;</li><li>отслеживать динамику качества кода в разных проектах и сравнивать показатели качества между различными ветвями/репозиториями.</li></ul><p>Благодаря поддержке множества языков можно производить проверку кода на JS, Python, Ruby, PHP, Go и т. д., так что сервис может пригодиться в различных проектах, кроме того, он легко интегрируется в процессы непрерывной интеграции и доставки (CI/CD), обеспечивая автоматический анализ кода при каждом коммите или пулл-реквесте.</p><p>Выбрать тарифный план можно на <a href="https://codeclimate.com/quality/pricing">официальном сайте</a>, также доступна 14-дневная бесплатная пробная версия.</p><h2>Заключение</h2><p>Сегодня, когда количество библиотек с открытым исходным кодом только растет, анализ и аудит кода обязательны для IT-компаний, а качество кода – едва ли не краеугольный камень для создания любого ПО. Чистый код повышает эффективность разработки, упрощает понимание и поддержку проекта, снижает затраты на тестирование и, наконец, способствует более быстрому внедрению новых функций.</p><p>Безусловно, приведенный нами список сервисов для оценки и улучшения качества кода не является исчерпывающим, есть и множество других решений: например, иногда для этих целей, а порой даже для написания кода, используют нашумевший ChatGPT.</p><p>При этом стоит понимать, что какой бы инструмент для проверки кода ни использовался, он не заменит человека, однако может помочь ускорить проверку, сэкономить время и ресурсы.</p><p>На этом всё, выбирайте подходящий сервис — и пусть ваш код всегда будет чистым 🙂</p><p>Буду рада вашим комментариям!</p>]]></content:encoded>
    </item>
    <item>
      <title>Fish 4.0 — интерактивный Shell — переписали с C++ на Rust</title>
      <link>https://tproger.ru/news/--fish-4-0---interaktivnyj-shell---perepisali-s-c---na-rust</link>
      <comments>https://tproger.ru/news/--fish-4-0---interaktivnyj-shell---perepisali-s-c---na-rust?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--fish-4-0---interaktivnyj-shell---perepisali-s-c---na-rust</guid>
      <description><![CDATA[<p>Бета-версия Fish 4.0, переписанная с C++ на Rust, предложила пользователям улучшенную многопоточность, безопасность и удобство</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--fish-4-0---interaktivnyj-shell---perepisali-s-c---na-rust">Fish 4.0 — интерактивный Shell — переписали с C++ на Rust</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Бета]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 30 Dec 2024 04:06:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Популярный интерактивный командный интерпретатор Fish выпустил бета-версию 4.0, полностью переписанную с языка C++ на Rust.</p><p>Основная цель перехода — улучшить многопоточность и повысить безопасность кода.</p><p>Разработчики отметили, что работа с C++ часто осложнялась инструментарием, разными компиляторами и необходимостью ручного управления потоками.</p><p>Rust предложил современные возможности и встроенные гарантии безопасности, которые сделали его естественным выбором для переписывания проекта.</p><h2>Новые возможности Fish 4.0</h2><p>Переход на Rust открыл двери для улучшений и новых функций. Среди ключевых нововведений в Fish 4.0:</p><ul><li>Обновленные привязки клавиш: Бинды стали более интуитивными, упрощая взаимодействие с терминалом.</li><li>Улучшенный поиск по истории: Теперь пользователи могут находить команды быстрее благодаря более мощным алгоритмам поиска.</li><li>Поддержка многопоточности: Благодаря Rust, Shell теперь эффективно обрабатывает несколько задач одновременно.</li></ul><p>Эти изменения делают Fish еще более удобным и современным инструментом для работы в командной строке.</p><h2>Как протестировать новую версию?</h2><p>Бета-версия Fish 4.0 доступна для тестирования. Установочные пакеты предоставлены для macOS, Ubuntu и других популярных дистрибутивов Linux.</p><p>Также доступны портативные бинарные файлы, которые можно запустить без установки.</p><p>Для тестирования пользователи могут перейти на<a href="https://fishshell.com/blog/rustport/"> официальный сайт проекта</a> и скачать соответствующую версию.</p>]]></content:encoded>
    </item>
    <item>
      <title>Какие языки программирования учить в 2026 году</title>
      <link>https://tproger.ru/articles/kakie-yazyki-programmirovaniya-uchit-v-2025-godu</link>
      <comments>https://tproger.ru/articles/kakie-yazyki-programmirovaniya-uchit-v-2025-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[МТС]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kakie-yazyki-programmirovaniya-uchit-v-2025-godu</guid>
      <description><![CDATA[<p>Рейтинг 7 языков для изучения в 2026: Python, TypeScript, JavaScript, Java, C++, Go, 1С. Зарплаты, рейтинги TIOBE и GitHub, перспективы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kakie-yazyki-programmirovaniya-uchit-v-2025-godu">Какие языки программирования учить в 2026 году</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 28 Dec 2024 16:29:20 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Это обновлённая версия статьи. Первая версия вышла в декабре 2024 года. Все данные актуализированы по состоянию на март 2026: рейтинги TIOBE и GitHub Octoverse 2025, зарплаты по данным Хабр Карьеры за H2 2025.</i></p><p>Мир IT стремительно меняется и диктует новые требования к разработчикам. Поэтому каждый год мы составляем топ языков программирования, на которые стоит обратить внимание будущим и уже опытным айтишникам.</p><p>TypeScript впервые стал #1 на GitHub, обогнав Python и JavaScript</p><p>Python по-прежнему лидирует в TIOBE (21,25%), но потерял 2,59 п.п. за год</p><p>Go упал с 7-й на 16-ю позицию в TIOBE — самое неожиданное падение года</p><p>Самые высокие зарплаты в РФ у Go-разработчиков — 320 000 ₽ (медиана)</p><p>Рост зарплат в IT остановился: +19% (H2’2024) → 0% (H2’2025)</p><p>На что мы опирались при составлении этого обзора:</p><p><a href="https://www.tiobe.com/tiobe-index/"><b>TIOBE Index</b></a> (март 2026) — отслеживает популярность языков программирования на основе поисковых запросов, упоминаний в новостях, научных статьях и на форумах.</p><p><a href="https://github.blog/news-insights/octoverse/"><b>GitHub Octoverse 2025</b></a> — рейтинг на основе статистики GitHub. Показывает, какие языки используют в репозиториях и какие проекты популярны среди пользователей.</p><p><a href="https://habr.com/ru/companies/habr_career/articles/994308/"><b>Данные Хабр Карьеры</b></a> (H2 2025) по медианным зарплатам программистов, работающих с разными языками.</p><p>В статье рассмотрим:</p><ol><li>Python;</li><li>TypeScript;</li><li>JavaScript;</li><li>Java;</li><li>C++;</li><li>Golang (Go);</li><li>1С.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/e28005cf-079c-46ff-81c3-34c933644f4b.webp" alt="Рейтинг TIOBE Index за март 2026 — топ-20 языков программирования" /><figcaption>Рейтинг TIOBE Index, март 2026</figcaption></figure><h2>Python</h2><h4>Популярность</h4><p>Python уверенно удерживает первое место в рейтинге TIOBE с долей 21,25%, хотя за год потерял 2,59 процентных пункта. На GitHub он опустился на 2-е место, уступив TypeScript. При этом по числу новых репозиториев Python вырос на 53% за год — 9,26 млн новых репо.</p><h4>Уровень зарплат</h4><p>Медианная зарплата Python-разработчиков во втором полугодии 2025 составила 229 000 ₽ (+8% к H1 2025). Python показывает стабильный рост зарплат на фоне общего замедления рынка.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/029ffc87-9101-4b5a-a31c-fac155701b9e.webp" alt="Медианные зарплаты разработчиков в России по языкам программирования, H2 2025" /><figcaption>Зарплаты разработчиков в России, H2 2025 (данные Хабр Карьеры)</figcaption></figure><h4>Перспективы</h4><p>Python — ключевой инструмент для анализа данных, машинного обучения, автоматизации и веб-разработки. Бум ИИ продолжается: 1,1 млн публичных репозиториев на GitHub используют LLM SDK (+178% за год), и Python остаётся языком #1 для ИИ-проектов.</p><h2>TypeScript</h2><h4>Популярность</h4><p>TypeScript совершил исторический прорыв: в августе 2025 он впервые стал языком #1 на GitHub по числу контрибьюторов, обогнав Python и JavaScript. GitHub назвал это «самым значительным сдвигом за десятилетие». Рост числа контрибьюторов — +66,63% за год, а новых репозиториев стало на 78% больше.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/a0cd41c6-09b2-4528-a41a-2686ac0232f6.webp" alt="Топ языков программирования на GitHub в 2025 году — TypeScript, Python, JavaScript" /><figcaption>GitHub Octoverse 2025: TypeScript стал языком #1</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-28/faff8b10-35fc-496a-9a58-eeeeaf6e2fcf.webp" alt="Топ-10 языков программирования на GitHub 2023-2025 — TypeScript обогнал Python и JavaScript" /><figcaption>Динамика топ-10 языков на GitHub, 2023–2025</figcaption></figure><p>В рейтинге TIOBE TypeScript пока не вошёл в топ-10, но это объясняется методологией индекса: TIOBE считает поисковые запросы, а не реальное использование.</p><h4>Уровень зарплат</h4><p>В российских зарплатных обзорах TypeScript обычно объединяют с JavaScript. Медиана для JavaScript/TypeScript-разработчиков во втором полугодии 2025 — 241 000 ₽ (+11%).</p><h4>Перспективы</h4><p>TypeScript популярен в веб- и мобильной разработке, облачных и корпоративных приложениях. Главная причина роста — ИИ: строгая типизация TypeScript делает код, сгенерированный Copilot и другими ИИ-ассистентами, безопаснее для продакшена. Крупные фреймворки теперь по умолчанию генерируют проекты на TypeScript.</p><h2>JavaScript</h2><h4>Популярность</h4><p>JavaScript сохранил 6-ю позицию в TIOBE (3,45%) и опустился на 3-е место на GitHub, уступив TypeScript. Но важно понимать: JavaScript + TypeScript вместе по-прежнему образуют крупнейшую экосистему. По числу новых репозиториев JavaScript всё ещё лидирует — 9,35 млн (+14,6%).</p><h4>Уровень зарплат</h4><p>Медианная зарплата JavaScript/TypeScript-программистов во втором полугодии 2025 составила 241 000 ₽ (+11%). Это один из самых заметных ростов среди всех языков.</p><h4>Перспективы</h4><p>JavaScript остаётся фундаментом веб-разработки, хотя многие проекты мигрируют на TypeScript. В России спрос на JS-разработчиков стабильно высок благодаря цифровизации бизнеса и импортозамещению. Node.js позволяет использовать его как для фронтенда, так и для бэкенда.</p><h2>Java</h2><h4>Популярность</h4><p>Java опустился на 4-е место в TIOBE (7,99%, -2,37 п.п.), но это всё ещё один из крупнейших языков мира. На GitHub Java держится на 4-м месте с устойчивым ростом контрибьюторов (+20,7%).</p><h4>Уровень зарплат</h4><p>Медианная зарплата Java-разработчиков — 226 000 ₽ (+1% к H1 2025). Рост минимальный, но стабильный.</p><h4>Перспективы</h4><p>Java активно используют в корпоративных приложениях, банковских сервисах и Android-приложениях. В России появилась отечественная IDE — OpenIDE — для работы с Java и другими языками. Это хороший сигнал для развития экосистемы.</p><h2>C++</h2><h4>Популярность</h4><p>C++ опустился с 2-й на 3-ю позицию в TIOBE (8,18%), уступив место языку C. На GitHub C++ стабильно входит в топ-6 языков по использованию.</p><h4>Уровень зарплат</h4><p>Медианная зарплата разработчиков на C++ — 241 000 ₽ (+14% за полугодие). Это самый сильный рост среди всех языков во втором полугодии 2025.</p><h4>Перспективы</h4><p>C++ остаётся основным инструментом для геймдева, встроенного ПО и высокопроизводительных систем. Рост зарплат на 14% объясняется спросом в embedded-разработке и оборонном секторе. Изучать C++ как первый язык непросто, но после него легко освоить другие языки.</p><h2>Golang (Go)</h2><h4>Популярность</h4><p>Go показал самое неожиданное падение года: с 7-й на 16-ю позицию в TIOBE (-1,49 п.п.). Однако это не значит, что язык теряет актуальность — TIOBE меряет поисковые запросы, а не реальное использование. На практике Go остаётся одним из самых востребованных языков в России.</p><h4>Уровень зарплат</h4><p>И вот главный аргумент: Go-разработчики получают самые высокие зарплаты среди всех языков в нашем рейтинге. Медиана — 320 000 ₽ (+4% к H1 2025). Это на 37 000₽ больше, чем у C# и на 91 000₽ больше, чем у Python.</p><h4>Перспективы</h4><p>Go остаётся языком выбора для микросервисов, высоконагруженных систем и облачных сервисов. Простота синтаксиса и высокая производительность делают его отличным выбором для бэкенд-разработки, особенно в финтехе.</p><h2>1С</h2><h4>Популярность</h4><p>Этого языка нет в международных рейтингах TIOBE и GitHub — в наш топ он попал вне конкурса. 1С использует большинство компаний России для бухучёта, управления торговлей и расчёта зарплат.</p><h4>Уровень зарплат</h4><p>Медиана для 1С-программистов — 200 000 ₽. Рост зарплат остановился (0% во втором полугодии 2025). На рынке переизбыток джунов, но синьоры 1С по-прежнему в дефиците.</p><h4>Перспективы</h4><p>Спрос на 1С-разработчиков стабилен благодаря импортозамещению: компании переходят на отечественное ПО. 1С — идеальный шанс войти в IT для тех, кто не уверен в английском.</p><p>Кстати, мы уже публиковали статью <a href="https://tproger.ru/articles/stoit-li-uchitsya-programmirovaniyu-na-1s">«Стоит ли учиться программированию на 1С»</a> — там можно узнать все за и против.</p><h2>Окей, так какой язык выбрать в итоге?</h2><p>Зависит от ваших интересов и направления, в котором планируете развиваться.</p><p>— Хотите строить карьеру в области ИИ, анализа данных или автоматизации — обратите внимание на <b>Python</b>. Это лучший старт для новичков.</p><p>— Для веб-разработки и фулстека — <b>TypeScript</b> (язык #1 на GitHub) или <b>JavaScript</b>. TypeScript становится стандартом для новых проектов.</p><p>— Хотите максимальную зарплату и работу в финтехе — выбирайте <b>Go</b>. Медиана 320 000₽ — это на 40% больше, чем у Python.</p><p>— Универсальный и стабильный выбор — <b>Java</b>. Корпоративные приложения, банки, Android — Java подходит для любых задач.</p><p>— Геймдев, embedded, системы реального времени — <b>C++</b>. Зарплаты выросли на 14% за полгода.</p><p>— Для работы в российских компаниях — <b>1С</b>. Идеальный шанс войти в IT без английского.</p><p>В комментариях можно дополнить наш обзор — и поделиться своим опытом. Так статья будет еще полезнее!</p><p><i>Если бы вы составляли топ языков для изучения в 2026 году, какие ЯП туда бы включили и почему?</i></p>]]></content:encoded>
    </item>
    <item>
      <title>5 лучших языков программирования для создания нейросетей</title>
      <link>https://tproger.ru/articles/5-luchwih-yazykov-programmirovaniya-dlya-sozdaniya-nejrosetej-253661</link>
      <comments>https://tproger.ru/articles/5-luchwih-yazykov-programmirovaniya-dlya-sozdaniya-nejrosetej-253661?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[МТС]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-luchwih-yazykov-programmirovaniya-dlya-sozdaniya-nejrosetej-253661</guid>
      <description><![CDATA[<p>Топовые языки для программирования нейросетей — Python, Java, C#, С++.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-luchwih-yazykov-programmirovaniya-dlya-sozdaniya-nejrosetej-253661">5 лучших языков программирования для создания нейросетей</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Язык R]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Dec 2024 13:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Последние два года весь мир наблюдает за бумом нейросетей. Они готовы в режиме 24/7 генерировать для нас картинки, делать рефераты, переводить тексты, писать код… Этот список можно продолжать до бесконечности. Поэтому неудивительно, что разработчики нейросетей востребованы на IT-рынке.</p><p>Если вы тоже хотите заниматься машинным обучением, очень важно выбрать первый язык программирования — от этого будет зависеть скорость вашего прогресса и поиска первой работы.</p><p>В статье рассмотрим плюсы и минусы языков, на которых обучают нейросети. Выбор за вами!</p><h2>Кто и как создаёт нейросети</h2><p>Начнём с азов.</p><p>Нейросетями занимаются ML-инженеры — специалисты по машинному обучению.</p><p>Чтобы создать нейросеть, нужно пройти следующие этапы:</p><ul><li><b>сбор данных </b>— это могут быть изображения, тексты, аудиозаписи или что-то ещё. Например, если хотим создать нейросеть, которая распознаёт породы кошек, нужно много фотографий кошек</li><li><b>подготовка данных </b>— полученные данные обрабатывают, чтобы их было удобно использовать для обучения нейросети. Например, изображения могут быть уменьшены или преобразованы в числовой формат</li><li><b>выбор модели </b>— инженеры выбирают архитектуру нейросети, то есть её «строение». Это как чертёж, который определяет, как данные будут передаваться через сеть и как она будет принимать решения</li><li><b>обучение модели </b>— нейросеть обучается на подготовленных данных — в нашем примере «учится» распознавать особенности изображений кошек, корректируя свои веса и параметры</li><li><b>проверка модели </b>— после обучения модель проверяется на новых данных, которые она ранее не видела. Это нужно, чтобы удостовериться, что она научилась обобщать знания, а не просто «запомнила» входные данные</li><li><b>настройка и оптимизация </b>— если модель не даёт достаточно хороших результатов, её могут настраивать и оптимизировать, чтобы улучшить производительность</li></ul><p>Таким образом, создание нейросетей — процесс, включающий сбор данных, выбор модели, обучение, проверку и, при необходимости, настройку.</p><h2>Языки машинного обучения</h2><h3>Python</h3><p>Самый популярный язык программирования этого года <a href="https://www.tiobe.com/tiobe-index/">по версии TIOBE</a>, а также № 1 в машинном обучении. По данным ChatGPT и Google Bard, они созданы с использованием Python и фреймворков для глубокого обучения TensorFlow и PyTorch.</p><p>Плюсы Python:</p><ul><li>простой синтаксис, который может легко освоить даже новичок в программировании. Также это плюс и для опытных инженеров — вместо того чтобы думать, как обойти технические сложности языка, они могут сконцентрироваться на решении задач машинного обучения</li><li>большое количество библиотек и фреймворков, которые помогают в создании ML-моделей и ускоряют разработку. Например, TensorFlow, Keras, Scikit-learn и Pandas</li><li>Python легко интегрируется с другими языками программирования, что полезно при работе с библиотеками и инструментами, написанными на других языках</li></ul><p>Минусы Python:</p><ul><li>в некоторых случаях Python может быть несколько медленнее по сравнению с низкоуровневыми языками, такими как C++ или Java. Это особенно актуально для высоконагруженных систем или задач, требующих высокой производительности</li></ul><h3>Java</h3><p>Ещё один популярный выбор ML-инженеров, которые ценят стабильность, надёжность и производительность. Java использовали для создания чат-бота A.L.I.C.E., выпущенного в 1995 году, мобильных роботов для исследований полярного круга и движка для разработки рекомендательных систем Seldon Server.</p><p>Плюсы Java:</p><ul><li>Java — кроссплатформенный язык программирования. Поэтому код на этом языке без изменений работает на любых операционных системах. Это особенно важно при создании нейросетей, предназначенных для использования в разных средах</li><li>Java известен стабильностью и надёжностью, что может быть серьёзным плюсом при разработке критически важных систем, например в области медицины и финансов</li><li>Java имеет большую библиотеку и фреймворки для обучения нейросетей (например, Weka, Apache Mahout, Deeplearning4j, Mallet, MLlib)</li></ul><p>Минусы Java:</p><ul><li>Java — компилируемый язык, поэтому код сначала компилируется в машинный, а затем выполняется. Это может замедлить процесс разработки и обучения нейросетей</li><li>сообщество разработчиков в области машинного обучения в Java не такое активное, как в случае с Python. Это значит, что сложнее найти обучающие материалы и ответы на свои вопросы</li></ul><h3>С++</h3><p>Мощный язык программирования, который часто используется для разработки решений на стыке ИИ, робототехники и интернета вещей. Хотя он также хорошо справляется с задачами обучения нейросетей и чат-ботов.</p><p>Плюсы С++:</p><ul><li>C++ известен своей высокой производительностью, что может быть критично для задач, требующих интенсивных вычислений, таких как обучение нейронных сетей</li><li>предоставляет контроль над аппаратными ресурсами, что позволяет оптимизировать код под конкретные архитектуры процессоров и ускорять выполнение операций</li></ul><p>Минусы С++:</p><ul><li>C++ может быть более сложным и требовательным к написанию кода, чем некоторые другие языки программирования, поэтому не рекомендуется новичкам</li></ul><h3>C#</h3><p>C# — универсальный язык от компании Microsoft, который она активно продвигает для машинного обучения, для чего создала библиотеку ML.NET.</p><p>Плюсы C#:</p><ul><li>C# может обеспечить хорошую производительность, что важно при обработке больших объёмов данных, характерных для обучения нейросетей</li><li>если нейросети встраиваются в большой проект, который включает в себя и другие компоненты, написанные на C#, использование того же языка может обеспечить лучшую интеграцию и общую согласованность</li></ul><p>Минусы C#:</p><ul><li>в сравнении с такими языками, как Python, у C# более ограниченная экосистема библиотек и фреймворков для машинного обучения</li><li>C# более сложный для освоения новичками, чем тот же Python</li></ul><h3>R</h3><p>Язык R разработали учёные факультета статистики Оклендского университета. Обычно он используется в связке с Python для обработки и визуализации данных.</p><p>Плюсы R:</p><ul><li>имеет большое количество библиотек для машинного обучения и работы с данными: Caret, DataExplorer, Dplyr, Ggplot2, kernLab и другие</li><li>если ваши данные и задачи тесно связаны со статистикой, R может быть хорошим выбором, так как он широко используется в академических и исследовательских сферах</li></ul><p>Минусы R:</p><ul><li>может быть менее эффективным по сравнению с такими языками, как C++ или Python, что может сказаться на производительности при обучении сложных нейронных сетей</li><li>имеет меньше инструментов для развёртывания ML-моделей, что усложняет работу с ними</li><li>довольно узкая сфера применения</li></ul><h2>Выводы</h2><p>Если делаете первые шаги в программировании и машинном обучении, лучше остановиться на Python. Это самый востребованный у работодателей язык, который можно освоить в короткие сроки.</p><p>Дальше можно добавить R для работы с большими данными. А если вы уже не новичок в программировании, подойдут Python, Java или С++ (последний особенно актуален для проектов в сфере интернета вещей).</p>]]></content:encoded>
    </item>
  </channel>
</rss>