<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Компиляторы</title>
    <description/>
    <link>https://tproger.ru/tag/compilers</link>
    <atom:link href="https://tproger.ru/tag/compilers/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 23:31:21 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Компиляторы</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Интерпретатор Plush перешёл на регистры и ускорился до 3,37 раза</title>
      <link>https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza</link>
      <comments>https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza</guid>
      <description><![CDATA[<p>Байткод Plush переписан со стековой модели на регистровую: медиана 2,07 раза, максимум 3,37, на fib быстрее Lua на 24%. Как устроено и что не выросло.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza">Интерпретатор Plush перешёл на регистры и ускорился до 3,37 раза</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 09:32:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Максим Шевалье-Буавер, автор языка Plush и в прошлом разработчица JIT-компилятора YJIT для Ruby, 2 сентября <a href="https://pointersgonewild.com/2026-09-02-plushs-new-register-based-interpreter/">описала</a>, как переписала виртуальную машину Plush со стекового байткода на регистровый. На наборе синтетических тестов новый интерпретатор быстрее старого в 2,07 раза по медиане и до 3,37 раза в лучшем случае; на тестах fib и binary_tree Plush обогнал Lua 5.5.1 на 24% и 55%.</p><p>Практический интерес здесь не в самом Plush, минималистичном динамическом языке на Rust, а в измеренном ответе на старый вопрос: сколько стоит стековая модель байткода. Вывод автора сформулирован жёстко: «вам, вероятно, не стоит писать стековые байткод-интерпретаторы в 2026 году» (перевод редакции). Для тех, кто пишет свои DSL, скриптовые движки или встраиваемые интерпретаторы, это готовый аргумент с цифрами и с честным списком того, что не ускорилось.</p><ul><li>Медианное ускорение 2,07 раза, максимальное 3,37; геометрическое среднее 1,94 раза, из них 1,55 дала сама регистровая модель без оптимизаций, ещё 25% добавили специализированные инструкции.</li><li>Инструкция теперь 64-битное слово вместо enum на 24 байта; трёхадресная форма reg(a) = reg(b) + reg(c), до 64 000 локальных переменных, 76 опкодов.</li><li>Замеры: MacBook Air M5 (10 ядер, arm64), rustc 1.96.0, 11 чередующихся запусков на тест, медиана; повторный прогон дал те же результаты.</li><li>Против Lua 5.5.1: быстрее на 24% в fib и на 55% в binary_tree; сравнение с CPython 3.14.6 и CRuby 4.0.6 автор ограничивает оговорками о разной семантике и составе тестов.</li><li>Тесты сборщика мусора почти не изменились: регистровая модель ускоряет диспетчеризацию, а не аллокацию.</li></ul><h2>Почему стековая машина медленнее</h2><p>В стековой VM выражение a + b превращается в три инструкции: положить a, положить b, сложить. Каждая инструкция проходит через диспетчер: прочитать опкод, перейти на обработчик, сдвинуть указатель. В регистровой VM то же выражение записывается одной инструкцией с тремя операндами: куда положить и что сложить. Главный тезис статьи: в интерпретаторе самый большой рычаг производительности это число инструкций, которые нужно продиспетчеризовать, и регистровая модель сокращает его в разы. Автор цитирует это как основной вывод: «снова, в интерпретаторе главный рычаг это уменьшение числа инструкций» (перевод редакции).</p><p>Второй эффект: значения не гоняются между локальными переменными и временным стеком. Локальные переменные и есть регистры фрейма, поэтому x = y + z не требует ни загрузки, ни сохранения.</p><h2>Как устроен новый байткод</h2><p>Старая инструкция была Rust-перечислением Insn размером 24 байта. Новая упакована в 64-битное слово: опкод и операнды-регистры. Для сравнения автор приводит Lua: там 32-битное слово с 8-битными полями, отсюда лимит в 255 регистров на фрейм и 200 именованных локальных переменных. У Plush поля шире, до 64 000 локальных переменных, ценой вдвое большего размера инструкции. Всего опкодов 76. Сверху добавлены оптимизации, каждая из которых убирает инструкции: слитые сравнение-и-переход, сдвиги и маски с непосредственными операндами, свёртка констант, устранение лишних пересылок. Инлайн-кэши вынесены в отдельные таблицы, чтобы не раздувать слово инструкции.</p><p>Замену enum на 64-битное слово автор описывала <a href="https://pointersgonewild.com/2026-08-25-replacing-a-rust-enum-with-a-64-bit-word/">неделей раньше</a>, тогда это дало 17% на старой стековой модели; нынешняя статья седьмая в серии о Plush.</p><h2>Что показали замеры и где их границы</h2><p>Методика описана подробно: MacBook Air M5, rustc 1.96.0, для каждого сравнения 11 чередующихся запусков старой и новой версии, берётся медиана, весь набор прогнан дважды. Сравнивались конкретные коммиты репозитория. Неоптимизированная регистровая VM дала 1,55 раза по геометрическому среднему, оптимизации добавили ещё 25%, итого 1,94; медиана по отдельным тестам 2,07, максимум 3,37. Тесты, упирающиеся в сборщик мусора, остались на месте: диспетчеризация там не узкое место.</p><p>Сравнение с другими языками автор сопровождает оговорками: CPython 3.14.6, CRuby 4.0.6 и Lua 5.5.1 имеют другую семантику, а набор тестов синтетический. Заявлены только два прямых результата против Lua: fib на 24% быстрее, binary_tree на 55%. Отдельная демонстрация: программный рендеринг уровня Quake в 800 на 600 в один поток, около 47 кадров в секунду, с живой кучей до 1 ГБ без заметных пауз GC по оценке автора.</p><h2>Что из этого забрать в свой интерпретатор</h2><ul><li>Если вы проектируете байткод с нуля, начинайте с регистровой модели: выигрыш от неё больше, чем от любой микрооптимизации диспетчера.</li><li>Считайте инструкции, а не такты: слитые инструкции (сравнение плюс переход) и непосредственные операнды окупаются именно сокращением диспетчеризации.</li><li>Не ждите ускорения там, где узкое место в аллокации: GC-тесты Plush не изменились.</li><li>Готовые бинарники Plush есть для Linux и macOS (x86-64 и arm64) и через PowerShell-установщик для Windows x86-64; код под Apache-2.0, примеры под CC0, всё в <a href="https://github.com/maximecb/plush">репозитории</a>.</li></ul><p>Кому это не пригодится: тем, кто использует готовые рантаймы и не пишет свои. CPython, к слову, остаётся стековой машиной, и разница подходов хорошо видна на его фоне; о цене операций в самом Python мы недавно писали в связи с новой <a href="https://tproger.ru/news/vywel-python-3-15-0rc2-abi-zamorozhen-finalnyj-reliz-1-oktyabrya">3.15.0rc2</a>. Другой свежий пример переписанного интерпретатора с подробным разбором каждой оптимизации: <a href="https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza">Wasmi 2.0</a>, где тоже сменили промежуточное представление и получили 2,2 раза.</p><p>Источники: <a href="https://pointersgonewild.com/2026-09-02-plushs-new-register-based-interpreter/">Pointers Gone Wild: Plush's New Register-Based Interpreter</a>, <a href="https://github.com/maximecb/plush">Репозиторий Plush</a>, <a href="https://pointersgonewild.com/2026-08-25-replacing-a-rust-enum-with-a-64-bit-word/">Предыдущая статья серии: Replacing a Rust enum with a 64-bit word</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Rust std и musl неверно округляют fmaf на редких числах</title>
      <link>https://tproger.ru/news/rust-std-i-musl-neverno-okruglyayut-fmaf-na-redkih-chislah</link>
      <comments>https://tproger.ru/news/rust-std-i-musl-neverno-okruglyayut-fmaf-na-redkih-chislah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/rust-std-i-musl-neverno-okruglyayut-fmaf-na-redkih-chislah</guid>
      <description><![CDATA[<p>Одинаковая ошибка округления fmaf в f32::mul_add, std::simd и musl: результат отличается на один младший бит. Затронуты x86 без AVX2 и 32-битный ARM, ARM64 нет.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/rust-std-i-musl-neverno-okruglyayut-fmaf-na-redkih-chislah">Rust std и musl неверно округляют fmaf на редких числах</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 09:20:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик под ником Shnatsel 2 сентября <a href="https://shnatsel.github.io/implementing-fma-finding-bugs-in-std/">описал</a>, как, реализуя fused multiply-add для библиотеки fearless_simd, нашёл ошибку округления на субнормальных числах, а затем ту же ошибку обнаружил в f32::mul_add стандартной библиотеки Rust, в std::simd и в функции fmaf() из libc musl. Результат отличается от правильного на один младший бит; в исходном контрпримере это около 15 частей на миллион.</p><p>Ошибка проявляется только там, где FMA эмулируется программно: на x86 это дешёвые или старые Intel без AVX2 и процессоры Hygon без аппаратного FMA, а также 32-битный ARM и старые встраиваемые тулчейны. 64-битный ARM, по словам автора, не затронут. На практике это касается детерминированных симуляций и численных библиотек, где одинаковый код обязан давать одинаковые биты на разных машинах: сетевые игры с lockstep, физические движки, воспроизводимые вычисления. Автор честно пишет, что не знает, насколько ошибка важна в реальных программах.</p><ul><li>Ошибка: неправильное округление fmaf на субнормальных входах, отличие на один младший бит.</li><li>Затронуты f32::mul_add и std::simd в Rust, fmaf() в musl; проверка одна и та же: a = 0x97000800, b = 0x1cfff001, c = 0x00010002, верный ответ 0x00010001, ошибочный 0x00010002.</li><li>Исправлены fearless_simd и ABI f128 в компиляторе Rust на 32-битном ARM; патч в стандартную библиотеку Rust на момент публикации ждал ревью, исправления musl не влиты.</li><li>Аппаратный FMA (x86 с AVX2/FMA3, 64-битный ARM) не затронут: ошибка живёт в программной эмуляции.</li><li>Контрпример к первой версии исправления в Rust нашла языковая модель, которую автор попросил искать ошибки.</li></ul><h2>Что такое FMA и откуда берётся лишний бит</h2><p>Fused multiply-add вычисляет a*b+c с одним округлением в конце вместо двух: после умножения и после сложения. Так требует IEEE 754, и именно на это рассчитывают численные алгоритмы: одно округление даёт предсказуемую ошибку. Когда у процессора нет аппаратной инструкции, библиотека эмулирует FMA через операции с расширенной точностью и ручную коррекцию округления. Ошибка, которую нашёл автор, живёт в этой коррекции на субнормальных числах, то есть очень маленьких значениях, у которых часть мантиссы уже ушла в ноль. В таких случаях программная реализация округляла не в ту сторону.</p><p>Автор переносил формально верифицированный алгоритм и гонял его в CI на эмуляторах SIMD, добавив тесты на миллион субнормальных значений и ещё миллион случаев, требующих коррекции округления. Отдельно он попросил языковую модель искать контрпримеры, и она нашла случай, ломающий первую версию исправления для стандартной библиотеки Rust: там ошибка приводила ещё и к неправильной установке флагов исключений плавающей точки.</p><h2>Как проверить свою платформу</h2><p>Достаточно трёх чисел. Ниже проверка на C для fmaf из системной libc; в Rust то же самое делается через f32::from_bits и mul_add:</p><p>Если вывод 00010002, ваша libc или тулчейн эмулируют FMA с ошибкой. На машине с аппаратным FMA (любой современный x86 с AVX2, 64-битный ARM) результат будет верным независимо от библиотеки, поэтому проверять имеет смысл именно сборки под старое или встраиваемое железо и контейнеры на musl (Alpine) на таких хостах.</p><h2>Состояние исправлений</h2><ul><li>fearless_simd: исправлено, можно использовать как реализацию FMA без этой ошибки.</li><li>Rust, тип f128 на 32-битном ARM: ошибка ABI исправлена в компиляторе (тип доступен только в nightly).</li><li>Стандартная библиотека Rust (f32::mul_add, std::simd): патч на момент публикации ожидал ревью; номер версии с исправлением не назван.</li><li>musl: предложены минимальное исправление и полная переработка fmaf(), ни то ни другое не влито. Автор отмечает, что код FreeBSD, откуда растёт реализация, мог копироваться и в другие тулчейны.</li></ul><p>Кому это ничего не меняет: сервисам на современных x86 и ARM64, где FMA аппаратный, и коду, не зависящему от битовой точности. Кому стоит проверить: авторам физических движков и симуляций с детерминизмом между машинами, разработчикам под 32-битный ARM и тем, кто собирает статические бинарники под musl для старых серверов. Про то, как выбор libc влияет на скорость тех же бинарников, мы <a href="https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na">писали</a> на примере Rust Coreutils; смежная тема из этой же недели: <a href="https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri">переписывание линкера mold на Rust</a>. Что мы проверим дальше: когда патч попадёт в стабильный Rust и появится ли исправление в релизе musl.</p><p>Источники: <a href="https://shnatsel.github.io/implementing-fma-finding-bugs-in-std/">Shnatsel: Implementing FMA and finding bugs in C and Rust standard libraries</a>, <a href="https://lobste.rs/s/qq9jpo/implementing_fma_finding_bugs_c_rust">Обсуждение на Lobsters</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Python 3.15.0rc2: ABI заморожен, финальный релиз 1 октября</title>
      <link>https://tproger.ru/news/vywel-python-3-15-0rc2-abi-zamorozhen-finalnyj-reliz-1-oktyabrya</link>
      <comments>https://tproger.ru/news/vywel-python-3-15-0rc2-abi-zamorozhen-finalnyj-reliz-1-oktyabrya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-python-3-15-0rc2-abi-zamorozhen-finalnyj-reliz-1-oktyabrya</guid>
      <description><![CDATA[<p>Python 3.15.0rc2 — последний запланированный кандидат перед релизом 1 октября. ABI больше не меняется, значит можно собирать wheels. Разбираем JIT, tail-calling interpreter, free-threading, lazy imports, frozendict и что сделать мейнтейнеру пакета сейчас.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-python-3-15-0rc2-abi-zamorozhen-finalnyj-reliz-1-oktyabrya">Вышел Python 3.15.0rc2: ABI заморожен, финальный релиз 1 октября</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 01 Sep 2026 17:26:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>1 сентября <a href="https://www.python.org/downloads/release/python-3150rc2/">вышел</a> <b>Python 3.15.0rc2</b>, второй и последний запланированный релиз-кандидат. Для большинства разработчиков это сигнал не «попробовать новинки», а «пора действовать»: с этого момента бинарный интерфейс (ABI) ветки 3.15 больше не меняется, и авторы пакетов с C-расширениями могут собирать wheels, которые будут работать с финальной версией 1 октября.</p><p>Между rc1 и rc2 вошло около 144 исправлений от 76 участников: ошибки, сборка, документация. До финала принимаются только проверенные исправления багов, новых функций не будет. Релиз-менеджер Хьюго ван Кеменаде называет rc2 финальным кандидатом и просит мейнтейнеров тестировать пакеты именно сейчас; ставить rc2 в прод команда не рекомендует.</p><ul><li>3.15.0rc2 — последний запланированный кандидат; ABI заморожен, финальный релиз назначен на 1 октября 2026 года.</li><li>JIT: в среднем на 8–9% быстрее обычного интерпретатора на x86-64 Linux и на 12–13% быстрее tail-calling interpreter на macOS с Apple Silicon; разброс по тестам от замедления на 15% до ускорения больше чем вдвое; цифры предварительные.</li><li>Официальные сборки для Windows x64 используют tail-calling interpreter, сборки для macOS по умолчанию поддерживают free-threading.</li><li>Новое в языке: ленивые импорты через ключевое слово lazy (PEP 810), встроенные типы frozendict (PEP 814) и sentinel (PEP 661).</li><li>Мейнтейнерам: собирайте wheels под 3.15 и гоняйте тесты на rc2; после 1 октября исправление попадёт только в 3.15.1.</li></ul><h2>Что означает «ABI заморожен»</h2><p>ABI — набор правил, по которым скомпилированный код (numpy, pydantic-core, любой пакет с C или Rust внутри) обращается к интерпретатору: размеры структур, порядок полей, сигнатуры функций. Пока ABI меняется, wheel, собранный под бету, может упасть на финальной версии. Теперь команда CPython обещает: «There will be no ABI changes from this point forward in the 3.15 series» (перевод редакции: «С этого момента в серии 3.15 изменений ABI не будет»). Значит, wheel, собранный сегодня под rc2, останется валидным для 3.15.0 и всех 3.15.x.</p><p>На практике это точка, после которой авторы популярных библиотек выкладывают на PyPI сборки для новой версии. Если ваш проект зависит от пакета, который до сих пор не собран под 3.15, самое время открыть issue или прислать PR: у мейнтейнеров есть месяц.</p><h2>Сколько на самом деле даёт JIT</h2><p><a href="https://docs.python.org/3.15/whatsnew/3.15.html">Документация «What's New»</a> приводит две цифры, и их важно не смешивать. На x86-64 Linux JIT даёт 8–9% ускорения в среднем геометрическом относительно обычного интерпретатора. На macOS с процессорами Apple JIT сравнивают с более быстрым tail-calling interpreter, и там выигрыш 12–13%. Разброс по отдельным тестам огромный: от замедления примерно на 15% до ускорения больше чем вдвое. Документация подчёркивает, что цифры предварительные и до финала могут измениться. Так что «Python стал на 10% быстрее» — неверное обобщение: на вашем коде может быть и минус.</p><p>Tail-calling interpreter — другой способ реализовать цикл исполнения байткода, где каждая инструкция вызывает следующую хвостовым вызовом вместо большого switch. В 3.15 именно он идёт в официальных 64-битных сборках для Windows. Официальные сборки для macOS по умолчанию получают поддержку free-threading, то есть режим без GIL остаётся экспериментальным, но доступным без пересборки.</p><h2>Три новинки языка, которые вы заметите</h2><p><b>Ленивые импорты</b> (PEP 810): ключевое слово lazy перед import откладывает загрузку модуля до первого обращения. Это ответ на старую проблему медленного старта CLI-утилит, которые тянут тяжёлые зависимости «на всякий случай».</p><p><b>frozendict</b> (PEP 814) — неизменяемый словарь, встроенный в язык: если все его ключи и значения хешируемы, его можно использовать как ключ другого словаря, и его безопасно отдавать наружу как константу. <b>sentinel</b> (PEP 661) закрывает старый обходной приём с _MISSING = object() для «значение не передано»: у таких маркеров появляется нормальный repr и корректное поведение при pickle.</p><h2>Что сделать до 1 октября</h2><ul><li>Поставьте rc2 рядом с рабочей версией: официальные установщики и исходники на python.org; в uv или pyenv сначала проверьте, что версия появилась в их списках (uv python list), и прогоните тесты проекта.</li><li>Если у вас пакет с расширениями: соберите wheels под 3.15 и выложите на PyPI; ABI больше не изменится.</li><li>Замерьте свой код с JIT и без: флаги сборки и переменные окружения описаны в документации; средним цифрам не верьте.</li><li>Проверьте зависимости на совместимость с ленивыми импортами: код, который полагается на побочные эффекты при импорте, с lazy сломается.</li><li>Нашли регрессию — сообщайте в трекер CPython сейчас: после релиза исправление уйдёт только в 3.15.1.</li><li>Если пользуетесь корпоративным зеркалом PyPI, убедитесь, что оно синхронизирует wheels с тегом cp315: первые сборки под 3.15 появятся в ближайшие недели.</li></ul><h2>Контекст</h2><p>Разработка 3.15 началась 7 мая 2025 года, первая бета вышла 7 мая 2026-го, rc1 — 4 августа. После финального релиза ветка получит около двух лет исправлений ошибок и затем ещё примерно три года обновлений безопасности, по обычному графику CPython.</p><p>Источники: <a href="https://www.python.org/downloads/release/python-3150rc2/">Python 3.15.0rc2 (python.org)</a>, <a href="https://docs.python.org/3.15/whatsnew/3.15.html">What's New in Python 3.15</a></p><p>Изображение на обложке: Python Software Foundation</p>]]></content:encoded>
    </item>
    <item>
      <title>Линкер mold переписывают на Rust: версия 3.0 научится собирать ядра</title>
      <link>https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri</link>
      <comments>https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri</guid>
      <description><![CDATA[<p>Руи Уэяма объявил, что линкер mold переписывают на Rust. В версии 3.0 появится поддержка линкер-скриптов, чтобы mold мог заменить GNU ld при сборке ядер и встраиваемых программ. Свежие бенчмарки против lld и wild, как включить mold сегодня и кому ждать 3.0.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri">Линкер mold переписывают на Rust: версия 3.0 научится собирать ядра</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 01 Sep 2026 17:25:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Руи Уэяма, автор линкера <b>mold</b> и один из создателей LLVM lld, 1 сентября <a href="https://x.com/rui314/status/2094677980857680052">сообщил</a>, что mold переписывают на Rust. Будущая версия получит номер 3.0 и главную недостающую функцию: поддержку линкер-скриптов, без которой mold нельзя было использовать для сборки ядер операционных систем и встраиваемых программ. Сроков выхода автор не назвал.</p><p>Линкер склеивает скомпилированные объектные файлы в исполняемый файл, и на больших проектах это минуты ожидания при каждой пересборке. mold появился в 2021 году именно как ответ на это: по свежему бенчмарку автора он в 4,9 раза быстрее lld по медиане. Но проекты, которые собираются через сложные линкер-скрипты GNU ld, вроде ядра Linux, до сих пор были для него закрыты; 3.0 должна это изменить.</p><ul><li>mold переписывают на Rust; новая версия выйдет как mold 3.0, дата не названа.</li><li>Цель: поддержка линкер-скриптов, чтобы mold собирал всё, что умеет GNU ld, включая ядра и прошивки.</li><li>Текущий mold написан на C++20; по бенчмарку августа 2026 года он быстрее lld в 4,9 раза, а wild в 1,9 раза по медиане.</li><li>Debug-сборка Chromium 145 на Threadripper 7980X: lld 16,64 с, wild 3,98 с, mold 1,65 с; TensorFlow 2.21: lld 50,73 с, mold 3,15 с.</li><li>Текущий mold продолжает работать как замена ld и lld; включается флагом -fuse-ld=mold или через .cargo/config.toml.</li></ul><h2>Зачем линкеру скрипты</h2><p>Линкер-скрипт описывает, как раскладывать секции кода и данных по адресам памяти. Обычному приложению это не нужно: там всё решает стандартная раскладка. Ядру, загрузчику или прошивке микроконтроллера критично, чтобы таблица прерываний лежала по конкретному адресу, а код инициализации попал в нужную область флеш-памяти. Всё это описывается на языке скриптов GNU ld, и до сих пор mold понимал лишь их малую часть: в собственной документации проект называет этот язык переусложнённым и ещё недавно прямо писал, что расширять поддержку не планирует.</p><p>Уэяма пишет, что цель новой версии — совместимость со всем, что умеет собирать GNU ld. Именно это открывает дорогу к тому, чтобы дистрибутивы Linux сделали mold линкером по умолчанию: пока хоть один важный пакет не собирается, менять умолчание никто не будет. Конкретных дистрибутивов с такими планами в README пока не названо.</p><blockquote>We are rewriting the mold linker in Rust. This will be mold 3.0.</blockquote><h2>Насколько mold быстрее сегодня</h2><p>Автор обновил бенчмарки в <a href="https://github.com/rui314/mold">README репозитория</a> в августе: девять крупных программ, медиана трёх запусков после прогрева, два стенда — Threadripper 7980X с 64 ядрами и Apple M1 Ultra, у которого использовались 16 производительных ядер. Сравнивались lld, wild (ещё один линкер на Rust) и mold. Результаты на Threadripper выглядят так.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-02/cd378d06-61ff-4b48-ba6c-22b4678f3f27.webp" alt="Столбчатая диаграмма времени линковки debug-сборок Chromium 145 и TensorFlow 2.21 линкерами lld, wild и mold" /><figcaption>Время линковки debug-сборок на Threadripper 7980X, секунды. График: Tproger по данным README mold, бенчмарк августа 2026 года.</figcaption></figure><p>На Chromium 145 lld тратит 16,64 секунды, wild 3,98, mold 1,65. На TensorFlow 2.21 разрыв ещё больше: 50,73 секунды у lld против 3,15 у mold. На Apple M1 Ultra картина ровнее: debug-сборка Clang 21 линкуется за 2,96 секунды у mold, 4,40 у lld и 2,78 у wild, то есть в этом тесте конкурент на Rust слегка впереди, хотя на большинстве остальных задач M1-стенда mold быстрее. Артефакты бенчмарка опубликованы на Zenodo, их можно повторить.</p><h2>Почему Rust, если и так быстро</h2><p>В сообщении Уэямы причин не названо. Из README видно другое: текущий mold требует GCC 10.2 или Clang 16 и написан на C++20, а конкурент wild с самого начала на Rust и на части задач уже догоняет. Переписывание с добавлением линкер-скриптов означает во многом новую кодовую базу, и выбор языка для неё делается один раз. Всё остальное — предположения, и мы их не делаем.</p><h2>Как включить mold сегодня</h2><p>Для C и C++ с GCC или Clang достаточно флага компоновки -fuse-ld=mold. Для Rust README предлагает настройку в .cargo/config.toml:</p><ul><li>Проекты с собственными линкер-скриптами (ядра, прошивки, загрузчики) пока остаются на GNU ld; ждите mold 3.0.</li><li>Если пользуетесь wild, сравните на своём проекте: на M1 Ultra он выигрывает лишь в части тестов, по общей медиане бенчмарка mold быстрее в 1,9 раза.</li><li>mold распространяется под лицензией MIT через GitHub и пакеты дистрибутивов; наличие пакета в репозиториях Astra Linux и РЕД ОС проверяйте отдельно, в README они не перечислены.</li></ul><h2>Что дальше</h2><p>mold используется в проде с 2021 года, и текущая C++-версия никуда не денется до выхода 3.0. Следить стоит за двумя сигналами: появится ли в репозитории ветка на Rust с первыми тестами линкер-скриптов и объявит ли какой-нибудь дистрибутив о планах сделать mold линкером по умолчанию. Второе и будет настоящей новостью.</p><p>Источники: <a href="https://x.com/rui314/status/2094677980857680052">Сообщение Руи Уэямы в X</a>, <a href="https://github.com/rui314/mold">Репозиторий mold с бенчмарками</a></p><p>Изображение на обложке: Tproger по данным README mold</p>]]></content:encoded>
    </item>
    <item>
      <title>Async Rust: как уменьшить бинарник, пока rustc не оптимизирован</title>
      <link>https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan</link>
      <comments>https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan</guid>
      <description><![CDATA[<p>Разбираем, почему async Rust генерирует лишние state machine, как это бьёт по embedded и WASM, и что можно сделать в коде прямо сейчас.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan">Async Rust: как уменьшить бинарник, пока rustc не оптимизирован</a>»</p>]]></description>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 29 Jun 2026 10:21:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Асинхронный Rust обещал нам zero-cost abstraction: пишете почти как на обычном синхронном языке, а runtime сам разбирается с конкурентностью. На сервере с десятками гигабайт RAM это обещание обычно сбывается. Но стоит перейти к embedded-прошивке на 256 КБ flash или к WebAssembly-модулю, который гонится за каждым килобайтом, — и картина меняется. Функция с двумя await-точками превращается в state machine из 360 строк MIR, тогда как синхронный аналог укладывается в 23. Почему так происходит и что с этим делать уже сегодня?</p><p>Тема получила новый импульс после серии публикаций Диона Доктера (Dion Dokter) из голландской компании Tweede golf. Во второй части он заглядывает внутрь rustc и утверждает: async Rust так и не вышел из состояния MVP. Я не буду дословно переводить его рассуждения, а переосмыслю их с упором на практику: как понять, платите ли вы за async-удобство лишними байтами, и как снизить налог, пока компилятор не научился делать это сам.</p><ul><li>Асинхронный Rust компилируется в state machine: на каждую await-точку приходится отдельное состояние плюс служебные Unresumed, Returned и Panicked.</li><li>Простая функция с двумя await-точками даёт 360 строк MIR против 23 у синхронного кода. Часть излишков LLVM убирает, но не все, особенно при оптимизации по размеру.</li><li>Компилятор не схлопывает идентичные состояния, не инлайнит futures через await, генерирует state machine даже для async-блоков без await и оставляет panic-путь в состоянии Returned.</li><li>В release-сборках замена panic в Returned на возврат Pending может сократить прошивку на 2–5%. Убирание state machine у пустых async-блоков — ещё около 0,2%.</li><li>Пока rustc не исправлен, можно вручную: возвращать impl Future из «прозрачных» функций, использовать std::future::ready, схлопывать await-точки через match и передавать большие данные по ссылке.</li></ul><h2>Почему async-функция — это всегда state machine</h2><p>Когда вы пишете async fn, компилятор не просто оборачивает тело в callback. Он строит конечный автомат: enum, где каждый вариант — состояние между await-точками. Это называется coroutine desugaring и происходит на уровне MIR (Mid-level IR) — до того, как код попадает в LLVM.</p><p>Рассмотрим минимальный пример. Есть две функции, каждая из которых просто возвращает число, и третья складывает результаты:</p><p>У bar две await-точки, поэтому минимум два пользовательских состояния. Но если сдампить MIR после прохода coroutine_resume, картина шире:</p><p>Три служебных состояния добавляются всегда. Они нужны, чтобы соблюсти контракт Future::poll: опрос завершённой future не должен приводить к неопределённому поведению. Поэтому после первого Ready future переходит в Returned, а повторный poll паникует. Аналогично Panicked блокирует future после пойманного panic — похоже на poisoning мьютекса.</p><p>Логика корректная, но цена высокая: bar порождает 360 строк MIR, а эквивалентный синхронный код — 23. В 15 с лишним раз больше. LLVM часть этого выбросит, но на opt-level = "z" или в толстых async-графах вызовов он быстро сдаётся.</p><h2>Четыре места, где компилятор работает вхолостую</h2><h3>1. Panic в состоянии Returned</h3><p>Контракт future требует только отсутствия UB. Паниковать при повторном poll — не обязательно. Можно просто вернуть Pending снова: ничего опасного не произойдёт, а ветка panic — это лишний побочный эффект, который плохо оптимизируется.</p><p>Дион сделал экспериментальный патч rustc: в release-режиме Returned больше не паникует. На embedded-прошивках это дало <b>2–5% экономии бинарного размера</b>. В debug-сборках панику можно оставить, чтобы быстро ловить ошибочный повторный poll, — по аналогии с overflow-checks.</p><h3>2. State machine без await</h3><p>Взгляните на функцию без единой await-точки:</p><p>Идеальная реализация — всегда возвращать Poll::Ready(5) безо всякого enum. А rustc генерирует полноценный CoroutineLayout с тремя служебными состояниями и switch по дискриминанту. Такие функции часто появляются в трейтах, где один интерфейс должен быть async, но конкретная реализация ничего не ждёт. Патч, убирающий state machine у async-блоков без await, даёт ещё <b>0,2%</b> размера — мало, но правка тривиальная.</p><h3>3. Futures не инлайнятся через await</h3><p>Классический шаблон: адаптер просто пересылает вызов вниз.</p><p>Сейчас bar получает собственный state machine, который вызывает state machine foo. Вручную мы бы написали fn bar(blah) -&gt; impl Future { foo(blah) } и избавились бы от лишнего enum. Аналогично с преамбулой и постамбулой: их можно перенести на FutureExt::map из крейта futures.</p><h3>4. Одинаковые состояния не схлопываются</h3><p>Если в async-функции несколько веток match ведут к одинаковому await, компилятор создаёт отдельное состояние на каждую ветку:</p><p>Здесь send_response вызывается с разными аргументами, но структура состояний дублируется. Если вынести выбор аргумента за await, получится одно состояние вместо двух:</p><p>В одном примере из статьи MIR сокращается с 456 до 302 строк, а ассемблер — примерно на 11%. Оптимизации stack, поэтому выигрыш в реальном коде может быть заметнее.</p><h2>Что делать сегодня, не дожидаясь rustc</h2><p>Всё перечисленное выше — это работа для команды компилятора. Но релиз с этими патчами может занять месяцы, а то и годы. Пока он не вышел, можно снизить async-bloat в своём коде.</p><p><b>Главный принцип:</b> каждый лишний async fn — это лишний state machine. Если функция не содержит await, не делайте её async.</p><h3>Заменяйте async-пустышки на impl Future</h3><p>Типичный случай — трейт, где одна реализация реально ждёт ввода-вывода, а другая просто возвращает значение.</p><p>Вместо полноценного state machine получается готовая future, которая сразу возвращает Ready. Это особенно полезно в embedded-HAL, где трейты часто async, но конкретный драйвер может делать только прямой доступ к регистрам.</p><h3>Прозрачные обёртки без await</h3><p>Если функция только пересылает await вниз, уберите await:</p><h3>Схлопывайте await-точки</h3><p>Если несколько веток match заканчиваются одним и тем же await, вынесите выбор аргументов наружу. Это уменьшает число состояний state machine и облегчает жизнь LLVM.</p><h3>Передавайте большие данные по ссылке</h3><p>Async-функция захватывает в state machine всё, что живёт через await. Если передать массив по значению, он окажется внутри future целиком:</p><p>Разница в 52 раза по размеру future — и это без учёта memcpy, который компилятор вынужден вставлять при перемещении больших значений.</p><h2>Перспективы: Project Goal и финансирование</h2><p>Дион оформил эти идеи как <a href="https://rust-lang.github.io/rust-project-goals/2026/async-statemachine-optimisation.html" rel="noopener">Rust Project Goal</a> — формальный механизм, через который команды заявляют цели на полугодие. По его оценке, работа требует порядка <b>€30 000</b> финансирования. Для компиляторного проекта это скромная сумма: речь идёт о 2–5% размера прошивки практически в любом async-проекте.</p><p>Есть и другой подход к той же проблеме: не убирать state machine на входе, а научить LLVM лучше их оптимизировать на выходе. Дион считает, что оба направления дополняют друг друга. Чем проще state machine попадает в LLVM, тем эффективнее её можно проинлайнить и упростить на поздних проходах.</p><h2>Выводы</h2><blockquote>Async Rust never left the MVP state. The compiler generates state machines with a lot of unnecessary baggage. With a few targeted optimizations in rustc we can get smaller binaries and better performance for everyone.</blockquote><p>Утверждение «async Rust так и не вышел из MVP» звучит резко, но поясняет, почему наши «zero-cost» абстракции иногда всё-таки стоят дорого. Компилятор делает корректный, но не оптимальный код: лишние panic-ветки, неинлайненные futures, дублирующиеся состояния и state machine там, где они не нужны.</p><p>Для embedded и WASM это не абстрактная проблема, а конкретные килобайты прошивки. Пока rustc учится, разработчик может снизить налог вручную: убирать async у функций без await, возвращать impl Future из прозрачных обёрток, схлопывать await-точки и не передавать большие структуры по значению.</p><p>Если ваш проект на Rust бьётся о лимит flash, имеет смысл посмотреть на async-граф вызовов свежим взглядом. Часто проще убрать одну лишнюю async-обёртку, чем месяцами ждать патч в компиляторе.</p><p><b>Источники:</b><br />— <a href="https://tweedegolf.nl/en/blog/237/async-rust-never-left-the-mvp-state" rel="noopener">Dion Dokter, «Async Rust never left the MVP state»</a>;<br />— <a href="https://tweedegolf.nl/en/blog/235/debloat-your-async-rust" rel="noopener">Dion Dokter, «Debloat your async Rust»</a>;<br />— <a href="https://rust-lang.github.io/rust-project-goals/2026/async-statemachine-optimisation.html" rel="noopener">Rust Project Goal: Async state machine optimisation</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как TypeScript выводит типы переменных: разбор алгоритма</title>
      <link>https://tproger.ru/articles/kak-typescript-vyvodit-tipy-peremennyh-razbor-algoritma</link>
      <comments>https://tproger.ru/articles/kak-typescript-vyvodit-tipy-peremennyh-razbor-algoritma?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-typescript-vyvodit-tipy-peremennyh-razbor-algoritma</guid>
      <description><![CDATA[<p>Разбираем двухфазный алгоритм вывода типовых переменных в TypeScript: сбор кандидатов, разрешение, вариантность, пересечения и NoInfer. Узнайте, почему компилятор ведёт себя именно так.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-typescript-vyvodit-tipy-peremennyh-razbor-algoritma">Как TypeScript выводит типы переменных: разбор алгоритма</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 08 Jun 2026 05:15:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы когда-нибудь ловили себя на мысли, что TypeScript ведёт себя странно с дженериками, знайте: вы не одиноки. TypeScript выводит типовые переменные в две фазы: сначала собирает кандидатов из аргументов и контекста, затем сворачивает список в единственный тип. Иногда компилятор выводит unknown там, где ожидаешь конкретный тип, а иногда — наоборот, слишком поспешно захватывает весь объект вместо его «остаточной» части. В этой статье разберём, как внутри устроен алгоритм вывода типовых переменных — и почему он ведёт себя именно так.</p><p>Это не дословный перевод, а авторский разбор на основе исследования Nicolas Laurent (norswap), дополненный практическими примерами для enterprise-разработки на TypeScript.</p><h2>Что такое вывод типовых переменных</h2><p>В TypeScript, когда вы вызываете функцию с дженериком function foo&lt;T&gt;(x: T), компилятор должен понять, чему равен T. Этот процесс называется <b>type variable inference</b> — выводом типовой переменной. Он происходит в две фазы: сначала TypeScript собирает «кандидатов» из типов аргументов и контекста возврата, а затем «сворачивает» список кандидатов в единственный тип.</p><p>Звучит просто, но на практике алгоритм полон тонкостей: covariant и contravariant позиции, приоритеты кандидатов, странное поведение пересечений и неочевидные ограничения. Разберём всё по порядку.</p><p>TypeScript выводит типовые переменные в две фазы: сбор кандидатов из аргументов и контекста, затем свёртка списка в единственный тип.</p><p>Кандидаты делятся на ковариантные (выходные позиции) и контравариантные (входные позиции); контравариантный результат обычно побеждает.</p><p>При свёртке TypeScript ищет общий супертип в списке кандидатов, но никогда не выбирает тип, которого нет в списке.</p><p>Пересечения типов ведут себя непредсказуемо: иногда TypeScript «снимает» литеральный тип, иногда захватывает весь объект.</p><p>В generic-контексте условные типы (extends ? :) не вычисляются, что ломает инференс через Exclude и подобные утилиты.</p><p>NoInfer&lt;T&gt; (с TypeScript 5.4+) позволяет блокировать вывод типа из конкретной позиции — полезно для API со значениями по умолчанию.</p><h2>Фаза 1: сбор кандидатов</h2><p>Когда TypeScript видит вызов функции с дженериком, он сопоставляет типы аргументов (source types) с типами параметров функции (target types). Каждый раз, когда «прогулка» по типам доходит до «голого» type parameter в target, соответствующий source type записывается как кандидат.</p><h3>Ковариантные и контравариантные кандидаты</h3><p>Кандидаты собираются в два списка. Если type parameter находится в позиции аргумента функции или возвращаемого значения — это <b>ковариантный</b> (output position) кандидат. Если type parameter находится в позиции параметра callback-функции — это <b>контравариантный</b> (input position) кандидат.</p><h3>Условные типы и infer</h3><p>Когда TypeScript встречает условный тип, кандидаты собираются только из той ветки, которая теоретически может сработать. Но важно: <b>само условие не добавляет кандидатов</b>. Запись T extends Foo НЕ добавляет Foo как кандидат для T.</p><p>Это классическая ловушка: кандидаты собираются из одной ветки, а типовая проверка — из другой. TypeScript <b>не вычисляет</b> условные типы на этапе инференса.</p><h3>Распределение по union</h3><p>Если source type — union, а target — не «голый» type parameter, TypeScript проходит по каждой ветке union отдельно и собирает кандидатов из всех веток в один список.</p><h3>Что НЕ учитывается при сборе</h3><ul><li>Условие условного типа (только ветки).</li><li>Constraints (&lt;T extends Foo&gt;) — они проверяются позже, на этапе разрешения.</li><li>Дефолтные значения type parameter (&lt;T = unknown&gt;) — используются только если список кандидатов пуст.</li><li>Супертипы source type.</li></ul><h2>Фаза 2: разрешение кандидатов</h2><p>После сбора TypeScript сворачивает каждый список в единственный тип. Алгоритм зависит от вариантности и содержимого списка.</p><h3>Ковариантные кандидаты</h3><ol><li>Если все кандидаты — литералы одного базового типа, они объединяются в union.</li><li>Иначе ищется кандидат, который является строгим супертипом всех остальных. Если найден — он выбирается.</li><li>Если нет — выполняется left-reduce: начинаем с первого кандидата, идём по списку, заменяя текущий на супертип, если встречаем его.</li></ol><p><b>Важно:</b><br />Если в списке кандидатов нет общего супертипа, TypeScript выбирает <b>первый</b> элемент. Это частая причина неожиданных ошибок при передаче разнородных аргументов одного дженерика.</p><h3>Контравариантные кандидаты</h3><p>Для контравариантных кандидатов логика зеркальная: ищется общий <b>подтип</b>, иначе — left-reduce с подтипами. Если оба списка (ковариантный и контравариантный) непусты, контравариантный результат обычно побеждает — за исключением случаев, когда ковариантный результат является подтипом контравариантного.</p><h3>Приоритеты кандидатов</h3><p>Каждый кандидат помечается приоритетом. Кандидат с более высоким приоритетом <b>стирает</b> все кандидаты с более низким приоритетом. Основные приоритеты: None (0), NakedTypeVariable (1), MappedTypeConstraint (32), ReturnType (128), LiteralKeyof (256).</p><p>Приоритеты MappedTypeConstraint, ReturnType и LiteralKeyof — «комбинационные»: при них результатом становится union или intersection всех кандидатов, а не единственный тип.</p><h2>Пересечения: загадочное поведение</h2><p>Одно из самых неинтуитивных мест — вывод через пересечения. Рассмотрим несколько примеров.</p><p>Почему так? Это эвристики компилятора, направленные на максимизацию полезности захваченного типа. В первом случае полезнее получить весь объект, во втором — сохранить литеральную точность строки. Порядок операндов пересечения не влияет на результат.</p><h2>Вывод в generic-контексте</h2><p>Когда инференс происходит внутри другой generic-функции, условные типы <b>не могут быть вычислены</b>, потому что type variables ещё не связаны. Это ломает паттерны вроде Exclude, если вызывать их через generic-обёртку.</p><p>В типовых enterprise-проектах, где активно используются типовые утилиты для валидации API (например, в проектах на NestJS или с Zod), это ограничение часто приводит к необходимости явно прописывать generic-аргументы или реструктурировать типы.</p><h2>NoInfer: как управлять выводом</h2><p>Начиная с TypeScript 5.4, в языке есть встроенный вспомогательный тип NoInfer&lt;T&gt;. Он блокирует сбор кандидатов для T из той позиции, где используется NoInfer&lt;T&gt;.</p><p>Это особенно полезно в библиотечном коде, где нужно разделить «источник истины» для вывода типа и позиции, которые должны ему подчиняться.</p><h2>FAQ</h2><h2>Выводы</h2><p>Теперь вы знаете, как TypeScript выводит типы переменных: через сбор кандидатов из аргументов, свёртку списка с учётом вариантности и приоритетов, а затем проверку результата на соответствие constraints. Алгоритм вывода типовых переменных — это тщательно продуманная, но не лишённая сюрпризов система. Две фазы (сбор и разрешение), вариантность, приоритеты и эвристики для пересечений создают поверхность, которую сложно угадать интуитивно, но которую можно понять, зная правила.</p><p>Ключевые практические выводы для разработчиков:</p><ol><li>Если функция принимает несколько аргументов одного дженерика — убедитесь, что они совместимы, иначе TypeScript выберет первый кандидат и отвергнет остальные.</li><li>Не полагайтесь на супертипы для инференса: они не попадают в список кандидатов.</li><li>В generic-контексте условные типы «замораживаются» — проектируйте API с этим ограничением.</li><li>Используйте NoInfer&lt;T&gt; в библиотечном коде для точного контроля над источниками вывода типов.</li><li>При странном поведении с пересечениями — перепишите типы явно или добавьте constraint.</li></ol><blockquote>Понимание алгоритма вывода типовых переменных позволяет писать более надёжные типовые абстракции и тратить меньше времени на отладку сложных generic-конструкций.</blockquote><p><b>Источники:</b></p><ul><li><a href="https://norswap.com/typescript-type-variable-inference">How TypeScript infers type variables — Nicolas Laurent (norswap)</a></li><li><a href="https://norswap.com/typescript-distribute">How TypeScript distributes unions — Nicolas Laurent (norswap)</a></li><li><a href="https://www.typescriptlang.org/docs/handbook/2/generics.html">TypeScript Handbook: Generics</a></li></ul><p>Если у вас есть примеры неожиданного поведения TypeScript с дженериками — делитесь в комментариях. Соберём коллекцию «типовых загадок» вместе.</p>]]></content:encoded>
    </item>
    <item>
      <title>Интуиция за Pratt parsing: как работают приоритеты операторов</title>
      <link>https://tproger.ru/translations/intuiciya-za-pratt-parsing--kak-rabotayut-prioritety-operatorov</link>
      <comments>https://tproger.ru/translations/intuiciya-za-pratt-parsing--kak-rabotayut-prioritety-operatorov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/intuiciya-za-pratt-parsing--kak-rabotayut-prioritety-operatorov</guid>
      <description><![CDATA[<p>Понятное объяснение алгоритма Pratt parsing: как деревья разбора наклоняются по приоритету операторов, что такое binding power (LBP/RBP) и как написать корректный парсер за 10 строк на Python.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/intuiciya-za-pratt-parsing--kak-rabotayut-prioritety-operatorov">Интуиция за Pratt parsing: как работают приоритеты операторов</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 30 Mar 2026 15:10:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Перевод статьи <a href="https://louis.co.nz/2026/03/26/pratt-parsing.html">Intuiting Pratt parsing</a>. Автор: Louis.</p><p>Вы знаете, что a + b * c + d вычисляется как a + (b * c) + d. Но как объяснить это машине? Как закодировать правила приоритета операторов так точно, чтобы парсер сам правильно строил дерево разбора?</p><p>Pratt parsing — элегантный алгоритм, придуманный Воном Праттом в 1973 году. Он лежит в основе парсеров многих современных языков, но его описания часто сводятся к магическим таблицам приоритетов без объяснения, почему это работает. Эта статья строит интуицию с нуля.</p><p>— AST — основная структура данных: оператор над операндами, вычисление снизу вверх.</p><p>— Приоритет операторов определяет наклон дерева: выше приоритет — глубже в дерево.</p><p>— При падении приоритета алгоритм поднимается по «хребту» дерева — это и есть суть Pratt parsing.</p><p>— Левая и правая ассоциативность задаются через LBP и RBP (left/right binding power).</p><p>— Полный парсер с поддержкой всех операторов — около 10 строк на Python.</p><h2>Абстрактное синтаксическое дерево</h2><p>Наиболее распространённое решение для разбора выражений — абстрактное синтаксическое дерево (AST, Abstract Syntax Tree). В AST каждый оператор стоит над своими операндами. Вычисление идёт снизу вверх: сначала обрабатываются дочерние узлы, затем операция над ними.</p><p>Для выражения a + b * c + d правильное AST выглядит так:</p><p>Узел * находится глубже, чем +, — это и отражает более высокий приоритет умножения. При вычислении сначала перемножаются b * c, результат складывается с a, затем прибавляется d.</p><h2>Как приоритет влияет на форму дерева</h2><p>Здесь кроется главная интуиция Pratt parsing. Приоритет операторов напрямую определяет, в какую сторону «наклоняется» дерево:</p><ul><li><b>Убывающий приоритет</b> (например, * + ==) — дерево наклонено влево: операторы с большим приоритетом оказываются глубже.</li><li><b>Возрастающий приоритет</b> (например, == + *) — дерево наклонено вправо.</li><li><b>Равный приоритет</b> — по соглашению левая ассоциативность, дерево наклоняется влево.</li></ul><p>Рассмотрим промежуточное состояние разбора. Пусть мы уже построили дерево I для выражения (a &gt; b + c * d) — это правонаклонное дерево: &gt; наверху, * в самом низу.</p><p>Теперь встречаем следующий оператор. Куда вставить новый узел? Зависит от приоритета:</p><ul><li><b>[I] * e</b> — приоритет * не меньше приоритета * в дереве, вставляем в самый глубокий узел.</li><li><b>[I] + e</b> — приоритет + ниже *, но выше &gt;, поднимаемся по хребту выше узла *.</li><li><b>[I] == e</b> — приоритет == ниже всего дерева, всё дерево I становится левым потомком.</li></ul><p><b>Ключевое наблюдение:</b> когда встречается оператор с меньшим приоритетом, мы поднимаемся по правому хребту дерева, собирая узлы с более высоким приоритетом. Это и есть Pratt parsing — алгоритм, который реализует именно этот подъём по хребту.</p><h2>От интуиции к коду</h2><p>Начнём с простого случая — правонаклонного дерева. Каждый оператор правоассоциативен, приоритет не учитывается:</p><p>Здесь leaf() читает следующий терминал (число или переменную), peek() смотрит на текущий токен без продвижения, advance() читает и сдвигает позицию.</p><p>Добавляем приоритет. Рекурсивный вызов передаёт приоритет текущего оператора как порог — это ограничивает, какие операторы следующий уровень может «захватить»:</p><p>Это уже работает для правоассоциативных операторов. Но у нас if — разобрали один оператор и вышли. Для левоассоциативных нужен цикл:</p><h3>Полный Pratt parser</h3><p>Замена if на while — это и есть процедура подъёма по хребту дерева. Цикл продолжается, пока следующий оператор имеет достаточно высокий приоритет, чтобы «захватить» левую часть. Как только приоритет падает — выходим, и текущее поддерево передаётся вверх по стеку вызовов.</p><h3>Правая ассоциативность через binding power</h3><p>До сих пор у нас одно число приоритета на оператор. Но для управления ассоциативностью нужно различать, насколько «сильно» оператор притягивает операнды слева и справа. Вводятся два понятия:</p><ul><li><b>LBP (left binding power)</b> — сила притяжения левого операнда.</li><li><b>RBP (right binding power)</b> — сила притяжения правого операнда.</li></ul><p>Правила ассоциативности через binding power:</p><ul><li><b>Левоассоциативные операторы</b> (+, *): LBP == RBP. Правый рекурсивный вызов получает тот же приоритет — следующий оператор с таким же приоритетом не захватывается, строится левое дерево.</li><li><b>Правоассоциативные операторы</b> (**, =): RBP = LBP − 1. Правый рекурсивный вызов получает чуть меньший приоритет — следующий оператор с таким же приоритетом захватывается, строится правое дерево.</li></ul><p>Это финальная версия Pratt parser. Всего 8 строк кода — и корректный разбор всех операторов с любым приоритетом и ассоциативностью.</p><h2>Итог</h2><p>Pratt parsing — не хитрый трюк, а следствие простой геометрической интуиции. Деревья разбора наклоняются влево или вправо в зависимости от приоритета операторов. Когда встречается оператор с меньшим приоритетом, алгоритм поднимается по правому хребту текущего дерева — ровно настолько, насколько нужно.</p><p>Ключевые детали реализации:</p><ul><li>while вместо if — реализует подъём по хребту для левоассоциативных операторов.</li><li>Передача приоритета в рекурсию — ограничивает, какие операторы «захватываются» на следующем уровне.</li><li>LBP / RBP — контролируют ассоциативность через разницу в единицу.</li></ul><p>Понимание этой геометрии делает Pratt parsing прозрачным: каждая строка кода отражает конкретное геометрическое действие с деревом, а не магию таблиц приоритетов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Маск: «ИИ будет создавать бинарники напрямую» — программирование якобы уйдет в прошлое</title>
      <link>https://tproger.ru/news/mask---ii-budet-sozdavat-binarniki-napryamuyu----programmirovanie</link>
      <comments>https://tproger.ru/news/mask---ii-budet-sozdavat-binarniki-napryamuyu----programmirovanie?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/mask---ii-budet-sozdavat-binarniki-napryamuyu----programmirovanie</guid>
      <description><![CDATA[<p>Маск заявил, что ИИ скоро будет создавать бинарники напрямую, но эксперты сомневаются в отказе от исходного кода и компиляторов</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/mask---ii-budet-sozdavat-binarniki-napryamuyu----programmirovanie">Маск: «ИИ будет создавать бинарники напрямую» — программирование якобы уйдет в прошлое</a>»</p>]]></description>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Илон Маск]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 17 Feb 2026 02:17:09 GMT</pubDate>
      <content:encoded><![CDATA[<p>Илон Маск <a href="https://timesofindia.indiatimes.com/technology/tech-news/elon-musk-gives-less-than-a-year-to-coding-as-a-profession-says-there-is-no/articleshow/128244238.cms" rel="nofollow">заявил</a> на встрече с сотрудниками xAI, что уже к концу 2026 года «никто не будет писать код». Якобы ИИ сможет создавать бинарные файлы напрямую.</p><p>По его словам, нейросеть сможет делать это даже эффективнее традиционных компиляторов.</p><p>Звучит громко. Но если разобрать тезис технически, все не так однозначно.</p><h2>Что именно предлагает Маск</h2><p>По словам миллиардера, вместо привычной цепочки «исходный код → компилятор → бинарник», ИИ будет получать задачу и сразу выдавать исполняемый файл. Без промежуточного слоя в виде читаемого кода.</p><p>Фактически это означает отказ от исходников как основного артефакта разработки. Промпт на входе, а .exe или ELF на выходе.</p><h2>Почему это спорно с технической точки зрения</h2><p>Компиляторы — это детерминированные системы. Они проверяют синтаксис и типы, строят промежуточное представление программы, применяют оптимизации и гарантируют воспроизводимый результат.</p><p>Один и тот же код при одинаковых условиях дает один и тот же бинарник.</p><p>LLM работают иначе: они генерируют вероятностный результат. Малейшая ошибка в бинарнике приведет к падению программы или трудноуловимому багу.</p><p>В отличие от исходного кода, бинарный файл невозможно нормально ревьюить, сравнивать в Git или проверять на уровне логики.</p><p>Кроме того, компиляция стоит дешево — это миллисекунды CPU. Генерация крупных бинарников через LLM потребовала бы миллионов токенов и значительно больших вычислительных затрат.</p><h2>Где ИИ действительно меняет разработку</h2><p>На фоне громких заявлений Маска, многие как будто забыли, что ИИ уже активно используется в программировании. Но в другом формате. Технология помогает писать исходный код, объяснять сложные участки, генерировать тесты, предлагать рефакторинг.</p><p>А дальше в дело все равно вступает компилятор — как проверяемый и предсказуемый этап.</p><p>Более реалистичный сценарий — улучшение компиляторов с помощью ИИ, а не их замена. Например, автоматический подбор оптимизаций или более агрессивная векторизация.</p>]]></content:encoded>
    </item>
    <item>
      <title>Создатель Linux поддержал вайб-кодинг, назвав его «отличным способом войти в IT»</title>
      <link>https://tproger.ru/news/sozdatel-linux-podderzhal-vajb-koding--nazvav-ego--otlichnym-sposobom-vojti-v-it-</link>
      <comments>https://tproger.ru/news/sozdatel-linux-podderzhal-vajb-koding--nazvav-ego--otlichnym-sposobom-vojti-v-it-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/sozdatel-linux-podderzhal-vajb-koding--nazvav-ego--otlichnym-sposobom-vojti-v-it-</guid>
      <description><![CDATA[<p>Линус Торвальдс поддержал вайб-кодинг как легкий вход в IT, но предупредил: для реальных проектов это плохо подходит и усложняет поддержку</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/sozdatel-linux-podderzhal-vajb-koding--nazvav-ego--otlichnym-sposobom-vojti-v-it-">Создатель Linux поддержал вайб-кодинг, назвав его «отличным способом войти в IT»</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 20 Nov 2025 06:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Линус Торвальдс</b> неожиданно <a href="https://www.theregister.com/2025/11/18/linus_torvalds_vibe_coding/">высказался</a> <b>в поддержку вайб-кодинга</b>. Но только как способа входа в профессию, а не как подхода к разработке реального продукта.</p><p>Об этом он рассказал в интервью на <b>Open Source Summit</b> в Сеуле.</p><h2>«Я уже 20 лет не программист»</h2><p>Торвальдс признался, что своей основной задачей <b>давно</b> <b>не считает написание кода</b>:</p><blockquote>«Около 20 последних лет я не программист. Я смотрю на Git со стороны, а в ядре моя роль — соглашаться или отказывать».</blockquote><p>Он отметил, что все чаще приходится «говорить да» новым идеям, несмотря на сопротивление старых мейнтейнеров. Это можно заметить, например, в вопросе <b>интеграции Rust в ядро Linux</b>.</p><h2>Что он думает об ИИ и разработке</h2><p>Несмотря на то, что сам <b>Линус не пользуется ИИ-ассистентами</b>, он не исключает, что такие инструменты могут пригодиться в ядре. Основная проблема ИИ сейчас, по его словам — не код, а инфраструктура:</p><blockquote>«ИИ-краулеры сильно захламляют наши ресурсы, притаскивают баги и репорты, которых не существует».</blockquote><p>При этом <b>Торвальдс позитивно оценивает влияние ИИ-бума на индустрию</b>: из-за него NVIDIA стала «значительно более хорошим игроком» в Linux-сообществе.</p><h2>А что с вайб-кодингом?</h2><p>Именно здесь Линус удивил больше всего. Он сказал, что относится к вайб-кодингу <b>«довольно позитивно»</b>, потому что он:</p><ul><li>облегчает вход в программирование для новичков;</li><li>позволяет увидеть быстрый результат;</li><li>снижает технический порог для тех, кто раньше не мог «заставить компьютер что-то делать».</li></ul><p>Но использовать это в реальных проектах — гиблая идея:</p><blockquote>«Это может быть ужасным решением с точки зрения поддержки».</blockquote><p>По мнению Торвальдса, <b>вайб-кодинг — отличная «точка входа»</b>, но <b>плохой фундамент</b> для сложных систем вроде ядра Linux.</p><h2>Вердикт Линуса</h2><p>Он видит ИИ как обычный инструмент — как когда-то компиляторы, которые избавили разработчиков от необходимости писать код ассемблера вручную:</p><blockquote>«ИИ не убьет профессию. Как и компиляторы, он просто повысит продуктивность».</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Cloudflare поймала редкий баг в компиляторе Go для arm64: падения при разворачивании стека</title>
      <link>https://tproger.ru/news/cloudflare-pojmala-redkij-bag-v-kompilyatore-go-dlya-arm64--padeniya-pri-razvorachivanii-steka</link>
      <comments>https://tproger.ru/news/cloudflare-pojmala-redkij-bag-v-kompilyatore-go-dlya-arm64--padeniya-pri-razvorachivanii-steka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/cloudflare-pojmala-redkij-bag-v-kompilyatore-go-dlya-arm64--padeniya-pri-razvorachivanii-steka</guid>
      <description><![CDATA[<p>На arm64 Go обнаружен баг: async preemption могла прервать корректировку стека и вызвать краш в runtime.(*unwinder).next. Исправлено в Go 1.24.6, 1.23.12 и 1.25.0+.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/cloudflare-pojmala-redkij-bag-v-kompilyatore-go-dlya-arm64--padeniya-pri-razvorachivanii-steka">Cloudflare поймала редкий баг в компиляторе Go для arm64: падения при разворачивании стека</a>»</p>]]></description>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Баги и ошибки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Oct 2025 11:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Cloudflare опубликовала технический <a href="https://blog.cloudflare.com/how-we-found-a-bug-in-gos-arm64-compiler/">разбор</a> редкой, но критичной проблемы в экосистеме Go: из-за ошибки в генерации кода для arm64 в некоторых случаях возникала гонка на уровне одной инструкции, приводившая к крашам рантайма при разворачивании стека (stack unwinding) в runtime.(*unwinder).next.</p><p>Cloudflare связала учащение «фатальных паник» на arm64 с кодом, где выполнялась работа с Netlink, но корневая причина оказалась глубже — в связанке компилятор ↔ ассемблер Go для arm64 и в том, как разбивалось большое смещение стека на две инструкции ADD со «сдвигом на 12 бит». Если прерывание попадало между этими двумя ADD, стековый указатель оказывался «наполовину скорректирован», и трассировщик стека считывал нерелевантные данные как адрес возврата, что заканчивалось segfault/фатальной паникой. Схожие аварии ранее <a href="https://github.com/golang/go/issues/73259">отмечали</a> и другие команды, в частности Datadog: именно в runtime.(*unwinder).next на Linux/arm64 (Go 1.23.x/1.24.x).</p><h2>Что именно ломалось</h2><ul><li>Сценарий сбоя: асинхронная предвыборка (preemption) <a href="https://github.com/golang/go/issues/63830">попадает</a> между двумя инструкциями корректировки SP (split ADD), после чего GC/трассировка начинают разворачивать некорректный фрейм, обращаясь по невалидному SP. Итог — падение в (*unwinder).next.</li><li>Подтверждение на практике: сходные трассы стеков и «рандомные» крэши на arm64 фиксировались у сторонних команд; проблема оформлена в ишью #73259 в репозитории Go и была <a href="https://github.com/golang/go/issues/73259">признана</a> кандидатом на бэкпорт.</li></ul><h2>Как починили (и какие версии содержат фикс)</h2><p>Исправление прошло через бэкпорт и доступно в поддерживаемых ветках Go:</p><ul><li>Go 1.24.6 — явное упоминание бэкпорта по <a href="https://github.com/golang/go/issues/74694">ишью #73259</a>.</li><li>Go 1.23.12 — <a href="https://go.dev/doc/devel/release">минор</a> с правками рантайма (включая бэкпорт по связанным arm64-сбоям).</li><li>Go 1.25.0 и новее — <a href="https://tip.golang.org/doc/go1.25">фиксация</a> на мажорной ветке.</li></ul><p>Суть изменения: вместо двух поочерёдных ADD для большого смещения теперь собирают оффсет в временный регистр и выполняют одну атомарную корректировку SP.</p><p>Это исключает «окно» между ADD-инструкциями и делает разворачивание стека предсказуемым даже при async preemption. (Подробные обсуждения и сопутствующие arm64-проблемы рантайма см. также в #<a href="https://github.com/golang/go/issues/63830">63830</a>, #<a href="https://github.com/golang/go/issues/65449">65449</a>, #<a href="https://github.com/golang/go/issues/73413">73413</a>.)</p><h2>Кому это важно</h2><ul><li>Все сервисы Go на arm64, где возможны большие стековые фреймы и активна асинхронная предвыборка (по умолчанию с Go 1.14+). В условиях продакшн-нагрузок редкая гонка становится статистически вероятной. Читайте подробнее: https://unskilled.blog/posts/preemption-in-go-an-introduction/</li></ul><h2>Что делать инженерам прямо сейчас</h2><ol><li>Обновиться до: Go 1.25.x или минимум до 1.24.6 / 1.23.12 (если «зажаты» веткой).</li><li>Пересобрать сервисы, критичные по доступности, и раскатить обновления в первую очередь на arm64-инфраструктуру.</li><li>Если апгрейд временно невозможен — минимизируйте большие стек-фреймы (вынос больших буферов в heap), снизьте вероятность попадания preemption в эпилог и проверьте зависимости на предмет собственного asm/unsafe-кода.</li><li>Отслеживайте релизы Go и связанные тикеты об unwinding/arm64 (см. #73259 и бекпорт #74694).</li></ol><p>Источники и материалы:</p><ul><li>Обсуждение с примерами падений: runtime: segfaults in runtime.(*unwinder).next (GitHub, #73259).  https://github.com/golang/go/issues/73259</li><li>Бэкпорт фикса в ветку 1.24: (GitHub, #74694) — релиз Go 1.24.6. https://github.com/golang/go/issues/74694</li><li>История релизов, минор Go 1.23.12 с правками рантайма. <a href="https://go.dev/doc/devel/release?utm_source=chatgpt.com">https://go.dev/doc/devel/release</a></li><li>Release notes Go 1.25 (фикс присутствует в мажорной ветке).  https://tip.golang.org/doc/go1.25</li><li>Ранние разборы проблем разворачивания стека/прерываний на arm64 https://github.com/golang/go/issues/63830</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>WebAssembly 3.0 добрался до браузеров: 64-битная память, сборщик мусора и настоящие исключения</title>
      <link>https://tproger.ru/news/webassembly-3-0-dobralsya-do-brauzerov--64-bitnaya-pamyat--sborshhik-musora-i-nastoyashhie-isklyucheniya</link>
      <comments>https://tproger.ru/news/webassembly-3-0-dobralsya-do-brauzerov--64-bitnaya-pamyat--sborshhik-musora-i-nastoyashhie-isklyucheniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/webassembly-3-0-dobralsya-do-brauzerov--64-bitnaya-pamyat--sborshhik-musora-i-nastoyashhie-isklyucheniya</guid>
      <description><![CDATA[<p>WebAssembly 3.0 уже работает в браузерах: 64-битная память, полноценный GC, система исключений и новые инструменты для языков</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/webassembly-3-0-dobralsya-do-brauzerov--64-bitnaya-pamyat--sborshhik-musora-i-nastoyashhie-isklyucheniya">WebAssembly 3.0 добрался до браузеров: 64-битная память, сборщик мусора и настоящие исключения</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Scala]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Блокчейн]]></category>
      <category><![CDATA[Firefox]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 18 Sep 2025 03:28:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>Спустя три года после релиза версии 2.0, WebAssembly <a href="https://webassembly.org/news/2025-09-17-wasm-3.0/">получил</a> масштабное обновление.</p><p>Новый стандарт 3.0 уже поддерживается большинством современных браузеров и приносит сразу несколько ключевых нововведений.</p><h2>Главное из нововведений</h2><ul><li><b>64-битная адресация:</b> теперь Wasm может использовать i64 вместо i32, что расширяет лимит адресуемой памяти с 4 ГБ до 16 ЭБ (в реальности — до 16 ГБ в браузерах).</li><li><b>Несколько областей памяти:</b> модули теперь могут напрямую использовать и копировать данные между разной памятью, без обходных трюков с импортом других модулей.</li><li><b>Сборка мусора (GC):</b> добавлена поддержка управляемой памяти для языков с автоматическим управлением памятью (например, Java, Scala, Kotlin, Dart).</li><li><b>Типизированные ссылки:</b> улучшенная типизация ссылок и функций позволяет избежать лишних проверок в рантайме.</li><li><b>Исключения:</b> наконец-то появилась полноценная система обработки исключений — с try, throw и catch, как в других языках.</li><li><b>Хвостовые вызовы:</b> позволяют не занимать стек при возврате через вызов, что критично для функциональных языков и оптимизаций.</li><li><b>Расслабленные SIMD-инструкции:</b> добавлены быстрые, но менее детерминированные версии векторных инструкций для повышения производительности.</li><li><b>Детерминированный профиль:</b> теперь для задач с требованием полной воспроизводимости (например, блокчейны) можно включить строго определенное поведение операций.</li><li><b>Аннотации в тексте:</b> появилась возможность вставлять пользовательские аннотации прямо в текстовый формат .wat.</li></ul><h2>Что это значит</h2><p>WebAssembly становится всё ближе к полноценной виртуальной машине для высокоуровневых языков. В новой версии уже появляются компиляторы для Java, OCaml, Scala и прочих ЯП — благодаря поддержке GC и исключений.</p><p>Новый стандарт уже <b>поддерживается в основных браузерах</b>, включая Chrome и Firefox. Независимые движки, такие как Wasmtime, тоже догоняют.</p>]]></content:encoded>
    </item>
    <item>
      <title>WebAssembly выходит за пределы браузера: серверные и embedded-применения</title>
      <link>https://tproger.ru/articles/webassembly-vyhodit-za-predely-brauzera--servernye-i-embedded-primeneniya-257873</link>
      <comments>https://tproger.ru/articles/webassembly-vyhodit-za-predely-brauzera--servernye-i-embedded-primeneniya-257873?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/webassembly-vyhodit-za-predely-brauzera--servernye-i-embedded-primeneniya-257873</guid>
      <description><![CDATA[<p>Как WebAssembly используют в серверных и embedded-системах. Преимущества WASM: безопасность, переносимость и эффективность. Примеры внедрения от Fastly и других компаний. Перспективы технологии в 2025 году.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/webassembly-vyhodit-za-predely-brauzera--servernye-i-embedded-primeneniya-257873">WebAssembly выходит за пределы браузера: серверные и embedded-применения</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 17 Sep 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>WebAssembly (WASM) — язык программирования низкого уровня для стековой виртуальной машины. Когда он только появился, его воспринимали  исключительно как технологию для ускорения веб-приложений. Сегодня WASM стремительно выходит за границы браузера, открывая новые возможности для серверных и встраиваемых систем. Кардинально меняется сам подход к созданию кроссплатформенных приложений.</p><h2>WebAssembly в браузере: как всё начиналось</h2><p>Прежде чем говорить о настоящем и будущем WebAssembly, вспомним, с чего он начинался. Технология создавалась исключительно для работы в браузере. WebAssembly использовался (и используется сейчас): для оптимизации производительности, миграции legacy-нативных приложений, запуска кода на языках, отличных от JavaScript.</p><p>Ярче всего успех этого подхода демонстрирует Figma — популярный редактор для дизайнеров интерфейсов. Для многих стало неожиданностью, что редактор Figma, будучи веб-приложением, написан на C++.</p><p><b>Александр Коротаев</b>, фронтенд-разработчик, автор ТГ канала «Трудно быть Коротаевым»:</p><blockquote>На заре появления WASM многие ошибочно считали его то ли машиной для ускорения JS, то ли нативным модулем, который имеет доступ к операционной системе. Буквально чудо-коробочка, в которую можно поместить весь код, и он станет быстрее в три раза. Но в реальности технология столь ограничена в применении, что она до сих пор остается нишевой, хотя и очень перспективной.</blockquote><p>До WebAssembly разработчики Figma использовали технологию asm.js — предшественника WASM. Специальный компилятор преобразовывал (транспилировал) код C++ в высокооптимизированный JavaScript, который браузерные движки могли выполнять с близкой к нативной производительностью. У этого подхода были недостатки: большой размер получаемого кода и затраты на его парсинг и компиляцию в браузере.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-12/ca50f24f-8007-4880-b346-6b7e63692456.png" alt="" /></figure><p>Переход на WebAssembly стал переломным моментом. Поскольку WASM — это бинарный машинно-ориентированный формат, он гораздо компактнее и требует меньше ресурсов для обработки браузером. В результате миграции с asm.js на WebAssembly, Figma получила трёхкратный прирост производительности.</p><p>Этот кейс наглядно показал, что WebAssembly — это не просто ещё одна веб-технология, а настоящий прорыв, который стирает границы между нативными и веб-приложениями. Успех Figma и подобных проектов заложил фундамент для следующего логического шага: если WebAssembly так эффективен в браузере, почему бы не запускать его где угодно?</p><h2>Почему WebAssembly выходит за пределы браузера</h2><p>WebAssembly изначально создавался как безопасная, эффективная и портируемая платформа для компиляции высокоуровневых языков. Ключевые преимущества этого инструмента — изоляция выполняемого кода, платформонезависимость и высокая производительность — оказались востребованы не только в вебе.</p><p>Серверные и встроенные системы долгое время страдали от проблем совместимости, безопасности и сложности распространения кода. Традиционные подходы к изоляции (например, контейнеризация) требуют значительных ресурсов и не всегда дают достаточный уровень безопасности. WebAssembly предлагает альтернативу: песочницу с минимальными накладными расходами и встроенными механизмами безопасности.</p><p>Главным катализатором этого процесса стал стандарт WASI (WebAssembly System Interface), разработанный при участии Mozilla, Fastly и других компаний. WASI предоставляет стандартизированный интерфейс, где WebAssembly-модули взаимодействуют с операционной системой и решают проблему переносимости между различными платформами.</p><p><b>Александр Коротаев</b>, фронтенд-разработчик, автор ТГ канала «Трудно быть Коротаевым»:</p><blockquote>Открытая «кроссплатформенная» обертка WASI — это довольно большой прорыв в разработке, так как в текущем состоянии все современные продукты, выпускающиеся для разных ОС с одной кодовой базой, имеют большие, подчас legacy модули совместимости, или же запускаются внутри особых песочниц, сильно увеличивающих размер бандла. Например, браузерный движок Electron или React Native.</blockquote><h2>Как WebAssembly работает вне браузера</h2><p>Вне браузера WebAssembly исполняется в специальных средах выполнения (runtimes), которые взаимодействуют с операционной системой через WASI. Известные примеры — <a href="https://wasmtime.dev/">Wasmtime</a> от Mozilla, <a href="https://github.com/bytecodealliance/lucet">Lucet</a> от Fastly и <a href="https://wasmer.io/">Wasmer</a>.</p><p>Эти среды выполняют роль «концептуальной операционной системы», предоставляют модулям WebAssembly стандартизированный доступ к системным ресурсам: файлам, сети, случайным числам и другим функциям.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-12/029b3ae4-a5db-416b-817f-b296969a3226.png" alt="" /></figure><p>WebAssembly принципиально отличается от традиционных подходов тем, что изолируется на уровне инструкций, а не процессов. Каждый модуль выполняется в собственной песочнице с чётко определенными границами доступа к ресурсам. Это значительно снижает риск компрометации системы даже в случае уязвимостей в самом коде.</p><h2>Безопасность как фундаментальное преимущество</h2><p>Безопасность WebAssembly основана на нескольких уровнях защиты. Модули выполняются в изолированной среде, отделённой от хост-системы с помощью техник изоляции отказов. Это означает, что приложения выполняются независимо и не могут покинуть песочницу без явного разрешения через API.</p><p>Система контролирует выполнение кода с помощью статической проверки типов — все функции нужно явно объявлять перед использованием. Даже косвенные вызовы проверяются на соответствие сигнатурам прямо во время работы программы. Такой подход блокирует распространённые атаки — переполнение буфера и внедрение вредоносного кода.</p><p>Память в WebAssembly изолирована — напрямую с ней работать нельзя. Когда система обращается к памяти, она проверяет границы доступа, а локальные переменные хранятся в защищённом стеке вызовов.</p><p>Важность такого подхода к безопасности сложно переоценить в свете общих трендов защиты данных. К 2025 году безопасность и конфиденциальность стали ключевыми приоритетами для индустрии. Это особенно актуально на фоне растущих рисков при работе с большими языковыми моделями (LLM), которые могут невольно запоминать и воспроизводить конфиденциальные данные из тренировочных наборов.</p><p>Если запускать изолированные модули WebAssembly на своей инфраструктуре вместо публичного облака, можно безопасно обрабатывать чувствительные данные без риска утечки.</p><p><b>Александр Коротаев</b>, Фронтенд-разработчик, автор ТГ канала «Трудно быть Коротаевым»:</p><blockquote>Здесь явно подчеркивается безопасность платформы из коробки, но не стоит забывать, что на разработчике все еще лежит ответственность за безопасность данных и пользователей. Режим «разрешить все» — стандарт для любого MVP, и без аудита перед релизом тут все еще не обойтись. Платформа лишь гарантирует, что память процесса будет защищена от несанкционированного доступа, что уже давно делается во всех популярных операционных системах. Чтобы выйти за пределы стека или прочитать чужую память, надо использовать очень старые компиляторы или сильно низкоуровневые средства разработки.</blockquote><h2>Серверные применения WebAssembly</h2><p>Серверный ландшафт традиционно строился на монолитных приложениях и виртуальных машинах, но сегодня индустрия движется к более легковесным и изолированным компонентам. WebAssembly предлагает компромисс между производительностью нативного кода и безопасностью интерпретируемых сред. Эта технология особенно востребована в сценариях, где критически важны быстрое масштабирование и минимальное время запуска.</p><h2>Микросервисы и бессерверные архитектуры</h2><p>WebAssembly идеально подходит для микросервисных архитектур благодаря легковесности и быстрому запуску. В отличие от традиционных контейнеров, WASM-модули не требуют отдельной ОС и запускаются за миллисекунды.</p><p>Кейс: компания Fastly использует WebAssembly для исполнения пользовательского кода на серверах. Их технический директор Тайлер МакМаллен <a href="https://habr.com/ru/articles/446764/">отмечает</a>: «Мы рассматриваем WebAssembly как платформу для быстрого и безопасного кода в облаке на границе сети».</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-12/45f4a6a2-5b2f-440c-a634-a3b4a3f4accf.jpg" alt="" /></figure><h2>Безопасные расширения приложений</h2><p>Многие приложения позволяют пользователям запускать собственный код через плагины и расширения. Но это создаёт риски для безопасности. В WebAssembly пользовательский код выполняется с минимальными рисками.</p><p>Веб-сервер Angie <a href="https://angie.software/news/articles/wasm/">использует</a> WASM для безопасности пользовательских модулей. Это решает проблему совместимости, характерную для традиционных модулей, написанных на C.</p><p>Экономическая эффективность таких вариантов становится решающим фактором. По <a href="https://explodingtopics.com/blog/list-of-llms">данным на 2025 год</a>, глобальный рынок больших языковых моделей (LLM), чьи backend-системы часто используют микросервисные архитектуры, демонстрирует колоссальный рост. Прогнозируется, что к 2033 году он достигнет $140,8 млрд.</p><p>Для таких масштабов нужны технологии с качествами, которые как раз предоставляет WebAssembly: безопасность, переносимость и эффективное использование ресурсов. Почти все компании из списка Fortune 500 уже <a href="https://cybernews.com/security/ai-adoption-outpace-security-at-fortune500-firms/">используют</a> генеративный ИИ в своих бизнес-процессах, и для многих из них WebAssembly — ключевой инструмент для развёртывания и масштабирования этих рабочих нагрузок.</p><p><b>Александр Коротаев</b>, Фронтенд-разработчик, автор ТГ канала «Трудно быть Коротаевым»:</p><blockquote>Здесь все закономерно: бизнес всегда выбирал решения, где можно было написать код один раз и поставить его сразу на несколько платформ. Даже если сами решения  сырые и небезопасные, дешевле было увеличить поддержку пользователей и настроить аудит безопасности, чем реализовать фичу для каждой платформы отдельно. Так на рынок вышли Python, Node.js, React Native, стремительно обгоняя конкурентов за счет скорости разработки.</blockquote><p><br /></p><h2>WebAssembly в embedded-системах</h2><p>WebAssembly успешно работает на серверах, но главные изменения происходят во встроенных системах. В IoT всегда была проблема совместимости: разные процессоры, операционные системы и периферийные устройства.</p><p>Технология предлагает принципиально новый подход — единую бинарную форму, способную работать на любом микроконтроллере с минимальными адаптациями. Теперь разработчики могут не привязываться к конкретным платформам и сосредоточиться на бизнес-логике приложения.</p><h2>Удаленные интерфейсы и централизованный мониторинг</h2><p>Производители встраиваемых систем всё чаще нуждаются в удаленных интерфейсах и централизованном мониторинге. WebAssembly позволяет повторно использовать код, написанный для embedded-устройств, в веб-интерфейсах для удалённого управления.</p><p>Согласно <a href="https://www.qt.io/blog/does-webassembly-matter-for-embedded-systems-makers">исследованию</a> Qt Company, более 77% респондентов из промышленной автоматизации считают удалённое управление и централизованный мониторинг критически важными в ближайшие десять лет. WebAssembly предоставляет экономичный способ реализации таких решений.</p><p><b>Александр Коротаев</b>, Фронтенд-разработчик, автор ТГ канала «Трудно быть Коротаевым»:</p><blockquote>А это, пожалуй, самая продающая фича: обычно у компаний, которые выходят на рынок со своими железками, базами данных и прочими продуктами, все продажи буквально построены на том, что программисты у клиента знают, как это быстро встроить. Так, бизнес готов платить деньги. Обычно у них есть проблемы с API для разных языков программирования, ОС и девайсов: либо хорошо все в JS, а в мобилках не заводится, либо наоборот. А то и вообще: стоит забросить поддержку платформы хоть на полгода, сразу всёперестает работать. Потому поставлять модуль для WASI должно быть дёшево, при этом  потенциально можно закрыть даже платформы будущего. Это инновация сродни изобретению стандарта USB.</blockquote><p><br /></p><h2>Прототипирование и сотрудничество</h2><p>WebAssembly упрощает процесс прототипирования и обратной связи для embedded-устройств. Разработчики могут скомпилировать приложение, разместить его на веб-сервере и предоставить доступ всем заинтересованным сторонам. При этом не нужно распространять устройства или проходить сложные процессы публикации.</p><p>Компания Qt использует этот подход в Qt Design Viewer, позволяя разработчикам делиться интерактивными дизайнами, созданными в Qt Design Studio, с коллегами по всему миру.</p><h2>Примеры внедрения: история ByteFog</h2><p>Компания Inetra из Новосибирска <a href="https://habr.com/ru/companies/jugru/articles/441140/">разработала</a> технологию peer-to-peer для доставки видео ByteFog. Система работает на множестве платформ: Windows, Linux, Android, iOS, Web и Tizen.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-12/2ec3300a-dcc3-41aa-acf5-7e51b78f9131.webp" alt="" /></figure><p>Изначально веб-версия использовала Netscape Plugin API, но когда основные браузеры прекратили поддержку этой технологии в 2015 году, компания осталась без веб-версии на два года. Поэтому в 2017 году они обратились к WebAssembly.</p><p>Используя компилятор Emscripten, разработчики перенесли существующее C++-приложение в браузер. Главной сложностью было разграничить транспортный слой и бизнес-логику через интерфейсы. Основной канал доставки видео заменили на AJAX, а P2P-слой — на WebRTC.</p><p>Результат компиляции — двоичный.wasm-файл и «клеевой код» на JavaScript, взаимодействующий с браузерными API. Это позволило запускать сложную P2P-систему Peers.TV напрямую в браузере без плагинов.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-09-12/6f383fd2-9857-497f-848a-d296791fb36e.png" alt="" /></figure><h2>Fastly Terrarium: экспериментальная платформа для WebAssembly-приложений</h2><p>В 2021 году инженеры Fastly <a href="https://www.fastly.com/blog/terrarium-reframes-compiler-sandbox-relationship">выпустили</a> Terrarium — экспериментальную платформу для запуска WebAssembly-модулей на периферийных устройствах (edge devices), над которой работали несколько лет. Сейчас проект всё ещё в демо-версии.</p><p>Terrarium  показывает, как можно запускать пользовательский код в изолированных средах с минимальной задержкой. Платформа использует рантайм Lucet, разработанный инженерами Fastly, и поддерживает компиляцию из Rust, C++ и AssemblyScript.</p><p>Ключевая особенность подхода — стандарт WASI для системных вызовов, что помогаетпереносить модули между разными средами. Это особенно важно для edge-вычислений, где код должен работать на разнородном оборудовании.</p><p>По данным тестирования, время запуска модулей составляет около 50 микросекунд, а потребление памяти измеряется килобайтами на инстанс. Такие показатели достигаются за счёт изоляции на уровне инструкций, а не процессов.</p><p>Хотя Terrarium не стал коммерческим продуктом, его наработки повлияли на другие решения Fastly. Компания <a href="https://www.fastly.com/blog/how-fastly-and-developer-community-invest-in-webassembly-ecosystem">развивает</a> направление WebAssembly-вычислений далее — экосистема постоянно обновляется.</p><h2>Технические вызовы и ограничения</h2><p>Несмотря на впечатляющие возможности WebAssembly за пределами браузера, технология сталкивается с объективными сложностями в реальных проектах. Разработчикам приходится решать две задачи одновременно: изолировать код для безопасности и при этом давать доступ к системе. Важно также сохранить кроссплатформенность, но не терять в производительности на конкретных устройствах.</p><p>Эти компромиссы особенно заметны в embedded-среде, где каждое решение напрямую влияет на энергопотребление, стоимость и надежность системы.</p><p><b>Александр Коротаев</b>, Фронтенд-разработчик, автор ТГ канала «Трудно быть Коротаевым»:</p><blockquote>А здесь кроется главное: почему такое решение не было написано ранее? Дело в том, что оно явно затратное по ресурсам, если сравнивать ту же логику, написанную на низком уровне. Сейчас любые устройства стали мощнее, чем ранее, и теперь разница уже не так заметна. Поэтому WASI может широко распространяться, без типичных минусов высокоуровневых абстракций: потребления памяти и энергии сильно выше чем у конкурентов.</blockquote><p><br /></p><h2>Доступ к аппаратным ресурсам</h2><p>WebAssembly ограничивает прямой доступ к аппаратуре во встроенных системах — это плата за безопасность. Это усложняет работу embedded-разработчикам.</p><p>Сообщество WebAssembly уже решает проблемы. Стандарт WASI продолжает развиваться, и в будущем появятся более гибкие способы работы с оборудованием.</p><h2>Размер файлов и производительность</h2><p>WebAssembly-модули могут иметь значительный размер, особенно при включении стандартных библиотек. В случае ByteFog размер бандла достигал 100 МБ, что создавало проблемы для инструментов сборки и загрузки в браузере.</p><p>Чтобы уменьшить размер, нужно тщательно удалять неиспользуемый код и подбирать настройки компиляции. Кроме того, передача данных между хост-системой и WebAssembly-модулем обходится дорого.</p><p><b>Александр Коротаев</b>, Фронтенд-разработчик, автор ТГ канала «Трудно быть Коротаевым»:</p><blockquote>Тут имеется ввиду краеугольная проблема WASM модулей — ввод и вывод. Дело в том, что он довольно низкоуровневый, и если в случае с микроконтроллерами они буквально будут говорить на «одном языке» с железом, то более высокоуровневые системы, передающие данные в том же JSON, столкнутся с довольно затратным процессом сериализации данных. Чтение строки с английскими буквами это одно, а текст на разных языках — это уже задачка со звездочкой. Так что в случае LLM надо будет серьезно работать надо протоколом обмена данными.</blockquote><h2>Инструменты и экосистема</h2><p>Экосистема WebAssembly вне браузера всё ещё развивается. Поддержка различных языков программирования неравномерна: лучше всего дела обстоят у C/C++ и Rust, с интерпретируемыми языками всё сложнее.</p><p>Отладка WebAssembly-модулей ограничена в сравнении с традиционными средствами. Разработчикам часто приходится использовать косвенные методы и работать с преобразованным кодом. Это особенно важно в контексте другой быстрорастущей тенденции — переносить выполнение ИИ-моделей с серверов на сами устройства пользователей (edge computing).</p><p>Например, современные компактные LLM, такие как Phi-4-mini-flash, демонстрируют впечатляющую производительность на мобильных чипах ARM, обрабатывая запросы за 90–100 мс прямо на устройстве без облака. Для подобных сценариев WebAssembly с его переносимостью и низким потреблением ресурсов выглядит идеальной средой, если сможет предложить более прямой и эффективный доступ к специфическим возможностям железа.</p><h2>Будущее WebAssembly вне браузера</h2><p>Перспективы WebAssembly вне браузера выглядит многообещающим. Стандарт WASI совершенствуется,  поддерживая новые системные интерфейсы и возможности. Разработчики получают всё более мощные инструменты для создания и отладки WASM-модулей.</p><p>В embedded-сфере WebAssembly может стать стандартом для безопасного выполнения кода на различных устройствах IoT (интернета вещей). Его способность работать на ресурсо-ограниченных устройствах при изоляции делает инструмент привлекательной альтернативой традиционным подходам.</p><p>Майлз Боринс, технический директор руководящего комитета Node.js, <a href="https://habr.com/ru/articles/446764/">видит</a> потенциал WebAssembly в решении одной из наибольших проблем фреймворка: «Это способ достичь скорости, близкой к нативной, и повторно использовать код, написанный на других языках (C и C++), сохранять портативность и безопасность».</p><p><b>Александр Коротаев</b>, Фронтенд-разработчик, автор ТГ канала «Трудно быть Коротаевым»:</p><blockquote>Как я понял, под фундаментальными проблемами имеется в виду ограничение на кол-во операций с потоками и файлами в текущий версиях Node.js, что не дает серверам на «ноде» тягаться с Nginx на равных.</blockquote><p><br /></p><h2>Итоги</h2><p>WebAssembly превращается из узкоспециализированной веб-технологии в универсальную платформу для выполнения кода. Безопасность, переносимость и производительность WebAssembly делают его эффективным решением для серверных и встраиваемых систем.</p><p>У WebAssembly всё ещё есть проблемы с доступом к аппаратным ресурсам и большим размерам модулей. Однако инструменты и стандарты активно развиваются — скорее всего, эти ограничения постепенно устранят.</p><p>Для разработчиков WebAssembly открывает новые возможности повторного использования кода и создания безопасных, переносимых приложений. Для индустрии в целом — это шаг к более безопасным и эффективным моделям распределения и выполнения кода.</p><p>Как <a href="https://habr.com/ru/articles/446764/">отмечает</a> Шон Уайт, директор Mozilla по R&amp;D: «WebAssembly уже меняет способы доставки людям новых видов привлекательного контента. С WASI преимущества WebAssembly получат больше пользователей и больше устройств в разных местах».</p><p>WebAssembly больше не ограничивается браузером — он становится универсальной платформой для среды, где код должен выполняться безопасно и эффективно везде: от облачных серверов до крошечных устройств интернета вещей.</p>]]></content:encoded>
    </item>
    <item>
      <title>CEO Okta уверен — через 5 лет программистов станет больше, а не меньше</title>
      <link>https://tproger.ru/news/ceo-okta-uveren---cherez-5-let-programmistov-stanet-bolwe--a-ne-menwe</link>
      <comments>https://tproger.ru/news/ceo-okta-uveren---cherez-5-let-programmistov-stanet-bolwe--a-ne-menwe?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ceo-okta-uveren---cherez-5-let-programmistov-stanet-bolwe--a-ne-menwe</guid>
      <description><![CDATA[<p>Глава Okta заявил, что ИИ не заменит разработчиков, а создаст новый спрос — программистов станет больше, особенно на фоне роста автоматизации</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ceo-okta-uveren---cherez-5-let-programmistov-stanet-bolwe--a-ne-menwe">CEO Okta уверен — через 5 лет программистов станет больше, а не меньше</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Apr 2025 07:38:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>Генеральный директор Okta Тодд Макиннон не верит в мрачные прогнозы о будущем профессии программиста. В интервью <i>Business Insider</i> он <a href="https://www.businessinsider.com/okta-ceo-software-engineer-job-market-future-2025-4">заявил</a>: идея о том, что разработчиков станет меньше из-за ИИ — «просто смешна».</p><p>Больше новостей — в нашем тг-канале «<a href="https://t.me/your_tech">Представляешь»</a></p><p>По его мнению, спрос на программистов будет только расти. Да, нейросети берут на себя часть рутины.</p><p>Но именно это, считает Макиннон, и позволит инженерам перейти на новый уровень — заниматься не механической работой, а проектированием систем, решением комплексных задач и созданием новых продуктов.</p><h2>Почему ИИ — не угроза, а шанс</h2><p>Макиннон провел параллель с прошлым. В 1978 году, когда появились компиляторы, тоже звучали опасения: <i>«Теперь компьютеры будут писать код сами»</i>. Но произошло обратное — разработчики стали продуктивнее, индустрия выросла, а программисты остались ключевыми фигурами технологического прогресса.</p><p>Сейчас, по его словам, мы наблюдаем похожую ситуацию: ИИ действительно автоматизирует часть задач, но это не убирает потребность в специалистах — наоборот, расширяет её.</p><h2>Автоматизация рождает еще больший спрос</h2><p>Макиннон уверен: даже если ИИ помогает создавать код быстрее, это не отменяет необходимость в новых продуктах. А значит — нужны новые программисты. Он приводит простой пример: запуск iPhone не убил рынок приложений, а породил гигантов вроде Snapchat.</p><p>По его словам, спрос на автоматизацию и цифровые инструменты бесконечен — и он растёт быстрее, чем скорость, с которой ИИ повышает эффективность.</p><h2>«Смотрите на цифры, а не на заявления»</h2><p>Макиннон скептически относится к заявлениям компаний, которые говорят, что больше не будут нанимать инженеров. Например, Google утверждает, что четверть их кода уже пишет ИИ, а Salesforce в этом году не планирует найм разработчиков.</p><p>Но глава Okta уверен: это лишь попытка продемонстрировать клиентам эффективность своих ИИ-решений. Он считает, что через год-два эти же компании вернутся к активному найму, потому что спрос на технологии и продукты не замедляется.</p><h2>Новая волна инженеров</h2><p>По прогнозу Макиннона, впереди нас ждет «новое поколение программистов», которые будут строить продукты на базе ИИ-инфраструктуры.</p><p>Компании вроде Microsoft, Meta, Salesforce и самой Okta продолжат расширять свои инженерные команды — потому что ИИ делает их не менее нужными, а просто другими.</p>]]></content:encoded>
    </item>
    <item>
      <title>Облачные IDE: Тестируем лучшие онлайн-редакторы кода</title>
      <link>https://tproger.ru/articles/oblachnye-ide--testiruem-luchwie-onlajn-redaktory-koda</link>
      <comments>https://tproger.ru/articles/oblachnye-ide--testiruem-luchwie-onlajn-redaktory-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ростислав Сорокин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/oblachnye-ide--testiruem-luchwie-onlajn-redaktory-koda</guid>
      <description><![CDATA[<p>Полезные сервисы: Replit, CodeSandbox, GitHub Codespaces, JetBrains Fleet, StackBlitz.
Обзор возможностей, плюсы и минусы, какие задачи лучше решать в каждой среде.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/oblachnye-ide--testiruem-luchwie-onlajn-redaktory-koda">Облачные IDE: Тестируем лучшие онлайн-редакторы кода</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 23 Feb 2025 09:07:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда я впервые столкнулся с облачными IDE, возникло сомнение: «А разве онлайн-среда может заменить привычный локальный редактор, где всё под рукой и настроено?» Однако, спустя несколько лет я убедился, что эти сервисы серьёзно продвинулись в плане функционала и быстроты работы. Сегодня хочу поделиться опытом тестирования пяти популярных решений: Replit, CodeSandbox, GitHub Codespaces, JetBrains Fleet и StackBlitz. Расскажу, в каких случаях они выручат, какие у них плюсы и минусы, а также поделюсь конкретными примерами использования.</p><h2>Что такое облачные IDE и почему они важны</h2><p>Облачные IDE (или онлайн-редакторы кода) позволяют работать над проектом прямо из браузера, без сложной локальной настройки окружения. На сервере уже установлены необходимые инструменты (компиляторы, интерпретаторы), можно быстро переключаться между различными стеками технологий. Это удобно, когда нужно:</p><ol><li>Быстро протестировать идею или прототип,</li><li>Работать из любого места и с любого устройства,</li><li>Обучаться программированию (особенно новичкам, которым сложно настраивать среду разработки),</li><li>Совместно редактировать код в реальном времени.</li></ol><p>Для меня облачные IDE — отличный вариант, когда нужно не заморачиваться с локальной установкой инструментов, а сразу перейти к коду. А ещё они выручают, когда я не хочу загружать ноутбук гигантскими IDE, особенно если машина не слишком мощная.</p><h2>Replit</h2><p><a href="https://replit.com">Replit</a> был одним из первых облачных решений, с которыми я столкнулся. Он ориентирован на скорость старта: заходишь на сайт, создаёшь «репл» (так называются проекты в Replit), выбираешь язык — и готово. Уже предустановлен интерпретатор или компилятор, можно писать и сразу же запускать программу.</p><h3>Возможности</h3><ul><li>Поддержка множества языков: Python, JavaScript, C++, Java, Go, Rust и другие.</li><li>Встроенный чат с искусственным интеллектом (Ghostwriter) для помощи в написании кода.</li><li>Возможность совместной работы: можно дать ссылку коллеге, и он зайдёт в ваш проект, чтобы вместе отлаживать или рефакторить код.</li><li>Хостинг: Replit умеет публиковать веб-приложения «на живом URL» одним нажатием кнопки.</li></ul><h3>Плюсы</h3><ul><li>Очень простая регистрация и моментальный старт.</li><li>Социальные функции: можно смотреть публичные проекты других пользователей, форкать их и учиться.</li></ul><h3>Минусы</h3><ul><li>Не всегда удобен для серьёзных проектов: базовые настройки окружения ограничены, а для расширенных сценариев нужен платный тариф.</li><li>Интерфейс может работать медленнее, если проект становится большим или инсталляция зависимостей тяжёлая.</li></ul><h3>Где пригодится</h3><ul><li>Отличный вариант для новичков, которые хотят учиться программировать без сложной настройки локальной среды.</li><li>Быстрые прототипы, демонстрации кода на собеседованиях или парное программирование.</li></ul><h2>CodeSandbox</h2><p><a href="https://codesandbox.io">CodeSandbox </a>ориентирован, прежде всего, на фронтенд-разработчиков. Он замечательно подходит для проектов на React, Vue, Angular, Svelte и других библиотечных и фреймворковых решениях.</p><h3>Возможности</h3><ul><li>Автоматическое создание окружения для фронтенд-проектов: нужен React? Выбираем шаблон — и сразу получаем структуру, файлы конфигурации и пакетный менеджер.</li><li>«Live preview» (живая перезагрузка): при каждом изменении в коде страница в правой части обновляется без перезагрузки.</li><li>Интеграция с GitHub: можно подтянуть репозиторий, внести правки в CodeSandbox, а затем запушить изменения обратно.</li><li>Возможность запускать бэкенд-сервер (через Docker-контейнеры) в отдельных sandboxes.</li></ul><h3>Плюсы</h3><ul><li>Удобно для веб-разработки: всё уже настроено (Webpack, Vite или другие сборщики).</li><li>Поддержка TypeScript из коробки.</li><li>Отлично работает совместное редактирование, есть возможность прямого «шеринга» результатов.</li></ul><h3>Минусы</h3><ul><li>Фокус именно на веб-технологиях, так что для языков, не связанных с фронтендом, CodeSandbox не всегда подойдёт.</li><li>Бесплатные sandboxes могут засыпать при простое, что не всегда удобно для постоянного хостинга.</li></ul><h3>Где пригодится</h3><ul><li>Быстрые демки UI-компонентов или обучающие примеры для фронтенда.</li><li>Когда нужно показать коллегам, как работает тот или иной React-хук, без установки Node.js локально.</li><li>Создание небольшого прототипа веб-приложения в режиме реального времени.</li></ul><h2>GitHub Codespaces</h2><p><a href="https://github.com/features/codespaces">GitHub Codespaces</a> — по сути, облачное продолжение Visual Studio Code. Если у вас есть репозиторий на GitHub, вы можете открыть его в Codespaces и получить преднастроенную среду разработки прямо в браузере. Это решение особенно нравится разработчикам, которые уже привыкли к VS Code.</p><h3>Возможности</h3><ul><li>Полноценная интеграция с GitHub: открываем репозиторий, создаём Codespace, и всё готово к работе.</li><li>Расширения VS Code в облаке: многие привычные плагины можно установить и использовать.</li><li>Поддержка Docker и Dev Containers: можно создавать контейнеры со своим набором инструментов, чтобы каждый член команды имел идентичную среду.</li><li>Возможность «подцепиться» к Codespaces и локальным VS Code, если хочется работать в офлайне или со своим привычным окружением.</li></ul><h3>Плюсы</h3><ul><li>Знакомая среда для тех, кто пользуется VS Code.</li><li>Гибкий вариант конфигурации (Dev Containers), позволяющий упростить онбординг новых сотрудников.</li><li>Нет проблем с зависимостями: всё хранится в контейнере, поэтому переходить между проектами очень удобно.</li></ul><h3>Минусы</h3><ul><li>Требует платного тарифного плана GitHub, если нужен серьёзный объём ресурсов (хотя есть ограниченное бесплатное время).</li><li>Для маленьких проектов может быть избыточен, так как мощь Codespaces раскрывается больше в средних и крупных командах.</li></ul><h3>Где пригодится</h3><ul><li>Команды, которые живут в экосистеме GitHub, хотят, чтобы любой разработчик мог моментально начать работать с проектом, не тратя часы на установку зависимостей.</li><li>Сложные проекты, где важно гарантировать одинаковую среду для всех.</li></ul><h2>JetBrains Fleet</h2><p><a href="https://www.jetbrains.com/fleet">Fleet </a>— новый проект от JetBrains, который позиционируется как «умная и быстрая» IDE нового поколения. Предлагается как облачная среда с возможностью локальной установки. JetBrains известны своими тяжёловесными, но очень функциональными IDE (IDEA, PyCharm, WebStorm и т.д.), а Fleet стремится занять более лёгкую нишу с возможностью работать в облаке.</p><h3>Возможности</h3><ul><li>Режим «смарт-редактирования», когда Fleet по мере необходимости подгружает функции анализа кода.</li><li>Распределённая архитектура: можно разворачивать часть Fleet в локальном окружении, часть — в удалённом, чтобы снизить нагрузку на машину.</li><li>Совместное редактирование кода в реальном времени, причём JetBrains обещают, что это будет «ровно, как в Google Docs, только для кода».</li></ul><h3>Плюсы</h3><ul><li>Потенциально более лёгкая, чем классические JetBrains IDE, работает быстрее на слабом железе.</li><li>Глубокий анализ кода, как и во всех решениях JetBrains, что особенно полезно для больших проектов.</li></ul><h3>Минусы</h3><ul><li>Fleet пока ещё развивается, некоторые функции отсутствуют или реализованы не до конца.</li><li>Менее дружелюбен к новичкам, чем Replit или CodeSandbox, потому что ориентирован скорее на опытных разработчиков.</li></ul><h3>Где пригодится</h3><ul><li>Разработка на языках, где особенно важны рефакторинг и интеллектуальные подсказки: Java, Kotlin, Python и т.д.</li><li>Если нужна более «лёгкая» альтернатива классическим IDE JetBrains, но при этом с возможностью работать удалённо.</li></ul><h2>StackBlitz</h2><p><a href="https://stackblitz.com">StackBlitz</a> — ещё один «фронтенд-ориентированный» онлайн-редактор, но с упором на выполнение кода прямо в браузере без специальных серверных окружений. Он запускает Node.js-среду в браузере через WebAssembly, благодаря чему проекты могут работать очень быстро и автономно.</p><h3>Возможности</h3><ul><li>Мгновенный запуск Angular, React, Vue, Svelte и т.д., без серверной компоненты.</li><li>Поддержка Node.js-приложений (через WebContainers) прямо в браузере: по сути, локальная VM работает «внутри» вкладки.</li><li>Отличная интеграция с GitHub и возможность деплоя проектов.</li></ul><h3>Плюсы</h3><ul><li>Реально быстрая загрузка и мгновенный старт проектов на популярных фреймворках.</li><li>Почти не зависит от «серверной» стороны, потому что всё работает через WebContainers.</li><li>Хорошо подходит для офлайн-режима (в разумных пределах).</li></ul><h3>Минусы</h3><ul><li>Частично функционал ограничен: если нужны какие-то специфические системные зависимости, WebContainers могут не справиться.</li><li>Не так универсален, как решения уровня GitHub Codespaces. В первую очередь он предназначен для веба.</li></ul><h3>Где пригодится</h3><ul><li>Обучающие примеры фронтенда, демо на конференциях или мастер-классах.</li><li>Когда нужно показать, как работает Angular-компонент или React-хук, а интернет-подключение не самое надёжное.</li><li>Быстрое создание прототипа и проверка идей.</li></ul><h2>Мой личный опыт и выводы</h2><p>За 10 лет работы программистом я привык, что «настоящая IDE» должна быть у меня локально, с тщательно настроенными плагинами. Однако чем дальше, тем больше я использую облачные решения. В одних случаях это экономит время на настройке окружения, в других — позволяет быстро работать даже на слабом устройстве, а в третьих — просто удобно для совместной разработки.</p><ul><li>Replit я использую, когда хочу быстро показать фрагмент кода на собеседовании или протестировать идею на маломальном языке, где нет желания ставить компилятор локально.</li><li>CodeSandbox прекрасно подходит для демонстрации и прототипирования фронтенд-проектов. Идеально, если нужно поделиться примером React или Vue-компонента.</li><li>GitHub Codespaces — моё решение для серьёзных проектов, где нужна стабильная облачная среда уровня VS Code, плюс глубокая интеграция с GitHub Actions и репозиториями.</li><li>JetBrains Fleet я «щупаю» как потенциальную легковесную замену IntelliJ IDEA, но с возможностью облачной синхронизации и удалённой мощью серверов JetBrains. Пока рано говорить о полной замене, но направление впечатляет.</li><li>StackBlitz — это «волшебство», когда нужно поднять Node.js в браузере. Очень люблю показывать StackBlitz на воркшопах по фронтенду, потому что всё запускается буквально за секунды.</li></ul><p>Какую из этих сред выбрать — зависит от задач и предпочтений. Если вы профессионал, который «сидит в одной IDE 8 часов в день», возможно, вы пока предпочтёте локальные решения. Но всё чаще облачные сервисы дают такую же мощь и удобство, причём сэкономив кучу времени на конфигурации. В любом случае, всем рекомендую попробовать, хотя бы ради эксперимента. Может оказаться, что облачная IDE для некоторых задач станет вашим новым любимым инструментом.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышла LLVM 19.1.0 – универсальный инструмент для компиляции и оптимизации кода</title>
      <link>https://tproger.ru/news/vywla-llvm-19-1-0---universalnyj-instrument-dlya-kompilyacii-i-optimizacii-koda</link>
      <comments>https://tproger.ru/news/vywla-llvm-19-1-0---universalnyj-instrument-dlya-kompilyacii-i-optimizacii-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywla-llvm-19-1-0---universalnyj-instrument-dlya-kompilyacii-i-optimizacii-koda</guid>
      <description><![CDATA[<p>Команда разработки LLVM объявила о релизе версии 19.1.0. В обновлении учтены основные компоненты проекта, такие как clang, lld, libc++ и MLIR</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywla-llvm-19-1-0---universalnyj-instrument-dlya-kompilyacii-i-optimizacii-koda">Вышла LLVM 19.1.0 – универсальный инструмент для компиляции и оптимизации кода</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 18 Sep 2024 19:49:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда разработки LLVM <a href="https://discourse.llvm.org/t/llvm-19-1-0-released/81285">объявила</a> о выходе версии 19.1.0 – первой в серии 19.x.</p><p>Обновление включает основные компоненты проекта LLVM, а также его подпроекты, такие как clang, lld, libc++ и MLIR.</p><p>Релиз стал результатом шести месяцев напряженной работы LLVM-сообщества. За этот период в проект внесли вклад 1502 уникальных автора, создав 18925 коммитов, добавив 3 605 729 строк кода и удалив 1 665 792.</p><h2>Благодарность сообществу</h2><p>Разработчики выразили огромную благодарность всем, кто так или иначе помог с этим релизом: от авторов кода до тех, кто проводил ревью и оказывал поддержку. Данный вклад помог сделать новую версию еще более функциональной и стабильной.</p><h2>Доступ к исходному коду и бинарникам</h2><p>Исходный код новой версии LLVM можно посмотреть на <a href="https://github.com/llvm/llvm-project/releases/tag/llvmorg-19.1.0">GitHub</a>.</p><p>Официальные бинарные файлы пока недоступны и появятся немного позже.</p><p>Для тех, кто нуждается в сторонних бинарниках, они будут размещены в специальной ветке форума проекта.</p><p>Стоит отметить, что они не проходят проверку со стороны менеджеров релиза, поэтому использовать их следует с осторожностью.</p><h2>Следующее обновление</h2><p>Ожидается, что следующий релиз версии 19.1.1 выйдет через две недели. Разработчики призвали сообщать обо всех найденных проблемах, относящихся к ветке 19.x, чтобы сделать будущее обновление более стабильным и надежным.</p>]]></content:encoded>
    </item>
    <item>
      <title>Какие новые фичи C++ появились в GCC 14</title>
      <link>https://tproger.ru/news/kakie-novye-fichi-c---poyavilis-v-gcc-14</link>
      <comments>https://tproger.ru/news/kakie-novye-fichi-c---poyavilis-v-gcc-14?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/kakie-novye-fichi-c---poyavilis-v-gcc-14</guid>
      <description><![CDATA[<p>Не так давно вышла новая версия GNU Compiler Collection — GCC 14.1. Обновление принесло немало новшеств, призванных улучшить компилятор и исправить ошибки

Вот самые интересные новые функции для языка C++, появившиеся в этой версии компилятора.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/kakie-novye-fichi-c---poyavilis-v-gcc-14">Какие новые фичи C++ появились в GCC 14</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 16 May 2024 05:56:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>7 мая вышла новая версия GNU Compiler Collection (GCC) 14.1. Как и в каждом крупном выпуске, GCC 14 приносит множество нововведений, улучшений и исправлений ошибок.</p><p>Вот самые интересные новые функции для языка C++, появившиеся в этой версии компилятора.</p><h2>Поддержка C++26</h2><h3>Бесконечные циклы без неопределенного поведения</h3><p>В C++26, как и в C, теперь разрешены тривиальные бесконечные циклы. Это изменение устраняет неопределенное поведение, которое возникало при написании низкоуровневого кода. Например, следующий код больше не вызывает такового:</p><h3>Статическое хранение для braced-инициализаторов</h3><p>Теперь компилятор может оптимизировать код, использующий std::initializer_list, уменьшая количество вызовов memcpy для копирования массивов. Это позволяет размещать массивы в статической памяти.</p><h3>Неоцененные строки</h3><p>GCC 14 поддерживает <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2361r6.pdf">P2361R6</a>, добавляющий понятие неоцененных строк.</p><p>Такие строки не используются во время выполнения программы и не конвертируются в исполняемую кодировку, что предотвращает использование числовых escape-последовательностей.</p><h3>Constexpr cast from void*</h3><p>Фича <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2738r1.pdf">P2738R1</a> позволяет выполнять кастинг из void* в constexpr коде, что упрощает использование различных трюков с type erasure.</p><h3>Пользовательские сообщения в static_assert</h3><p>Теперь можно использовать статические утверждения с пользовательскими сообщениями, что делает диагностику ошибок более удобной:</p><h2>Поддержка C++23</h2><h3>Deducing this</h3><p>Эта долгожданная функция позволяет добавлять явный параметр this к нестатическим членам функций, что упрощает их перегрузку и уменьшает дублирование кода:</p><h3>CTAD от наследуемых конструкторов</h3><p>GCC 14 теперь поддерживает <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2582r1.pdf">P2582R1</a>, что позволяет использовать аргумент-вывод для шаблонных классов с наследуемыми конструкторами.</p><p>Интересуетесь новыми возможностями и языками программирования? Возможно, позиция <a href="https://tproger.ru/jobs/golang-razrabotchik-deckhouse">Golang-разработчика (Deckhouse) в компанию Флант </a>будет для вас вариантом применить свои знания на практике и участвовать в разработке инновационных проектов</p>]]></content:encoded>
    </item>
    <item>
      <title>В Python 3.13.0a6 нашли встроенный JIT-компилятор</title>
      <link>https://tproger.ru/news/v-python-3-13-0a6-nawli-vstroennyj-jit-kompilyator</link>
      <comments>https://tproger.ru/news/v-python-3-13-0a6-nawli-vstroennyj-jit-kompilyator?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-python-3-13-0a6-nawli-vstroennyj-jit-kompilyator</guid>
      <description><![CDATA[<p>В альфа-версии Python 3.13.0a6 нашлось упоминание встроенного JIT-компилятора, который основан на архитектуре Copy-and-Patch.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-python-3-13-0a6-nawli-vstroennyj-jit-kompilyator">В Python 3.13.0a6 нашли встроенный JIT-компилятор</a>»</p>]]></description>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 Apr 2024 09:10:19 GMT</pubDate>
      <content:encoded><![CDATA[<p>Python 3.13.0a6 принес с собой экспериментальную функцию, которая может значительно повысить производительность языка — JIT-компилятор.</p><p><b>JIT (Just-In-Time) компилятор – </b>это инструмент, который компилирует код Python в машинный код «на лету», во время выполнения программы. Все это позволяет языку работать значительно быстрее, чем раньше.</p><h2>Как работает JIT-компилятор в Python?</h2><ul><li>в Python 3.13.0a6 он основан на архитектуре Copy-and-Patch.</li><li>инструмент компилирует байткод Python в машинный код, используя LLVM.<br /></li><li>JIT-компилятор генерирует код очень быстро и легко поддерживается.<br /></li><li>он полностью интегрирован с интерпретатором Python.<br /></li></ul><h2>Какие преимущества дает JIT-компилятор?</h2><p>Как минимум, он генерирует код в 5 раз быстрее, чем WebAssembly (Liftoff), в случае с Python 3.13.0a6. Да и результирующий код работает на 50% быстрее, чем код, скомпилированный с помощью устаревшего инструмента.</p><p>К тому же JIT-компилятор в Python 3.13.0a6 работает в 100 раз быстрее, чем традиционный JIT-инструментарий LLVM. Здесь результирующий код быстрее уже на 15%, чем тот, что скомпилирован с помощью LLVM.</p><h2>А как попробовать JIT-компилятор?</h2><p>Для начала нужно уточнить, что JIT-компилятор в Python 3.13.0a6 — это экспериментальная функция. Для его активации необходимо добавить опцию --enable-experimental-jit при сборке CPython.</p><p>Вам также потребуется установить LLVM в качестве дополнительной зависимости.</p><p>Скачать нужную версию Python можно по <a href="https://www.python.org/downloads/release/python-3130a6/">ссылке</a>.</p><p>Если вы хотите использовать свои навыки автоматизированного тестирования на переднем крае технологий, присоединяйтесь к команде в <a href="https://tproger.ru/jobs/tech-lead-aqa-2gis-pro">2GIS.PRO на позицию Tech Lead AQA</a>. Изучение новых возможностей Python 3.13.0a6 будет отличным дополнением к рабочему арсеналу.</p>]]></content:encoded>
    </item>
    <item>
      <title>Автокод Гленни. Каким был первый высокоуровневый язык программирования</title>
      <link>https://tproger.ru/articles/avtokod-glenni-kakim-byl-pervyj-vysokourovnevyj-yazyk-programmirovniya</link>
      <comments>https://tproger.ru/articles/avtokod-glenni-kakim-byl-pervyj-vysokourovnevyj-yazyk-programmirovniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/avtokod-glenni-kakim-byl-pervyj-vysokourovnevyj-yazyk-programmirovniya</guid>
      <description><![CDATA[<p>Рассказали, что такое автокод, кто придумал его первым и почему автокод можно считать первым современным языком программирования.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/avtokod-glenni-kakim-byl-pervyj-vysokourovnevyj-yazyk-programmirovniya">Автокод Гленни. Каким был первый высокоуровневый язык программирования</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[История IT]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 20 Sep 2023 11:00:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Автокод был разработан в 1950-х годах и представлял собой высокоуровневый язык программирования. Он был создан, чтобы облегчить процесс написания кода. Автокод позволял писать программы не на машинном языке и даже не на ассемблере, и это была инновация.</p><p>В общем-то, автокод стал первым языком программирования в том виде, в котором мы привыкли его видеть сегодня: появились буквенные обозначения операций.</p><p>В 50-е годы программисты писали код на машинном языке или ассемблере и работали напрямую с адресами памяти компьютера. Конечно, это было сложно и долго, а ошибиться можно было слишком легко. Каждая операция и адрес памяти задавались в виде числовых кодов, после чего их вручную размечали на перфокартах.</p><p>Автокод позволил программистам использовать более удобный и абстрактный способ описания операций для компьютера. Он стал использовать символические имена для операций, что делало код более понятным и легким для чтения.</p><p>Теперь программисты могли обращаться к переменным по именам, вызывать циклы и условные операторы.</p><h2>Кто придумал автокод</h2><p>Первый автокод был разработан Аликом Гленни в 1952 году для компьютера Mark I. Гленни работал в Манчестерском университете, и за свою жизнь успел приложить руку к множеству открытий в мире IT.</p><p>К примеру, вместе с Аланом Тьюрингом, знаменитым британским математиком, Гленни разработал компьютер Mark I, который был одним из первых компьютеров, хранящих программу для него прямо на борту.</p><figure><img src="https://media.tproger.ru/user-uploads/48741/2023-09-20/66f1da46-2a91-43b2-bc4e-3f8de9021656.jpeg" alt="" /><figcaption>Manchester Mark I</figcaption></figure><p>Первая версия Mark I была представлена в 1949 году, и именно для этого компьютера Гленни разработал высокоуровневый язык. Дело в том, что работать на Mark I было даже сложнее, чем на прочих компьютерах той поры, хотя все они были огромными шкафами без всякого интерфейса и принимали перфокарты.</p><p>Чтобы облегчить работу себе и коллегам, Гленни придумал первый современный язык программирования, который компилировался компьютером. При этом Гленни отмечал, что потеря эффективности автокода по сравнению с машинным языком составляла не более 10%.</p><p>Вот, как выглядел автокод Гленни:</p><p>После работы в Манчестере, Гленни перешел в Исследовательский институт атомного оружия, где в начале 60-х годов разрабатывал компиляторы для FORTRAN и компьютеров IBM.</p><p>Автокод Гленни не был единственным автокодом. Условно говоря, автокоды скорее являются семейством первых высокоуровневых языков программирования, которые поддерживали абстракцию и могли компилироваться.</p><p>Автокодов была целая куча. Все дело в том, что они разрабатывались под конкретные ЭВМ, потому что все они были устроены по-разному. Если Гленни создал свой автокод для Mark I, то для IBM он бы уже не работал.</p><h2>Примеры программ на Автокоде Гленни</h2><p>Пример простой программы на Автокоде Гленни, складывающей два числа:</p><p>Пример цикла на Автокоде Гленни, вычисляющего факториал числа:</p><p>Пример условной конструкции на Автокоде Гленни, проверяющей четность числа:</p><h2>Что общего между автокодами и современными языками программирования</h2><p>Впоследствии программисты смогли доработать автокод Гленни и даже сделать его модульным. Вот, почему можно считать автокоды частью огромного семейства современных языков программирования:</p><ol><li>Автокоды поддерживали абстракции. Также они включали в себя синтаксические конструкции для работы с данными, операциями и структурами.</li><li>У автокодов была схожая с современными языками программирования синтаксис и структура.</li><li>Поздний автокод можно было переносить на разные платформы. Его можно было запускать на разных компьютерах, и он работал без изменений.</li><li>Автокод предлагал оптимизацию и определение типов данных, которые делали код эффективнее. Все, как в современных языках программирования.</li><li>Автокод, как и современные языки, в конце концов стал модульным: его можно было использовать в разных проектах и интегрировать с библиотеками и фреймворками. Автокод можно было поделить на функции и модули, чтобы перенести в другие проекты.</li></ol><h2>Немного о судьбе Алика Гленни</h2><p>После того, как Гленни покинул Манчестерский университет, разработка автокода не закончилась. Уже в 1955 году Тони Брукер представил собственную версию автокода для того же Mark I.</p><p>Позже Брукер написал научную статью, в которой не стал упоминать Гленни как одного из людей, который приложил руку к созданию автокода.</p><p>В Википедии статья про Гленни ограничивается парой абзацев. В Британнике у Алика Гленни нет даже отдельной статьи, только <a href="https://www.britannica.com/biography/Alick-Glennie">одно упоминание</a>.</p><p>Он умер в 2003 году.</p>]]></content:encoded>
    </item>
    <item>
      <title>Онлайн-компиляторы мертвы. Да здравствуют онлайн-компиляторы</title>
      <link>https://tproger.ru/articles/onlajn-kompilyatory-python-mertvy-da-zdravstvuyut-onlajn-kompilyatory-python</link>
      <comments>https://tproger.ru/articles/onlajn-kompilyatory-python-mertvy-da-zdravstvuyut-onlajn-kompilyatory-python?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лена Капаца]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/onlajn-kompilyatory-python-mertvy-da-zdravstvuyut-onlajn-kompilyatory-python</guid>
      <description><![CDATA[<p>Составили список из шести отличных онлайн-компиляторов Python и указали их ключевые функции, плюсы и минусы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/onlajn-kompilyatory-python-mertvy-da-zdravstvuyut-onlajn-kompilyatory-python">Онлайн-компиляторы мертвы. Да здравствуют онлайн-компиляторы</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 May 2023 10:50:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы думаете, что онлайн-компилятор – это тот грустный сайт с плохим UI, на котором однажды был запущен ‘hello world’? Не тут-то было. Пока мы ругаемся с VSCode и системными разрешениями на исполнение, да подолгу ищем нужную кнопку в PyCharm, онлайн-компиляторы подросли и заматерели.</p><p>Вот список шести отличных онлайн-компиляторов Python вместе с их ключевыми функциями.</p><h2>repl.it</h2><p>Относительно молодой продукт, уподобляющий свой интерфейс под GitHub и прочие системы версионирования. За последний месяц платформу посетило 84 тысячи человек.</p><p>Плюсы:</p><ul><li>Удобный интерфейс с темной темой.</li></ul><ul><li>Поддерживает множество других языков наряду с Python.</li></ul><ul><li>Совместное редактирование кода.</li></ul><ul><li>Встроенный отладчик и терминал.</li></ul><ul><li>Поставляется со встроенным менеджером пакетов.</li></ul><p>Минусы:</p><ul><li>За пару секунд до компилятора не добраться, приходится авторизовываться.</li></ul><ul><li>Панель управления — космолет, легко запутаться.</li></ul><h2>colab.research.google.com</h2><p>Многослойное решение от Google, которое завораживает своей кажущейся простотой. На деле же Колаб уверенно держится в тройке победителей засчет массированного финансирования Google. На курсах машинного обучения преподаватели используют именно его.</p><p>Плюсы:</p><ul><li>Предоставляет бесплатный GPU (графический процессор).</li></ul><ul><li>Встроенное версионирование в духе Google Docs.</li></ul><ul><li>Логика и интерфейс «Поделиться» наследуются от Google Диска.</li></ul><ul><li>Автозаполнение и интерактивные виджеты (например, «причесывание таблицы»).</li></ul><ul><li>Импорт популярных библиотек без установки.</li></ul><p>Минусы:</p><ul><li>Зачастую выделенных мощностей не хватает даже для данных, не считающихся «большими». Страница «замораживается».</li></ul><h2>pythonanywhere.com (от Anaconda)</h2><p>Развиваемый минимальным составом компилятор от монстра Anaconda.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/62c31fab-6b84-4c70-951f-bca5e01eedaa.png" alt="" /><figcaption>Дашборд</figcaption></figure><p>Плюсы:</p><ul><li>Позволяет запустить bash / среду Python 3.x / файл / ноутбук или даже веб-приложение.</li><li>Поставляется с предварительно настроенной средой с предустановленным большим набором полезных библиотек.</li></ul><ul><li>Бесплатный и платный тарифы.</li></ul><ul><li>Поддерживает просмотр веб-страниц и запуск веб-приложений.</li></ul><ul><li>Позволяет сохранять скрипты и делиться ими.</li></ul><p>Минусы:</p><ul><li>Невкусный интерфейс.</li></ul><h2>mybinder.org (Jupyter Notebook)</h2><p>Заточенная под развертывание готового кода среда, готовая “принять” ваш репозиторий и выделить под это контейнер Docker.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/0138db85-8dac-4bad-bd9c-0634053c97aa.png" alt="" /><figcaption>Окно импорта репозитория</figcaption></figure><p>Плюсы:</p><ul><li>Позволяет импорт напрямую из репозитория.</li></ul><ul><li>Запускается в браузере.</li></ul><ul><li>Поддерживает язык разметки Markdown и LaTeX.</li></ul><ul><li>Каждую ячейку можно запускать отдельно, что отлично подходит для отладки и итеративной разработки.</li></ul><p>Минусы:</p><ul><li>Работает только с репозиториями, в пустой компилятор для Hello World не пустит.</li></ul><h2>trinket.io</h2><p>Учебная платформа с интерфейсом, наводящим на мысли о плохом UX.</p><figure><img src="https://media.tproger.ru/uploads/2023/05/5b2326c5-871e-4671-bdb0-60dc37410ca7.png" alt="" /><figcaption>Непосредственно компилятор Trinket</figcaption></figure><p>Плюсы:</p><ul><li>Позволяет встраивать сниппеты на свой сайт.</li><li>Эмулятор Sense Hat для Raspberry Pi (одноплатные компьютеры размером с банковскую карту и разъемом для вывода на экран).</li></ul><ul><li>Поддерживает Python 2.7 — 3.x.</li></ul><ul><li>Предоставляет библиотеку примеров и проектов.</li></ul><p>Минусы:</p><ul><li>Устаревший и непродуманный UI – добраться до компилятора займет пару минут.</li></ul><h2>glot.io</h2><p>Многоязыковой компилятор, предоставляющий самый быстрый доступ к среде исполнения кода.</p><p>Плюсы:</p><ul><li>Пускает в компилятор сразу, без регистрации и лабиринта из переходов.</li><li>Поддерживает несколько языков программирования, включая Python.</li></ul><ul><li>Простой и понятный интерфейс.</li></ul><ul><li>Запускает фрагменты кода без создания учетной записи.</li></ul><ul><li>Позволяет вам сохранять фрагменты кода (известные как «gists») для дальнейшего использования.</li></ul><p>Минусы:</p><ul><li>Не поддерживает импорт из репозитория.</li></ul><p>У каждого решения есть свои достоинства и недостатки. Выбор будет зависеть, конечно, от конкретных потребностей задачи. Возможность использования компилятора в онлайне – все еще спорный вопрос. С широким распространением облачных технологий некоторым удалось вдохнуть в онлайн-компиляторы новую жизнь.</p>]]></content:encoded>
    </item>
    <item>
      <title>Изобретатели компилятора получат Премию Тьюринга и 1 миллион долларов</title>
      <link>https://tproger.ru/news/izobretateli-kompiljatora-poluchat-premiju-tjuringa-i-1-million-dollarov</link>
      <comments>https://tproger.ru/news/izobretateli-kompiljatora-poluchat-premiju-tjuringa-i-1-million-dollarov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/izobretateli-kompiljatora-poluchat-premiju-tjuringa-i-1-million-dollarov</guid>
      <description><![CDATA[<p>Ассоциация вычислительной техники наградила Альфреда Ахо и Джеффри Ульмана за создание компилятора и учебники, обучившие поколения студентов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/izobretateli-kompiljatora-poluchat-premiju-tjuringa-i-1-million-dollarov">Изобретатели компилятора получат Премию Тьюринга и 1 миллион долларов</a>»</p>]]></description>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Премия Тьюринга]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 01 Apr 2021 05:00:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ассоциация вычислительной техники объявила победителей, которые получат Премию Тьюринга 2021. Ими стали два ветерана индустрии — Джеффри Ульман и Альфред Ахо.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/1.jpg" alt="" /><figcaption>Джеффри Ульман (слева) и Альфред Ахо (справа)</figcaption></figure><p>Организация решила наградить разработчиков за их, пожалуй, главное творение — компилятор. По мнению экспертов, именно его создание позволило современному миру стать таким, какой он есть сейчас.</p><blockquote>Без их разработки мы бы не смогли писать приложения для наших телефонов. У нас бы не было тех машин, на которых мы сегодня ездим.</blockquote><p>Исследователи также написали множество учебников. Они обучили целые поколения студентов тому, как разработка компьютерных программ отличается от электротехники или математики.</p><p>Премия Тьюринга выдаётся с 1966 года. Главным призом, помимо всеобщего признания единомышленников, является денежная награда — 1 млн долларов. Её Ульман с Ахо поделят между собой.</p><p>Источник: <a href="https://www.nytimes.com/2021/03/31/technology/turing-award-aho-ullman.html">The New York Times</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Как компилятор преобразует код на C в Assembler?</title>
      <link>https://tproger.ru/video/kak-kompiljator-preobrazuet-kod-na-c-v-assembler</link>
      <comments>https://tproger.ru/video/kak-kompiljator-preobrazuet-kod-na-c-v-assembler?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Олег Борисенков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/video/kak-kompiljator-preobrazuet-kod-na-c-v-assembler</guid>
      <description><![CDATA[<p>Автор видео с ручкой и бумагой сравнивает программу на C и её ассемблерный вид на примере вывода чисел Фибоначчи, объясняя машинный код.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/video/kak-kompiljator-preobrazuet-kod-na-c-v-assembler">Как компилятор преобразует код на C в Assembler?</a>»</p>]]></description>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Язык ассемблера]]></category>
      <category><![CDATA[Видео]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 03 Jan 2021 09:12:27 GMT</pubDate>
      <content:encoded><![CDATA[<p>Автор видео, используя только ручку и бумагу, сравнивает код на C и скомпилированный в Assembler. Он делает это на примере программы, которая выводит на экран <a href="https://tproger.ru/problems/finding-fibonacci/">числа Фибоначчи</a>.</p><p>В комментариях подсказывают, что в реальности машинный код получается более оптимизированным. <a href="https://godbolt.org/z/7dYv58">По этой ссылке</a> вы найдете компилятор из языка Си в Assembler, который подсвечивает соответствующие друг другу строки программы на С и Assembler.</p><p>0:00 Как программа на C считает числа Фибоначчи</p><p>2:28 Как скомпилировать и дизассемблировать программу</p><p>3:20 Разбор машинного кода</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел LLVM 7.0.0</title>
      <link>https://tproger.ru/news/llvm-7-0-0</link>
      <comments>https://tproger.ru/news/llvm-7-0-0?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тимур Кондратьев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/llvm-7-0-0</guid>
      <description><![CDATA[<p>В релиз системы анализа и оптимизации программ вошли llvm-mca и llvm-exegesis для оценки производительности машинного кода и другие улучшения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/llvm-7-0-0">Вышел LLVM 7.0.0</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 21 Sep 2018 22:10:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики <a href="https://www.llvm.org/">LLVM</a>, универсальной <a href="https://habr.com/post/47878/">системы</a> анализа, трансформации и оптимизации программ, <a href="http://releases.llvm.org/7.0.0/docs/ReleaseNotes.html">объявили</a> о выходе версии 7.0.0. Среди нативных инструментов появились llvm-mca и llvm-exegesis для оценки производительности машинного кода, прошла оптимизация преобразования вещественных чисел в целые, а также отключена принудительная интеграция с Visual Studio.</p><h3>Что нового в LLVM 7.0?</h3><ul><li>В Windows появился отдельный набор инструментов для Visual Studio — <a href="https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.llvm-toolchain">LLVM Compiler Toolchain</a>. Как следствие, пропала необходимость принудительно интегрировать LLVM в среду разработки.</li><li>Утилита llvm-rc улучшена для сокращения количества инструментов, необходимых для создания Windows-приложений с помощью фреймворка.</li><li>Оптимизирован механизм преобразования чисел с плавающей точкой в целые числа. Улучшение может повлечь за собой проблемы в местах, где разработчики полагались на неожиданное поведение кода. Во избежание проблем создан новый переключатель в командной строке Clang:</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/09/Screenshot_2018-09-21-LLVM-7-0-0-Release-Notes-LLVM-7-documentation.png" alt="" /></figure><ul><li>Значительный прирост в скорости работы компоновщика lld, который теперь поддерживает форматы ELF (Unix), COFF (Windows) и MinGW. lld/COFF уже применяется для формирования официальных сборок Chrome и Firefox, а lld/ELF появится по умолчанию для компоновки компонентов в следующей версии FreeBSD.</li><li>Новый инструмент <a href="http://releases.llvm.org/7.0.0/docs/CommandGuide/llvm-mca.html">llvm-mca</a> для прогнозирования количества ресурсов компьютера, которые тратит машинный код, на различных процессорах.</li><li>Появление llvm-exegesis для оценки работы набора команд данных архитектур.</li></ul><p>С этими и другими обновлениями новой версии набора компиляторов можно ознакомиться в <a href="http://releases.llvm.org/7.0.0/docs/ReleaseNotes.html">списке изменений</a> выпуска.</p><p>В начале сентября 2018 года <a href="https://tproger.ru/news/kotlin-native-v09-release/">вышло</a> обновление LLVM-бэкенда Kotlin/Native для компилятора языка. Среди нововведений — простейшие элементы параллелизма, а также работа с компилятором и стандартными библиотеками Kotlin 1.3-M2.</p>]]></content:encoded>
    </item>
    <item>
      <title>Компилятор фреймворков для ИИ Glow от Facebook получил поддержку от Intel и Qualcomm</title>
      <link>https://tproger.ru/news/glow-facebook</link>
      <comments>https://tproger.ru/news/glow-facebook?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Артем Гаврилов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/glow-facebook</guid>
      <description><![CDATA[<p>Открытый проект Glow помогает создавать и оптимизировать фреймворки для ИИ и машинного обучения; поддержку объявили Cadence, Esperanto, Intel и Marvell.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/glow-facebook">Компилятор фреймворков для ИИ Glow от Facebook получил поддержку от Intel и Qualcomm</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 16 Sep 2018 20:39:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>Facebook опубликовала заявление о поддержке их компилятора Glow с открытым кодом компаниями Cadence, Esperanto, Intel, Marvell и Qualcomm. Разработка позволяет создавать и оптимизировать фреймворки, с помощью которых создаются продукты для ИИ и машинного обучения.</p><h3>Принцип работы</h3><p>Glow собирает вычислительные данные фреймворков и старается оптимизировать код каждого из них, независимо от аппаратных средств акселератора. Компилятор содержит программы и блоки, при помощи которых фреймворк выполняет несколько задач. Распределитель ресурсов памяти компьютера, к примеру, выделяет мощности индивидуально для каждого акселератора.</p><figure><img src="https://media.tproger.ru/uploads/2018/09/glow.jpg" alt="" /></figure><h3>Устройство акселераторов</h3><p>Аппаратные ускорители необходимы для выполнения задач машинного обучения. Благодаря функциональным модулям, блокам памяти в чипе и специальных схемам для приложений, они способны эффективно достигать поставленных целей.</p><figure><img src="https://media.tproger.ru/uploads/2018/09/slide61.gif" alt="" /></figure><p>Для этого акселераторам необходимо организовать работу всех частей. Поэтому акселераторы вроде фреймворка PyTorch нуждаются в компиляторе.</p><figure><img src="https://media.tproger.ru/uploads/2018/09/slide131.gif" alt="" /></figure><p>Исследователи Facebook <a href="https://tproger.ru/news/pytorch-1-0-announced/">анонсировали</a> выход версии 1.0 библиотеки PyTorch в начале мая 2018 года. Они предполагали, что крупное обновление поможет облегчить переход от этапа исследований к разработке приложений.</p>]]></content:encoded>
    </item>
    <item>
      <title>Онлайн-компиляторы для разных языков: выполняем код прямо в браузере</title>
      <link>https://tproger.ru/digest/compile-code-online</link>
      <comments>https://tproger.ru/digest/compile-code-online?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/compile-code-online</guid>
      <description><![CDATA[<p>Подборка лучших онлайн-компиляторов для Python, JavaScript, Java, PHP и других языков. Запускайте и тестируйте код прямо в браузере.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/compile-code-online">Онлайн-компиляторы для разных языков: выполняем код прямо в браузере</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 Aug 2018 17:01:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Отобрали лучшие онлайн-компиляторы. Некоторые из них умеют работать с десятками языков программирования, другие заточены под конкретные технологии.</p><p>• Мультиязычные компиляторы (Repl.it, JDoodle, Ideone) поддерживают 50+ языков и подходят для быстрых экспериментов
• Для Python, JavaScript, PHP и Java есть специализированные онлайн-IDE с отладкой и автодополнением
• Большинство сервисов бесплатны и работают прямо в браузере без установки
• Онлайн-компиляторы удобны для обучения, собеседований и совместной работы над кодом</p><p>Содержание:</p><ul><li><a href="https://tproger.ru/#part1">Мультиязычные онлайн-компиляторы</a></li><li><a href="https://tproger.ru/#part2">Python онлайн-компиляторы</a></li><li><a href="https://tproger.ru/#part3">JavaScript онлайн-компиляторы</a></li><li><a href="https://tproger.ru/#part4">PHP онлайн-компиляторы</a></li><li><a href="https://tproger.ru/#part5">Java онлайн-компиляторы</a></li></ul><h2>Мультиязычные онлайн-компиляторы</h2><p><a href="https://repl.it/">Repl.it</a> — среда для совместной работы с кодом в браузере. Поддерживает более 50 языков, среди которых C, C++, C#, Java, Python, R, JavaScript.</p><p>Особенности:</p><ul><li>Есть шаблоны — например, для Django, React.js, Vue, Rails.</li><li>Интеграция с GitHub — можно открывать свои репозитории сразу на Repl.it.</li><li>Возможность поделиться проектом с другими пользователями, есть режим совместной работы.</li></ul><p>В бесплатной версии доступно многопользовательское сотрудничество, 500 МБ хранилища и 500 МБ памяти, 0.2 – 0.5 vCPUs. Есть также платная версия с приватными проектами, хостингом до 5 реплов, 5 ГБ хранилища, 2 ГБ памяти и 2 vCPUs.</p><p>Если нужны не только языки программирования, но и интерактивные терминалы для работы с MySQL и MongoDB, попробуйте сервис <a href="https://www.jdoodle.com/">JDoodle.</a> Это инструмент для онлайн-обучения, у которого есть режим совместного использования. Вы можете компилировать код на разных языках и разбираться с базами данных прямо в браузере.</p><figure><img src="https://media.tproger.ru/uploads/2018/08/jdoodle.png" alt="" /><figcaption>Пример кода на Pascal</figcaption></figure><p>Если нужен не только компилятор, но и другие технологии, попробуйте сервис <a href="https://www.tutorialspoint.com/codingground.htm">Coding Ground.</a> Эта платформа предоставляет доступ к 75+ языкам программирования и технологиям. Вы можете использовать встроенный редактор Markdown и запускать Bash Shell в браузере. Кроме того, на сайте есть учебные материалы, в том числе бесплатные справочники и платные видеокурсы.</p><p>Ещё один мощный сервис — Ideone. Это онлайн-компилятор и инструмент отладки, который позволяет прямо в браузере выполнять код на более чем 60 языках программирования и их версиях.</p><p>Особенности:</p><ul><li>Поддерживаются не только популярные языки, но и Ассемблер, Ada95, COBOL, Fortran и т.д.</li><li>Есть шаблоны и примеры кода.</li><li>Можно выбрать режим доступности кода: общедоступный, частный, секретный (только по ссылке).</li></ul><p>В Ideone есть ряд ограничений для пользователей. Например, время компиляции/интерпретации не должно превышать 10 секунд. Максимальное время исполнения для гостей — 5 секунд, для зарегистрированных пользователей — 15 секунд. Размер выделенной оперативной памяти не превышает 256 МБ.</p><h2>Python онлайн-компиляторы</h2><p>Для проверки кода на Python подходит сервис <a href="https://www.online-python.com/">Online Python</a>. Здесь представлена простая IDE, которая поддерживает загрузку с компьютера и скачивание кода в виде файла с расширением *.py. Вы можете работать над проектом совместно с коллегами, поделившись ссылкой. В редакторе поддерживается тёмная тема.</p><p>В многоязычных компиляторах тоже очень хорошая поддержка Python. Например, на Repl.it есть вторая и третья версии языка, Python with Turtle для обучения, фреймворк PyGame  и движок Pyxel для создания игр, библиотека Tkinter для разработки графического интерфейса, а также шаблоны для Django, Multi-Page Flask и даже ботов для Discord.</p><h2>JavaScript онлайн-компиляторы</h2><p>Если вам нужен JavaScript онлайн-компилятор, то <a href="https://jsfiddle.net/">JSFiddle</a> — один из лучших вариантов. Он позволяет проверить любое сочетание JavaScript, HTML и CSS.</p><p>Особенности:</p><ul><li>Поддержка библиотек и фреймворков: Angular, React, Vue, Lodash, jQuery.</li><li>Поддержка CSS, SCSS, SASS, PostCSS, Normalized CSS.</li><li>Режим совместной работы над проектом.</li></ul><p>JavaScript, как и Python, есть во всех многоязычных онлайн-компиляторах. Так что если вам не требуется поддержка препроцессоров и постпроцессоров, библиотек и фреймворков, то можно выбрать любой сервис.</p><h2>PHP онлайн-компиляторы</h2><p>Лучший выбор для проверки кода на PHP — <a href="https://sandbox.onlinephpfunctions.com/">Sandbox на сайте Online PHP Functions</a>. Здесь можно выбрать версию языка, начиная с 4.4.9 и до последней. На сайте также есть подсказки по функциям PHP. Они выполнены в виде шпаргалок, разбитых на темы: Arrays, Date and Time, Math и так далее. Есть и пошаговые туториалы.</p><p>Выполнить код на PHP можно и с помощью многоязычных онлайн-компиляторов. Однако они не предлагают такой большой выбор версий. Более того, практически везде отсутствует последняя версия языка.</p><h2>Java онлайн-компиляторы</h2><p>Если требуется Java онлайн-компилятор, попробуйте <a href="https://www.codiva.io/">Codiva.io</a>. В нём нет такого разнообразия языков, как на других сервисах. Кроме Java поддерживаются только C и C++.</p><p>Особенности:</p><ul><li>Компиляция кода по мере его ввода.</li><li>Поддержка автозаполнения на Java.</li><li>Есть консоль для интерактивного ввода данных пользователем.</li></ul><p>Можно также использовать компилятор Java на сайте <a href="https://www.onlinegdb.com/online_java_compiler">OnlineDGB</a>. Здесь есть встроенный отладчик и автоматическое форматирование. Вы можете поделиться примерами кода с другими пользователями, сохранить их или скачать в виде файла с расширением *.java.</p><h2>Часто задаваемые вопросы</h2><h3>Можно ли использовать онлайн-компиляторы для серьёзной разработки?</h3><p>Онлайн-компиляторы подходят для прототипирования, обучения и быстрой проверки идей. Для полноценной разработки лучше использовать локальные IDE — они обеспечивают работу с файловой системой, отладчиком, системами контроля версий и не имеют ограничений по времени выполнения и памяти.</p><h3>Безопасно ли выполнять код в онлайн-компиляторах?</h3><p>Большинство сервисов запускают код в изолированных песочницах (sandbox), что обеспечивает безопасность. Тем не менее не стоит вставлять в них пароли, API-ключи и другие конфиденциальные данные — код может сохраняться на серверах сервиса или быть доступным другим пользователям по ссылке.</p><h3>Какой онлайн-компилятор лучше выбрать новичку?</h3><p>Для начинающих лучше всего подойдёт Repl.it — он поддерживает множество языков, имеет понятный интерфейс и встроенные шаблоны для популярных фреймворков. Если вы изучаете конкретный язык, выбирайте специализированный компилятор: Online Python для Python, JSFiddle для JavaScript, Codiva.io для Java.</p><p>Чтобы сделать процесс разработки более эффективным, используйте также <a href="https://tproger.ru/digest/podborka-poleznyh-servisov-dlja-programmistov">полезные сервисы для программистов</a>. Как и онлайн-компиляторы, они помогают сэкономить время на решении разных задач.</p>]]></content:encoded>
    </item>
    <item>
      <title>Открыт исходный код C++ компилятора Zapcc</title>
      <link>https://tproger.ru/news/open-source-zapcc</link>
      <comments>https://tproger.ru/news/open-source-zapcc?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даниил Шатухин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/open-source-zapcc</guid>
      <description><![CDATA[<p>Компилятор на базе Clang и LLVM кэширует этапы сборки: пересборка Boost.Math проходила в 10–50 раз быстрее по сравнению с Clang.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/open-source-zapcc">Открыт исходный код C++ компилятора Zapcc</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 18 Jun 2018 15:39:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Ceemple Software <a href="https://github.com/yrnkrn/zapcc">выложила</a> в открытый доступ исходный код C++ компилятора <a href="https://www.zapcc.com/about/company/">Zapcc</a>. Программа основана на наработках <a href="https://ru.wikipedia.org/wiki/Clang">Clang/</a><a href="https://ru.wikipedia.org/wiki/Low_Level_Virtual_Machine">LLVM</a>. Компилятор может быть использован в качестве замены Clang и GCC, а также способен взаимодействовать с любыми системными сборками. Исходники распространяются под лицензией LLVM.</p><h3>Особенности компилятора Zapcc</h3><p>Увеличение скорости сборки заметно для проектов, написанных на C++ с применением шаблонов и большого количества заголовочных файлов. Для языка Си ускорение менее явное. Во время проверки производительности компилятора пересборка Boost.Math с использованием Zapcc проходила в 10–50 раз быстрее по сравнению с Clang. ПО актуально только для проектов на C++, так как для кода на языке Си кэширование отключается.</p><p>Благодаря специальному фоновому процессу zapccs система имеет возможность компилировать код и поддерживать в оперативной памяти кэш компиляции всех этапов сборки. На выходе качество и производительность итогового генерируемого кода аналогичны Сlang.</p><p>C++ — язык программирования, представленный в 1983 году и активно используемый по сей день. В марте 2017 года группа WG21 <a href="https://tproger.ru/news/cpp-17-officially-approved/">приняла</a> стандарт C++17.</p>]]></content:encoded>
    </item>
    <item>
      <title>Представлен релиз свободного набора компиляторов GCC 8.1</title>
      <link>https://tproger.ru/news/gcc-8-1-released</link>
      <comments>https://tproger.ru/news/gcc-8-1-released?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Наташа Маркова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/gcc-8-1-released</guid>
      <description><![CDATA[<p>В GCC 8.1 появились улучшенные средства диагностики, новые механизмы оптимизации и поддержка некоторых возможностей будущего стандарта C++2a.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/gcc-8-1-released">Представлен релиз свободного набора компиляторов GCC 8.1</a>»</p>]]></description>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 May 2018 12:05:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Спустя год после выхода <a href="https://tproger.ru/news/gcc-7-1-release/">GCC 7.1</a>, <a href="https://gcc.gnu.org/ml/gcc-announce/2018/msg00001.html">опубликован</a> новый релиз свободного набора компиляторов GCC 8.1 с расширением средств диагностики, реализацией некоторых опций будущего стандарта C++2a и другими функциями.</p><h3>Поддержка стандартов C++</h3><p>В libstdc++ появились новые возможности стандартов <a href="https://ru.wikipedia.org/wiki/C%2B%2B17">C++17</a>, такие, как std::filesystem, std::char_traits, std::to_chars, std::from_chars, а также экспериментального <a href="https://gcc.gnu.org/projects/cxx-status.html#cxx2a">C++2a</a>: std::to_address и std::endian. Добавлена поддержка расширений математических функций __gnu_cxx::airy_ai и __gnu_cxx::airy_bi.</p><h3>Оптимизация</h3><p>Механизм <a href="https://ru.wikipedia.org/wiki/Profile-guided_optimization">PGO</a> генерирует улучшенный код на основе анализа особенностей его выполнения. Режим оптимизации -freorder-blocks-and-partition на системах x86/x86-64 разделяет тело функции на «горячие» и «холодные» области выполнения. Он применяется по умолчанию, начиная с уровня «<a href="https://wiki.gentoo.org/wiki/GCC_optimization/ru#-O">-O2</a>». Также в системе оптимизации улучшен способ представления отладочной информации в формате <a href="https://en.wikipedia.org/wiki/DWARF">DWARF</a>.</p><h3>Диагностика</h3><p>Расширенные средства диагностики точнее находят конфликты в коде и предлагают подсказки по их устранению. Например, теперь в случае пропущенных скобок } и ) компилятор указывает на место возможного пропуска. В случае обращения к приватным полям класса или структурам выдается подсказка по использованию функции-обертки. Конфликтующие типы шаблонов выделяются цветом или отображаются в виде иерархии.</p><h3>Архитектуры</h3><p>Для ARM64 появилась поддержка механизма <a href="https://community.arm.com/processors/b/blog/posts/technology-update-the-scalable-vector-extension-sve-for-the-armv8-a-architecture">SVE</a> с расширенными инструкциями для векторной обработки данных. Внесена поддержка архитектур Armv8-R, Armv8.3-A и Armv8.4-A, а также процессоров Arm Cortex серий A75, A55 и R52.</p><h3>Новые расширения</h3><p>Добавлена поддержка процессоров Intel Cannon Lake c расширениями AVX512VBMI, AVX512IFMA и SHA ISA. Intel Ice Lake поддерживается c AVX512VNNI, GFNI, VAES, AVX512 VBMI2 и другими расширениями. <a href="https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf">CET</a> (Intel Control-flow Enforcement Technology) для систем x86 активируется при помощи опций -mibt, -mshst и -mcet.</p><p>С полным списком изменений в новой версии можно ознакомиться на <a href="https://gcc.gnu.org/gcc-8/changes.html">официальном сайте</a> разработчиков.</p><p>Напомним, что предыдущая версия компилятора — 7.3 <a href="https://tproger.ru/news/gcc-with-spectre-v2-mitigation-support/">вышла</a> в январе 2018 года. Разработчики внедрили в GCC защиту от атак типа Spectre, а также устранили проблемы с совместимостью.</p>]]></content:encoded>
    </item>
    <item>
      <title>Представлен GCC 7.3 с защитой от второй версии Spectre</title>
      <link>https://tproger.ru/news/gcc-with-spectre-v2-mitigation-support</link>
      <comments>https://tproger.ru/news/gcc-with-spectre-v2-mitigation-support?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Хачатурян]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/gcc-with-spectre-v2-mitigation-support</guid>
      <description><![CDATA[<p>GNU Compiler Collection 7.3 добавила поддержку Retpoline для x86 и PowerPC, новые переключатели компилятора и 99 исправлений ошибок.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/gcc-with-spectre-v2-mitigation-support">Представлен GCC 7.3 с защитой от второй версии Spectre</a>»</p>]]></description>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Чипокалипсис]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Jan 2018 19:16:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики <a href="https://www.phoronix.com/scan.php?page=news_item&amp;px=GCC-7.3-Released">выпустили</a> GNU Compiler Collection версии 7.3 c исправлением ошибок, а также устранением регрессивных изменений и проблем с совместимостью.</p><h3>Особенности</h3><p>Поддержка технологии Retpoline для защиты от второй версии атаки типа Spectre (CVE 2017-5715) на системах x86 и PowerPC добавила в компилятор несколько новых переключателей, а именно: -mindirect-branch, -mfunction-return и -mindirect-branch-register для обхода спекулятивного исполнения кода. Помимо патчей, в GCC 7.3 <a href="https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&amp;resolution=FIXED&amp;target_milestone=7.3">представлено</a> 99 исправлений багов.</p><p>От разработчиков все еще ожидается внедрение поддержки портирования патчей Spectre на более старые версии GCC. Несмотря на немалое число фиксов, в новом цикле GCC 7.4 присутствует более 200 неисправностей.</p>]]></content:encoded>
    </item>
    <item>
      <title>Выпущен компилятор Zinc 1.0 для Scala</title>
      <link>https://tproger.ru/news/zinc-1-0-scala-compiler</link>
      <comments>https://tproger.ru/news/zinc-1-0-scala-compiler?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Хачатурян]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/zinc-1-0-scala-compiler</guid>
      <description><![CDATA[<p>Инкрементальный компилятор Zinc 1.0 анализирует зависимости исходного кода по классам и сокращает сборку Scala-проектов до 40 раз.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/zinc-1-0-scala-compiler">Выпущен компилятор Zinc 1.0 для Scala</a>»</p>]]></description>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Scala]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 07 Nov 2017 11:59:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Zinc — это инкрементальный компилятор для Scala. Большинство Scala-разработчиков даже не замечают, что используют его практически ежедневно: в <a href="https://github.com/sbt/zinc">sbt</a>, <a href="https://github.com/pantsbuild/pants">pants</a>, <a href="https://github.com/cvogt/cbt">CBT</a>, <a href="https://github.com/Jetbrains/intellij-scala">IntelliJ</a> и <a href="https://github.com/scala-ide/scala-ide">Scala IDE</a>.</p><p>У этого инструмента единственная цель — максимально сократить время сборки без ущерба для корректности исполнения. При изменении исходного кода Zinc анализирует все зависимости и компилирует подмножество исходных файлов, на которые оказали влияние внесённые правки. Таким образом сгенерированный код получается абсолютно идентичным выходу чистой компиляции.</p><p>3 ноября разработчики представили новую, усовершенствованную версию компилятора — Zinc 1.0.</p><p>Ключевая особенность v1.0 — анализ зависимостей на основе классов. Этот механизм был разработан для более рафинированной обработки зависимостей, исключающей общие случаи излишней компиляции. Сравнительные тесты показали, что новый механизм сокращает процесс сборки до 40 раз.</p><h3>Пример семикратного увеличения скорости</h3><p>И что же в ней такого особенного? Для сравнения были взяты две версии Zinc: 0.13.x и 0.1.x.</p><p>Исходные данные: <a href="http://www.scalatest.org/">ScalaTest</a>, основной модуль которой состоит из 40 377 строк кода на Scala (не считая комментариев и пустых строк).</p><p>Испытание: обычная операция в любой кодовой базе — добавление метода.</p><p>В данном случае стоит задача добавить новый метод к классу с большим числом зависимостей (вроде AndHaveWord в Matcher.scala) после корректного «разогрева» компилятора и компиляции проекта.</p><p>Насколько быстро с этим справится v0.13.x?</p><figure><img src="http://www.scala-lang.org/resources/img/blog/zinc-0.13-scalatest.gif" alt="" /></figure><p>Инкрементальная компиляция заняла у нее 21 секунду. Настала очередь нового алгоритма.</p><figure><img src="http://www.scala-lang.org/resources/img/blog/zinc-1.0-scalatest.gif" alt="" /></figure><p>Эта версия завершила перекомпиляцию всего лишь за 3 секунды. В данном примере Zinc 1.0.0 оказался быстрее своего предшественника в 7 раз.</p><p>Подобные эксперименты дают совершенно разные результаты, зависящие от особенностей Scala и используемой архитектуры. Но главная идея в здесь том, что разработчикам можно смело ожидать увеличения скорости компиляции при решении ежедневных задач. Больше всего от этого выигрывают проекты Scala на основе cake pattern или интенсивного <a href="http://slick.lightbend.com/talks/scalaio2014/Type-Level_Computations.pdf">type-level</a> программирования. По словам тестировавших алгоритм программистов, в некоторых проектах скорость компиляции в Zinc 1.0 превосходила скорость старой версии в 22 раза.</p><h3>Краткий список нововведений</h3><p>В ходе работы над новой версией инкрементального компилятора были выполнены следующие задачи:</p><ul><li>Усовершенствован инкрементальный алгоритм: устранены «узкие места», которые раньше не удавалось скомпилировать до конца;</li><li>Исправлены баги в инкрементальной компиляции Scala bridge и Java;</li><li>Улучшена обработка type-level программ;</li><li>Усовершенствованы старые Zinc API и созданы дружественные API для дополнения недостающего функционала общего доступа;</li><li>Закончена миграция к Scala 2.12. Zinc подготовлен для JDK8;</li><li>Добавлен анализ на основе протокола передачи данных с долгосрочной бинарной поддержкой.</li></ul><p>С полным списком улучшений можно ознакомиться <a href="https://github.com/sbt/zinc/pulls?utf8=%E2%9C%93&amp;q=author%3Ajvican%20is%3Ap://github.com/sbt/zinc/pulls?utf8=%E2%9C%93&amp;q=author%3Ajvican%20is%3Apr">здесь</a>.</p><p>Новая версия Zinc уже доступна в sbt 1.0.</p>]]></content:encoded>
    </item>
    <item>
      <title>Amazon представила компилятор NNVM для фреймворков машинного обучения</title>
      <link>https://tproger.ru/news/amazon-new-compiler-nnvm</link>
      <comments>https://tproger.ru/news/amazon-new-compiler-nnvm?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/amazon-new-compiler-nnvm</guid>
      <description><![CDATA[<p>Компилятор NNVM переводит описания нейронных сетей из Keras, Caffe, Apache MXNet и ONNX в код для CUDA, OpenCL, Metal и LLVM.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/amazon-new-compiler-nnvm">Amazon представила компилятор NNVM для фреймворков машинного обучения</a>»</p>]]></description>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 09 Oct 2017 13:45:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>На данный момент существует широкий выбор фреймворков для разработки алгоритмов машинного обучения. Также есть возможность запускать код на огромном количестве устройств: от мобильных телефонов до облачных дата-центров. Это разнообразие является проблемой для разработчиков ИИ.</p><p>Во-первых, необходимо поддерживать на должном уровне работу многих фреймворков. Во-вторых, нужно гарантировать высокую производителность на разном железе, используя портируемый код, который подойдёт как для запуска в веб-браузере, так и на видеокартах дата-центров. В-третьих, необходимо убедиться, что работа фреймворков будет обеспечена на ещё не вышедшем железе.</p><h3>Компилятор всему голова</h3><p>Amazon считает, что ключом к решению подобных проблем является используемый компилятор. Группа исследователей Вашингтонского университета и AWS <a href="https://aws.amazon.com/ru/blogs/ai/introducing-nnvm-compiler-a-new-open-end-to-end-compiler-for-ai-frameworks/">представили</a> свой подход в виде компилятора NNVM, основанный на применении <a href="https://github.com/dmlc/tvm">стека TVM</a>. Его целью является предоставление многократно используемой цепочки инструментов для компиляции описания высокоуровневых нейронных сетей из фреймворков глубинного обучения в низкоуровневые коды, используемые в бэкенде.</p><h3>Компилятор NNVM</h3><p>Целью компилятора является представление входных данных из разных фреймворков в качестве стандартизированных вычислительных графов с последующим их переводом в исполняемые графы.</p><p>Компилятор поддерживает модели в форматах OpenML (фреймворки Keras и Caffe), Apache MXNet и используемого Facebook и Microsoft <a href="https://tproger.ru/news/facebook-microsoft-onnx/">открытого формата ONNX</a> (Open Neural Network Exchange), при помощи которого передаются модели для обучения в фреймворках Caffe2, PyTorch и CNTK (Cognitive Toolkit). Результатом компиляции является код для различных бекэндов, включая вычислительные ядра CUDA, OpenCL и Metal. Также возможна генерация кода LLVM, на основе которого формируются машинные инструкции для архитектур x86 и ARM или представление WebAssembly.</p><figure><img src="https://media.tproger.ru/uploads/2017/10/nnvm_compiler_stack.png" alt="" /></figure><h3>Процесс компиляции кода</h3><ul><li>Формирование промежуточного графа вычислений на основе входных данных, полученных из фронтенд-интерфейсов фреймворков;</li><li>Оптимизация графа и выделение в нём операторов с подпрограммами обработки данных;</li><li>Компиляция операторов в исполняемые модули и развёртывание для различных бэкендов с минимальными зависимостями.</li></ul><figure><img src="https://media.tproger.ru/uploads/2017/10/nnvm-1.png" alt="" /></figure><p>Полученные после компиляции модули могут быть сгенерированы в необходимый код на разных языках программирования: С++, Python, JavaScript, Java, Objective-C — для дальнейшего использования на мобильных платформах, видеокартах, серверах и в веб-браузерах.</p><figure><img src="https://media.tproger.ru/uploads/2017/10/nnvm_deploy.jpg" alt="" /></figure><h3>Производительность компилятора</h3><p>Сотрудники Amazon сравнили в производительности фреймворк MXNet и новый компилятор NNVM на двух разных аппаратных кофигурациях: ARM-процессор на Raspberry Pi и видеопроцессор Nvidia в облачных сервисах Amazon.</p><figure><img src="https://media.tproger.ru/uploads/2017/10/nnvm-3-1.png" alt="" /></figure><p>В случае видеокарт Nvidia для фреймворка MXNet в качестве бекэнда использовалась библиотека cuDNN на графическом ускорителе Nvidia K80. Компилятор NNVM показал ускорение в 1,2 раза для наборов данных ResNet18 и MobileNet.</p><figure><img src="https://media.tproger.ru/uploads/2017/10/nnvm-4.png" alt="" /></figure><p>На Raspberry Pi демонстрируемые результаты ещё лучше. Скорость обработки ResNet18 у NNVM в 2,2 раза выше, а MobileNet — в 11,5 раз. Это связано главным образом с тем, что в MXNet глубина свёртки не оптимизирована (из-за отсутствия подобных операторов в библиотеке dnn), тогда как NNVM использует прямую генерацию эффективного кода.</p><p>Код компилятора и инструкция по его использованию доступны <a href="https://github.com/dmlc/nnvm">на GitHub</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Azul Systems выпустила Falcon, новый JIT-компилятор для Java</title>
      <link>https://tproger.ru/news/new-java-jit-compiler-falcon</link>
      <comments>https://tproger.ru/news/new-java-jit-compiler-falcon?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Богдан Федоренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/new-java-jit-compiler-falcon</guid>
      <description><![CDATA[<p>Falcon 1.0 — новый JIT-компилятор Azul Systems для Java с модульной архитектурой; его можно бесплатно тестировать по лицензии на 30 дней.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/new-java-jit-compiler-falcon">Azul Systems выпустила Falcon, новый JIT-компилятор для Java</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 05 May 2017 19:10:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Некоторое время назад в Azul Systems заметили, что есть необходимость в создании нового <a href="https://tproger.ru/translations/basic-jit/">JIT-компилятора</a> для Java, так как C2 (компилятор от Sun Microsystems) используется уже на протяжении 20 лет. Их задачей стало создание нового компилятора с модульной архитектурой, которая позволила бы легко добавлять новый функционал.</p><h3>И что у них получилось?</h3><p>Новый компилятор Falcon был создан на основе <a href="https://ru.wikipedia.org/wiki/Low_Level_Virtual_Machine">LLVM</a>. Главный плюс LLVM — возможность разбить оптимизатор на набор библиотек, которые будут получать на вход промежуточное представление кода и генерировать следующую промежуточную версию, которая затем будет передана дальше.</p><p>Falcon 1.0 уже превосходит по производительности Zing C2 в некоторых тестах, но это только начало. Компания уже получает наработки от пользователей с ранним доступом, которые помогают определить, какие места можно было бы оптимизировать сильнее.</p><h3>Falcon уже можно попробовать?</h3><p>В данный момент <a href="http://docs.azul.com/zing/zing-quick-start.htm">можно получить</a> бесплатную 30-дневную лицензию.</p>]]></content:encoded>
    </item>
    <item>
      <title>Состоялся релиз свободного набора компиляторов GCC 7.1</title>
      <link>https://tproger.ru/news/gcc-7-1-release</link>
      <comments>https://tproger.ru/news/gcc-7-1-release?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Саша Ушатинская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/gcc-7-1-release</guid>
      <description><![CDATA[<p>После года разработки официально вышел GCC 7.1. Следующий значительный релиз набора GNU Compiler Collection получит номер 8.1.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/gcc-7-1-release">Состоялся релиз свободного набора компиляторов GCC 7.1</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 May 2017 15:31:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>После года разработки официально <a href="https://lists.gnu.org/archive/html/info-gnu/2017-05/msg00002.html">объявлено</a> о выпуске GCC (GNU Compiler Collection) 7.1. Следующий значительный релиз выйдет под номером 8.1. в соответствии с новым <a href="https://gcc.gnu.org/develop.html#num_scheme">принципом нумерации</a> выпусков.</p><h3>Примечательные нововведения в GCC</h3><ul><li>Полностью <a href="https://www.phoronix.com/scan.php?page=news_item&amp;px=GCC-Finishes-Removing-GCJ">прекращена поддержка</a> компилятора Java (GCJ).</li><li><a href="https://gcc.gnu.org/projects/cxx-status.html#cxx1z">Реализована</a> экспериментальная поддержка готовящегося стандарта C++17.</li><li>Множество улучшений в меж- и внутрипроцедурных оптимизациях, добавлены новые оптимизации для позднего связывания.</li><li>Добавлена поддержка архитектуры набора команд <a href="https://ru.wikipedia.org/wiki/RISC-V">RISC-V</a>…</li><li>…и операционной системы <a href="https://tproger.ru/news/we-compiled-fuchsia/">Fuchsia</a>.</li><li>Для новых целей теперь по умолчанию используется <a href="https://gcc.gnu.org/wiki/LRAIsDefault">LRA (local register allocator)</a>.</li><li>Прекращена поддержка чипов ARMv5 / ARMv5E, добавлена поддержка ARMv8.2-A и ARMv8.3-A, Cortex A73, Broadcom Vulcan, ThunderX CN81xx/CN83xx/CN88xx/CN99xx и Qualcomm Falkor.</li><li>Появилась возможность использования OpenMP 4.5 для спецпроцессоров NVIDIA PTX.</li></ul><p>Подробности о выпуске можно узнать в <a href="https://gcc.gnu.org/gcc-7/changes.html">полном списке</a> изменений, нововведений и исправлений.</p>]]></content:encoded>
    </item>
    <item>
      <title>В Java 9 появится Ahead-Of-Time компиляция. Это как?</title>
      <link>https://tproger.ru/news/jaotc-wtf</link>
      <comments>https://tproger.ru/news/jaotc-wtf?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/jaotc-wtf</guid>
      <description><![CDATA[<p>Статическая AOT-компиляция превращает исходный код в исполняемый файл заранее, в отличие от динамической JIT, работающей во время выполнения программы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/jaotc-wtf">В Java 9 появится Ahead-Of-Time компиляция. Это как?</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 29 Oct 2016 12:17:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Недавно <a href="http://openjdk.java.net/jeps/295">стало</a> окончательно известно — в Java 9 будет AOT-компиляция. Мы решили рассказать о том, как это будет, зачем это нужно, а также развеять несколько устойчивых мифов, которые сложились вокруг статической и динамической компиляции.</p><h4>Какая-какая компиляция?</h4><p>Статическая, или Ahead-Of-Time (AOT) компиляция — это самая обычная компиляция, которую мы привыкли видеть в языке Си. Исходный код превращается в исполняемый, и на выходе получается исполняемый файл, который можно запустить позже. На статическую компиляцию требуется дополнительное время до начала работы программы, отсюда и название. Существует ещё динамическая, или Just-In-Time (JIT) компиляция — она осуществляется прямо во время работы программы, “на лету”. Именно она и используется в Java в настоящий момент.</p><h4>А в Java 9 хотят заменить её на статическую?</h4><p>Нет. В Java 9 планируют добавить возможность AOT-компилятор в качестве альтернативы (но не замены) существующим инструментам. Утилита будет называться jaotc. В Java 9 она гарантированно будет работать только для модуля java.base, который содержит всё необходимое для работы с объектами, потоками и структурами данных — то, без чего не может обойтись ни одно приложение. Исходя из этого, AOT-компиляцию в Java 9 всё ещё можно назвать лишь экспериментальной возможностью.</p><h4>А зачем это нужно?</h4><p>AOT-компиляция имеет несколько специфических преимуществ. Во-первых, это защита от декомпиляции. Байткод Java можно без особого труда декомпилировать в код на Java, и, таким образом, взломать программу (которая, например, требует лицензионный ключ). Исполняемый код же можно лишь дизассемблировать, и, думается, любой может сравнить сложность поиска каких-то деталей в коде на Java и ассемблерном коде. Обфускация же далеко не панацея, т.к. она трудно реализуема при активном использовании рефлексии и всё равно не даёт стопроцентной защиты. Во-вторых, стоит обратить внимание на время запуска приложения. Для первого запуска (так называемого “холодного старта”) приложению требуется значительное количество времени. Для скомпилированного статически кода на Java стартовое время <a href="https://www.youtube.com/watch?v=blXQTBiYbzs">не отличается</a> от старта аналогичной программы на Си:<br /><a href="https://media.tproger.ru/uploads/2016/10/aot1.png"></a></p><h4>То есть, получается, со статической компиляцией мы получим в Java скорость Си?</h4><p>Нет. Си достигает значительной скорости за счёт многих допущений небезопасного поведения. Например, в случае выхода за границы массива в Си случится <a href="https://ru.wikipedia.org/wiki/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0_%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8">segfault</a> (в лучшем случае), а в Java просто вылетит ArrayOutOfBoundsException. Подобные проверки не бесплатны, за них приходится платить производительностью как в случае динамической компиляции, так и в случае статической.</p><p>Неверным также является представление, что Си в целом работает быстрее Java. Так, в Java компилятору доступен весь код всех подключенных библиотек, а значит, он может оптимизировать их работу наиболее выгодным для данного приложения путём. В Си же библиотеки могут подключаться в виде машинного кода, и никакие дополнительные оптимизации для них недоступны.</p><h4>Так значит, JIT для Java подходит лучше? Это ведь всё-таки динамический язык.</h4><p>Такое утверждение тоже будет неверным. Оптимизации, которые производит компилятор, могут быть достаточно сложными и ресурсоёмкими, могут требовать итеративного пересчёта и анализа всей программы целиком. Зачастую в процессе оптимизации возникает такое количество дополнительных данных, что хранить их в оперативной памяти невозможно, и требуется их промежуточная запись на диск. Всего этого JIT-компилятор просто не может себе позволить. Очень заметна разница в производительности между JIT-исполняемым кодом и AOT-компилированным, например, при работе с элементами пользовательского интерфейса.</p><h4>Что-то я совсем запутался. Так что же лучше?</h4><p>На этот вопрос нельзя дать однозначного ответа. Для разных приложений и для разных целей выбор может быть разным. Главное, что теперь он будет. Конечно, AOT-компиляторы Java существовали и раньше, однако мало кто из них может похвастаться полноценной поддержкой свежих спецификаций Java. Теперь, когда за дело взялись специалисты из Oracle, возможно, ситуация изменится в лучшую сторону. Про AOT-компиляцию Java кода есть отличный доклад Никиты Липского, на который мы в основном и опирались при подготовке данной статьи:</p><h4>Можно привести пример, в каких ситуациях статическая компиляция будет явно лучше, чем JIT?</h4><p>При разработке для встраиваемых систем и мобильных платформ, скорее всего, AOT-компиляция будет лучшим выбором. Встраиваемые системы чаще всего не обладают теми же вычислительными мощностями, что и настольные компьютеры или сервера, а чем слабее железо, тем дороже динамическая компиляция. В случае с мобильными устройствами решающую роль играет другой фактор — нагрузка на аккумулятор. Динамическая компиляция требует много большего расхода энергии, чем выполнение уже скомпилированного кода. Так, для iOS политика распространения приложений вовсе запрещает любую динамическую загрузку кода, поэтому Java фактически невозможно использовать для программирования под устройства Apple.</p><h4>А можно больше подробностей про то, что именно мы увидим в Java 9?</h4><p>Мы увидим утилиту jaotc, которая сможет создавать нативные исполняемые файлы для Linux x64, основанные на модуле java.base.</p><figure><img src="https://media.tproger.ru/uploads/2016/09/original.jpg" alt="" /></figure><p>Выглядеть это будет примерно следующим образом. Мы можем создать <a href="https://ru.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF</a>-файл:</p><p>Затем подключить его в качестве библиотеки для исполнения другого кода:</p><p>Причём (по крайней мере, в этом релизе) для AOT-компиляции и для запуска должны использоваться одни и те же параметры:</p><p>Больше технических деталей можно узнать <a href="http://openjdk.java.net/jeps/295">на сайте OpenJDK</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Почему числовые типы данных в C имеют такой размер?</title>
      <link>https://tproger.ru/translations/data-sizes-c</link>
      <comments>https://tproger.ru/translations/data-sizes-c?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/data-sizes-c</guid>
      <description><![CDATA[<p>Размер переменных одного типа на разных машинах различается: ответ про разрядность и компиляторы даёт книга «Computer Science: A Programmer's Perspective».</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/data-sizes-c">Почему числовые типы данных в C имеют такой размер?</a>»</p>]]></description>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 Mar 2015 18:04:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Каждый программист, которому приходилось писать на C или C-подобных языках, наверняка сталкивался с тем, что размер переменных одного и того же типа на разных машинах может быть различным. Немного разобравшись в этом вопросе многие успокаивались, узнав, что, действительно, размер тех же указателей зависит от реализации компилятора и разрядности машины. Но почему? И почему именно столько байт занимает указатель в том или ином случае?</p><p>Ответ дает книга <a href="http://csapp.cs.cmu.edu/">«Computer Science: A Programmer’s Perspective»</a> за авторством Рендела Брайанта и Девида О’Халарона.</p><p>Компьютеры и компиляторы поддерживают различные типы для хранения данных — в частности, целых чисел и чисел с плавающей запятой. Каждый отдельный тип может отличаться от других, например, способом представления хранимой информации и объемом занимаемой памяти.</p><p>Язык программирования C поддерживает различные типы для хранения как целых чисел, так и чисел с плавающей запятой. Символьный тип <b>char</b>, обычно используемый для представления отдельного символа, может также хранить беззнаковые числа. Более распространенный для этих целей <b>int</b> образует целое семейство типов за счет возможных префиксов: <b>short</b>, <b>long</b> и <b>long long</b> — и все различных размеров. В таблице ниже указано, сколько байт занимает в памяти каждый тип в зависимости от разрядности системы.</p><p>Та же ситуация и с указателями (<b>char*</b>): в системе для хранения адресов используется все то же одно машинное слово, размер которого зависит от разрядности.</p><p>Перевод  пункта 2.1.3 «Data sizes» из книги <a href="http://csapp.cs.cmu.edu/">«Computer Science: A Programmer’s Perspective»</a></p>]]></content:encoded>
    </item>
    <item>
      <title>История синтаксического анализа</title>
      <link>https://tproger.ru/translations/parsing-a-timeline</link>
      <comments>https://tproger.ru/translations/parsing-a-timeline?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/parsing-a-timeline</guid>
      <description><![CDATA[<p>Парсеры разбирают документы, чтобы извлечь данные: на них держатся автоматические переводчики, трансляторы языков программирования и SQL-запросы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/parsing-a-timeline">История синтаксического анализа</a>»</p>]]></description>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 20 Feb 2015 16:34:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>В настоящее время все процессы, где применяется синтаксический анализ, используют парсеры — программы для проведение визуального или программно-автоматизированного синтаксического и лексического анализа или разбора какого-либо документа с целью извлечения из него необходимых данных. Это и различные автоматизированные переводчики с одного языка на другой, и трансляторы языков программирования, которые формируют программный код на машинно-ориентированный язык, это и язык SQL-запросов и тому подобные применения.</p><p>В этой статье мы в хронологическом порядке перечислим важнейшие этапы развития парсеров как инструмента анализа данных.</p><h3>1960</h3><p>Выпущена спецификация ALGOL 60, в которой впервые описан язык с блочной структурой. Комитету ALGOL хорошо известно, что никто не знает, как парсить такой язык. Но они считают, что, если они детально описали язык с блочной структурой, то для него будет изобретен анализатор/парсер. Рискованный подход, который впоследствии окупился.</p><h3>1961</h3><p>Нед Айронс выпускает свой парсер ALGOL. Фактически, алгоритм Айронса является первым подобным анализатором, который был описан в печати. Парсер Неда является лево-рекурсивным (форма рекурсивного спуска) парсером . В отличие от современного рекурсивного спуска, алгоритм Айронса носит общий характер и является синтаксически-управляемым. «Общий» означает, что они могут разобрать что написано в БНФ (форма Бэкуса – Наура — формальная система описания синтаксиса, в которой одни синтаксические категории последовательно определяются через другие категории). «Синтаксически-управляемый» (декларативный) означает, что анализатор фактически создается из БНФ — парсер не нужно создавать самому.</p><h3>1961</h3><p>Почти одновременно, появляются самокодируемые (т.е. с возможностью внесения изменений в исходный код) подходы к реализации леворекурсивных алгоритмов. Сейчас их рассматривают как рекурсивный спуск. В течение следующих лет самокодируемые подходы становятся все более популярными для леворекурсивных анализаторов, чем синтаксически-управляемые алгоритмы. Важную роль сыграли следующие три фактора:</p><ul><li>В 1960-х память и CPU очень ограничены. Ручное кодирование (hand-coding) окупается даже тогда, когда выигрыш от его применения мал.</li><li>Чистый леворекурсивный анализ — очень слабый метод синтаксического анализа. Ручному кодированию часто приходится преодолевать эти ограничения. Это утверждение верно как в 1961, так и в наши дни.</li><li>Леворекурсивный анализ хорошо работает в сочетании с ручным кодированием — они дополняют друг друга.</li></ul><h3>1965</h3><p>Дональд Кнут (Don Knuth) изобретает алгоритм LR. Ученый в первую очередь заинтересован в математической стороне задачи. Кнут описывает алгоритм анализа, но его подход считается непрактичным.</p><h3>1968</h3><p>Джей Эрли (Jay Earley) изобретает алгоритм, названный в его честь. Как и алгоритм Irons, алгоритм Эрли является синтаксически-управляемым и носит общий характер. В отличие от алгоритма Irons, не использует метод поиска с возвратом. Основная идея Эрли состоит в том, чтобы отслеживать этапы работы алгоритма в таблицах. Алгоритм Эрли заманчив, но имеет три основных недостатка:</p><ul><li>Во-первых, есть ошибка в обработке правил нулевой длины.</li><li>Во-вторых, при право-сторонней рекурсии необходимо применять алгоритм дважды.</li><li>В-третьих, чтобы создать таблицы, необходимо вести учёт системных ресурсов, что, по меркам аппаратных средств 1968 года, является довольно сложной задачей.</li></ul><h3>1969</h3><p>Фрэнк ДеРемер (Frank DeRemer) описывает новый вариант LR Кнута. Для алгоритма LALR ДеРемера необходим только стек и таблица состояний, размер которой можно легко изменить.</p><h3>1972</h3><p>Ахо (Aho) и Алманн (Ullmann) описали простой способ исправить ошибку правила нулевой длины в оригинальном алгоритме Эрли. К сожалению, это исправление требует даже больше системных ресурсов, чем алгоритм Эрли.</p><h3>1975</h3><p>Белл Лэбс (Bell Labs) преобразует свой компилятор языка C из самокодируемого рекурсивного спуска в алгоритм LALR ДеРемера.</p><h3>1977</h3><p>Выходит первая «Книга дракона». Этот, вскоре ставший классическим, учебник назван так из-за обложки, на которой изображен рыцарь, бросающий вызов дракону. На копье рыцаря выгравированы буквы «LALR». Впредь, говорить легкомысленно LALR — значит запятнать герб теории синтаксического анализа.</p><h3>1979</h3><p>Bell Labs выпустила новую версию UNIX — седьмую. V7 включает в себя безусловно наиболее полный, полезный и доступный инструментарий для разработки компиляторов. Центральное место занимает инструментарий Yacc, генератор синтаксических анализаторов на основе LALR. С небольшим трудом Yacc парсит свой собственный язык ввода, а также язык основного компилятора V7 — переносимого компилятора языка C. Кажется, что после двух десятилетий исследований, проблема синтаксического анализа наконец решается.</p><h3>1987</h3><p>Ларри Уолл (Larry Wall) представляет Perl 1. Perl позволяет решать более сложные задачи, чем отличается от уже существующих языков. Ларри активно использует LALR — насколько известно автору, чаще, чем кто-либо до или после него.</p><h3>1991</h3><p>Джуп Лео (Joop Leo) обнаруживает способ ускорить правосторонние рекурсии в алгоритме Эрли. Алгоритм Лео является линейным практически для любой: как однозначной, так и неоднозначной грамматики, представляющей практический интерес. Аппаратное обеспечение в 1991 на шесть порядков быстрее, чем в 1968 году, так что вопрос учёта системных ресурсов стал не столь важен. Однако, если дело касается скорости, то выигрывает алгоритм Эрли. Алгоритм Лео оказался важным открытием, но его практическая реализация появится лишь через 20 лет.</p><h3>1990-е</h3><p>Алгоритм Эрли забыт. Все приверженцы LALR довольны, не так ли? Нет. Пользователи LALR делают неприятные открытия. В то время как LALR автоматически генерирует свои анализаторы, их отладка настолько трудна, что проще написать парсер самому. После отладки их LALR анализаторы при правильных входных данных работают быстро. Но почти все, что они говорят пользователям о некорректных входных данных — лишь сообщение о неверном формате без указания дополнительной информации. По словам Ларри, LALR «быстр, но глуп».</p><h3>2000</h3><p>Ларри Уолл принимает решение о радикальном переопределении Perl — издании Perl 6. Он даже не рассматривает вопрос о повторном использовании LALR.</p><h3>2002</h3><p>Эйкок (Aycock) и Хоспул (Horspool) опубликовали результаты своих опытов по созданию быстрого, практичного парсера Эрли. Однако при этом не использовалось улучшение, предложенное Джупом Лео — они, кажется, не знают о нем. Их собственный метод ускорения ограничен в своих показателях и сложности, которые он несет с собой, они могут быть даже контрпродуктивными при оценке времени. Но в этой работе ценным оказалось решение ошибки правила нулевой длины. И на этот раз оно не требует никакого дополнительного учета системных ресурсов.</p><h3>2006</h3><p>GNU объявляет, что был переписан парсер компилятора GCC. В течение трех десятилетий, компиляторы языка C промышленного флагмана использовали LALR в качестве парсера — доказательство утверждения, что LALR и серьезный алгоритм эквивалентны. Теперь GNU заменяет LALR технологией, которую тот заменил четверть века назад: рекурсивным спуском.</p><h3>С 2000 и до сегодняшнего дня</h3><p>С отступлением от LALR приходит крах престижа теории синтаксического анализа. Спустя полтора века, мы пришли к тому, с чего начали. Если вы возьмете оригинальный алгоритм Ned Irons 1961 года, измените имена и даты и переведете код из смеси ассемблера и ALGOL в Haskell, то вы бы легко смогли выпустить его в наши дни и представить как новый и революционный подход.</p><h3>Парсер Marpa</h3><p>Оригинальное, давно заброшенное представление алгоритма Эрли — эффективный, практичный, общий и синтаксически-управляемый парсер — теперь, по сути, вполне возможно применять на практике. Все кусочки мозаики встали на свои места.</p><p>Эйкок и Хоспул решили проблему правила нулевой длины. Джуп Лео разработал ускорение для правосторонней рекурсии. И вопрос учета системных ресурсов разрешился сам по себе: машинные операции в настоящее время в миллиард раз быстрее, чем в 1968 году, и скорость, вероятно, уже не столь значима — в настоящее время главной проблемой стали кэш-промахи.</p><p>Но в то же время как разрешились проблемы оригинального алгоритма Эрли, появился новый метод. С таким же мощным, как алгоритм Эрли, синтаксически-управляемый подход будет работать намного эффективнее, чем с левосторонним парсером. В настоящее время не так много программистов используют чисто декларативный парсер из-за печального опыта работы с LALR. Как говорится, раз обожжешься, другой раз остережешься.</p><p>Чтобы зарекомендовать себя в IT-сообществе Marpa необходимо осуществлять не только декларативный, но и процедурный синтаксический анализ. Так Marpa позволяет пользователю указывать события — вхождения символов и правил — во время которых работа декларативных алгоритмов приостанавливается. В это время приложение может вызвать процедурную логику и продолжить пошагово продвигаться от токена к токену. Процедурная логика позволяет в любой момент вернуться к синтаксически-управляемому анализу. В таблицах Эрли сохраняются все данные о состоянии: все правила и все возможные ожидаемые символы распознаются при анализе во всех возможных вариантах. В настоящее время алгоритм Эрли более эффективен при разработки процедурной логики, чем рекурсивный спуск.<br /></p><p>Перевод статьи <a href="http://jeffreykegler.github.io/Ocean-of-Awareness-blog/individual/2014/09/chron.html">«Parsing: a timeline»</a></p>]]></content:encoded>
    </item>
    <item>
      <title>auto в C</title>
      <link>https://tproger.ru/articles/article-auto-c</link>
      <comments>https://tproger.ru/articles/article-auto-c?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/article-auto-c</guid>
      <description><![CDATA[<p>Строка auto a = 1; в файле с расширением .c собирается без ошибок, хотя вывод типа появился только в C++11. Причина — старое значение ключевого слова auto.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/article-auto-c">auto в C</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 24 Dec 2014 14:55:30 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Вопрос</h3><p>Почему строка auto a = 1; воспринимается компилятором C как корректная?</p><p>Я пользуюсь MS Visual Studio 2012, и вот этот код:</p><p>компилируется без ошибок, несмотря на то, что я использую расширение *.c исходника. Т.е. таким образом, я создаю код на чистом C, а насколько мне известно использование auto без указания типа стало возможным только в C++11 – заметьте, в C++, а не C.</p><p>Означает ли это, что у меня не так настроен компилятор, или этот код действительно корректен в C?</p><h3>Ответ</h3><p>auto – это старое ключевое слово C, обозначающее “локальную область видимости”. auto a эквивалентно auto int a, а в силу того, что в данном примере область видимости ограничена блоком, в котором объявлена переменная, то это то же самое, что и просто int a.</p><p>Это ключевое слово перешло в C еще из его предка, B, в котором не существовало базовых типов, а все было int(*): сами int‘ы, указатели на них, массивы int‘ов и т.п. И объявлялось все с помощью auto и extern. Подход “все, что тут есть – это int” в C было решено оставить, поэтому int‘овые переменные можно объявить и так:</p><p>В стандарте ISO C от подобного подхода отказались, однако многие компиляторы все еще поддерживают bacward-совместимость. Если это кажется вам странным, то вспомните о том, что вот такая строка будет корректной:</p><p>В C++ это слово вернули, но уже с новым смыслом (теперь эта конструкция позволяет явно не указывать тип переменной), ведь вряд ли множество программистов использовало это слово с оригинальным значением, особенно если учесть, что от “всего, что ты видишь – это int” отказались уже в C++98. Единственным исключением осталось тогда auto T a, чем все равно никто не пользуется.</p><p>Если вам не лень и очень интересно, можете покопаться в <a href="https://vk.com/away.php?to=http%3A%2F%2Fstroustrup.com%2Fpapers.html">истории языка</a> за авторством Страуструпа.</p><p>Кстати, интересно было организовано хранение строк в B. Строка была массивом int‘ов, каждый элемент которого хранил несколько символов. Таким образом, B – это тот же <a href="https://vk.com/away.php?to=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FBCPL">BCPL</a> с другим синтаксисом.</p><p><a href="https://vk.com/away.php?to=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F23406212%2Fwhy-does-auto-a-1-compile-in-c">Источник</a> (StackOverflow)</p>]]></content:encoded>
    </item>
  </channel>
</rss>