<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Все посты подряд / Системное программирование / Хабр]]></title>
    <link>https://habr.com/ru/hubs/system_programming/posts/</link>
    <description><![CDATA[Системное программирование – обеспечение работы прикладного ПО]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Sun, 26 Apr 2026 09:56:17 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO — 19.03.2026 16:09]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/1012320/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/1012320/?utm_campaign=1012320&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Стать системным аналитиком в YADRO — дело трех дней</strong> </p><p>До 29 марта открыта программа быстрого найма для системных аналитиков. Таких специалистов ищут сразу две команды: </p><p>—&nbsp;<strong>Телеком. </strong>С нуля создают телекоммуникационные решения для беспроводных мобильных сетей и сопутствующих услуг. Разрабатывает первые российские базовые станции стандартов GSM/LTE. </p><p>— <strong>BIOS/BMC. </strong>Инженеры занимаются разработкой и сопровождением собственных программных реализаций ПО UEFI/BIOS и BMC, используемых в различных продуктах YADRO. </p><p><a href="https://sprintoffer.yadro.com/systems_analysts_03_26/?utm_source=habr&amp;utm_medium=social&amp;utm_campaign=bbmc_telecom_03_26&amp;utm_content=page_posts&amp;utm_referrer=habr.co" rel="noopener noreferrer nofollow">Подать заявку →&nbsp;</a></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/805/18a/616/80518a6162030f0a853f8c0a98daee64.jpg" width="1560" height="880"></figure><p>Формат быстрого найма подразумевает ускоренные прохождение технического и менеджерского интервью и возможность получить оффер в компанию за три дня.</p><p>Направления, где нужны аналитики: </p><ul><li><p><strong>OAM</strong> (Operations, administration and maintenance). Специалисты тут работают с системой, обеспечивающей эксплуатационную управляемость и устойчивость операторского уровня. Отвечают за сквозные сценарии эксплуатации — от конфигурирования и мониторинга до инцидентов, SLA и масштабирования.</p></li><li><p><strong>GSM.</strong> Здесь разрабатывают GSM Controller (BSC) и компоненты базовой станции (BTS) стандарта GSM с поддержкой GPRS и основного функционала для операторов большой тройки.</p></li><li><p><strong>LTE. </strong>Инженеры здесь создают базовую станцию LTE (4G), реализуя полный стек телекоммуникационных протоколов «с нуля».</p></li><li><p><strong>BIOS/BMC.</strong> Как уже писали выше, здесь занимаются разработкой и поддержкой UEFI/BIOS для продуктов компании, кода BMC для мониторинга и управления серверами, а также прошивками для MCU- и FPGA-модулей серверов (материнские платы, экспандеры и так далее).</p></li></ul><blockquote><p>Подробнее об ожиданиях к кандидатам — на лендинге SPRINT OFFER. Успейте <a href="https://sprintoffer.yadro.com/systems_analysts_03_26/?utm_source=habr&amp;utm_medium=social&amp;utm_campaign=bbmc_telecom_03_26&amp;utm_content=page_posts&amp;utm_referrer=habr.co" rel="noopener noreferrer nofollow">оставить заявку</a> до 29 марта. </p></blockquote> <a href="https://habr.com/ru/posts/1012320/?utm_campaign=1012320&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 19 Mar 2026 13:09:57 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[системная аналитика]]></category><category><![CDATA[системный аналитик]]></category><category><![CDATA[системный анализ бизнес-процессов]]></category><category><![CDATA[телеком]]></category><category><![CDATA[bios]]></category><category><![CDATA[bmc]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denoiselab — Анализ и проектирование систем (+4) — 01.03.2026 21:01]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1005246/</guid>
    <link>https://habr.com/ru/posts/1005246/?utm_campaign=1005246&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class=""><img src="https://habrastorage.org/getpro/habr/upload_files/9e1/c24/86b/9e1c2486bb0f319e8286731b5a8479b2.png" alt="🔥" width="72" height="72"><div><figcaption>🔥</figcaption></div></figure><p>Компания Zhipu AI совместно с Университетом Цинхуа представила одну из важнейших открытых моделей 2026 года — GLM-5. Это не просто инструмент для написания кода, а полноценная система, способная самостоятельно планировать проекты, создавать код, проводить тестирование, устранять баги и улучшать решения в течение длительного времени.</p><p>Основные характеристики GLM-5 впечатляют:<br>- Архитектура MoE с общим количеством параметров 744 миллиарда, из которых одновременно активируется лишь 40 миллиардов.<br>- Контекст длиной до 200 тысяч токенов позволяет хранить целиком большие кодовые базы.<br>- Первый открытый релиз с оценкой 50 баллов по индексу AAI.<br>- Лидирует среди открытых моделей в тестировании LMArena (оценка текста и кода).<br>- По уровню производительности сравнима с закрытыми моделями уровня Claude Opus 4.5 и Gemini 3 Pro.</p><p>Изначально модель была выпущена анонимно под именем Pony Alpha, вызвав предположения, что это продукт от крупных западных компаний вроде DeepMind или OpenAI. Однако вскоре выяснилось, что разработка принадлежит китайской стороне, подчеркивая значимость проекта.</p><p>Технические особенности включают:<br>- Обучение на массиве из 28,5 триллионов токенов.<br>- Использование технологии Sparse Attention, снижающей вычислительные затраты на обработку больших объемов контекста.<br>- Асинхронный метод обучения с использованием RLHF, позволяющий эффективно задействовать ресурсы GPU.<br>- Трехступенчатое обучение, включающее этапы рассуждений, агентирования и выравнивания.</p><p>Практические достижения:<br>- Высокий показатель успешности тестов на платформе SWE-bench Verified (77,8%) и лидерство в тесте BrowseComp (75,9%).<br>- Модель обучалась на большом количестве репозиториев GitHub (более 10 тыс.).<br>- Способность успешно управлять бизнес-процессами, включая моделирование реального бизнеса (например, сеть торговых автоматов).</p><p>Особенность GLM-5 заключается также в оптимизации под китайские процессоры Huawei Ascend, Cambricon и Kunlun, обеспечивающую производительность, аналогичную западным платформам, но с экономией примерно на 50%.</p><p>Таким образом, появление GLM-5 свидетельствует о том, что разница между открытыми и проприетарными системами практически исчезла. Открытые модели теперь способны решать реальные инженерные задачи на мировом уровне, работая на собственном оборудовании и показывая конкурентоспособные результаты.</p><p>Вывод очевиден: эпоха закрытых систем уходит в прошлое, а гонка технологий становится настоящим соревнованием, где качество продукта важнее бренда.</p><p><a href="https://arxiv.org/abs/2602.15763v2" rel="noopener noreferrer nofollow">https://arxiv.org/abs/2602.15763v2</a></p><p>ВК: <a href="https://vk.com/wall-222544138_412" rel="noopener noreferrer nofollow">https://vk.com/wall-222544138_412</a></p><p>Tenchat: <a href="https://tenchat.ru/media/4986873-glm5" rel="noopener noreferrer nofollow">https://tenchat.ru/media/4986873-glm5</a></p><p>TG: <a href="https://t.me/DenoiseLAB/4063" rel="noopener noreferrer nofollow">https://t.me/DenoiseLAB/4063</a></p> <a href="https://habr.com/ru/posts/1005246/?utm_campaign=1005246&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 01 Mar 2026 18:01:59 GMT</pubDate>
    <dc:creator><![CDATA[denoiselab]]></dc:creator>
      
      <category><![CDATA[аналитика]]></category><category><![CDATA[nlp]]></category><category><![CDATA[machinelearning]]></category><category><![CDATA[analytics]]></category><category><![CDATA[анализ данных]]></category><category><![CDATA[обработка данных]]></category><category><![CDATA[системный анализ]]></category><category><![CDATA[бизнес-процессы]]></category><category><![CDATA[бизнес-анализ]]></category><category><![CDATA[бизнес]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @atomlib — JavaScript (+4) — 10.02.2026 09:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/994724/</guid>
    <link>https://habr.com/ru/posts/994724/?utm_campaign=994724&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Греческие мифы рассказывают про титана Прометея, который украл у богов огонь и поделился им с людьми. Персонажа за это приковали к скале не просто в наказание, но и в назидание остальным: знание не даётся бесплатно, за него нужно платить.</p><p>Если судить по названию, автор проекта <a href="https://codeberg.org/smnx/promethee" rel="noopener noreferrer nofollow">Promethee</a> кары богов нисколько не боится. Некто SMNX взял самый сакральный слой современного компьютера&nbsp;— прошивку UEFI&nbsp;— и добавил туда JavaScript. Как гласит <code>readme.md</code>, на старте загрузки Promethee подхватывает <code>script.js</code> с загрузочного тома и исполняет его, то есть этот скрипт и будет загрузчиком.</p><p>Понятно, что на боевую машину это ставить смысла нет, это просто эксперимент. Лабораторный характер подчёркивается сборкой и запуском в QEMU. Проект реализован автономно (freestanding), с минимальными заглушками libc. В качестве движка используется <a href="https://duktape.org/" rel="noopener noreferrer nofollow">Duktape</a>&nbsp;— встраиваемый JS-движок, рассчитанный на портируемость и компактность.</p><p>Для SMNX это уже не первый подобный забавный самопис. На <a href="https://smnx.sh/" rel="noopener noreferrer nofollow">своём сайте</a> автор представляется как Клем и прямо говорит, что любит строить «операционные системы, компиляторы, инструменты и веб-движки». Там же перечислены другие поделки: модульная хобби-операционка <a href="https://github.com/skift-org/skift" rel="noopener noreferrer nofollow">SkiftOS</a>, HTML/CSS-движок <a href="https://github.com/skift-org/vaev" rel="noopener noreferrer nofollow">Vaev</a>, экспериментальные инструменты для генерации документов, а также операционная система с эстетикой брутализма и идеалами UNIX семидесятых <a href="https://github.com/brutal-org/brutal" rel="noopener noreferrer nofollow">BRUTAL</a>.</p><p>JavaScript исторически задумывался как язык, который оживляет веб-страницы и делает их интерактивными. Сегодня же он расползся по всем слоям стека, <a href="https://www.espruino.com/" rel="noopener noreferrer nofollow">от микроконтроллеров</a> до <a href="https://jerryscript.net/" rel="noopener noreferrer nofollow">ультра-лёгких движков для Интернета вещей</a>. В том числе бывают попытки писать на JavaScript то, что не следует, хоть операционные системы. Самый цитируемый пример&nbsp;— это <a href="https://github.com/NodeOS/NodeOS" rel="noopener noreferrer nofollow">NodeOS</a>, дистрибутив Linux, где вместо привычного пользовательского мира предлагается использовать Node.js и npm как основной пакетный менеджер, и многие утилиты предполагается брать из npm-экосистемы. Другой полюс&nbsp;— <a href="http://runtimejs.org/" rel="noopener noreferrer nofollow">runtime.js</a>, библиотечная операционка, где JavaScript-рантайм на базе V8 и минимальная операционка собираются в лёгкий неизменяемый образ виртуальной машины для запуска на KVM, то есть ОС здесь становится упаковкой для единственного приложения на JS.</p><p>Promethee&nbsp;— не первый проект, где соседствуют JavaScript и UEFI. Беглый поиск обнаруживает <a href="https://github.com/TuvianNavy/Duktape-UEFI" rel="noopener noreferrer nofollow">порт Duktape под UEFI-приложения</a>.</p> <a href="https://habr.com/ru/posts/994724/?utm_campaign=994724&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 10 Feb 2026 06:25:45 GMT</pubDate>
    <dc:creator><![CDATA[atomlib]]></dc:creator>
      
      <category><![CDATA[UEFI]]></category><category><![CDATA[извращения]]></category><category><![CDATA[программирование]]></category><category><![CDATA[личные проекты]]></category><category><![CDATA[open source]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Duktape]]></category><category><![CDATA[SkiftOS]]></category><category><![CDATA[операционные системы]]></category><category><![CDATA[ненормальное программирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @f0rk — *nix (+4) — 09.02.2026 14:05]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/994400/</guid>
    <link>https://habr.com/ru/posts/994400/?utm_campaign=994400&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Когда мне пришла в голову мысль что я хочу навайбкодить операционку, у меня было смутное представление что полноценным успехом можно будет считать только self-hosted OS, то есть чтоб в ней запускались дев-тулы, можно было поправить исходники, скомпилировать, ребутнуться с новым ядром и все продолжало работать.</p><p>Если честно, я не думал что получится, думал в лучшем случае получу что-нибудь что может запустить пару kernel-space процессов которые будут по очереди что-то в UART печатать и все. А оно раз, и получилось… Self-hosting milestone взят!</p><p>В Slopix есть:<br>- Простенький шелл<br>- Компилятор Си (и прочие build essentials)<br>- Интерактивный редактор текста с подсветкой синтаксиса для Си</p><p>Принципиально ничто не мешает теперь заниматься разработкой слопикса в слопиксе.</p><p>Потребовалось 5 weekend sprints. Получилось примерно 45к строк на Си. Узнал много нового про операционки и многому научился в плане coding agents workflows. Ну и тонну удовольствия получил, конечно же!</p><p>Реп тут: <a href="https://github.com/davidklassen/slopix" rel="noopener noreferrer nofollow">https://github.com/davidklassen/slopix</a></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/d70/525/a8c/d70525a8ce8bd9c0041b352c3253cc2d.gif" width="979" height="627"></figure> <a href="https://habr.com/ru/posts/994400/?utm_campaign=994400&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 09 Feb 2026 11:05:14 GMT</pubDate>
    <dc:creator><![CDATA[f0rk]]></dc:creator>
      
      <category><![CDATA[C]]></category><category><![CDATA[unix]]></category><category><![CDATA[OS]]></category><category><![CDATA[Vibe-coding]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+3) — 27.01.2026 07:45]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/989330/</guid>
    <link>https://habr.com/ru/posts/989330/?utm_campaign=989330&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Открытый мультиплатформенный проект <a href="https://github.com/pashkov256/deletor" rel="noopener noreferrer nofollow">Deletor</a> умеет удалять ненужные и вредоносные файлы, кэш после рабочей сессии, улучшает производительность вашего SSD. Решение написано на Go.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/9e1/9e2/3b6/9e19e23b6b1647406a8bdc795fe9274b.gif" width="720" height="382"></figure> <a href="https://habr.com/ru/posts/989330/?utm_campaign=989330&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 27 Jan 2026 04:45:27 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Deletor]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Информационная безопасность (+3) — 14.12.2025 16:35]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/976516/</guid>
    <link>https://habr.com/ru/posts/976516/?utm_campaign=976516&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Открытый проект <a href="https://github.com/fathulfahmy/aio-usb-drive" rel="noopener noreferrer nofollow">All In One USB Drive</a> содержит необходимые ISO-образы для восстановления компьютерной системы на ПК, включая установщики ОС, драйверы и все необходимые полезные сервисы для воскрешения системы и нормальной работы, а также инструкции ко всем сервисам.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/8dd/303/329/8dd30332999a0d80a51dc3899a9b27cd.png" width="1280" height="640"></figure> <a href="https://habr.com/ru/posts/976516/?utm_campaign=976516&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 14 Dec 2025 13:35:44 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[All In One USB Drive]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/954534/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/954534/?utm_campaign=954534&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Ускоренный найм для инженеров C/C++: оффер за 3 дня</strong></p><p>Телеком-команда YADRO создает решения для мобильных сетей нового поколения: базовые станции GSM и LTE, а также весь программный стек — от низкоуровневых протоколов до систем управления. Сейчас в команде открылись вакансии инженеров, отбор на которые можно пройти гораздо быстрее, чем обычно.</p><blockquote><p><a href="https://sprintoffer.yadro.com/?utm_source=habr&amp;utm_medium=social&amp;utm_campaign=telecom_c++_10_25&amp;utm_content=page_posts" rel="noopener noreferrer nofollow">SPRINT OFFER</a> — это формат ускоренного найма: все этапы отбора проходят всего за три дня. Чтобы попасть в программу, достаточно подать заявку до 19 октября. </p></blockquote><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/208/b02/dd1/208b02dd1eb3a5c0568b1d56c2badedf.jpg" width="2400" height="1350"></figure><p><strong>Software Engineer (телеком-платформа)</strong></p><p>Вам предстоит разрабатывать платформенное решение для телеком-систем. На его основе строятся современные узлы сотовых сетей LTE- и GSM-стандартов — например, базовые станции и системы управления. В это роли вы будете:&nbsp;</p><ul><li><p>Развивать платформу, обеспечивающую middleware-сервисы, высокую доступность и управление узлами для приложений, входящих в состав базовой станции LTE/GSM.</p></li><li><p>Разрабатывать компоненты платформы в технологическом стеке C++/Linux.</p></li><li><p>Собирать и анализировать метрики для оценки производительности продукта.</p></li><li><p>Создавать и оптимизировать высокопроизводительные каналы коммуникации между компонентами, а также работать с подсистемами временной синхронизации, управления конфигурацией инфраструктуры и компонентов.</p></li><li><p>Поддерживать средства развертывания и обновления приложений.</p></li><li><p>Разрабатывать API для взаимодействия с аппаратным обеспечением и операционной системой при конфигурации и управлении инфраструктурой.</p></li><li><p>Обеспечивать качество продукта: исправлять дефекты, писать unit-тесты, проводить код-ревью, разрабатывать техническую документацию.</p></li><li><p>Создавать инструменты, упрощающие работу других разработчиков.</p></li><li><p>Участвовать в диагностике и анализе проблем работы системы в тестовых и полевых сценариях.</p></li></ul><p>Подать заявку <a href="https://sprintoffer.yadro.com/?utm_source=habr&amp;utm_medium=social&amp;utm_campaign=telecom_c++_10_25&amp;utm_content=page_posts" rel="noopener noreferrer nofollow">по ссылке →</a> </p><p><strong>Software Engineer C/C++ (LTE/GSM)</strong></p><p>Создавайте высоконагруженные системы, которые обеспечивают стандарты связи разных поколений. Работа охватывает три уровня. L1 — низкоуровневое программирование, работа с радиоканалом и сигналами, близкая к железу. L2 — логика, работа с алгоритмами и математическими моделями. L3 — высокоуровневое программирование, бизнес-логика. В этой роли вы будете:&nbsp;</p><ul><li><p>Разрабатывать решения совместно с командой — от этапа исследования и прототипирования до коммерческого внедрения пакетного ядра сети 5 поколения (5G).</p></li><li><p>Создавать программное обеспечение для базовых станций LTE, реализуя полный стек протоколов 3GPP.</p></li><li><p>Разрабатывать спецификации и дизайн программного обеспечения.</p></li><li><p>Интегрировать решения с другими компонентами системы — как программными, так и аппаратными.</p></li><li><p>Поддерживать и оптимизировать код, обеспечивая стабильность и производительность продукта.</p></li><li><p>Исследовать и устранять проблемы, влияющие на надежность, производительность и масштабируемость системы.</p></li></ul><p>Узнать больше и подать заявку <a href="https://sprintoffer.yadro.com/?utm_source=habr&amp;utm_medium=social&amp;utm_campaign=telecom_c++_10_25&amp;utm_content=page_posts" rel="noopener noreferrer nofollow">по ссылке →</a></p> <a href="https://habr.com/ru/posts/954534/?utm_campaign=954534&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 08 Oct 2025 11:21:42 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[вакансии]]></category><category><![CDATA[оффер]]></category><category><![CDATA[работа в it]]></category><category><![CDATA[телеком]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Miss_PannaCotta — JavaScript (+4) — 08.10.2025 14:11]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/954570/</guid>
    <link>https://habr.com/ru/posts/954570/?utm_campaign=954570&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Привет всем!🙃</p><p>⠀⠀⠀⠀⠀⠀⠀⠀⠀</p><p>Мне бы очень хотелось стать инженером-строителем. Изучаю физику,но иногда это тяжело дается.Хотелось бы представлять ,как работают формулы в жизни.</p><p>Хочу научиться делать простенькие визуализации.</p><p>Посоветуйте,пожалуйста,с чего начать.Может,есть понятные сайты или программы,где такое можно создавать?Мне бы что-то для старта,чтобы поскорее увидеть результат и лучше понять физику.</p><p>Заранее спасибо за любую наводку🌷<br> Вы мне очень поможете!</p> <a href="https://habr.com/ru/posts/954570/?utm_campaign=954570&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 08 Oct 2025 11:11:29 GMT</pubDate>
    <dc:creator><![CDATA[Miss_PannaCotta]]></dc:creator>
      
      <category><![CDATA[визуализация]]></category><category><![CDATA[программирование]]></category><category><![CDATA[javascript]]></category><category><![CDATA[образование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Hedgehogues — Программирование (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/947612/</guid>
    <link>https://habr.com/ru/posts/947612/?utm_campaign=947612&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>MCP архитектура как развитие ручного подхода в LLM</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/de5/815/976/de5815976992adc81a1e5c9bcb6a7208.png" width="1280" height="749"></figure><p>Когда вы открываете ChatGPT и вставляете туда кучу текста — что реально происходит?<br> Всё складывается в один длинный «бутерброд»: данные, инструкции, системный промпт, даже куски схемы в Markdown. Никакого порядка. Это как если бы у вас в кодовой базе был один файл main.py, где и роуты, и бизнес-логика, и SQL-запросы.</p><p>Я хочу описать идею MCP кратко, поскольку в самой доке она не описана. А может быть даже и не закладывалась туда. Но очень похоже, что такая архитектура хорошо работает исходя из более фундаментальных принципов, чем просто разделение</p><p><strong>Как это выглядит у ChatGPT</strong></p><p>На схеме выше видно:</p><ul><li><p>Есть Line Edit — пользователь копипастит сырые данные.</p></li><li><p>Есть Плагин — иногда он что-то подмешивает.</p></li><li><p>Всё это сливается в один большой Склеенный промпт, который уходит в LLM.</p></li></ul><p>Мешанина как она есть</p><p><strong>Как это делает MCP?</strong></p><p>MCP приходит и говорит: «ребята, давайте хоть модули разнесём».</p><ul><li><p>System Prompt — отдельная часть, где живёт логика «как правильно жить» для модели.</p></li><li><p>Instruction Layer — патчи и локальные корректировки.</p></li><li><p>Schema Registry — отдельный каталог, который описывает структуру данных (таблицы, поля, форматы).</p></li><li><p>Data Adapter — слой, который достаёт данные у провайдера строго по схеме.</p></li><li><p>Всё это связывает MCP хост, который собирает финальный запрос к LLM, который зачастую представляет собой Lang Chain</p></li></ul><p>Итог: модель получает запрос не как «мусорный мешок», а как структурированный pipeline.</p><p><strong>Почему это важно</strong></p><ul><li><p>Прозрачность. Можно отследить, какая часть отвечает за что.</p></li><li><p>Контроль. Можно менять системный промпт без страха поломать данные.</p></li><li><p>Расширяемость. Хочешь новый источник данных? Добавь адаптер, а не переписывай всё.</p></li><li><p>Предсказуемость. Поведение модели становится ближе к детерминированному.</p></li></ul><p><strong>Простая метафора</strong></p><ul><li><p>ChatGPT — это когда у вас «final_final_v3.docx» и все правят его параллельно.</p></li><li><p>MCP — это когда у вас git с ветками, пайплайнами и CI с CQRS архитектурой (не шутка), читай выше</p></li></ul> <a href="https://habr.com/ru/posts/947612/?utm_campaign=947612&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 23 Sep 2025 06:00:00 GMT</pubDate>
    <dc:creator><![CDATA[Hedgehogues]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[mcp]]></category><category><![CDATA[ии]]></category><category><![CDATA[ии и машинное обучение]]></category><category><![CDATA[ии-ассистент]]></category><category><![CDATA[ии-агенты]]></category><category><![CDATA[ии чат-бот]]></category><category><![CDATA[ии-модель]]></category><category><![CDATA[ии помощник]]></category><category><![CDATA[ии бот]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Hedgehogues — Искусственный интеллект (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/947610/</guid>
    <link>https://habr.com/ru/posts/947610/?utm_campaign=947610&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Зачем работать напрямую с клиентом, когда можно просто выкинуть запрос на MCP и дать нейросети подумать? 😎</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/1ee/9a7/480/1ee9a74806163304abdb00c7dc759fc9.png" width="1157" height="485"></figure><p>Расскажу кейс Vivo Chat. Проверка статуса заказов (замените на вашу сущность). Давайте по порядку</p><blockquote><p>Клиент идёт к хосту, чтобы получить доступ к MCP</p></blockquote><p>Итак, наш клиент — это тот, кто первым инициирует запрос. Всё начинается с того, что клиент заходит в свою систему, которая подключена к MCP-серверу через хост. Хост выполняет функцию посредника, направляя запросы и получая ответы от разных компонентов системы.</p><p>Клиент: «Привет, хост, мне нужно проверить заказ, и я хочу понять, что из инструментария MCP мне пригодится. Покажи мне, пожалуйста, список доступных инструментов и подсказок, чтобы я мог выбрать что-то нужное для этого запроса.»<br> Хост (перехватывает запрос и направляет его к серверу MCP): «Окей, сейчас все передам.»</p><blockquote><p>Хост запрашивает у MCP список инструментов (Tools) и подсказок (Prompts)</p></blockquote><p>Хост теперь идёт к MCP-серверу. Этот сервер знает всё, что связано с доступом к данным и обработкой запросов. В MCP сервере хранятся все инструменты (tools) и подсказки (prompts) для выполнения нужных действий.</p><p>Хост: «MCP, подкинь мне список доступных tools и prompts для запроса клиента.»<br> MCP-сервер: «Вот, держи, вот все инструменты и подсказки, которые у нас есть. Для каждого метода я также подготовил параметры, которые можно подставить.»</p><blockquote><p>LLM, любимая нейросеть, выбирает метод из списка</p></blockquote><p>Теперь, когда хост получил список инструментов и подсказок, он передает всё это в LLM (нейросеть), которая и будет решать, какой метод нужно использовать для конкретного запроса.</p><p>Хост: «LLM, тебе пришёл запрос от клиента. Вот список инструментов и промптов. Тебе нужно выбрать подходящий метод для выполнения запроса и подготовить все нужные параметры для этого метода.»<br> LLM: «Хорошо, я выбираю метод X из списка инструментов, и вот какие параметры мне нужны для этого метода. Я знаю, что нужно сделать, и использую соответствующие промпты, чтобы точно понять, что клиент хочет.»</p><blockquote><p>LLM передает параметры и вызывает метод на MCP</p></blockquote><p>Теперь, когда LLM выбрала нужный метод и подготовила параметры, она отправляет всё это хосту, который, в свою очередь, передает запрос обратно в MCP-сервер для выполнения.</p><p>LLM: «Вот всё, что мне нужно: метод X и параметры для выполнения. Передавай это на MCP.»<br> Хост: «Принято, иду к MCP.»</p><blockquote><p>Хост направляется к MCP-серверу и передает запрос на выполнение метода.</p></blockquote><p>MCP выполняет метод и возвращает результат</p><p>MCP-сервер теперь, получив все необходимые данные, выполняет метод и обрабатывает запрос. Всё, что нужно, уже у него под рукой: инструменты, параметры, контекст. Вся обработка происходит внутри MCP, и сервер возвращает результат хосту.</p><p>MCP-сервер: «Я выполнил метод X с этими параметрами. Вот результат: (ответ).»</p><blockquote><p>Ответ от LLM клиенту</p></blockquote><p>Теперь, когда MCP выполнил метод, хост получает ответ и передает его обратно в LLM, которая уже анализирует результат, добавляет необходимые детали (например, форматирует или уточняет ответ) и отдает всё клиенту.</p><p>Хост: «Вот ответ от MCP через LLM: (ответ). Всё готово!»<br> LLM: «Отлично, теперь я передаю результат обратно клиенту.»<br> Клиент: «Вау, всё так быстро! Спасибо, LLM!»</p><p>Итог</p><p>На мой взгляд в бизнес-приложениях — это самый частый кейс, а всё остальное, связанное с обновлениями статусами заказов, удалениями данных будет упираться в безопасность и комплаенс</p> <a href="https://habr.com/ru/posts/947610/?utm_campaign=947610&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 20 Sep 2025 06:55:20 GMT</pubDate>
    <dc:creator><![CDATA[Hedgehogues]]></dc:creator>
      
      <category><![CDATA[ии]]></category><category><![CDATA[ии и машинное обучение]]></category><category><![CDATA[ии-ассистент]]></category><category><![CDATA[ии-агенты]]></category><category><![CDATA[ии чат-бот]]></category><category><![CDATA[ии-модель]]></category><category><![CDATA[ии помощник]]></category><category><![CDATA[ии бот]]></category><category><![CDATA[ии-инжиниринг]]></category><category><![CDATA[mcp]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Hedgehogues — Искусственный интеллект (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/947608/</guid>
    <link>https://habr.com/ru/posts/947608/?utm_campaign=947608&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я уже писал, из чего состоит протокол, как выглядят сервер и клиент, и зачем вообще всё это проксирование. Теперь — шаг вперёд: как вся эта архитектура живёт в реальных приложениях.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/39d/035/6d3/39d0356d34b7127c753bedc8d9e5bcb0.png" width="897" height="1244"></figure><p>Если смотреть на схемы выше, то картина получается парадоксальная. Уровень связности высокий: запросы к LLM проксируются через хост, а MCP-сервера сидят как отдельные острова, каждый тянет свои данные — базы, файлы, API. На первый взгляд хочется спросить: «зачем такие сложности?». Ответ простой — тарификация и контроль. Если бы сервер напрямую ходил к LLM, владелец MCP оказывался бы заложником чужой экономики. А так запрос идёт через клиента/хост, и именно пользователь контролирует, когда и какой токен уходит в модель.</p><p>Важно понимать: MCP-сервер всегда на стороне провайдера данных. Это он готовит промпты, пишет функции, агрегирует источники. Ваша задача — не изобретать велосипеды, а собрать этих провайдеров, подключить через MCP и дальше использовать уже в своих оркестраторах (хоть LangChain, хоть самописные пайплайны).</p><p>Почему MCP имеет значение? Всё зависит от того, где вы стоите:<br> – Разработчику MCP сокращает время интеграции и даёт готовый слой абстракций.<br> – ИИ-приложениям MCP открывает экосистему источников и тулзов.<br> – Пользователю MCP гарантирует, что его данные не уходят вслепую, а действия согласованы.</p><p>В сухом остатке: MCP — это не про «ещё один протокол», а про баланс удобства и контроля. Пример банальный, но показательный: пользователь хочет слетать в Барселону. Серверы MCP подтянули календарь, историю поездок, поиск рейсов и отелей. Агент сложил всё в кучу и забронировал отпуск за минуты. Задача, которая вручную заняла бы часы.</p><p>В следующей части разберём, какие паттерны интеграции MCP-серверов с LLM-оркестраторами реально просто работают</p><p>Ссылки, как обычно, в моём канале</p><p>——————<br> <a href="https://t.me/man_and_business" rel="noopener noreferrer nofollow">Менеджер? Давай сюда!</a><br> <a href="https://t.me/want_to_it" rel="noopener noreferrer nofollow">Ищи работу здесь</a><br> <a href="https://t.me/tales_from_it" rel="noopener noreferrer nofollow">Технологии и архитектура</a></p> <a href="https://habr.com/ru/posts/947608/?utm_campaign=947608&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 18 Sep 2025 07:15:50 GMT</pubDate>
    <dc:creator><![CDATA[Hedgehogues]]></dc:creator>
      
      <category><![CDATA[ии]]></category><category><![CDATA[ии и машинное обучение]]></category><category><![CDATA[ии-ассистент]]></category><category><![CDATA[ии-агенты]]></category><category><![CDATA[ии чат-бот]]></category><category><![CDATA[ии-модель]]></category><category><![CDATA[ии помощник]]></category><category><![CDATA[ии-инжиниринг]]></category><category><![CDATA[ии бот]]></category><category><![CDATA[ии агенты]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @SerpentFly — Go (+4) — 13.09.2025 13:28]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/946582/</guid>
    <link>https://habr.com/ru/posts/946582/?utm_campaign=946582&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Go + Windows = deadlock. Свет в конце тоннеля.</strong></p><p>В прошлой <a href="https://habr.com/ru/articles/932760/" rel="noopener noreferrer nofollow">статье</a> я рассказывал о редком, но весьма опасном баге: поток под Windows зависал в вызове <code>CancelIoEx</code>, хотя документация Microsoft утверждает обратное. Суть проблемы — в пересечении синхронного и асинхронного ввода-вывода, где ядро Windows блокирует доставку APC, и поток остаётся навсегда «висящим».</p><p>История получила развитие не сама по себе: мы целенаправленно поднимали эту тему через <strong>support-кейс в Microsoft</strong>. В результате удалось подключить и Escalation Team, и разработчиков Go, ответственных за Windows-порт.</p><p>Финальный вывод: стандартная библиотека Go действительно использует <strong>неправильный API</strong> для отмены синхронных операций. Вместо <code>CancelSynchronousIo</code>, рекомендованного самой Microsoft, в коде до сих пор вызывается <code>CancelIoEx</code>.</p><p>👀 Сам проблемный вызов:<br><a href="https://github.com/golang/go/blob/77f911e31c243a8302c086d64dbef340b0c999b8/src/internal/poll/fd_windows.go#L461" rel="noopener noreferrer nofollow">https://github.com/golang/go/blob/77f911e31c243a8302c086d64dbef340b0c999b8/src/internal/poll/fd_windows.go#L461</a></p><p>Хорошая новость: у команды уже есть рабочий <strong>proof-of-concept фикса</strong>:<br> <a href="https://go-review.googlesource.com/c/go/+/691395" rel="noopener noreferrer nofollow">https://go-review.googlesource.com/c/go/+/691395</a></p><p>Менее радостная часть: из-за сложности изменений и их влияния на рантайм правка запланирована только в <strong>Go 1.26</strong> (февраль 2026). Бэкпорт в предыдущие версии практически исключён.</p><p>Что это значит для разработчиков</p><ul><li><p>Если ваш сервис на Go под Windows внезапно «зависает» в <code>CancelIoEx</code> — это следствие бага в стандартной библиотеке, а не ваша ошибка.</p></li><li><p>До релиза Go 1.26 остаются обходные варианты:</p><ul><li><p>не вызывать <code>CancelIoEx</code> для синхронных дескрипторов,</p></li><li><p>использовать <code>CancelSynchronousIo</code>, если есть возможность управлять потоками,</p></li><li><p>минимизировать использование пайпов в критичных местах.</p></li></ul></li></ul><p>Итог</p><p>Редкий flaky-тест Go (<code>TestPipeIOCloseRace</code>) оказался симптомом реальной и серьёзной проблемы. Благодаря эскалации через Microsoft Support и совместному разбору мы получили подтверждение, понятное объяснение и официальный фикс в планах.</p><p>⚡️ Если ваш Go-код на Windows зависает в <code>CancelIoEx</code>, теперь вы знаете: проблема признана и исправление уже в пути.</p> <a href="https://habr.com/ru/posts/946582/?utm_campaign=946582&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 13 Sep 2025 10:28:16 GMT</pubDate>
    <dc:creator><![CDATA[SerpentFly]]></dc:creator>
      
      <category><![CDATA[Go]]></category><category><![CDATA[windows]]></category><category><![CDATA[CancelIoEx]]></category><category><![CDATA[CancelSynchronousIo]]></category><category><![CDATA[deadlock]]></category><category><![CDATA[APC]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rvnikita — Веб-разработка (+2) — 13.08.2025 01:15]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/936536/</guid>
    <link>https://habr.com/ru/posts/936536/?utm_campaign=936536&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Почему я больше никогда не буду использовать сервис bitly?</p><p>В общем я обычно достаточно аккуратен со всякого рода скамом, редко попадаю в такие ситуации, обычно хорошая чуйка на такие истории, но в этот раз не обошло меня стороной.&nbsp;</p><p>Long story short: помогают тут ребятам с одним оффлайн проектом, нужно было быстро сделать QR код для флайеров, google выдает миллион сервисов для генерации, выбрал первый попавшийся “Create Your Free QR Codes”.&nbsp; Удачно все сделал, заказали флаеры, не смотря на то, что по пути на каждому этапе было Free через 2 недели (когда уже все напечатано) прилетает вежливое “Oh no! Your Dynamic QR Codes will expire in 3 days”. И конечно же он перестанет работать если не заплатить ($20/month).&nbsp;</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/a31/14e/6cd/a3114e6cd4a1d7c205ec03be112baac1.png" width="1702" height="1446"></figure><p>Масштаб “потерь” - $40, но я готов заплатить $200 чтобы объяснить они строян бизнес на скаме и для кармы это вредно.&nbsp;<br></p><p>Конечно же я не один такой, и большинство “сжимают зубы” и платят.&nbsp; Например на редите 230 комментариев.&nbsp;</p><p>Как вы поступаете в такой сиутации?&nbsp; Я как-то с детства считаю что нельзя потокать и платить.&nbsp;<br></p><p>Мои действия:</p><p>✅ никогда в жизни ни на одном из моих проектов не будет использоваться сокращалка Bitly</p><p>✅ написал далобу в FTC</p><p>✅ написал отзыв на Google Maps (там таких много)</p><p>☑️ найду и напишу отзывы на других сервисах</p><p>✅ попрошу вас помочь мне и присоединиться</p><p>P.S. Ресеч показал, что это не просто какие-то горе стартаперы, а проект компании Bitly (рейтинг 1.6 на Trustpilot).<br><br>Если вам нечем заняться и вам не сложно уделить 2-5 минут своего времени.&nbsp;</p><p>Промпт для генерации отзыва:</p><p><code>Write a concise, neutral review of </code><a href="http://qr-code-generator.com" rel="noopener noreferrer nofollow"><code>qr-code-generator.com</code></a><code> (Bitly) in plain, easy-to-read language, 80-120 words. Context: It appears in Google for queries like "free qr code generator." During setup, the process is presented as free; any expiration notice, if present, seems absent or buried in terms. About 14 days later, the QR may be deactivated behind a paywall, leaving printed materials unusable unless payment is made to reactivate. The system does not allow converting that now paid QR to a free static code or redirecting it without payment. Many users report similar experiences online, including numerous Reddit comments. Keep the tone calm, factual, and non-accusatory. Do not include personal info or insults. Write in your own words.</code></p><p>Места куда стоит запостить отзыв:</p><p>- Google Maps (Bitly Office Google Maps)</p><p>- Trust Pilot</p><p>- G2</p><p>- Capterra</p><p><br>P.P.S. Есть кто-то из СМИ хочет изучить эту историю и написать подробнее - я буду рад ответить на вопросы и предоставить материалы.&nbsp;<br></p><p>P.P.P.S. Особенно иронично выглядит позиция “Head of Happiness” в подписи письма<br></p><p>#justice&nbsp;</p> <a href="https://habr.com/ru/posts/936536/?utm_campaign=936536&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 12 Aug 2025 22:15:37 GMT</pubDate>
    <dc:creator><![CDATA[rvnikita]]></dc:creator>
      
      <category><![CDATA[bitly]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+4) — 08.08.2025 10:30]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/935240/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/935240/?utm_campaign=935240&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>«Клей» для GPIO в QEMU</strong></p><p>В прошлой статье&nbsp;мы пришли к выводу, что QMP — это лучше, чем ничего. Но хочется большего — библиотеку или программу (желательно, уже готовую), которая умеет читать/писать и узнавать об изменении состояния через poll() / pselect() / select() / epoll() / read().&nbsp;</p><p>В таком случае для каждой модели GPIO нужен «клей», похожий на тот, что используется с chardev — мы включаем его прямо в модифицированный QEMU. Очевидное название такого «клея» — gpiodev. Вот его основные функции, которые сейчас почти полностью соответствуют GPIO UAPI в Linux:</p><ul><li><p>сообщать количество линий, конфигурацию, название и потребителя каждой линии,</p></li><li><p>читать и задавать состояние линии,</p></li><li><p>отслеживать изменения состояния и конфигурации линии (вход/выход, запрос/освобождение).</p></li></ul><p>«Клей» состоит из двух групп, первая — это индивидуальные для каждого модуля GPIO функции, которые gpiodev использует, чтобы запросить специфическую информацию:</p><ul><li><p>LineInfoHandler() — информация о линии: имя, флаги и потребитель,</p></li><li><p>LineGetValueHandler() — состояние линии: условный 0 или 1,</p></li><li><p>LineSetValueHandler() — задать состояние линии: 0 или 1.</p></li></ul><p>По аналогии с GPIO UAPI напрашиваются также функции LineGetMultiValueHandler() и LineSetMultiValueHandler() для запроса и выставления линий, но я решил ограничиться минимальным набором.</p><blockquote><p>Можно ли организовать прозрачное взаимодействие с устройствами внутри QEMU — использовать те же библиотеки и инструменты, как и для реальных устройств? Читайте <a href="https://habr.com/ru/companies/yadro/articles/925864/" rel="noopener noreferrer nofollow">во второй части</a> трилогии о долгом пути до GPIO в QEMU.   </p></blockquote> <a href="https://habr.com/ru/posts/935240/?utm_campaign=935240&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 08 Aug 2025 07:30:23 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[qemu]]></category><category><![CDATA[linux]]></category><category><![CDATA[gpio]]></category><category><![CDATA[gpiodev]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PhystechGenesis — Облачные сервисы (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/934722/</guid>
    <link>https://habr.com/ru/posts/934722/?utm_campaign=934722&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как облачные сервисы продвигают продукты на хакатонах</strong></p><p>Хакатон — способ поднять узнаваемость бренда и расширить воронку найма, все хорошо это знают.</p><p>При этом немногие учитывают, что хакатон — еще инструмент продвижения свой продукта среди разработчиков.</p><p>Облачные сервисы успешно этим пользуются. Ниже несколько кейсов с выводами.</p><p>Все топовые облака: Amazon, Google Cloud, Azure, Cloud.ru, VK Cloud, Yandex Cloud  провели хакатоны в последние 3 года.</p><p>Самый масшабный был с призовыми в $150 000.</p><p>К участию приглашались стартапы для решения социально значимых задач. Единственное требование — использовать сервис в своем решении.</p><p>В РФ сильнее всего отметились Selectel и Cloud.ru, тогда под брендом SberCloud.</p><p>На SberCloud Advanced Hacking собралось 70 команд из малого и среднего бизнеса. Они внедряли облачные технологии в свои продукты — самые оригинальные решения получили призы.</p><p><strong>Всего мы проанализировали 10 хакатонов от облаков. Делимся выводами.</strong></p><ol><li><p>Хакатоны облачных сервисов выделяются необычно взрослой аудиторией: как правило, ЦА — средний и малый бизнес. Это потенциальные клиенты.</p></li><li><p>Задачи ставятся максимально широко. Ограничения бывают<br> А) по тематике, например, «сделайте что-то социально значимое»,<br> Б) по технологии, например, собираются решения в области AI, Web3, Blockchain, IoT.<br> Это идеально для хакатона.</p></li><li><p>Максимум по участникам в РФ — около 260 человек. Есть простор для яркого крупного ивента.</p></li></ol><p><strong>Вывод:</strong> облачные сервисы и вообще все, кто производит продукт для разработчиков, одним махом закрывают сразу 3 задачи с помощью хакатона:</p><ul><li><p>продвинуть продукт</p></li><li><p>поднять узнаваемость бренда</p></li><li><p>расширить воронку найма</p></li></ul><p><strong>Если ваша компания относится к таким — донесите ценность до бизнеса, это поможет «продать» идею хакатона внутри и оставить всех довольными.</strong></p> <a href="https://habr.com/ru/posts/934722/?utm_campaign=934722&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 06 Aug 2025 14:50:04 GMT</pubDate>
    <dc:creator><![CDATA[PhystechGenesis]]></dc:creator>
      
      <category><![CDATA[облачное хранилище]]></category><category><![CDATA[хакатон]]></category><category><![CDATA[продукт]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+4) — 04.08.2025 17:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/933920/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/933920/?utm_campaign=933920&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Что ты сделал для <s>хип-хопа</s> IT-инфраструктуры в свои годы? Писал UEFI и BMC для высоконагруженного оборудования&nbsp;</strong></p><p>В YADRO есть распределенная команда, которая разрабатывает и сопровождает собственные программные реализации UEFI (BIOS) и BMC. Для самого разного оборудования —&nbsp;от серверов до телеком- и клиентского оборудования.&nbsp;</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/ad4/6dc/0e1/ad46dc0e163432ef7c13b36c25b7573a.png" alt="Что делают BIOS и BMC в продуктах" title="Что делают BIOS и BMC в продуктах" width="1270" height="613"><div><figcaption>Что делают BIOS и BMC в продуктах</figcaption></div></figure><p><strong><a href="https://careers.yadro.com/team/bios-bmc?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=bios_bmc_promo_08_25&amp;utm_content=post040825" rel="noopener noreferrer nofollow">Познакомиться с командой →&nbsp;</a></strong></p><p>Какие задачи выполняют в команде BIOS/BMC:&nbsp;</p><ul><li><p>Реализуют программную поддержку новых аппаратных продуктов компании, определяют протоколы и методы взаимодействия между программными и аппаратными компонентами продуктов YADRO.</p></li><li><p>Проводят верификацию микрокода и&nbsp;выполняют проверку прошивок микросхем всех продуктов компании. Выстраивают стратегию тестирования.</p></li><li><p>Исследуют новые программные и&nbsp;аппаратные технологии для применения в продуктах. Рефакторят код для повышения производительности.</p></li><li><p>Придумывают методы безопасного обновления прошивок BIOS и BMC, чтобы обеспечить минимальный или нулевой даунтайм.</p></li><li><p>Добавляют новые фичи и меняют существующие — от WebUI до политик управления аппаратными компонентами.</p></li></ul><blockquote><p>Команде нужно больше инженеров —&nbsp;разработчиков на С/C++, тестировщиков, автоматизаторов и техлидов. Знакомься с вакансиями <a href="https://careers.yadro.com/team/bios-bmc?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=bios_bmc_promo_08_25&amp;utm_content=post040825" rel="noopener noreferrer nofollow">на сайте</a> и вовлекайся в трушные инженерные задачи на современном технологическом стеке.&nbsp;</p></blockquote> <a href="https://habr.com/ru/posts/933920/?utm_campaign=933920&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 04 Aug 2025 14:51:06 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[bios]]></category><category><![CDATA[uefi]]></category><category><![CDATA[пак]]></category><category><![CDATA[аппаратная разработка]]></category><category><![CDATA[bmc]]></category><category><![CDATA[карьера]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DrArgentum — C (+4) — 20.07.2025 00:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/929236/</guid>
    <link>https://habr.com/ru/posts/929236/?utm_campaign=929236&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Последовательность Фибоначчи может конвертировать мили в километры с небольшой погрешностью</p><p>5 миль ≈ 8 км (5 и 8 - числа Фибоначчи). Реальность: 5 миль = 8.04672 км.</p><p>Почему?<br> 1 миля = 1.609344 километра (точное значение).<br> Золотое сечение (φ) ≈ 1.618034</p><p>Погрешность возникает потому что отношение Fₙ₊₁ / Fₙ стремится к φ ≈ 1.618034, а точное соотношение миля/км = 1.609344.</p><p>Относительная погрешность: (1.618034 - 1.609344) / 1.609344 * 100% ≈ 0.54%.</p><p>Решил по фану реализовать конвертор милей в километры на C. <a href="https://github.com/alexeev-prog/fib_miles2km" rel="noopener noreferrer nofollow">Ссылка тут</a>.</p><pre><code>Advanced distance converter: miles to kilometers
Usage: ./bin/fib_miles2km [OPTIONS] [distance]

Options:
  -h, --help                     Show help information
  -f, --fib=ARG                  Convert miles to km using basic Fibonacci
  -b, --basic=ARG                Convert miles to km using standard formula
  -i, --fib-interp=ARG           Convert using Fibonacci interpolation
  -c, --fib-cache=ARG            Convert using cached Fibonacci
  -g, --fib-golden=ARG           Convert using golden ratio
</code></pre><p>Не знаю зачем, но прикольно :)</p> <a href="https://habr.com/ru/posts/929236/?utm_campaign=929236&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 19 Jul 2025 21:25:04 GMT</pubDate>
    <dc:creator><![CDATA[DrArgentum]]></dc:creator>
      
      <category><![CDATA[фибоначчи]]></category><category><![CDATA[си]]></category><category><![CDATA[c]]></category><category><![CDATA[мили]]></category><category><![CDATA[километр]]></category><category><![CDATA[конвертер]]></category><category><![CDATA[системное программирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+4) — 17.07.2025 10:12]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/928506/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/928506/?utm_campaign=928506&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как создать простейшую модель GPIO для QEMU</strong></p><p>Предлагаю два варианта, которые я условно решил назвать MMIO и PCI. Последний — тоже MMIO, но в QEMU они добавляются разными путями. Начнем с сердца любой MMIO-модели — апертуры. </p><p><strong>Апертура и адресное пространство</strong></p><p>Как я упоминал&nbsp;<a href="https://habr.com/ru/companies/yadro/articles/877248/" rel="noopener noreferrer nofollow">в одной из своих статей</a>, любое MMIO-устройство — это&nbsp;<strong>MemoryRegion</strong>&nbsp;с заданными шириной доступа и размером. Для того, чтобы он был виден&nbsp;<strong>CPU</strong>&nbsp;или другому устройству, такому как&nbsp;<strong>DMA</strong>, его нужно разместить в соответствующем адресном пространстве — например, пространстве, назначенном для&nbsp;<strong>cpu0</strong>:</p><pre><code>      0x0                                    0xffffffffffffffff
      |------|------|------|------|------|------|------|------|
0:    [                    address-space: cpu-memory-0        ]
0:    [                    address-space: memory              ]
                    0x102000           0x1023ff
0:                  [             gpio        ]</code></pre><p>В любое время можно посмотреть существующие адресные пространства и регионы памяти в мониторе QEMU:</p><pre><code>(qemu) info mtree
[...]
address-space: cpu-memory-0
address-space: memory
  0000000000000000-ffffffffffffffff (prio 0, i/o): system
    0000000000102000-00000000001023ff (prio 0, i/o): gpio
[...]</code></pre><p>Тогда в модели устройства нам нужно всего лишь создать такой регион и назначить ему соответствующие функции записи и чтения:</p><pre><code>static const MemoryRegionOps mmio_mmio_ops = {
    .read = mmio_gpio_register_read_memory,
    .write = mmio_gpio_register_write_memory,
    .endianness = DEVICE_NATIVE_ENDIAN,
    .valid = {
        .min_access_size = 4,
        .max_access_size = 4,
    },
};
 
[...]
memory_region_init_io(iomem, obj, &amp;mmio_mmio_ops, s,
                      "gpio", APERTURE_SIZE);
[...]</code></pre><p>Фактически это означает, что все семейство инструкций Load/Store будет вызывать&nbsp;<code>mmio_gpio_register_read_memory()</code>/<code>mmio_gpio_register_write_memory()</code>&nbsp;при совпадении адреса чтения/записи с адресом региона в адресном пространстве.</p><pre><code>static uint64_t mmio_gpio_register_read_memory(void *opaque, hwaddr addr, unsigned size);
static void mmio_gpio_register_write_memory(void *opaque, hwaddr addr, uint64_t value, unsigned size);</code></pre><p>Передаваемые аргументы и возвращаемое значения интуитивно понятны. Отмечу, что&nbsp;<strong>hwaddr addr</strong>&nbsp;— это адрес относительно начала нашего региона, а не абсолютный адрес.</p><p>Нам остается лишь создать устройство и добавить его регион в файле машины:</p><pre><code>gpio = qdev_new(TYPE_MMIO_GPIO);
sysbus_mmio_map(SYS_BUS_DEVICE(gpio), 0, ADDRESS);</code></pre><blockquote><p>Почти десять лет назад Никита Шубин, ведущий инженер по разработке СнК в&nbsp;YADRO, сделал возможность чтения и записи GPIO для QEMU. Читайте <a href="https://habr.com/ru/companies/yadro/articles/925860/" rel="noopener noreferrer nofollow">первую часть</a> трилогии о долгом пути до GPIO в QEMU.</p></blockquote><p>  </p> <a href="https://habr.com/ru/posts/928506/?utm_campaign=928506&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 17 Jul 2025 07:12:22 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[gpio]]></category><category><![CDATA[qemu]]></category><category><![CDATA[pci]]></category><category><![CDATA[mmio]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ledevik — Блог компании Криптонит (+3) — 04.06.2025 17:09]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/kryptonite/posts/915654/</guid>
    <link>https://habr.com/ru/companies/kryptonite/posts/915654/?utm_campaign=915654&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>На днях в офисе я столкнулась с коллегами из направления системного программирования в «Криптоните». Они пишут на С++ — а ошибки на этом языке у нас ещё не было! </p><p>Поэтому я попросила их придумать код с ошибкой специально для Хабра — и вот что получилось! </p><p>Итак, есть ли в этом коде проблема кроме narrowing conversion? Ждём ваши варианты в комментариях.</p><pre><code class="cpp">#include &lt;cstdint&gt;
#include &lt;vector&gt;

struct Type
{
    Type(uint16_t, uint32_t = {}) 
    {}
};

int main()
{
    std::vector&lt;Type&gt; vector;
    std::uint32_t object_id{};

    // Есть предупреждение о narrowing conversion
    vector.insert(vector.begin(), {0, object_id}); 

    // Нет narrowing conversion
    vector.push_back({0, object_id}); 

    // Нет narrowing conversion
    vector.insert(vector.begin(), Type{0, object_id}); 
}</code></pre><p><strong>АККУРАТНО, ДАЛЬШЕ СПОЙЛЕР!</strong></p><p>Проблема в том, что в строке</p><pre><code class="cpp"> vector.insert(vector.begin(), {0, object_id});</code></pre><p> в вектор вставляется 2 элемента типа Type, а не один, как ожидает программист.</p><p>Причина в том, что метод <a href="https://en.cppreference.com/w/cpp/container/vector/insert" rel="noopener noreferrer nofollow">insert </a>у вектора имеет перегрузку (номер 5), которая вторым параметром принимает <a href="https://en.cppreference.com/w/cpp/utility/initializer_list" rel="noopener noreferrer nofollow">std::initializer_list</a>. А компилятор, видя фигурные скобки в коде, в первую очередь пытается создать объект такого типа.</p><p>И тут ему это удается, потому что у конструктора Type  второй параметр имеет значение по умолчанию, следовательно, Type умеет создаваться, если в конструктор передали только один аргумент. В итоге компилятор успешно создает <a href="https://en.cppreference.com/w/cpp/utility/initializer_list" rel="noopener noreferrer nofollow">std::initializer_list</a> с двумя элементами типа Type.</p><p>Так как создание <a href="https://en.cppreference.com/w/cpp/utility/initializer_list" rel="noopener noreferrer nofollow">std::initializer_list</a> выполняется с использованием uniform initialization, то компилятор следит за корректностью преобразований. В примере объект типа std::uint32_t передается в конструктор Type, который принимает первым параметром std::uint16_t. То есть, возникает риск потери точности (32 бита не могут поместиться в 16 бит).</p><p>Об этом компилятор и предупреждает. Вот упрощенный <a href="https://godbolt.org/z/1MeTKd5E7" rel="noopener noreferrer nofollow">пример</a>, где видим то же самое предупреждение.</p><p>Может возникнуть вопрос, почему создание Type от 0 не вызывает предупреждение, ведь 0 - это int, а он, скорее всего 32 бита и тоже не помещается в 16 бит. Но тут литерал. Компилятор видит, что 0 вмещается в 16 бит и не предупреждает. Но если поместить int в переменную,  то также возникает <a href="https://godbolt.org/" rel="noopener noreferrer nofollow">предупреждение</a>.</p> <a href="https://habr.com/ru/posts/915654/?utm_campaign=915654&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 04 Jun 2025 14:09:35 GMT</pubDate>
    <dc:creator><![CDATA[ledevik (Криптонит)]]></dc:creator>
      
      <category><![CDATA[задачи]]></category><category><![CDATA[задача]]></category><category><![CDATA[программирование]]></category><category><![CDATA[с++]]></category><category><![CDATA[собеседование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DrArgentum — Системное программирование (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/915070/</guid>
    <link>https://habr.com/ru/posts/915070/?utm_campaign=915070&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Устройство компилятора (кратко) на LLVM<br> Компилятор - инструмент конвертации исходного кода, написанного на высокоуровневом языке программирования в машинный код, который может исполнять компьютер.</p><p>Компилятор делится на 3 этапа:</p><ul><li><p>FRONTEND - анализирует текст исходного кода и преобразует его в IR.</p></li><li><p>MIDDLE - анализирует и оптимизирует этот сгенерированный код IR.</p></li><li><p>BACKEND - преобразует IR в машинный код.</p></li></ul><p>Сам компилятор, и собственно язык программирования состоит из нескольких частей.</p><p>Lexer - лексер</p><p>Лексер сканирует и превращает сырой текст в токены. То есть сам исходный код разбиваеты на набор токенов (такие как литералы, идентификаторы, ключевые слова, операторы, разделители)<br> Лексер читает исходный код&nbsp;<strong>символ за символом</strong>&nbsp;и идентифицирует последовательности символов, соответствующие определённым правилам языка.</p><p>Парсинг</p><p>Парсинг немного сложнее чем лексический анализ. Существует множество паресров и парсеров-генераторов.</p><p>Парсеры в компиляторах обычно принимают входные данные в форме токенов и строят определенное дерево - AST или дерево парсинга.</p><p>Обычно компиляторы строятся из множества маленьких компонентов, которые берут входные данные, меняют их или преобразуют их в различные выходные данные. Это одна из причин, по которым функциональные языки хорошо подходят для создания компиляторов. Другие причины — прекрасное сопоставление с эталоном и довольно обширные стандартные библиотеки. Прикольный факт: первая реализация компилятора&nbsp;<a href="https://en.wikipedia.org/wiki/Rust_(programming_language)" rel="noopener noreferrer nofollow">Rust</a>&nbsp;была на Ocaml.</p><p>Советую держать эти компоненты как можно более простыми и автономными — модульность сильно облегчит процесс. По-моему, то же можно сказать и о многих других аспектах разработки ПО.</p><p>AST</p><p>AST - абстрактное синтаксическое дерево. Это структурированное представление исходного кода программы в виде дерева, где каждый узел дерева представляет собой синтаксическую конструк языка программирования. Это дерево предоставляет абстракцию, которая позволяет анализировать и манипулировать программным кодом на высоком уровне.</p><p>IR</p><p>Эта часть занимается созданием [[1.2 IR]]. Через примитивы LLVM мы можем сгенерировать промежуточное представление. Каждому типу в AST дается метод, называемый codegen, который всегда возвращает объект значение LLVM, используемый для представления одного регистра присваивания (single assignment register), который является переменной для компилятора, которая может быть назначена только один раз. Интересно, что в этих примитивах IR то, что в отличии от ассемблера, они не зависят от какой-либо конкретной архитектуры машины, и это значительно упрощает работу для разработчиков языков, которым больше не нужно сопоставлять вывод в набор инструкций процессора. Теперь, когда фронтенд может генерировать IR, инструмент LLVM Optimizer используется для анализа и оптимизации сгенерированного кода. Он выполняет несколько проходов по IR и выполняет такие действия как устранение мертвого кода и скалярная замена агрегатов, и, наконец, это приводит нас к бекенду, где мы пишем модуль, который принимает IR в качестве входных данных, который выдает объектный код, который может работать на любой архитектуре.</p> <a href="https://habr.com/ru/posts/915070/?utm_campaign=915070&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Jun 2025 23:37:56 GMT</pubDate>
    <dc:creator><![CDATA[DrArgentum]]></dc:creator>
      
      <category><![CDATA[компиляторы]]></category><category><![CDATA[llvm]]></category><category><![CDATA[ast]]></category><category><![CDATA[lexer]]></category><category><![CDATA[parser]]></category><category><![CDATA[llvm ir]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DrArgentum — Системное программирование (+3) — 28.05.2025 19:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/913708/</guid>
    <link>https://habr.com/ru/posts/913708/?utm_campaign=913708&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>LLVM IR: что это такое?</strong></p><p>Главной особенностью LLVM является промежуточное представление кода (англ. Intermediate Representation, IR), форма, которую использует LLVM для представления кода в компиляторе. LLVM IR был разработан для выполнения функций промежуточного анализа и преобразований внутри оптимизатора компилятора. Ее создание имело целью решение множества специализированных задач, включая поддержку легковесных оптимизаций среды выполнения, кроссфункциональные и межпроцедурные оптимизации, полный анализ программы и агрессивные реструктурирующие преобразования. Промежуточное представление кода определено как язык первого порядка с четкой семантикой.</p><p>IR (Intermediate Representation) в контексте LLVM — это промежуточное представление кода. Это низкоуровневое, независимое от платформы и типобезопасное представление программного кода, которое используется в качестве промежуточного языка между интерфейсной частью и серверной частью компилятора.</p><pre><code>define i32 @add1(i32 %a, i32 %b) {
entry:
  %tmp1 = add i32 %a, %b
  ret i32 %tmp1
}

define i32 @add2(i32 %a, i32 %b) {
entry:
  %tmp1 = icmp eq i32 %a, 0
  br i1 %tmp1, label %done, label %recurse

recurse:
  %tmp2 = sub i32 %a, 1
  %tmp3 = add i32 %b, 1
  %tmp4 = call i32 @add2(i32 %tmp2, i32 %tmp3)
  ret i32 %tmp4

done:
  ret i32 %b
}
</code></pre><p>Этот код LLVM IR соответствует следующему коду на языке C, обеспечивающему возможность сложения целых чисел двумя разными способами:</p><pre><code class="cpp">unsigned add1(unsigned a, unsigned b) {
  return a+b;

}
// возможно не самый лучший способ сложения двух чисел
unsigned add2(unsigned a, unsigned b) {
  if (a == 0) return b;
  return add2(a-1, b+1);
}
</code></pre><p>Как видно из этого примера, LLVM IR — низкоуровневый RISC-подобный набор виртуальных инструкций. Как и настоящий набор инструкций RISC, он поддерживает линейные последовательности простых инструкций (сложение, вычитание, сравнение и ветвление). Эти инструкции имеют трехадресную форму. Это значит, что они берут некоторое количество входных данных и вычисляют результат в другом регистре. LLVM IR поддерживает метки и в целом выглядит как необычная форма языка ассемблера.</p><p>Строго говоря, промежуточное представление LLVM является четко определенным и единственным интерфейсом оптимизатора. Это означает, что всё, что необходимо знать, чтобы писать фронтенды для LLVM, это: что такое LLVM IR, как он работает и какие инварианты ему необходимы. Так как LLVM IR имеет текстовую форму, то имеет смысл создавать фронтенд, который выводит LLVM IR в виде текста, а затем отправляет его на оптимизатор и необходимый генератор кода при помощи каналов Unix.</p> <a href="https://habr.com/ru/posts/913708/?utm_campaign=913708&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 28 May 2025 16:19:29 GMT</pubDate>
    <dc:creator><![CDATA[DrArgentum]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[llvm]]></category><category><![CDATA[llvm ir]]></category><category><![CDATA[C]]></category><category><![CDATA[clang]]></category><category><![CDATA[компиляторы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @atomlib — Разработка под Windows (+4) — 09.05.2025 16:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/908102/</guid>
    <link>https://habr.com/ru/posts/908102/?utm_campaign=908102&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Рэймонд Чен&nbsp;— ветеран компьютерной индустрии, который работает в Microsoft c 1992&nbsp;года. Рэймонд участвовал в разработке OS/2, Windows 95, DirectX и оболочки Windows, а последние десятилетия отвечает за сохранение обратной совместимости системы. В своём блоге <a href="https://devblogs.microsoft.com/oldnewthing/" rel="noopener noreferrer nofollow">Old New Thing</a> Чен регулярно делится забавными историями из разработки софта, но также показывает действительно полезные примеры.</p><p>На этот раз Чен <a href="https://devblogs.microsoft.com/oldnewthing/20250508-00/?p=111162" rel="noopener noreferrer nofollow">показал</a>, почему история буфера обмена не отражает быстрые изменения содержимого буфера. Рэймонд приводит следующий фрагмент кода от клиента. Этот код был написан для некой утилиты, вставляющей в историю буфера обмена объекты. В некотором роде историю прошлых изменений превращали в будущее&nbsp;— целью было предугадать, какие элементы пользователь хотел бы видеть в истории буфера обмена.</p><pre><code class="cpp">// В целях наглядности вся проверка ошибок опущена
#include &lt;windows.h&gt;

void SetClipboardText(HWND hwnd, PCWSTR text)
{
    OpenClipboard(hwnd);
    EmptyClipboard();
    auto size = sizeof(wchar_t) * (1 + wcslen(text));
    auto clipData = GlobalAlloc(GMEM_MOVEABLE, size);
    auto buffer = (LPWSTR)GlobalLock(clipData);
    strcpy_s(buffer, size, text);
    GlobalUnlock(clipData);
    SetClipboardData(CF_UNICODETEXT, clipData);
    CloseClipboard();
}

// Чтобы они были под рукой, разместим эти строки в истории буфера обмена
static constexpr PCWSTR messages[] = {
    L"314159", // номер бага, который мы хотим исправить
    L"e83c5163316f89bfbde7d9ab23ca2e25604af290", // коммит, к которому привязываем ошибку
    L"Widget polarity was set incorrectly.", // комментарий, который нужно добавить
};

int wmain([[maybe_unused]] int argc,
          [[maybe_unused]] wchar_t* argv[])
{
    auto tempWindow = CreateWindowExW(0, L"static", nullptr, WS_POPUPWINDOW,
            0, 0, 0, 0, nullptr, nullptr, nullptr, nullptr);

    for (auto message : messages)
    {
        SetClipboardText(tempWindow, message);
    }
    DestroyWindow(tempWindow);
    return 0;
}</code></pre><p>Код записывает в буфер обмена последовательно три строковые переменные. Однако при запуске утилиты в истории буфера обмена оказывалась лишь одна&nbsp;— последняя. Куда делись две остальные?</p><p>Дело в том, что служба истории буфера обмена работает асинхронно через механизм <a href="https://habr.com/ru/articles/339442/" rel="noopener noreferrer nofollow">Clipboard Format Listener</a>, существующий с эпохи Windows&nbsp;Vista. В этом механизме через функцию <code>Add­Clipboard­Format­Listener</code> приложение добавляет себя в качестве листенера. После этого никаких дополнительных опросов буфера обмена проводить не нужно&nbsp;— система сама оповестит приложение, если буфер изменился.</p><p>При получении уведомления служба истории буфера обновляет собственно историю буфера обмена. Но из-за асинхронности событие может происходить с задержкой. Как объясняет Чен, из-за асинхронной природы обновлений при получении <code>WM_CLIPBOARD­UPDATE</code> от Clipboard Format Listener буфер может успеть обновиться ещё раз.</p><p>Как считает Рэймонд, это даже не баг, а фича. Так получается избегать приложений, которые быстро спамили бы в буфер обмена множество изменений. Если даже пользователь не успевает воспользоваться содержимым буфера, то сохранять это для истории смысла нет, указывает Чен.</p><p>В другом посте из своего блога Рэймонд <a href="https://devblogs.microsoft.com/oldnewthing/20110919-00/?p=9613" rel="noopener noreferrer nofollow">объяснил</a> механизмы утилит-просмотрщиков буфера обмена с синхронными обновлениями буфера. Здесь периодически выполняется опрос <code>GetClipboardSequenceNumber</code>. У данного подхода тоже есть проблемы: редкий опрос угрожает привести к пропуску изменения буфера, но слишком частые запросы создадут лишнюю нагрузку на систему.</p><p>Рэймонд обещает в следующий раз показать, как исправить код выше.</p> <a href="https://habr.com/ru/posts/908102/?utm_campaign=908102&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 09 May 2025 13:27:10 GMT</pubDate>
    <dc:creator><![CDATA[atomlib]]></dc:creator>
      
      <category><![CDATA[буфер обмена]]></category><category><![CDATA[Old New Thing]]></category><category><![CDATA[The Old New Thing]]></category><category><![CDATA[Рэймонд Чен]]></category><category><![CDATA[Windows]]></category><category><![CDATA[Clipboard Format Listener]]></category><category><![CDATA[программирование]]></category><category><![CDATA[блоги]]></category><category><![CDATA[блоги программистов]]></category><category><![CDATA[Microsoft]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Vanovsky714 — Блог компании Группа Астра (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/astralinux/posts/905620/</guid>
    <link>https://habr.com/ru/companies/astralinux/posts/905620/?utm_campaign=905620&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Читаемость Си-кода: грустный ликбез, чтобы жить стало веселее</strong></p><p>Многие коллеги по цеху подтвердят, что читаемость кода на языке Си иногда оставляет желать лучшего. Как подтвердят и те, кто им плохо владеет, но так или иначе сталкивается в связи с рабочими задачами.</p><p>И всему виной (ожидаемо) <strong>выражения препроцессора</strong> и, как следствие, <strong>макросы</strong>. Да, вы правильно подумали. Именно те части кода, в которых вызываются такие легенды как:</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e09/464/acd/e09464acdb1ff98f3c83a601972f68c7.jpg" width="1132" height="1280"></figure><p>Последние два очень легко спутать, если читать код невнимательно. Вместо них иногда рекомендуют использовать</p><pre><code class="cpp">#if defined // вместо #ifdef
#if !defined // вместо #ifndef</code></pre><p>Но если же в компании/проекте/отделе нет определенного код-стайла, или он не предполагает написание длинного варианта, то, естественно, разрабы пишут короткую форму (я, честно признаться, тоже).</p><p>Чего далеко ходить - все open source проекты пестрят именно сокращенными вариантами этих выражений и с этим уже ничего не поделаешь.</p><p>А вот первое выражение из первой тройки игроков иногда вообще открывает врата ада, когда используется многострочный макрос с бэкслэш-символами (<code>\</code>) на концах строк.</p><p>Конечно же выражения препроцессора - это очень гибкий и полезный инструмент, позволяющий делать всё:</p><ul><li><p>условную компиляцию;</p></li><li><p>выравнивание структур;</p></li><li><p>предотвращать повторные включения файла;</p></li><li><p>работать со строками;</p></li><li><p>грамотно оборачивать повторяющийся код и т.д. и т.п.</p></li></ul><p>Но бывают случаи, когда упрощение кода с точки зрения алгоритма делает его слабо читаемым для того самого бедного программиста, пытающегося прочесть этот шедевр машинописного текста:</p><pre><code class="cpp">struct {
  const char *name;
  const char *value;
#define _SPECIAL(x) { .name = #x, .value = b-&gt;x, }
} specials[] = {
  { .name = "object", .value = b-&gt;object_string, },
  _SPECIAL(host),
  _SPECIAL(endpoint),
#undef _SPECIAL
};</code></pre><p><em>*ну все, можно начинать грустить*</em></p><p>Чтобы разобраться, давайте очистим код от макросов, но сохраним суть:</p><pre><code class="cpp">struct {
  const char *name;
  const char *value;
} specials[] = {
  { .name = "object", .value = b-&gt;object_string, },
  { .name = "host", .value = host, },
  { .name = "endpoint", .value = endpoint, },
};</code></pre><p>Что понятно из очищенного варианта:</p><ul><li><p>инициализируется массив <code>specials[]</code>;</p></li><li><p>типом данных этого массива является структура с полями <code>*name</code> и <code>*value</code>;</p></li><li><p>поля элементов массива задаются вручную.</p></li></ul><p>Но как можно этот процесс немного автоматизировать и не прописывать вручную одинаковые строки?</p><p>Правильно, с помощью макроса:</p><pre><code class="cpp">#define _SPECIAL(x) { .name = #x, .value = b-&gt;x, }</code></pre><p>который определяется после объявления полей структуры.</p><p>Как обрабатывается аргумент <code>x</code>:</p><ul><li><p>имя аргумента преобразуется в строку с помощью макроса "<code>#x</code>" и присваивается полю <code>*name</code>;</p></li><li><p>полю <code>*value</code> присваивается значение поля структуры <code>b</code> с названием аргумента <code>x</code> (тут нужно убедиться, что поле с именем <code>x</code> действительно существует в структуре <code>b</code>).</p></li></ul><p>То есть чтобы при заполнении массива не писать каждый раз одинаковые строчки:</p><pre><code class="cpp">{ .name = "host", .value = host, },
{ .name = "endpoint", .value = endpoint, }</code></pre><p>можно вызвать выражение <code>_SPECIALS</code>:</p><pre><code class="cpp">_SPECIAL(host),
_SPECIAL(endpoint),</code></pre><p>Ну и в самом конце вызываем удаление созданного макроса, чтобы оно не было использовано в коде в дальнейшем:</p><pre><code class="cpp">#undef _SPECIAL</code></pre><p>Теперь после прочтения этого небольшого ликбеза вы <s>можете смело пользоваться макросами и создавать более сложные и нечитаемые шедевры</s> наконец-то разобрались в том, насколько гибкими могут оказаться выражения препроцессора ( вообще не понимаю, как вы жили без них раньше...)</p><p>А какие выражения и макросы в Си видели вы?</p> <a href="https://habr.com/ru/posts/905620/?utm_campaign=905620&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 30 Apr 2025 03:52:59 GMT</pubDate>
    <dc:creator><![CDATA[Vanovsky714 (Группа Астра)]]></dc:creator>
      
      <category><![CDATA[программирование]]></category><category><![CDATA[code]]></category><category><![CDATA[синтаксис]]></category><category><![CDATA[syntax]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Vanovsky714 — Блог компании Группа Астра (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/astralinux/posts/903422/</guid>
    <link>https://habr.com/ru/companies/astralinux/posts/903422/?utm_campaign=903422&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/db9/ec5/122/db9ec5122e1bb3a46cbd3c9019662c7c.jpg" width="920" height="804"></figure><div class="floating-image"><p><strong>Что такое быть Unix-программистом? Быть наполовину сисадмином (и вот почему)</strong></p></div><p>Как вы поняли, этот пост на Хабре начался со смелого заявления. Конкретно в данном случае я не хотел бы раскладывать по полкам абсолютно все навыки, которые нужны Unix-программисту для успешной работы. Их можно получить простым запросом в поисковике или к любому чат-боту типа ChatGPT, DeepSeek и т.д. (на ваш вкус и цвет)</p><p>Я же отметил именно те, приобрести которые стоило мне многих набитых шишек. Они связаны с работой в проектах, состоящих из утилит, содержащих по несколько тысяч строк кода каждая.</p><p>Итак, навыки, правила, они же житейские мудрости, они же грабли, на которые наступал.</p><p><strong>1. Сначала править конфиги и только потом - код. Это база</strong></p><p>В течение практически двух лет такой работы, я часто сталкивался с ситуацией: когда возникает проблема, она находится (неожиданно) не в коде, а в конфигурации программы. Спустя десятки выполненных задач на стыке программирования и системного администрирования, я осознал одну очень важную вещь: </p><blockquote><p><em>Сначала проверь конфигурацию и все её возможные варианты! Если все эти варианты исчерпаны, то только тогда, в последнюю очередь смотри в код!</em></p></blockquote><p>Я очень долго привыкал к этой мысли, тратя тонны времени на чтение кода, так и не найдя там ошибки. А после приходил коллега-сисадмин, который пошарил конфигурацию, почитал документацию, поиграл с настройками и всё решил.</p><p><strong>2. Владеть инструментами командной строки</strong></p><p>Логично, но не очевидно на первый взгляд. В отличие от обычного программиста (в сферическом вакууме), когда ты можешь ограничиться пошаговой отладкой или логами, Unix-программист должен уметь работать с командной строкой. Хоть и не обязательно знать все команды и их опции "на зубок", но нужно понимать, для каких случаев какие утилиты полезны. </p><p>Сколько было случаев, когда работа над какой-то задачей ускорялась при использовании какой-нибудь утилиты, дающей больше информации об используемых ресурсах.</p><p>Например:</p><p>- при невозможности пошаговой отладки использовать perf, чтобы проанализировать стек вызовов</p><p>- уметь пользоваться grep'ом для поиска и выделения нужной информации из конкретных файлов</p><p>- использовать sed для формирования файлов без лишней информации (например в логах убирать строки с наличием отметок времени)</p><p><strong>3. Уметь работать с виртуальными машинами, докером, анализаторами трафика</strong></p><p>Например, не плодить виртуалки, а делать снэпшоты (вы скажете: "Спасибо, капитан-очевидность!", но я видел на своей практике тех, кто, не зная про снэпшоты, плодил виртуалки). Держать мастер-копии виртуалок с предварительно настроенной конфигурацией для быстрого развертывания новых машин. Понимать, для каких целей проще использовать докер-контейнер и т.д.</p><p><strong>4. Работать с огромным количеством открытых одновременно утилит</strong></p><p>Как ни странно, я встречал разработчиков, которые задавали вопрос: "Зачем так много всего?"</p><p>Ответ прост: когда непонятно поведение программы, нужно принимать во внимание всё.</p><p><strong>Резюме</strong>: с таким набором навыков в какой-то момент начинаешь себя чувствовать, как оператор из Матрицы. </p><p>А какие особенности в Unix-разработке (и не только) подметили вы?</p> <a href="https://habr.com/ru/posts/903422/?utm_campaign=903422&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 23 Apr 2025 14:08:31 GMT</pubDate>
    <dc:creator><![CDATA[Vanovsky714 (Группа Астра)]]></dc:creator>
      
      <category><![CDATA[linux]]></category><category><![CDATA[разработка]]></category><category><![CDATA[кейс]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Spym — C++ (+4) — 25.03.2025 20:33]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/894322/</guid>
    <link>https://habr.com/ru/posts/894322/?utm_campaign=894322&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я тут опубликовал библиотеку для программирования в парадигме потоков данных (dataflow) на микроконтроллерах: <a href="https://github.com/Zubax/ramen" rel="noopener noreferrer nofollow">https://github.com/Zubax/ramen</a></p><p>Она чрезвычайно проста (один заголовочный файл) и работает на любой платформе без портирования.</p><p>Простейший пример --- сумматор:</p><pre><code>               ┌────────┐
       (float) │ Summer │ (float)
 in_a ◄────────┤        │◄──────── out_sum
               │        │
       (float) │        │
 in_b ◄────────┤        │
               └────────┘</code></pre><pre><code class="cpp">struct Summer
{
    ramen::Puller&lt;float&gt; in_a;
    ramen::Puller&lt;float&gt; in_b;
    ramen::Pullable&lt;float&gt; out_sum = [this](float&amp; out) { out = *in_a + *in_b; };
};</code></pre><p>Больше примеров, а также объяснение зачем это нужно при наличии альтернатив, по ссылке. Всем спасибо.</p> <a href="https://habr.com/ru/posts/894322/?utm_campaign=894322&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 25 Mar 2025 17:33:23 GMT</pubDate>
    <dc:creator><![CDATA[Spym]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[c++20]]></category><category><![CDATA[dataflow]]></category><category><![CDATA[message-passing]]></category><category><![CDATA[actor]]></category><category><![CDATA[actor model]]></category><category><![CDATA[микроконтроллер]]></category><category><![CDATA[поток данных]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+4) — 20.03.2025 17:10]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/892794/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/892794/?utm_campaign=892794&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Готовим прошивки для BIOS. Нужно всего лишь... </strong></p><p>В YADRO есть команда, которая разрабатывает и отлаживает UEFI для самых разных продуктов компании. Подробнее о ней —&nbsp;<a href="https://rutube.ru/video/private/1d432fc0ccd473955854050f7c7e237b/?p=FCZUmbmqX0QAu5aqRQxg5w" rel="noopener noreferrer nofollow">в видеоролике →</a> . </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/30b/9e8/b3d/30b9e8b3d69155aa74b06571f108934d.png" width="2256" height="1150"></figure><p>Первая особенность работы — в распределенной команде. Серверы, на которых инженеры разрабатывают прошивки, могут находиться в Москве, а разработчики — в других городах: от Владивостока до Калининграда и от Архангельска до Смоленска. </p><p>Системы, для которых разрабатывают прошивки в YADRO, делятся на два типа: с&nbsp;BMC&nbsp;и без него.</p><blockquote><p><strong>Больше о работе команды и, в целом, об истории BIOS/UEFI читайте <a href="https://habr.com/ru/companies/yadro/articles/886480/" rel="noopener noreferrer nofollow">в статье →</a>&nbsp;</strong></p></blockquote><p>А если тоже хотите стать «поваром» UEFI, присмотритесь к одной из вакансий: </p><p>→&nbsp;<a href="https://careers.yadro.com/vacancy/14718/?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=uefi_bios_post_200325" rel="noopener noreferrer nofollow">Старший/ ведущий разработчик на C++ (Linux/OpenBMC)</a></p><p>→&nbsp;<a href="https://careers.yadro.com/vacancy/17045/?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=uefi_bios_post_200325" rel="noopener noreferrer nofollow">Старший разработчик на С (BIOS/UEFI)</a></p><p>→&nbsp;<a href="https://careers.yadro.com/vacancy/50993/?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=uefi_bios_post_200325" rel="noopener noreferrer nofollow">Тимлид разработки в OpenBMC</a></p><p></p> <a href="https://habr.com/ru/posts/892794/?utm_campaign=892794&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 20 Mar 2025 14:10:15 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[bios]]></category><category><![CDATA[uefi]]></category><category><![CDATA[прошивка]]></category><category><![CDATA[bmc]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+4) — 19.03.2025 11:38]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/892204/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/892204/?utm_campaign=892204&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>SystemVerilog отжил свое? На пятки наступает Scala/Chisel?</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/994/d0a/073/994d0a0730ee452a88181413d13b2164.jpg" width="740" height="316"></figure><p>DARPA, управление перспективных исследовательских проектов Минобороны США, описывает Chisel как <em>технологию, позволяющую маленьким командам создавать большие цифровые проекты</em>. И я вполне могу с этим согласиться, но есть нюансы.</p><p>Chisel — это, по сути, библиотека Scala, а точнее, Domain Specific Language. Языку Scala уже больше 20 лет, он постоянно развивается, сочетает функциональное и императивное программирование. При написании кода на Scala вам доступны все библиотеки Java.&nbsp;</p><p>Scala — это масштабируемый язык, который позволяет добавлять свои языковые конструкции. На основе Scala можно создать язык под свои задачи. Так 12 лет назад и поступили инженеры в Беркли: выкинули из Verilog 90%, оставив только нужное, и обернули все это в Scala. Получился Chisel.&nbsp;</p><p>Chisel используют прежде всего для создания RTL-описаний. Также он позволяет проводить симуляцию несложных модулей. Это удобно для создания юнит-тестов и моделирования работы различных алгоритмов. В плане симуляции не стоит возлагать на Chisel такие же надежды, как на System C или что-то подобное. Симулировать вы сможете лишь очень маленькие схемки, а генерировать — хоть целые кластеры из тысяч процессоров, вообще все, что захотите.</p><p>На основе Chisel/Scala можно написать свой HLS-инструмент (High Level Synthesis), где одним росчерком пера вы будете создавать очень большие схемы, что с использованием одного Verilog невозможно.</p><blockquote><p>В блоге YADRO Денис Муратов <strong><a href="https://habr.com/ru/companies/yadro/articles/890476/" rel="noopener noreferrer nofollow">подробно сравнил</a></strong> Chisel/Scala с SystemVerilog в создании RTL-описаниях, раскрыл основные преимущества и недостатки альтернативы, а также ее дополнительные возможности — функциональное программирование и переиспользование модулей.</p></blockquote><p></p> <a href="https://habr.com/ru/posts/892204/?utm_campaign=892204&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 19 Mar 2025 08:38:45 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[scala]]></category><category><![CDATA[verilog]]></category><category><![CDATA[asic]]></category><category><![CDATA[systemverilog]]></category><category><![CDATA[chisel]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AnimeSlave — Zig (+2) — 05.03.2025 22:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/888302/</guid>
    <link>https://habr.com/ru/posts/888302/?utm_campaign=888302&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Новый релиз языка Zig 0.14.0</strong></p><p><a href="https://github.com/ziglang/zig/releases/tag/0.14.0" rel="noopener noreferrer nofollow">Github Release</a></p><p><a href="https://ziglang.org/download/0.14.0/release-notes.html" rel="noopener noreferrer nofollow">Описания изменений версии</a></p><p>Я информирую о релизе постом только потому, что у меня лично сейчас нет свободного времени написать полноценную статью об всех изменениях. Изменений много.</p><p>Важное изменение, которое всё же я упомяну - появился свой backend для компилятора. То есть отказ от LLVM состоялся, но на данный момент только для Linux x86_64.</p> <a href="https://habr.com/ru/posts/888302/?utm_campaign=888302&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 05 Mar 2025 19:43:59 GMT</pubDate>
    <dc:creator><![CDATA[AnimeSlave]]></dc:creator>
      
      <category><![CDATA[zig]]></category><category><![CDATA[новая версия]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+3) — 06.02.2025 15:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/880098/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/880098/?utm_campaign=880098&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как и зачем дублировать Intel NTB Gen3 в QEMU</strong></p><p>Системным программистам в YADRO нужно было «обмануть» драйвер в Linux: он не должен&nbsp;«знать», что работает в эмуляции.&nbsp;</p><p>Для этого ведущий инженер Никита приступил к созданию виртуального двойника&nbsp;<abbr class="habraabbr" title="Intel NTB (Non-Transparent Bridge) Gen3 — это аппаратная технология, встроенная в чипсеты и процессоры Intel. Она предназначена для организации прямого обмена данными между двумя системами или устройствами через интерфейс PCIe (Peripheral Component Interconnect Express)." data-title="&lt;p&gt;Intel NTB (Non-Transparent Bridge) Gen3 — это аппаратная технология, встроенная в чипсеты и процессоры Intel. Она предназначена для организации прямого обмена данными между двумя системами или устройствами через интерфейс PCIe (Peripheral Component Interconnect Express).  &lt;/p&gt;" data-abbr="Intel NTB Gen3">Intel NTB Gen3</abbr> в QEMU, документации к которому в открытом доступе нет.&nbsp;Реализованная модель позволяет производить разработку и тестирование протоколов более высокого уровня, а также выполнять их качественное сравнение.</p><p>PCIe NTB не позволяет увидеть адресное пространство, которое принадлежит к подключенному по NTB соседнему устройству. Вкратце он работает так:</p><ul><li><p>перенаправляет трафик PCIe между шинами как мост,</p></li><li><p>CPU рассматривает мост как конечное устройство,</p></li><li><p>CPU не «видит» все устройства на «другой» стороне, как правило, другая сторона — это другой компьютер.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/2a3/ee3/5d1/2a3ee35d119f61f3967332479bfa058b.png" alt="Упрощенное представление PCIe NTB" title="Упрощенное представление PCIe NTB" width="3205" height="792"><div><figcaption>Упрощенное представление PCIe NTB</figcaption></div></figure><p>С точки зрения эмуляции, нужно уделить особое внимание регистрам, прерываниям и моделированию поведения устройств.</p><p>В работе с PCI BAR необходимо обеспечить прозрачное использование Linux-драйвера Intel NTB для оптимального взаимодействия с оборудованием, которое мы эмулируем. Еще одна задача — разработать новые транспорты, которые работают поверх эмуляции: RPMSG, Virtio/Vhost, NTRDMA и другие.&nbsp;Также одна модель помогла найти ошибки в инициализации драйвера.</p><blockquote><p><strong>Никита подробно описывает тернистый путь создания виртуального двойника&nbsp;Intel NTB Gen3 <a href="https://habr.com/ru/companies/yadro/articles/877248/" rel="noopener noreferrer nofollow">в статье&nbsp;→</a></strong></p></blockquote><p></p> <a href="https://habr.com/ru/posts/880098/?utm_campaign=880098&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 06 Feb 2025 12:43:03 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[QEMU]]></category><category><![CDATA[ntb]]></category><category><![CDATA[linux]]></category><category><![CDATA[kvm]]></category><category><![CDATA[intel ntb]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+4) — 27.12.2024 14:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/870340/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/870340/?utm_campaign=870340&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>«Пушим байты» в сугробы: новогодняя демосцена 2025</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c7f/e55/08f/c7fe5508fe20337c97d30bb8df26d919.jpg" width="1283" height="729"></figure><p>Признанная классика демосцены — PICO-8, в арсенале которой сотни игр разной сложности. Мы же пойдем более оригинальным путем и напишем новогоднюю демку для BytePusher. Эта приставка включает 8-битный процессор, предлагает разрешение 256x256 и 8-битный цвет. Но самое интересное в ней — это OISC-архитектура ByteByeJump (BBJ).</p><p>OISC, One-Instruction Set Computer, известна гораздо меньше, чем RISC или CISC. Ее простота, очевидная из названия, привлекает немного энтузиастов, судя по странице BytePusher. Тем интересней будет сделать что-нибудь для нее с нуля.</p><p>Этим и занялся в своей статье Пётр Советов, специалист в области разработки DSL-компиляторов и старший научный сотрудник лаборатории специализированных вычислительных систем РТУ МИРЭА. Написал ассемблер на Python, разобрался с вычислениями без АЛУ и «отрисовал» классическое демо с падающим снегом. Еще и со «звездочкой» в виде сугробов и статичных цифр.</p><p><a href="https://habr.com/ru/companies/yadro/articles/867424/" rel="noopener noreferrer nofollow"><u>Читать полное руководство →</u></a></p> <a href="https://habr.com/ru/posts/870340/?utm_campaign=870340&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 27 Dec 2024 11:18:39 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[ассемблер]]></category><category><![CDATA[демосцена]]></category><category><![CDATA[эмулятор]]></category><category><![CDATA[низкоуровневое программирование]]></category><category><![CDATA[bytepusher]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+4) — 11.12.2024 17:38]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/865804/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/865804/?utm_campaign=865804&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Три проверенных метода организовать обмен прерываниями между машинами QEMU c KVM и без</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/0de/397/745/0de397745f64baa0b12cc612678997bb.jpg" width="1467" height="717"></figure><p>Эмулятор QEMU помогает решать ряд задач, в том числе разработку и отладку любого уровня коммуникаций. Вы можете эмулировать работу не только отдельной машины, но и связывать несколько независимых машин между собой.&nbsp;</p><p>Быстрая работа такой связки приятна при разработке/отладке и очень важна при массовом прогоне автотестов в CI. Как оптимизировать обмен прерываниями и какой подход к организации IQI вам подойдет — узнаете <a href="https://habr.com/ru/companies/yadro/articles/862306/" rel="noopener noreferrer nofollow"><u>из статьи</u></a>. А еще разберемся c:</p><ul><li><p>устройством QEMU под капотом,</p></li><li><p>реализацией модели и драйвера,</p></li><li><p>добавлением прерываний MSI-X,</p></li><li><p>результатами замеров.</p></li></ul><p><strong>На бонус:</strong> десяток полезных материалов для изучения. </p> <a href="https://habr.com/ru/posts/865804/?utm_campaign=865804&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 11 Dec 2024 14:38:18 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[linux]]></category><category><![CDATA[kvm]]></category><category><![CDATA[qemu]]></category><category><![CDATA[прерывания]]></category><category><![CDATA[ntb]]></category><category><![CDATA[iqi]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+3) — 22.11.2024 17:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/860622/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/860622/?utm_campaign=860622&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Битовые маски #17: О гипервизорах, реализации разных языков и будущем системного программирования</strong></p><p><a href="https://engineer.yadro.com/podcast/dizajn-yazykov-programmirovaniya-gipervizory/?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=anounce_post_221124" rel="noopener noreferrer nofollow">Смотреть или слушать → </a></p><p>В гостях у подкаста «Битовые маски» — Николай Иготти, разработчик, участвовавший в создании многих известных проектов международных корпораций. Николай успел поработать над HotSpot в Sun Microsystems, над гипервизором VirtualBox, а также в разных проектах Google и EMC. Руководил разработкой Kotlin/Native компилятора и Compose Multiplatform в JetBrains, а сейчас трудится в Huawei. В выпуске затронули много разных тем — от гипервизоров до дизайна современных языков программирования:</p><ul><li><p>Чем виртуальные машины отличаются друг от друга и от процессоров.</p></li><li><p>В чем сложности создания гипервизоров.</p></li><li><p>С какими проблемами придется столкнуться при создании нового языка программирования.</p></li><li><p>В чем особенности и отличия разработки системного ПО от прикладного.</p></li><li><p>Как связана разработка современных UI-фреймворков с системным программированием.</p></li><li><p>Какие задачи в системном программирование самые интересные.</p></li><li><p>Как учить будущих специалистов в этой сфере.</p></li></ul><p>Бонус: разбор того, что не давало запустить VirtualBox c MacOS на архитектуре x86.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/34f/37a/f98/34f37af98e0a3b580d674e1526befa69.png" alt="Николай Иготти в студии «Битовых масок»" title="Николай Иготти в студии «Битовых масок»" width="2654" height="1518"><div><figcaption>Николай Иготти в студии «Битовых масок»</figcaption></div></figure><p></p> <a href="https://habr.com/ru/posts/860622/?utm_campaign=860622&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 22 Nov 2024 14:25:23 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[виртуальные машины]]></category><category><![CDATA[huawei]]></category><category><![CDATA[jetbrains]]></category><category><![CDATA[системное программирование]]></category><category><![CDATA[virtualbox]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ParfenovIgor — C (+2) — 16.11.2024 23:12]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/859146/</guid>
    <link>https://habr.com/ru/posts/859146/?utm_campaign=859146&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Книга по C и не только</strong></p><p>Добрый день. Пару месяцев назад я закончил написание книги и выставляю её в открытый доступ: <a href="https://github.com/ParfenovIgor/c-book" rel="noopener noreferrer nofollow">GitHub</a></p><p>В чём идея? Контент этой книги представляет собой не только обучение языку C, но и обучение большому количеству прикладных вещей с серьёзной глубиной погружения. Я постарался дать ответ на как можно большее количество вопросов, которые возникают в процессе изучения, оставив минимальное количество дыр в понимании, как всё работает.</p><p>Посмотреть <code>.html</code> файл книги можно на <code>GitHub</code>-е. Но он не рендерит <code>MathJax</code>, поэтому лучше скачать файл <code>c-book.html</code> локально. Можно как угодно (в том числе в issues) сообщать мне о нерабочем коде в примерах, опечатках, неправильных утверждениях с моей стороны. Буду также рад увидеть конструктивную критику. Возможно, в ответ на неё, я буду добавлять новые главы в книгу.</p><p>(Эта книга абсолютно точно не является рекламой <code>Zig</code>-а.)</p> <a href="https://habr.com/ru/posts/859146/?utm_campaign=859146&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 16 Nov 2024 20:12:21 GMT</pubDate>
    <dc:creator><![CDATA[ParfenovIgor]]></dc:creator>
      
      <category><![CDATA[C]]></category><category><![CDATA[обучение]]></category><category><![CDATA[системное программирование]]></category><category><![CDATA[linux]]></category><category><![CDATA[assembler]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rukhi7 — Программирование — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/853814/</guid>
    <link>https://habr.com/ru/posts/853814/?utm_campaign=853814&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Почему умирает OpenHarmony</strong></p><p>Если вы откроете проект на <a href="https://gitee.com/openharmony" rel="noopener noreferrer nofollow">gitee.com</a><strong> </strong>вы увидите что проект включает в себя больше 700 (семисот!)  репозиториев. Секрет в том что ни один из этих проектов в отдельном репозитории не компилируется независимо! Один знакомый разработчик, который работает с этим богатством, рассказал мне, что чтобы скомпилировать какой либо из проектов составляющих OpenHarmony вы должны скачать и скомпилировать минимум 450 репозиториев! Дело в том что даже отдельные приложения такие как mailBox, storage с СМС-ками, с контактами, видео плеер, ... которые, казалось бы, должны быть отдельными приложениями таковыми не являются. Они все компилируются как части одной монолитной прошивки смартфона (как части операционной системы) и вы не можете скомпилировать их без компиляции всей системы, такая опция просто не предусмотрена.</p><p>Поэтому OpenHarmony превратилась в огромного монстра который уже не может даже шевелиться от собственной тяжести. Внутренние связи и зависимости между функциями приложений и зависимостями ядра и системных библиотек никто не контролирует, они постоянно дублируются все в новых и новых модификациях, входят в противоречие друг другом, генерируют противоречивые потоки данных, копии данных, несовместимые интерфейсы, ... все это подобно раковой опухоли которая разъедает-разрывает носителя изнутри.</p><p>Каждый новый добавленный в OpenHarmony репозиторий приближает видимый крах проекта.</p><p>Интересно как обстоят дела у Андроида в этом смысле.</p><p></p> <a href="https://habr.com/ru/posts/853814/?utm_campaign=853814&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 28 Oct 2024 05:43:31 GMT</pubDate>
    <dc:creator><![CDATA[rukhi7]]></dc:creator>
      
      <category><![CDATA[android]]></category><category><![CDATA[open source]]></category><category><![CDATA[китайский планшет]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AnimeSlave — Zig (+2) — 03.09.2024 20:21]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/840662/</guid>
    <link>https://habr.com/ru/posts/840662/?utm_campaign=840662&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Первая вакансия на Zig в России</strong></p><p>Собственно вот: <a href="https://career.habr.com/vacancies/1000147586" rel="noopener noreferrer nofollow">https://career.habr.com/vacancies/1000147586</a></p><p>Вот мы (те кто следит за языком Zig) и дожили до этого момента. Большой вопрос зачем Zig в проде сейчас. Но сам факт такого похвальный. Начали появляться смельчаки, готовые взять ещё очень молодой язык в работу. Я туда не откликнусь, не мой стек. Но может найдутся желающие</p><p></p> <a href="https://habr.com/ru/posts/840662/?utm_campaign=840662&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 03 Sep 2024 17:21:22 GMT</pubDate>
    <dc:creator><![CDATA[AnimeSlave]]></dc:creator>
      
      <category><![CDATA[zig]]></category><category><![CDATA[вакансия]]></category><category><![CDATA[вакансии]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @antoshkka — Блог компании Яндекс (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yandex/posts/830846/</guid>
    <link>https://habr.com/ru/companies/yandex/posts/830846/?utm_campaign=830846&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Всем привет. Возможно, вы помните меня по статьям об изменениях в C++ и о фреймворке 🐙 userver, поэтому сразу к делу. <strong>27 июля</strong> я выступаю на конференции <strong><a href="https://cppzerocostconf.yandex.ru/cppzerocostconf_2024?utm_source=habr&amp;utm_medium=social&amp;utm_campaign=6073865&amp;utm_content=news" rel="noopener noreferrer nofollow"><u>C++ Zero Cost Conf</u></a></strong>, которая пройдёт в Москве и Ереване. Там я поделюсь новостями со встречи Международного комитета по стандартизации языка в Сент-Луисе и расскажу о наших планах на C++26 и C++29. А ещё отвечу на ваши вопросы. Приходите в гости!</p><p>Помимо меня, вас также будут ждать:&nbsp;</p><ul><li><p>Константин Владимиров, руководитель отдела компиляторов и средств разработки Syntacore. Покажет развитие архитектуры сложного LLVM-based-C++-проекта и конкретные задачи, возникающие при его развитии.</p></li><li><p>Андрей Аксёнов, руководитель разработки инфраструктуры поиска Авито/Sphinx. Расскажет историю из продакшена с One Billion Row Challenge, парсингом гигабайтов TSV’шек, десятью странными оптимизациями и боттлнеками вообще везде.</p></li><li><p>Сергей Слотин, разработчик. Поговорит об устройстве памяти и кешей, их странностях и неожиданных последствиях для производительности.</p></li><li><p>Константин Облаков, старший разработчик браузера Яндекс Поиска и Рекламных технологий. Покажет на практике, как GDB позволяет добиться результатов, недоступных другими методами.</p></li></ul><p>Полный список спикеров и темы докладов смотрите <a href="https://cppzerocostconf.yandex.ru/cppzerocostconf_2024?utm_source=habr&amp;utm_medium=social&amp;utm_campaign=6073865&amp;utm_content=news" rel="noopener noreferrer nofollow"><u>на сайте</u></a>.&nbsp;</p><p>Если не получится прийти лично, подключайтесь дистанционно.</p> <a href="https://habr.com/ru/posts/830846/?utm_campaign=830846&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 23 Jul 2024 11:57:34 GMT</pubDate>
    <dc:creator><![CDATA[antoshkka (Яндекс)]]></dc:creator>
      
      <category><![CDATA[конференция]]></category><category><![CDATA[c++]]></category><category><![CDATA[c++17]]></category><category><![CDATA[c++20]]></category><category><![CDATA[c++23]]></category><category><![CDATA[c++26]]></category><category><![CDATA[executor]]></category><category><![CDATA[reflection]]></category><category><![CDATA[reflections]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sa2304 — Программирование (+4) — 07.05.2024 03:34]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/812733/</guid>
    <link>https://habr.com/ru/posts/812733/?utm_campaign=812733&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Готов HTML и EPUB книги об учебной операционной системе xv6.</p><p>Яндекс.Диск:</p><ul><li><p><a href="https://disk.yandex.ru/i/mfEiylK16ZAFPQ" rel="noopener noreferrer nofollow">Книга об xv6 на русском языке в формате PDF</a></p></li><li><p><a href="https://disk.yandex.ru/d/WE7dzj1urJAOrA" rel="noopener noreferrer nofollow">Книга об xv6 на русском языке в формате EPUB</a></p></li><li><p><a href="https://disk.yandex.ru/d/a2KlVERCt-kypg" rel="noopener noreferrer nofollow">Книга об xv6 на русском языке в формате HTML</a></p></li></ul><p>Google.Drive: <a href="https://drive.google.com/drive/folders/1Rt7hcHysWAilDn64uf-RpLACuJ39YKaR" rel="noopener noreferrer nofollow">https://drive.google.com/drive/folders/1Rt7hcHysWAilDn64uf-RpLACuJ39YKaR</a></p> <a href="https://habr.com/ru/posts/812733/?utm_campaign=812733&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 07 May 2024 00:34:18 GMT</pubDate>
    <dc:creator><![CDATA[sa2304]]></dc:creator>
      
      <category><![CDATA[xv6]]></category><category><![CDATA[книга]]></category><category><![CDATA[html]]></category><category><![CDATA[epub]]></category><category><![CDATA[pdf]]></category><category><![CDATA[скачать]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Учебный процесс в IT (+1) — 26.03.2024 19:45]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/803069/</guid>
    <link>https://habr.com/ru/posts/803069/?utm_campaign=803069&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>25.03.2024&nbsp;года&nbsp;«Лаборатория программно‑аппаратных комплексов с&nbsp;искусственным интеллектом» при&nbsp;финансовой поддержке ООО «НИЦ ЦТ» организовала первый семинар, посвящённый системному программированию. </p><p>Докладчики: сотрудники МЦСТ Александр Ермолицкий, Мурад Нейман‑заде. Предварительная тема: «Обзор оптимизаций компилятора LCC».</p><p>Запись мероприятия доступна по <a href="https://bbb.mipt.ru/playback/presentation/2.3/a7290b0eb36ee3e379adb2f7ce91f5b8cc94487a-1711358227951" rel="noopener noreferrer nofollow">этой ссылке</a>.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/bea/948/48e/bea94848e3a23b44eff2d35ba80b9b11.png" width="988" height="743"></figure><p></p> <a href="https://habr.com/ru/posts/803069/?utm_campaign=803069&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 26 Mar 2024 16:45:44 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[НИЦ ЦТ]]></category><category><![CDATA[компилятор LCC]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vadimr — Программирование (+1) — 23.01.2024 14:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/788324/</guid>
    <link>https://habr.com/ru/posts/788324/?utm_campaign=788324&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Откуда берётся мусор?</strong></p><p>Рассмотрим следующую программу:</p><pre><code class="cpp">#include &lt;stdio.h&gt;
int main () {
  int a [100];
  int i;
  for (i=0; i&lt;100; i++)
    printf ("%d ", a[i]);
  return 0;
}
</code></pre><p>При компиляции без оптимизации и вызове в Linux она выдаст некоторые числа, являющиеся мусорным содержимым памяти. Кто-нибудь в состоянии объяснить, откуда конкретно они берутся, и почему каждый раз разные при последовательных запусках программы?</p><p>Казалось бы, если это просто содержимое адресов, на которые приходится соответствующая секция исполняемого модуля, то оно должно бы сохраняться от запуска к запуску?</p><p>Объяснение в стиле “потому что виртуальные адреса мапируются на реальные рандомно” я и сам могу дать, хочется более глубокого понимания. Компьютер – вещь детерминированная, в нём случайность – это не познанная закономерность.</p><p>Upd: ответ дан уважаемым <a class="mention" href="/users/alexvangog">@alexvangog</a> в закреплённом комментарии.</p> <a href="https://habr.com/ru/posts/788324/?utm_campaign=788324&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 23 Jan 2024 11:31:04 GMT</pubDate>
    <dc:creator><![CDATA[vadimr]]></dc:creator>
      
      <category><![CDATA[мусор]]></category><category><![CDATA[память]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — C (+3) — 20.01.2024 14:53]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/787742/</guid>
    <link>https://habr.com/ru/posts/787742/?utm_campaign=787742&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Утечки памяти преследовали программы на языке С с тех пор, как существует этот язык. Было предложено множество решений, вплоть до идеи переписать программы на языке C на других языках. Но есть лучший способ.</p><p><a href="https://flak.tedunangst.com/post/memory-leak-proof-every-C-program" rel="noopener noreferrer nofollow">Здесь представлено</a> простое решение, которое устранит утечки памяти в каждой программе на языке C. Используйте этот модуль с вашей программой, и утечки памяти останутся в прошлом.</p><pre><code class="cpp">#include &lt;dlfcn.h&gt;
#include &lt;stdio.h&gt;

struct leaksaver {
        struct leaksaver *next;
        void *pointer;
} *bigbucket;

void *
malloc(size_t len)
{
        static void *(*nextmalloc)(size_t);
        nextmalloc = dlsym(RTLD_NEXT, "malloc");
        void *ptr = nextmalloc(len);
        if (ptr) {
                struct leaksaver *saver = nextmalloc(sizeof(*saver));
                saver-&gt;pointer = ptr;
                saver-&gt;next = bigbucket;
                bigbucket = saver;
        }
        return ptr;
</code></pre><blockquote><p>Пояснение автора кода в оригинале:</p><p>Every allocated pointer is saved in the big bucket, where it remains accessible. Even if no other references to the pointer exist in the program, the pointer has not leaked.</p><p>It is now entirely optional to call free. If you don’t call free, memory usage will increase over time, but technically, it’s not a leak. As an optimization, you may choose to call free to reduce memory, but again, strictly optional.</p><p>Problem sovled!</p></blockquote><p></p> <a href="https://habr.com/ru/posts/787742/?utm_campaign=787742&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 20 Jan 2024 11:53:42 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[C]]></category><category><![CDATA[утечка памяти]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
