<?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>WebAssembly</title>
    <description/>
    <link>https://tproger.ru/tag/webassembly</link>
    <atom:link href="https://tproger.ru/tag/webassembly/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 16:24:57 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>WebAssembly</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>libheif 1.23.4 закрыла уязвимости при чтении и декодировании HEIF</title>
      <link>https://tproger.ru/news/libheif-1-23-4-zakryla-uyazvimosti-pri-chtenii-i-dekodirovanii-hei</link>
      <comments>https://tproger.ru/news/libheif-1-23-4-zakryla-uyazvimosti-pri-chtenii-i-dekodirovanii-hei?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/libheif-1-23-4-zakryla-uyazvimosti-pri-chtenii-i-dekodirovanii-hei</guid>
      <description><![CDATA[<p>libheif 1.23.4 чинит квадратичный разбор iinf (23 МБ файла дают 1,5 ГБ памяти), рекурсию в проверке ссылок, вечный дедлок декодера и падение WebAssembly-сборки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/libheif-1-23-4-zakryla-uyazvimosti-pri-chtenii-i-dekodirovanii-hei">libheif 1.23.4 закрыла уязвимости при чтении и декодировании HEIF</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 07 Sep 2026 09:30:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вышла libheif 1.23.4, библиотека для чтения и записи HEIF и AVIF, которую используют для работы с изображениями. Выпуск <a href="https://github.com/strukturag/libheif/releases/tag/v1.23.4">закрывает шесть уязвимостей</a>, три из них с высокой оценкой, и объявлен ABI- и API-совместимой заменой 1.23.3: релиз сохраняет интерфейсы предыдущей версии. Это уже третий выпуск безопасности подряд после 1.23.2 и 1.23.3, все шесть проблем нашёл один исследователь под ником hackerman70000.</p><p>Уязвимости затрагивают разные этапы обработки файла. Для ошибки iinf/max_items достаточно чтения контейнера через heif_context_read_from_file, без декодирования изображения. Отдельная проблема возникает при обходе ссылок на этапе декодирования, а взаимная блокировка потоков связана с параллельным декодированием grid-тайлов. Поэтому проверка только загрузки метаданных не воспроизводит все три проблемы с высокой оценкой.</p><ul><li>Лимит max_items не применялся к дочерним боксам iinf: файл объявляет сколько угодно элементов, разбор становится квадратичным. Замер: 1,7, 6 и 23 секунды процессора на файлы 1, 2 и 4,1 МБ; файл 6,9 МБ держит 480 МБ памяти, 23 МБ файл 1,5 ГБ, и max_total_memory этого не видит. В сборке под Emscripten тот же счётчик задавал размер alloca на 64-килобайтном стеке WebAssembly: 16 000 элементов проходят, 17 000 роняют вызов, с 18 000 модуль ломается необратимо.</li><li>Неограниченная рекурсия при обходе ссылок могла исчерпать стек; исправленный обход на этапе декодирования использует явный список в куче.</li><li>Инверсия порядка блокировок при параллельном декодировании тайлов grid (включено по умолчанию) давала вечный дедлок; циклические графы ссылок отклоняются до начала декодирования.</li><li>Три проблемы средней важности: чтение за границей буфера в плагинах кодировщиков aom и x265, неисправимая утечка памяти в heif_track_get_next_raw_sequence_sample и чтение за границей в экспериментальном плагине WebCodecs.</li><li>Уязвимы версии от 1.16.0 до 1.23.3 включительно (в зависимости от проблемы), исправлено в 1.23.4; номера CVE будут присвоены позже.</li></ul><h2>Как одна неучтённая ветка отключила лимит на число элементов</h2><p>В <a href="https://github.com/strukturag/libheif/security/advisories/GHSA-vg7w-rp49-4fc2">отчёте</a> описана классическая ошибка перегруженного параметра. Функция Box::read_children принимает max_number, у которого два смысла: со значением-сентинелом READ_CHILDREN_ALL она читает до конца бокса и проверяет лимит max_items, а с любым другим числом читает ровно столько детей и ничего не проверяет. Box_iinf::parse передавала туда счётчик из самого файла, поэтому проверка, написанная специально для iinf, никогда не выполнялась.</p><p>Дальше цена растёт квадратично: для каждого элемента вызывается полный проход по списку ссылок iref без раннего выхода. Исследователь измерил на одном ядре 1,7, 6,0 и 23 секунды для файлов в 1,0, 2,0 и 4,1 МБ; абсолютные цифры различаются вдвое между машинами, но рост в 3–4 раза на каждое удвоение стабилен против 2 раз у линейного парсера. Всё это происходит внутри вызова, который затем возвращает heif_error_Ok, без коллбэка отмены и прогресса. В 1.23.4 лимит проверяется заранее, объявленное число ограничено оставшимся входом, а запросы к iref индексируются по идентификатору элемента: на файле с 1 000 элементов и 160 000 ссылок dimg время чтения упало с 1,83 до 0,26 секунды.</p><p>Сборка под WebAssembly страдала отдельно. Два вспомогательных метода в Emscripten-обвязке выделяли массив идентификаторов через alloca с размером из того же счётчика. Скрипт сборки не задаёт ни размер стека, ни проверку его переполнения, поэтому использовался стек по умолчанию в 64 КБ: 16 000 элементов занимают 64 000 байт и декодируются, 17 000 прерывают вызов, а с 18 000 переполнение уходит в сегмент статических данных и экземпляр модуля перестаёт работать до перезагрузки страницы. Хелпер вызывается при каждом HeifDecoder.decode().</p><h2>Рекурсия и дедлок: две другие высокие уязвимости</h2><p><a href="https://github.com/strukturag/libheif/security/advisories/GHSA-xrp2-63fq-jm8q">Вторая проблема</a>: проверка на циклы ссылок между производными элементами была рекурсивной, и длинная цепочка исчерпывала стек. Без лимита на число элементов глубина ничем не ограничена. Исправленный обход на этапе декодирования использует явный рабочий список в куче вместо рекурсии.</p><p><a href="https://github.com/strukturag/libheif/security/advisories/GHSA-prgh-72vc-3xmc">Третья проблема</a> затрагивает серверы с параллельным декодированием: параллельное декодирование тайлов grid включено по умолчанию, а ImageItem::decode_image() держит нерекурсивный мьютекс элемента на время вложенных декодирований. Два рабочих потока, чьи элементы ссылаются друг на друга, берут два мьютекса в противоположном порядке и зависают навсегда; процесс не падает и не освобождает ресурсы. Исправление отклоняет циклические графы декодирования, включая рёбра dimg и alpha auxl, до старта.</p><h2>Кому обновляться в первую очередь</h2><p>Всем, кто принимает HEIC и AVIF от пользователей: это серверные конвертеры, бэкенды фотохостингов и мессенджеров, CI-пайплайны с ImageMagick, а также веб-приложения, которые декодируют HEIC на клиенте через libheif-js или собственную Emscripten-сборку. Для последних важно, что обрушение WebAssembly-модуля необратимо в рамках страницы. Мейнтейнеры советуют обновиться всем пользователям; в дистрибутивах смотрите на пакет libheif1 или libheif в вашем менеджере. Уязвимость средней важности в плагине WebCodecs касается только Emscripten-сборок с WITH_WEBCODECS=ON, по умолчанию выключенной опции, и только без libde265.</p><p>Отдельный отчёт о расходе ресурсов опубликован для Go-библиотеки Excelize: файл на 3 КБ заставляет библиотеку выполнять произвольное число итераций хеширования, и патча пока нет (исправление в сохранённом отчёте не указано). Из недавних выпусков безопасности того же масштаба мы разбирали <a href="https://tproger.ru/news/curl-8-22-0-zakryl-devyat-uyazvimostej-i-otkazalsya-ot-tls-srp">curl 8.22.0 с девятью уязвимостями</a> и <a href="https://tproger.ru/news/postgres-pro-zakryl-28-uyazvimostej-postgresql-vneocherednymi-reli">внеочередные релизы PostgreSQL от Postgres Pro</a>.</p><p>Источники: <a href="https://github.com/strukturag/libheif/releases/tag/v1.23.4">libheif v1.23.4 – security maintenance, release notes</a>, <a href="https://github.com/strukturag/libheif/security/advisories/GHSA-vg7w-rp49-4fc2">GHSA-vg7w-rp49-4fc2: The max_items security limit is not enforced for iinf child boxes</a>, <a href="https://github.com/strukturag/libheif/security/advisories/GHSA-xrp2-63fq-jm8q">GHSA-xrp2-63fq-jm8q: Unbounded iref entry list and unbounded recursion</a>, <a href="https://github.com/strukturag/libheif/security/advisories/GHSA-prgh-72vc-3xmc">GHSA-prgh-72vc-3xmc: Lock-order inversion in parallel grid tile decoding</a></p>]]></content:encoded>
    </item>
    <item>
      <title>WebLLM запускает языковую модель в браузере без сервера за один вечер</title>
      <link>https://tproger.ru/articles/webllm-zapuskaet-yazykovuyu-model-v-brauzere-bez-servera-za-odin</link>
      <comments>https://tproger.ru/articles/webllm-zapuskaet-yazykovuyu-model-v-brauzere-bez-servera-za-odin?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/webllm-zapuskaet-yazykovuyu-model-v-brauzere-bez-servera-za-odin</guid>
      <description><![CDATA[<p>Разбор WebLLM 0.2.84: установка, код чата со стримингом, видеопамять для 9 моделей от 0,7 до 6,4 ГБ, 71–80% нативной скорости и поддержка WebGPU в браузерах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/webllm-zapuskaet-yazykovuyu-model-v-brauzere-bez-servera-za-odin">WebLLM запускает языковую модель в браузере без сервера за один вечер</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 06:49:32 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://github.com/mlc-ai/web-llm">WebLLM</a> — открытый движок команды MLC AI, который выполняет языковую модель внутри браузера на WebGPU и отдаёт её через API в стиле OpenAI. Сервера для инференса нет: веса скачиваются один раз, дальше промпты и ответы не покидают вкладку. Проект живёт с 2023 года, но 2 сентября 2026 года <a href="https://news.ycombinator.com/item?id=49536411">снова поднялся</a> на первую страницу Hacker News с 92 очками, а на GitHub у него 18 846 звёзд и 1 372 форка по данным API на 3 сентября.</p><p>Я разбираю WebLLM как рабочий инструмент: что нужно от железа и браузера, сколько весят модели, какой скоростью придётся заплатить за отказ от сервера и где проще остаться на облачном API. Все команды и фрагменты кода взяты из README репозитория, цифры производительности из статьи авторов на arXiv, требования к видеопамяти из файла конфигурации в исходниках.</p><p>Материал для фронтенд- и фулстек-разработчиков, которым нужен чат, классификатор или JSON-извлекатель на клиенте без счёта за токены и без передачи пользовательских данных третьей стороне.</p><ul><li>WebLLM выполняет модель в браузере на WebGPU, без сервера; API совместим с OpenAI Chat Completions: стриминг, JSON-режим, seed. Вызов функций помечен в README как незавершённый.</li><li>Актуальная версия пакета @mlc-ai/web-llm — 0.2.84 от 27 мая 2026 года; в 2025–2026 годах вышло всего 7 релизов против 63 за 2024 год по данным реестра npm.</li><li>По замерам авторов на MacBook Pro M3 Max WebLLM выдаёт 41,1 токена/с на Llama-3.1-8B и 71,1 токена/с на Phi-3.5-mini, то есть 71–80% от нативного MLC-LLM на том же железе.</li><li>Модели в 4-битной квантизации требуют от 0,7 ГБ видеопамяти (gemma3-1b) до 6,4 ГБ (Qwen3.5-9B) по значениям vram_required_MB в src/config.ts; первый запуск качает всё это с huggingface.co.</li><li>WebGPU по данным MDN есть в Chrome и Edge с версии 113, в Safari 26 с сентября 2025 года, в Firefox с 141 только частично: Linux и Intel-маки не поддерживаются.</li></ul><h2>Как WebLLM выполняет модель в браузере и при чём тут WebGPU?</h2><p>Модель считается на видеокарте пользователя через WebGPU, а всё, что не ложится на GPU, крутится в WebAssembly. Авторы <a href="https://arxiv.org/abs/2412.15803">описывают</a> схему так: родственный проект MLC LLM компилирует открытую модель заранее в два артефакта, конвертированные веса и WASM-библиотеку с WebGPU-ядрами и вспомогательными функциями. WebLLM в браузере загружает оба артефакта с хостинга, инициализирует WebGPU-устройство и дальше исполняет граф вычислений локально.</p><blockquote>Everything runs inside the browser with no server support and is accelerated with WebGPU.</blockquote><p>Отсюда же и главное ограничение, о котором в статье авторы говорят прямо: в отличие от CUDA у WebGPU нет готовых ускоренных библиотек для типовых ядер, поэтому матричные умножения и внимание команде пришлось писать и оптимизировать самой. Цена этого видна в замерах: на Apple MacBook Pro M3 Max в Chrome Canary 133 WebLLM версии 0.2.75 выдавал 41,1 токена/с на 4-битной Llama-3.1-8B против 57,7 у нативного MLC-LLM с Metal-ядрами на той же машине, и 71,1 против 89,3 токена/с на Phi-3.5-mini. Это 71,2% и 79,6% нативной скорости соответственно, замер вендора, другого железа в статье нет.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-03/faf6a5ef-05f1-4c84-a5b3-0de9ac78a2a2.webp" alt="Столбчатая диаграмма: скорость декодирования WebLLM и MLC-LLM в токенах в секунду на Llama-3.1-8B (41,1 против 57,7) и Phi-3.5-mini (71,1 против 89,3)" /><figcaption>Скорость декодирования в браузере и нативно на одном MacBook Pro M3 Max, 4-битная квантизация. График: Tproger по данным статьи авторов WebLLM на arXiv 2412.15803</figcaption></figure><p>Второй компонент, о котором обычно забывают, это кэш. Веса и WASM-библиотека скачиваются при первом обращении и складываются в хранилище браузера. README перечисляет четыре бэкенда, которые задаются полем cacheBackend в AppConfig: Cache API по умолчанию, IndexedDB, Origin Private File System и экспериментальный cross-origin через расширение Chrome, чтобы одни и те же веса не качались заново для каждого сайта. Без расширения движок сам откатывается на Cache API.</p><p>JSON-режим, который в серверных API обычно реализован на стороне провайдера, здесь тоже выполняется локально: по README структурированная генерация встроена в WebAssembly-часть библиотеки модели, а попробовать её со своей JSON-схемой можно в <a href="https://huggingface.co/spaces/mlc-ai/WebLLM-JSON-Playground">JSON Playground</a> на Hugging Face. Про то, как WASM-рантаймы догоняют нативный код, мы писали в заметке про <a href="https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza">Wasmi 2.0</a>.</p><h2>Что нужно, чтобы запустить первый чат?</h2><p>Достаточно npm-пакета, одного вызова фабрики и терпения на первую загрузку весов. README даёт три варианта установки и импорт через CDN для JSFiddle и CodePen без сборщика.</p><p>Движок создаётся функцией CreateMLCEngine: это асинхронная фабрика: она возвращает Promise, а готовый движок с загруженной моделью получают через await. Колбэк прогресса обязателен на практике, потому что без него пользователь смотрит на пустой экран, пока качаются гигабайты.</p><blockquote>loading models requires downloading and it can take a significant amount of time for the very first run without caching previously</blockquote><p>Дальше интерфейс тот же, что у клиента OpenAI: engine.chat.completions.create({ messages }). Одна ловушка: параметр model в запросе игнорируется, модель выбирается при создании движка или через engine.reload(model). Стриминг включается флагом stream: true, а статистика по токенам приходит только в последнем чанке, если попросить её через stream_options.</p><p>Готовый чат для проверки железа не нужно собирать самому: <a href="https://chat.webllm.ai/">WebLLM Chat</a> сделан на том же пакете, а его код открыт в отдельном репозитории.</p><h2>Какие модели доступны и сколько видеопамяти им нужно?</h2><p>В список prebuiltAppConfig.model_list в <a href="https://github.com/mlc-ai/web-llm/blob/main/src/config.ts">src/config.ts</a> на 3 сентября входят 165 записей: это варианты квантизации и длины контекста для семейств Llama 3.x, Qwen 2.5, Qwen 3 и Qwen 3.5, Phi 3.5 и Phi 4 mini, Gemma 2 и Gemma 3, Mistral и Ministral 3, дистилляты DeepSeek-R1, SmolLM2, OLMo 2, а также две модели эмбеддингов snowflake-arctic-embed. README при этом всё ещё перечисляет старый набор с Llama 2 и Qwen2, так что актуальный набор виден только в коде.</p><p>У каждой записи есть поле vram_required_MB, и это честнее любого «весит N гигабайт»: оно включает не только веса, но и память под KV-кэш при заданном контексте. Для 4-битных вариантов с половинной точностью (суффикс q4f16_1) разброс такой:</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-03/dd4f8b13-a996-4064-b90b-4c012e309271.webp" alt="Горизонтальная диаграмма: требуемая видеопамять в гигабайтах для девяти моделей WebLLM от 0,7 ГБ у gemma3-1b до 6,4 ГБ у Qwen3.5-9B" /><figcaption>Значение vram_required_MB для вариантов q4f16_1 с контекстом по умолчанию. График: Tproger по данным src/config.ts репозитория mlc-ai/web-llm, 3 сентября 2026</figcaption></figure><ul><li>gemma3-1b-it — 0,71 ГБ; Llama-3.2-1B-Instruct — 0,88 ГБ; Qwen2.5-0.5B-Instruct — 0,94 ГБ. Помечены флагом low_resource_required, это кандидаты для встроенной графики и ноутбуков.</li><li>Qwen3-0.6B — 1,40 ГБ; gemma-2-2b-it — 1,90 ГБ; Llama-3.2-3B-Instruct — 2,26 ГБ.</li><li>Qwen3-4B — 3,43 ГБ; Phi-3.5-mini-instruct — 3,67 ГБ; Llama-3.1-8B-Instruct — 5,00 ГБ; Qwen3-8B — 5,70 ГБ; Qwen3.5-9B — 6,43 ГБ.</li><li>Есть и Llama-3.1-70B-Instruct в 3-битной квантизации с требованием 31,15 ГБ; на потребительской видеокарте это не запустится.</li></ul><p>Варианты с суффиксом «-1k» урезают контекст до одной тысячи токенов и экономят память: у Llama-3.1-8B это 4,60 ГБ вместо 5,00, у Phi-3.5-mini 2,52 ГБ вместо 3,67. Все эти гигабайты приезжают с <a href="https://huggingface.co/mlc-ai">huggingface.co/mlc-ai</a>, поэтому доступность и скорость этого хоста в вашей сети стоит проверить до того, как обещать пользователям «работает без сервера». Свою модель в формате MLC подключают через appConfig.model_list, указав URL весов и WASM-библиотеки. Какие небольшие открытые модели вышли в августе и на чём их запускать дома, мы собирали в <a href="https://tproger.ru/news/otkrytye-nejroseti-avgusta-frontir-na-odnoj-videokarte-i-chto-za">обзоре открытых нейросетей</a>.</p><p>Полный каталог собранных моделей лежит на mlc.ai/models. Номер совместимой сборки библиотек зашит в пакет: для 0.2.84 это константа modelVersion со значением «v0_2_84/base», так что после обновления npm-пакета кэшированные WASM-библиотеки могут потребовать перезагрузки.</p><h2>Как не заморозить интерфейс: Web Worker или Service Worker?</h2><p>Для обычного приложения хватает выделенного Web Worker, а Service Worker нужен, когда модель должна переживать переходы между страницами. Оба варианта в README оформлены одинаково: в потоке живёт обработчик, в основном скрипте создаётся движок-прокси с тем же интерфейсом MLCEngineInterface.</p><p>С Service Worker сложнее. Его жизненным циклом управляет браузер и может убить поток без предупреждения; движок шлёт heartbeat каждые 10 секунд по умолчанию (значение keepAliveMs в src/service_worker.ts), но авторы просят закладывать обработку ошибок и в приложении. README отдельно требует создавать ServiceWorkerMLCEngineHandler на верхнем уровне скрипта и запрещает делать это внутри обработчиков activate или message: браузер перезапускает уже активный воркер без повторного события activate.</p><blockquote>Service Worker's life cycle is managed by the browser and can be killed any time without notifying the webapp. ServiceWorkerMLCEngine will try to keep the service worker thread alive by periodically sending heartbeat events, but your application should also include proper error handling.</blockquote><p>Отдельная ветка применения — расширения Chrome: в репозитории есть примеры базового расширения и расширения на Service Worker с WebGPU, которое держит модель в фоне. По данным MDN, в Firefox WebGPU недоступен именно в контексте Service Worker, так что этот сценарий пока привязан к Chromium.</p><h2>Где WebLLM выигрывает у серверного API, а где проигрывает?</h2><p>Выигрывает там, где важны приватность промптов и нулевая стоимость токена, проигрывает там, где нельзя выбирать пользователю железо. Разложу по пунктам, отделяя проверяемое от обещаний.</p><ul><li><b>Деньги.</b> Инференс идёт на GPU пользователя, счёт за токены равен нулю. Платите трафиком: каждый новый пользователь качает от 0,7 до 6,4 ГБ весов с Hugging Face; свой CDN нужен только тем, кто перехостит артефакты сам.</li><li><b>Приватность.</b> Промпты и ответы на сервер не уходят, это следует из архитектуры. Но сетевые запросы есть: веса и WASM скачиваются с huggingface.co и jsdelivr, поэтому формулировка «данные никогда не покидают устройство» некорректна, и в политике приватности так писать нельзя.</li><li><b>Скорость.</b> 71–80% от нативного инференса по замеру авторов на M3 Max. На ноутбуке с встроенной графикой цифр в статье нет, и обещать «десятки токенов в секунду» без своего замера нельзя.</li><li><b>Первый запуск.</b> Минуты загрузки против миллисекунд первого ответа у API. Кэш спасает повторные визиты, но не первый.</li><li><b>Браузеры.</b> По данным MDN, WebGPU есть в Chrome и Edge с версии 113 (полная поддержка на Linux только с 144 и только на Intel Gen12 и новее), в Safari 26 на macOS и iOS с 15 сентября 2025 года, в Firefox с 141 частично: есть Windows и Apple Silicon, нет Linux и Intel-маков. Проверка navigator.gpu обязательна.</li><li><b>Управление моделью.</b> Серверный API даёт одну версию модели для всех и мгновенную замену. В WebLLM версия модели живёт в кэше каждого браузера, а обновление пакета может потребовать перекачки библиотек.</li><li><b>Функции.</b> Вызов инструментов через tools и tool_choice в README помечен как WIP с предварительной поддержкой. Для агентских сценариев это стоп-фактор; про выбор стека для агентов у нас есть <a href="https://tproger.ru/articles/kak-vybrat-frejmvork-dlya-ii-agentov">отдельный разбор</a>.</li></ul><p>Есть и организационный риск. По реестру npm пакет обновлялся 19 раз в 2023 году, 63 раза в 2024-м, 3 раза в 2025-м и 4 раза с начала 2026 года; последний релиз 0.2.84 вышел 27 мая. Код в репозитории при этом продолжает меняться, последний push был 3 сентября. Для продакшена это означает, что свежие модели из config.ts могут ждать релиза месяцами.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-03/4059bf51-0d09-422e-8e6b-ba9c40176049.webp" alt="Столбчатая диаграмма: число релизов пакета @mlc-ai/web-llm по годам: 19 в 2023, 63 в 2024, 3 в 2025, 4 в 2026" /><figcaption>Релизы пакета @mlc-ai/web-llm по годам, 2026 год по 3 сентября. График: Tproger по данным реестра npm</figcaption></figure><blockquote>Evaluations show that WebLLM can retain up to 80% native performance on the same device with room to close the gap further.</blockquote><h2>Что делать по шагам, чтобы собрать чат на WebLLM за вечер</h2><p>План ниже покрывает путь от проверки железа до защиты артефактов; команды и имена функций взяты из README для версии 0.2.84.</p><ol><li>Проверьте, что в браузере есть navigator.gpu, и покажите понятную заглушку тем, у кого его нет. По MDN это Chrome и Edge 113+, Safari 26+, Firefox 141+ с оговорками по ОС.</li><li>Установите пакет: npm install @mlc-ai/web-llm (версия 0.2.84). Для прототипа без сборки подойдёт импорт с https://esm.run/@mlc-ai/web-llm.</li><li>Выберите модель из prebuiltAppConfig.model_list по полю vram_required_MB. Для широкой аудитории начните с моделей с флагом low_resource_required: Llama-3.2-1B, Qwen2.5-0.5B, gemma3-1b.</li><li>Создайте движок через CreateMLCEngine с initProgressCallback и выведите прогресс загрузки на экран.</li><li>Перенесите инференс в Web Worker через CreateWebWorkerMLCEngine, чтобы интерфейс не замирал во время генерации.</li><li>Включите стриминг флагом stream: true; для извлечения структурированных данных используйте JSON-режим из раздела Full OpenAI Compatibility.</li><li>Если артефакты лежат на своём хостинге, добавьте в запись модели поле integrity с SRI-хэшами для конфига, WASM и токенизатора; хэш генерируется командой openssl из README.</li></ol><p>При несовпадении хэша движок бросает IntegrityError, либо пишет предупреждение и продолжает работу, если задать onFailure: "warn". Без поля integrity проверка не выполняется вовсе, как и в прежних версиях.</p><h2>Что дальше: чего нет в WebLLM и за чем следить</h2><p>Первое, за чем стоит следить, это релиз после 0.2.84: в src/config.ts уже есть Qwen3.5 и Ministral 3, и вопрос в том, когда они попадут в опубликованный пакет. Второе — статус вызова функций, который держится в README как WIP. Третье — cross-origin хранилище: сейчас это расширение Chrome и экспериментальный API, а без него каждый сайт качает свою копию весов.</p><p>Мы не проверяли скорость на встроенной графике и на Windows-ноутбуках; единственные опубликованные цифры относятся к MacBook Pro M3 Max. Доступность huggingface.co и esm.run из конкретной сети мы тоже не измеряли: перед запуском продукта на WebLLM стоит замерить время первой загрузки у своей аудитории или перехостить артефакты.</p><p>Источники: <a href="https://github.com/mlc-ai/web-llm">GitHub: mlc-ai/web-llm (README, лицензия Apache-2.0)</a>, <a href="https://github.com/mlc-ai/web-llm/blob/main/src/config.ts">src/config.ts: prebuiltAppConfig.model_list с vram_required_MB</a>, <a href="https://github.com/mlc-ai/web-llm/blob/main/src/service_worker.ts">src/service_worker.ts: keepAliveMs и heartbeat</a>, <a href="https://arxiv.org/abs/2412.15803">arXiv 2412.15803: WebLLM: A High-Performance In-Browser LLM Inference Engine</a>, <a href="https://blog.mlc.ai/2024/06/13/webllm-a-high-performance-in-browser-llm-inference-engine">Блог MLC: WebLLM, 13 июня 2024</a>, <a href="https://webllm.mlc.ai/docs/">Документация WebLLM</a>, <a href="https://registry.npmjs.org/@mlc-ai/web-llm">Реестр npm: @mlc-ai/web-llm (версии и даты)</a>, <a href="https://news.ycombinator.com/item?id=49536411">Hacker News: обсуждение WebLLM 2 сентября 2026</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API#browser_compatibility">MDN: WebGPU API, совместимость браузеров</a>, <a href="https://huggingface.co/mlc-ai">Hugging Face: модели mlc-ai</a>, <a href="https://huggingface.co/spaces/mlc-ai/WebLLM-JSON-Playground">WebLLM JSON Playground</a>, <a href="https://chat.webllm.ai/">WebLLM Chat</a>, <a href="https://mlc.ai/models">Каталог моделей MLC</a>, <a href="https://github.com/mlc-ai/mlc-llm">GitHub: mlc-ai/mlc-llm</a></p><p>Изображение на обложке: Скриншот: chat.webllm.ai</p>]]></content:encoded>
    </item>
    <item>
      <title>Wasmi 2.0 ускорил интерпретацию WebAssembly в 2,2 раза</title>
      <link>https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza</link>
      <comments>https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza</guid>
      <description><![CDATA[<p>Вышел Wasmi 2.0, интерпретатор WebAssembly на Rust: новый исполнитель, четыре режима dispatch, аккумуляторные регистры и стабильный fuel metering. Замеры авторов на M2 Pro, EPYC и Xeon и что это значит для плагинов и embedded.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza">Wasmi 2.0 ускорил интерпретацию WebAssembly в 2,2 раза</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 01:28:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Робин Фрайлер, автор интерпретатора WebAssembly Wasmi, 1 сентября <a href="https://wasmi-labs.github.io/blog/posts/wasmi-v2.0/">объявил</a> о выходе Wasmi 2.0. По замерам самого проекта, новая версия исполняет Wasm-код примерно в 2,2 раза быстрее Wasmi 1.0 по геометрическому среднему набора бенчмарков. Для тех, кто запускает Wasm там, где JIT недоступен или нежелателен, это означает заметное ускорение без смены рантайма.</p><p>Wasmi написан на Rust и рассчитан на сценарии, где нужен именно интерпретатор: плагины в приложениях, встраиваемые устройства, песочницы, смарт-контракты. Релиз <a href="https://github.com/wasmi-labs/wasmi/releases/tag/v2.0.0">опубликован</a> на GitHub и crates.io; работа над ним заняла восемь месяцев.</p><ul><li>Wasmi 2.0 примерно в 2,2 раза быстрее Wasmi 1.0 по геометрическому среднему; замеры вендора на Apple M2 Pro, AMD EPYC 7763 и Intel Xeon Platinum 8370C.</li><li>Появились четыре режима dispatch; indirect-threaded на 10–15% медленнее direct-threaded, но экономит память под IR.</li><li>Новое промежуточное представление с аккумуляторными регистрами ireg, freg32 и freg64 и 64-битными ячейками стека.</li><li>Fuel metering стал стабильным и привязан к входному Wasm-коду; появился deterministic profile и новый CLI.</li><li>Включение SIMD больше не замедляет обычный код: в 1.0 это стоило около 8%, в 2.0 разница в пределах шума.</li></ul><h2>Откуда взялись 2,2 раза</h2><p>Автор подробно разбирает три источника ускорения. Первый: режимы диспетчеризации инструкций. В 1.0 был один switch-loop, теперь их четыре: direct-threaded, indirect-threaded, switch-loop и call-loop. Режим auto-dispatch включён по умолчанию и выбирает threaded-код там, где компилятор и платформа это позволяют. Indirect-threaded вариант примерно на 10–15% медленнее direct-threaded, зато требует меньше памяти на промежуточное представление, что важно для микроконтроллеров.</p><p>Второй источник: новое промежуточное представление. В 1.0 операнды адресовались смещениями в стеке; в 2.0 появились аккумуляторные регистры ireg, freg32 и freg64, через которые проходит большая часть значений. Ячейки стека стали всегда 64-битными, а SIMD-значения занимают две соседние ячейки, поэтому поддержка SIMD больше не стоит производительности обычного кода.</p><p>Третий: структура CodeMap, в которой хранятся скомпилированные функции. Она стала append-only с раздельными buckets, поэтому вызов внутренней функции на горячем пути не требует ни одного lookup и не берёт блокировок. Доступ к данным экземпляра модуля, по бенчмарку count/globals, улучшился примерно на 35%; таблицы Wasm уменьшились в 2–4 раза за счёт 32-битных ссылок.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-02/9fd51160-93fb-4066-847b-01cefb14b81b.webp" alt="График геометрического среднего времени исполнения для Wasmi 1.0, Wasmi 2.0, Wasm3, WAMR, Stitch и Wasmtime Pulley" /><figcaption>Геометрическое среднее времени исполнения по набору wasmi-benchmarks на Apple M2 Pro. Источник: Wasmi Labs</figcaption></figure><h2>Как измеряли и с кем сравнивали</h2><p>Замеры сделаны на проекте wasmi-benchmarks, который можно запустить самостоятельно, на трёх машинах: Apple M2 Pro, AMD EPYC 7763 и Intel Xeon Platinum 8370C. Кроме Wasmi 1.0 в сравнении участвовали интерпретаторы Wasm3, WAMR в режиме fast-interpreter, Wasmtime Pulley и Stitch. Это замер вендора: набор тестов, машины и конфигурации выбирал сам проект, и автор оговаривает, что цифры зависят от нагрузки.</p><p>В посте есть поучительный эпизод про компилятор. Rust 1.92 включил оптимизацию DestinationPropagation, из-за чего CoreMark у интерпретатора Stitch упал с более чем 3000 до примерно 2200 баллов; после исправления результат вернулся выше 3000. Похожая проблема нашлась и в Wasmi: её устранение подняло CoreMark примерно с 2800 до более чем 4200 баллов, то есть примерно на 50%. Вывод для практики: производительность интерпретатора на Rust заметно зависит от версии компилятора, и после обновления toolchain бенчмарки стоит перепрогонять.</p><h2>Что изменилось кроме скорости</h2><ul><li>Fuel metering, то есть учёт «топлива» на выполнение, стал стабильным и считается по входному Wasm-коду, а не по внутренним инструкциям; это важно для смарт-контрактов и лимитов на плагины.</li><li>Deterministic profile гарантирует одинаковый результат на разных платформах.</li><li>Поддержка memory64 стала опциональной; отключение валидации через feature validate уменьшает бинарник примерно на 200–300 КБ.</li><li>Обновлённый CLI и C-API.</li></ul><p>Кому обновление ничего не даст: тем, кто запускает Wasm через JIT-рантаймы вроде Wasmtime или V8 на сервере и в браузере. Интерпретатор нужен там, где JIT запрещён (iOS, некоторые блокчейн-среды), где нет памяти под скомпилированный код или где важна предсказуемость времени запуска.</p><h2>Как попробовать</h2><p>Wasmi ставится как обычный crate из crates.io; для Rust-проекта достаточно обновить зависимость wasmi до версии 2.0 и прогнать тесты: автор предупреждает о смене внутреннего представления, а значит, поведение при ошибках и лимитах стоит перепроверить. Проект открыт, спонсируется Stellar Development Foundation с октября 2024 года.</p><p>В планах на Wasmi 3.0 названы оставшиеся части WebAssembly 3.0: function-references, exception-handling и gc. Сроков автор не называет.</p><p>Источники: <a href="https://wasmi-labs.github.io/blog/posts/wasmi-v2.0/">Блог Wasmi Labs: Wasmi v2.0</a>, <a href="https://github.com/wasmi-labs/wasmi/releases/tag/v2.0.0">Релиз v2.0.0 на GitHub</a></p><p>Изображение на обложке: Wasmi Labs</p>]]></content:encoded>
    </item>
    <item>
      <title>Wasm — не совсем стековая машина</title>
      <link>https://tproger.ru/translations/wasm-ne-sovsem-stekovaya-mawina</link>
      <comments>https://tproger.ru/translations/wasm-ne-sovsem-stekovaya-mawina?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/wasm-ne-sovsem-stekovaya-mawina</guid>
      <description><![CDATA[<p>WebAssembly принято называть стековой машиной — но dup и swap в её наборе инструкций нет. Разбираем, почему Wasm ближе к регистровой архитектуре.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/wasm-ne-sovsem-stekovaya-mawina">Wasm — не совсем стековая машина</a>»</p>]]></description>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 28 Apr 2026 15:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Принято считать, что WebAssembly — стековая машина: так пишут в Википедии, в <a href="https://webassembly.github.io/spec/core/">официальной спецификации</a> и в популярных руководствах. На практике, как обнаружила <a href="https://purplesyringa.moe/">Alisa (purplesyringa)</a>, начавшая писать байт-код Wasm руками, это не совсем стековая машина: у неё нет ни dup, ни swap, ни прочих операций перестановки стека. Перевод её разбора того, чем Wasm на самом деле отличается от JVM и Forth, и почему это меняет интуицию для всех, кто пришёл туда из стековых VM.</p><p>Стековые машины (Forth, JVM) различают вычислительные операции и операции работы со стеком — dup, swap, drop. Регистровые машины вместо этого индексируют значения именами переменных.</p><p>В Wasm из «стековых» инструкций есть только drop. Никаких dup, swap, rot не предусмотрено.</p><p>Поэтому «чистый» Wasm способен вычислять только выражения ровно так, как они написаны. Любая нетривиальная оптимизация (вынесение общих подвыражений, превращение expr^2 в expr * expr) требует локальных переменных.</p><p>Корректнее воспринимать Wasm как регистровую машину с операциями, обобщёнными до составных выражений. Бинарный формат — лишь обратная польская запись поверх этой модели.</p><h2>Регистровая машина и стековая машина</h2><p>Шаг назад. Что такое стековая машина? Допустим, вы пишете на каком-нибудь языке высокого уровня и вам нужно посчитать 2 * 3 + 5 * 7. У низкоуровневых языков нет понятия составных выражений: они умеют выполнять только одну операцию за раз. То есть вам нужно сделать два умножения, сохранить промежуточные результаты, потом сложить.</p><p>Многие низкоуровневые языки — например, ассемблер x86 — представят эти шаги примерно так:</p><p>Это <b>регистровая машина</b>. У вас есть переменные (их называют <i>регистрами</i>), в которых можно держать и постоянные значения, и временные результаты. Каждая инструкция — формы var1 = var2 op var3.</p><p>Другие языки — например, <a href="https://en.wikipedia.org/wiki/Forth_(programming_language)">Forth</a> или <a href="https://hexcasting.hexxy.media/">Hex Casting</a> — используют для тех же целей стек. Стек хранит последовательность значений в порядке поступления; уже посчитанные подвыражения «лежат» на нём, пока вы работаете с другими частями. На стековом языке тот же самый расчёт выглядит так:</p><p>Обратите внимание на сходство: в обеих программах столько же шагов, и шаги делают то же самое. Главное различие — в стековой машине операнды неявно закодированы в порядке инструкций, а регистровая машина каждый раз указывает индексы явно.</p><h2>Перестановки на стеке</h2><p>Сжатия без потерь, которое всегда уменьшает данные, не существует — поэтому, делая индексы неявными, мы что-то теряем в выразительной силе. Что именно?</p><p>Для простых выражений — почти ничего. А вот когда значения <i>переиспользуются</i>, разница становится очевидной. Представьте, что вы — компилятор и вам надо скомпилировать такой кусок:</p><p>На регистровой машине всё прямолинейно:</p><p>А вот стековая машина «как описано выше» не умеет ссылаться на одно и то же значение дважды: mul всегда умножает два значения, лежащих на разных позициях стека. Чтобы такая программа стала возможной, в реальные стековые машины добавляют операции работы со стеком — помимо чисто вычислительных. Нужный нам инструмент называется dup — он <i>дублирует</i> верхнее значение стека:</p><p>Вы заметите, что регистровая машина посчитала (x*x)*x, а стековая — x*(x*x). Для умножения это одно и то же, но для других операций может быть нет. Чтобы починить — добавляют swap, который меняет местами два верхних значения:</p><p>На практике используют ещё больше операций: over (копирует предпоследнее значение наверх), 2dup (дублирует два верхних), drop (выбрасывает верхнее), rot (переносит третье сверху наверх) и так далее.</p><p>С этой точки зрения стековые машины можно рассматривать как разделение операций и индексов, на которые они действуют. Регистровые машины всегда явно указывают индексы и платят за это лишним размером, когда индексы избыточны. Стековые машины кодируют индексы только когда нужно — но платят за это ростом числа инструкций. Если хочется красиво — стековые машины реализуют «энтропийное сжатие» регистровой записи: средний код получается компактнее, потому что неявный индекс операнда дешевле в битах, чем явное имя регистра.</p><h2>А что у Wasm?</h2><p>Если посмотреть на JVM — известную стековую машину, с которой Wikipedia сравнивает WebAssembly — найдёте примерно тот же набор <a href="https://en.wikipedia.org/wiki/List_of_JVM_bytecode_instructions">байт-кода</a>:</p><ul><li>Доступ к памяти и константам: iaload, iastore, iconst.</li><li>Унарные и бинарные операции: d2f, iadd.</li><li>Манипуляции со стеком: dup, dup_x1 (он же over), pop (он же drop), swap.</li></ul><p>JVM — не чистая стековая машина: у неё есть инструкции для доступа к локальным переменным (iload, istore). Но без них тоже можно писать вполне рабочие JVM-программы — javac обычно использует их только для переменных, которые программист на Java явно завёл.</p><p>А теперь посмотрите на <a href="https://webassembly.github.io/spec/core/appendix/index-instructions.html">набор инструкций Wasm</a>:</p><ul><li>Доступ к памяти и константам: i32.load, i32.store, i32.const.</li><li>Унарные и бинарные операции: f32.demote_f64, i32.add.</li><li>Манипуляции со стеком: drop, э-э… и всё?</li></ul><p>Любопытно, не правда ли? У Wasm полно инструкций, которые принимают аргументы и кладут возвращаемые значения на стек, но почти нет инструкций, которые могут стек переставить. Насколько я могу судить, drop существует только потому, что иначе нельзя было бы проигнорировать результат функции.</p><p>По сути, чистый Wasm умеет вычислять выражения ровно так, как они записаны в исходнике. Оптимизирующий компилятор не может сделать вынесение общих подвыражений (CSE) или превратить expr^2 в expr * expr без введения новых переменных. Как только нужно что-то нетривиальное — приходится тянуться к локальным переменным, и иллюзия «стековой машины» рассыпается: получается обычная регистровая.</p><h2>Семантика</h2><p>На мой взгляд, правильно смотреть на Wasm как на регистровую машину с операциями, обобщёнными до составных выражений. В бинарном Wasm выражения закодированы в <a href="https://en.wikipedia.org/wiki/Reverse_Polish_notation">обратной польской записи</a>, которую удобно вычислять стеком — но это просто формат кодирования. В <a href="https://developer.mozilla.org/en-US/docs/WebAssembly/Guides/Understanding_the_text_format">текстовом Wasm</a> выражения, наоборот, записываются в LISP-подобной нотации — и она ничуть не менее эффективна.</p><p>Вообразите бинарный Wasm с префиксной нотацией — принципиально это бы ничего не поменяло. Если гадать почему всё-таки выбрали постфиксную — вероятно, чтобы упростить неоптимизирующие интерпретаторы, или потому что у разработчиков был опыт со стек-ориентированными VM, и это стало решающим аргументом.</p><p>Эту перспективу подкрепляет ещё один факт: пока Wasm не получил расширение <a href="https://github.com/WebAssembly/multi-value/blob/master/proposals/multi-value/Overview.md">multi-value</a>, управляющие конструкции практически не могли взаимодействовать со стеком. Значения, положенные на стек до if, не были видны внутри его тела; тело if могло вернуть только одно значение, поэтому if по сути был тернарным оператором, и даже значения с одним потребителем приходилось гонять через локальные переменные.</p><h2>Заключение</h2><p>Имеет ли это значение на практике? Не очень: почти любую машину можно перевести в <a href="https://en.wikipedia.org/wiki/Static_single-assignment_form">SSA-форму</a> (static single assignment — внутреннее представление, в котором каждой переменной значение присваивается ровно один раз; большинство оптимизирующих компиляторов работают именно с ней), и тогда формат входа становится не важен. Простоту реализации стекового интерпретатора тоже надо признать плюсом — это, наверное, помогло Wasm быстрее стать стандартом.</p><p>Но я думаю, стоит честно сказать: опыт работы со стек-ориентированными VM плохо переносится на Wasm — потому что Wasm не совсем стековая машина.</p><p>Уже после публикации этого поста я нашла <a href="https://troubles.md/posts/wasm-is-not-a-stack-machine/">ещё один отличный разбор</a> того же вопроса — но с точки зрения оптимизаций. Рекомендую почитать.</p><p><i>Перевод: оригинал — <a href="https://purplesyringa.moe/blog/wasm-is-not-quite-a-stack-machine/">purplesyringa.moe/blog/wasm-is-not-quite-a-stack-machine/</a>. Публикуется с разрешения автора в адаптации редакции tproger.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Пайплайны и базы данных в Kubernetes: как сделать развёртывание умным</title>
      <link>https://tproger.ru/articles/pajplajny-i-bazy-dannyh-v-kubernetes--kak-sdelat-razvyortyvanie-</link>
      <comments>https://tproger.ru/articles/pajplajny-i-bazy-dannyh-v-kubernetes--kak-sdelat-razvyortyvanie-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лесных Анна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pajplajny-i-bazy-dannyh-v-kubernetes--kak-sdelat-razvyortyvanie-</guid>
      <description><![CDATA[<p>Как в Kubernetes описать «база должна быть готова раньше приложения»? Helm и Argo CD для этого не подходят. Рассказываем, как управлять порядком и зависимостями правильно.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pajplajny-i-bazy-dannyh-v-kubernetes--kak-sdelat-razvyortyvanie-">Пайплайны и базы данных в Kubernetes: как сделать развёртывание умным</a>»</p>]]></description>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 06 Apr 2026 05:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>От переводчика: в статье разбирается, почему современные инструменты развёртывания (Helm, Kustomize, Argo CD) не справляются с оркестрацией сложных приложений, где важны порядок действий и взаимозависимости компонентов. В ней будут конкретные примеры проблем и способы их решения с полным рабочим кодом. Статья является переводом материала Дэвида Демаре-Мишо (David Desmarais-Michaud) <a href="https://yokecd.github.io/blog/posts/yoke-resource-orchestration/">«Kubernetes Orchestration is More Than a Bag of YAML»</a>. </i></p><p>Эту статью будет проще читать, если вы знакомы с основами <a href="https://yokecd.github.io/docs">Yoke</a> и <a href="https://yokecd.github.io/docs/airtrafficcontroller/atc">Air Traffic Controller</a>.</p><p>Если вкратце, Yoke позволяет определять пакеты как распространяемые программы, скомпилированные в WASM, которые называются Flights («рейсы»). Air Traffic Controller («диспетчер воздушного движения») расширяет API Kubernetes через Airways («воздушные трассы») — специальный ресурс, который создаёт CRD и связывает его с конкретным Flight.</p><p>Этот материал как раз о том, как Air Traffic Controller открывает простор для мощной и гибкой оркестрации ресурсов.</p><h2>За пределами плоского YAML: как выглядит реальная оркестрация в Kubernetes</h2><p>Если вам доводилось управлять современными сложными приложениями в Kubernetes, то наверняка знакомо чувство тревоги, когда ждёшь, пока все ресурсы перейдут в healthy-статус. Например, база данных должна быть готова до запуска приложения, серия пакетных задач (batch jobs) должна выполниться в строгой последовательности, а сервис может зависеть от секрета, которым управляет совершенно другая система. Как описать эти взаимоотношения? Сегодня, по большому счёту, никак.</p><p>Годами Helm и Kustomize были основными инструментами для управления Kubernetes-приложениями. Но они работают как генераторы манифестов: вы описываете список YAML-файлов, отправляете их в API и надеетесь, что всё сработает. Для простых stateless-приложений это нормально, но когда нужны порядок выполнения, координация между компонентами или управление состоянием — такой подход не годится.</p><p>Вот тут и встаёт вопрос оркестрации: способности осмысленно управлять жизненным циклом компонентов приложения, а не просто создавать их, надеясь на удачу.</p><h3>Пробел в оркестрации</h3><p>Причина этого пробела кроется в истории. Инструменты вроде Helm и Kustomize — это, по сути, шаблонизаторы на стороне клиента. Они генерируют манифесты, и на этом их работа заканчивается. Даже серверные GitOps-решения вроде Argo CD или FluxCD придерживаются той же концепции, ведь они преимущественно используют те же инструменты для генерации манифестов, которые потом синхронизируют за вас.</p><p>Конечно, есть обходные пути. Вы наверняка сталкивались с хуками pre/post-install в Helm или волнами синхронизации (sync waves) в Argo CD. И хотя это полезные фичи, проблема решается лишь частично. Они срабатывают только при установке или обновлении, но не работают <i>на протяжении всей жизни приложения</i>.</p><h2>Пара слов о YAML и итоговой согласованности</h2><p>Мы осознаем, что предложение отойти от использования YAML воспринимается неоднозначно. Для многих в сообществе «голые» манифесты — единственный «правильный» способ взаимодействия с API Kubernetes. Такая привязанность привела к тому, что для решения сложных проблем с зависимостями все стали активно полагаться на один базовый паттерн — итоговую согласованность (eventual consistency).</p><p>Идея в том, чтобы выкатить всё разом и просто надеяться, что рано или поздно контроллеры всё приведут к желаемому состоянию, зависимости подтянутся и кластер сам… заведётся. Все мы видели это на практике: под уходит в CrashLoopBackOff и висит в нём, пока какая-нибудь другая система наконец не создаст нужный ему ConfigMap или Secret.</p><p>Сразу поясним: итоговая согласованность — это фундаментальная часть Kubernetes и очень мощная идея. Проблема в том, что мы слишком долго использовали её как единственный инструмент для управления комплексными воркфлоу. Нам приходилось на неё полагаться, потому что имеющиеся инструменты не давали иного выбора: что имеем, тем и пользуемся. Наши YAML-ориентированные утилиты могли описать лишь то, что мы хотим получить в итоге, но не то, как к этому прийти.</p><h2>Дилемма оператора</h2><p>Классический ответ на запрос о создании умных и гибких стратегий развёртывания всегда был один: «Пишите свой оператор».</p><p>И хотя создание оператора — мощный и правильный подход, это ещё и масштабная задача. Здесь и высокий порог входа, и постоянные расходы на разработку и поддержку, которые далеко не всегда оправданы. Неужели нет золотой середины?</p><h2>Новая модель: логика приложения как код</h2><p>Вот тут-то на сцену и выходят <a href="https://github.com/yokecd/yoke">Yoke</a> и <a href="https://yokecd.github.io/docs/airtrafficcontroller/atc">Air Traffic Controller</a> (ATC) с новым образом мышления. Вместо того чтобы генерировать статичный набор YAML-файлов, Yoke описывает пакеты в виде исполняемого кода.</p><p>Это позволяет сфокусироваться на логике оркестрации приложения, написав простую [WASM] программу, работающую по знакомой схеме:</p><ol><li>Прочитать входные параметры из кастомного ресурса.</li><li>Принять решения, основываясь на текущем состоянии кластера.</li><li>Обновить статус кастомного ресурса, указав прогресс или другую информацию.</li><li>Создать те ресурсы, которые должны быть в кластере прямо сейчас.</li></ol><p>И да, это очень похоже на классический цикл согласования (reconciliation loop) в контроллере Kubernetes — так и задумано.</p><p>ATC — это контроллер, чья единственная работа — приводить ресурсы в кластере к желаемому состоянию. WASM-модуль представляет собой ядро логики и выступает посредником для цикла согласования, управляя желаемым состоянием (ресурсами) пакетов и избавляя вас от необходимости создавать и поддерживать собственный оператор с нуля.</p><h2>Как это работает на практике</h2><p>По своей сути, «Flight» в Yoke — это просто программа (скомпилированная в WASM; аналог Helm-чартов), которая считывает кастомный ресурс (Custom Resource) из stdin и записывает желаемое состояние системы в stdout.</p><p>Но поскольку ATC перезапускает её в рамках цикла управления (control loop), она становится <i>динамической</i> и <i>реагирующей</i>. Код выполняется каждый раз, когда:</p><ul><li>ресурс, которым он управляет (например, Job или Deployment), обновляется или удаляется;</li><li>внешний ресурс, который он отслеживает (например, Secret от другого инструмента), создаётся, обновляется или удаляется.</li></ul><p>Так код реагирует на изменения в кластере в реальном времени.</p><h2>Примеры</h2><h2>Пример 1: пайплайн для последовательного запуска задач</h2><p>Предположим, вам нужно создать ресурс Pipeline для запуска трёх задач друг за другом: job-one, job-two, job-three. При этом каждая следующая задача должна стартовать только после успешного завершения предыдущей.</p><p>С Yoke эту логику можно описать прямо в коде.</p><p>Сначала определим Go-тип для кастомного ресурса Pipeline:</p><p>Затем добавим соответствующее определение Airway, которое указывает ATC, как им управлять:</p><p>Основная магия содержится в WASM-модуле. Рассмотрим её пошагово:</p><p>Эта простая Go-программа как раз и реализует логику оркестрации. Она создаёт задачу, проверяет её статус и движется дальше, только когда та завершится. А цикл управления от ATC берёт на себя всю рутину по «ожиданию» и «перезапускам».</p><h2>Пример 2: координация с внешними ресурсами</h2><p>Рассмотрим другой распространённый сценарий: приложению требуется база данных. Вы используете Crossplane для инициализации CloudSQLInstance, который в итоге создаёт Secret, содержащий данные для подключения. Deployment не запустится до тех пор, пока этот Secret не будет существовать.</p><p>Сегодня вы, скорее всего, просто выкатываете всё сразу и ждёте, когда появится секрет (под приложения находится в состоянии CrashLoopBackOff). Но можно поступить умнее.</p><p>Давайте опишем ресурс App, который будет управлять этим процессом:</p><p>Airway нужно будет настроить так, чтобы он имел доступ к кластеру, а если точнее — чтобы мог искать ресурсы типа Secret.</p><p>Логика в нашем WASM-модуле будет такой:</p><p>Эта логика описывает зависимость: создать базу данных, дождаться секрета и только после этого развернуть приложение. Больше никаких подов в состоянии CrashLoopBackOff, только чистая оркестрация с отслеживанием состояния!</p><h2>Заключительные мысли</h2><p>Применяя подход «логика приложения как код», Yoke предлагает компромисс между статическими YAML-шаблонами и полнофункциональными операторами. Он позволяет кодифицировать сложные, активно реагирующие стратегии развёртывания с отслеживанием состояния, используя привычные языки программирования и инструменты, делая настоящую оркестрацию доступной для каждого.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что случилось с WebAssembly — и почему вы не заметили, как он победил</title>
      <link>https://tproger.ru/translations/chto-sluchilos-s-webassembly---i-pochemu-vy-ne-zametili--kak-on-po</link>
      <comments>https://tproger.ru/translations/chto-sluchilos-s-webassembly---i-pochemu-vy-ne-zametili--kak-on-po?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/chto-sluchilos-s-webassembly---i-pochemu-vy-ne-zametili--kak-on-po</guid>
      <description><![CDATA[<p>WebAssembly не заменил JavaScript — и не должен был. Figma, Cloudflare, Godot, Squoosh уже используют Wasm. Разбираем, как Wasm стал мостом между языками.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/chto-sluchilos-s-webassembly---i-pochemu-vy-ne-zametili--kak-on-po">Что случилось с WebAssembly — и почему вы не заметили, как он победил</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Архитектура ПО]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 27 Mar 2026 16:15:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>В каждом обсуждении WebAssembly найдётся комментарий в стиле «а что с ним стало?». Его рекламировали как революцию. Мы не видим сайтов, полностью написанных на Wasm. Он провалился? Это новый JVM-апплет?</p><p>Нет. WebAssembly победил — просто не так, как все ожидали.</p><p><b>Главное:</b> WebAssembly не заменил JavaScript в браузере — и не должен был. Его главная роль — мост между языками. Figma, Godot, Squoosh, Cloudflare Workers, Zellij — все они используют Wasm, но вы этого не замечаете — и это нормально.</p><h2>Где Wasm уже работает</h2><ul><li><b>Figma</b> — конвертирует C++ кодовую базу в браузерное приложение + запускает пользовательские плагины в песочнице через QuickJS+Wasm</li><li><b>Godot</b> — сборка игр для веба</li><li><b>Squoosh.app</b> — использует C/C++ библиотеки сжатия изображений прямо в браузере</li><li><b>Stackblitz</b> — веб-контейнеры на Wasm</li><li><b>Ruffle</b> — эмулятор Flash в браузере</li><li><b>Cloudflare Workers</b> — запуск недоверенного кода через V8 isolates</li><li><b>Zellij, Envoy, Lapce</b> — экосистема плагинов на Wasm</li></ul><h2>Что такое WebAssembly на самом деле</h2><p>WebAssembly — это <b>язык</b>. Более точно — байткод, похожий на JVM bytecode, но с меньшим API, более строгими гарантиями безопасности и без мнений о том, как управлять памятью.</p><p>Он достаточно низкоуровневый, чтобы чисто компилироваться под большинство архитектур без значительных потерь скорости. При этом Wasm-программа не может ничего без явного разрешения хоста — ни читать файлы, ни ходить в сеть. Всё внешнее — через импорты.</p><h2>Цель компиляции, не язык разработки</h2><p>В Wasm компилируются десятки языков: <b>Rust, C, Zig, Go, Kotlin, Java, C#</b>. Даже интерпретируемые языки работают — их рантаймы компилируются в Wasm (<b>Python</b> через Pyodide, <b>PHP, Ruby</b>). Есть и языки, которые компилируются исключительно в Wasm: <b>AssemblyScript, Grain, MoonBit</b>.</p><p>Ваш браузер уже умеет запускать Wasm. Но есть и автономные рантаймы: <b>Wasmtime</b>, <b>WasmEdge</b>, <b>Wasmer</b> — аналоги JVM, но для Wasm.</p><h2>Безопасность — главное преимущество</h2><p>Всё внешнее взаимодействие — явные импорты от хоста. Это даёт <b>изоляцию на уровне процесса внутри одного процесса</b>. Cloudflare запускает недоверенный код через V8 isolates — старт <b>в 100 раз быстрее</b>, чем отдельный процесс. Fermyon заявляет о старте менее чем за миллисекунду.</p><h2>Мост между языками — главная роль</h2><p>Самое распространённое применение — <b>мост между языками</b>. В большинстве случаев Wasm прозрачен для вас — какая-то библиотека просто использует его в дереве зависимостей. Это обработка изображений, OCR, физические движки, рендеринг, базы данных, парсеры.</p><h2>Ограничения</h2><ul><li>В браузере Wasm работает через тот же пайплайн, что и JS — потолок на производительность</li><li>Пересечение границы хост-программы стоит дорого — пост-мортем Zaplib показал, что постепенная миграция может не дать выигрыша</li><li>Нет нативного строкового типа — системные API приходится пересоздавать, WASI помогает частично</li><li>Самые компактные бинарники даёт Zig, самые тяжёлые без оптимизации — Rust</li></ul><h2>Почему кажется, что ничего не произошло</h2><p>Wasm-инструменты массово используются <b>авторами библиотек</b>, а не разработчиками приложений. Внутренности непрозрачны — и это нормально. Многие ожидали, что можно будет обойтись без .js файлов вообще — это крайне маловероятно, ни один вендор браузеров не работает над этим.</p><p>Фреймворки <b>Blazor</b> (.NET) и <b>Leptos</b> (Rust) позволяют писать веб-приложения без прямого контакта с JS. Стандартизация идёт: <b>WasmGC</b> уже в Chrome, Firefox и Safari; <b>Component Model</b> развивается в Bytecode Alliance.</p><h2>FAQ</h2><h3>WebAssembly быстрее JavaScript?</h3><p>Некорректный вопрос — скорость зависит от рантайма. Но конструкции Wasm хорошо ложатся на современное железо, поэтому в вычислительных задачах Wasm часто быстрее.</p><h3>Wasm заменит JavaScript?</h3><p>Крайне маловероятно. JS остаётся языком браузера, Wasm дополняет его там, где нужны вычисления, безопасность или доступ к библиотекам из других языков.</p><h3>С чего начать?</h3><p>Попробуйте <a href="https://github.com/nicolo-ribaudo/watlings">watlings</a> — упражнения по ручному написанию WAT в стиле rustlings. А для практического применения — wasm-pack для Rust.</p><p>Источник: <a href="https://emnudge.dev/blog/what-happened-to-webassembly/">What Happened To WebAssembly</a> — EmNudge</p>]]></content:encoded>
    </item>
    <item>
      <title>Quake запустили внутри Telegram — легендарный шутер из 90-х работает даже на смартфонах</title>
      <link>https://tproger.ru/news/quake-zapustili-vnutri-telegram---legendarnyj-wuter-iz-90-h-rabotaet-dazhe-na-smartfonah</link>
      <comments>https://tproger.ru/news/quake-zapustili-vnutri-telegram---legendarnyj-wuter-iz-90-h-rabotaet-dazhe-na-smartfonah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/quake-zapustili-vnutri-telegram---legendarnyj-wuter-iz-90-h-rabotaet-dazhe-na-smartfonah</guid>
      <description><![CDATA[<p>Quake 1996 теперь работает прямо в Telegram: бот @tgquake_bot запускает культовый шутер без установки, рекламы и даже на смартфонах</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/quake-zapustili-vnutri-telegram---legendarnyj-wuter-iz-90-h-rabotaet-dazhe-na-smartfonah">Quake запустили внутри Telegram — легендарный шутер из 90-х работает даже на смартфонах</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 14 Oct 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В Telegram появился игровой бот <b>@tgquake_bot</b>, который позволяет запустить оригинальный <b>Quake (1996)</b> прямо в мессенджере.</p><p>Да, тот самый культовый шутер от id Software, с которого для многих началась эра 3D-игр, теперь работает даже на смартфоне — без установок, эмуляторов и рекламы.</p><p>Автор проекта, разработчик под ником <b>@doszone</b>, рассказал, что за основу взял движок <b>Qwasm</b>, но полностью переработал его под Telegram. Он устранил критические ошибки, починил звук, добавил полноценное мобильное управление и интеграцию с мессенджером.</p><h2>Как это работает</h2><p>Игра запускается прямо в окне Telegram — на смартфоне, планшете или десктопе. Главные особенности:</p><ul><li>стабильная работа на большинстве устройств;</li><li>поддержка <b>полноэкранного режима</b> и <b>геймпадов</b>;</li><li>автоматическое <b>сохранение прогресса</b>;</li><li>полностью переработанное <b>тач-управление</b>.</li></ul><p>Разработчик предупреждает, что играть в шутер с сенсорным управлением все еще «экстремальный опыт», но обещает доработать интерфейс по отзывам игроков.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-10-14/86f85734-c197-4e04-a615-2d4e365d836b.jpeg" alt="" /></figure><h2>Что внутри</h2><p>Бот использует официальную <b>shareware-версию Quake</b> — тот же вариант, который распространялся бесплатно в 90-х. В ней доступен <b>первый эпизод</b>, состоящий из семи уровней и одного секретного, с финальным боссом.</p><p>Поиграть можно бесплатно, без рекламы, регистраций и прочих «подписок». Для запуска достаточно написать <a href="https://t.me/tgquake_bot">боту</a>.</p><h2>Почему это важно</h2><p>Quake в Telegram — не просто ностальгия, а показатель того, как далеко шагнули веб-технологии. Благодаря WebAssembly (WASM) и API Telegram, полноценная 3D-игра теперь помещается в окно мессенджера, работая без установки клиента или запуска с сервера.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как встроить распознавание паспорта СНГ в браузер</title>
      <link>https://tproger.ru/articles/kak-vstroit-raspoznavanie-pasporta-sng-v-brauzer</link>
      <comments>https://tproger.ru/articles/kak-vstroit-raspoznavanie-pasporta-sng-v-brauzer?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Smart Engines]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-vstroit-raspoznavanie-pasporta-sng-v-brauzer</guid>
      <description><![CDATA[<p>Рассказываем, как встроить распознавание паспортов РФ, стран СНГ и других удостоверений личности, а также банковских карт и других объектов прямо в браузер.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-pasporta-sng-v-brauzer">Как встроить распознавание паспорта СНГ в браузер</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Oct 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Эта статья продолжает раскрывать, как с помощью WebAssembly (Wasm) легко встроить технологии распознавания в любую веб-среду. Одними банковскими картами и паспортом РФ дело не ограничивается – на этот раз поговорим об удостоверениях личности стран СНГ: почему распознавание этих документов сегодня не менее актуально для бизнес-задач и как в этом деле помогает технология Wasm. В конце статьи вас ждет традиционный гайд по встраиванию, поехали!</p><h2>Зачем распознавать паспорта СНГ</h2><p>В нашей стране и за ее пределами паспорт – это ключ к любому цифровому сервису. Если вы открываете счет в банке, оформляете заказ в интернет-магазине, регистрируетесь в сервисе каршеринга, самостоятельно заселяетесь в отель или приобретаете билет на концерт, вам практически всегда требуется ввести свои паспортные данные.</p><p>Сегодня в этом помогает искусственный интеллект – он берет на себя <a href="https://smartengines.ru/smart-idreader/">распознавание паспорта</a> и позволяет получить в структурированном виде всю информацию о владельце документа без ошибок и задержек. Однако если решение умеет распознавать только российский паспорт, оно сразу теряет актуальность для Беларуси, Казахстана, Армении, Узбекистана и других стран. Это стратегический недочет – в особенности если бизнес имеет дело с иностранцами: например, связан со сферой туризма, банкингом, перевозками, или просто представлен в соседних с Россией государствах. Существенный спрос на технологии распознавание паспорта СНГ наблюдается со стороны HR-сферы – автоматизация ввода данных позволяет избавиться от бюрократических проволочек при массовом найме и работе с трудовыми мигрантами. Во всех этих случаях поддерживать распознавание документов стран СНГ просто необходимо.</p><p>Распознавание паспортов СНГ позволяет предложить единый, удобный и безопасный сценарий регистрации для пользователей из любых государств региона. В свою очередь, это повышает конверсию, сокращает клиентский путь и делает цифровые продукты доступнее для более широкой аудитории. Сегодня такие возможности искусственного интеллекта доступны не только для нативных приложений, но и для так называемых прогрессивных веб-приложений (PWA) и <a href="https://smartengines.ru/smart-engines-max-ocr/">mini apps в мессенджерах</a>.</p><h2>Как в этом помогает WebAssembly</h2><p>PWA, благодаря своей доступности и независимости от устройств и операционок, уже превратились в золотой стандарт для сферы цифровых услуг. «Прокачанные» сайты уже заменяют классические нативные приложения, поскольку не уступают по функциональности и быстродействию и при этом не требуют скачивания, обновления и поддержки в сторах. Кроме того, сейчас буквально на наших глазах происходит интеграция аналогичного формата в мессенджеры – MAX и Telegram. Туда уже интегрируют платежи и переводы, онлайн-покупки, регистрацию в сервисах и другие возможности, которые раньше оставались прерогативой нативных приложений.</p><p>Для переноса в веб хорошо знакомого пользователю функционала используется технология WebAssembly, или Wasm. Она позволяет выполнять ресурсоемкие вычисления – например, распознавание документов, анализ изображений, работу с графикой, – непосредственно в браузере. Это возможно без потери скорости и без постоянных запросов к серверу. Мы в <a href="https://smartengines.ru/">Smart Engines</a> разглядели перспективность Wasm задолго до того, как о технологии широко заговорили, и к моменту удаления банковских приложений из App Store и Google Play мы уже имели обширную экспертизу в этой области.</p><p>Мы разработали PWA, в котором реализовали распознавание QR-кодов, банковских карт, номеров телефонов, паспортов и других объектов. Это дало возможность ведущим российским банкам внедрить переводы по СБП и оплату квитанций прямо на интернет-странице. Таким образом, проблему блокировки приложений удалось решить – конечный пользователь получает максимально нативный опыт, оставаясь прямо в браузере. Веб-приложение хранит все необходимые ресурсы (включая Wasm-модули) в локальном кеше благодаря Service worker. В результате приложение получается максимально отзывчивым и может работать без интернета.</p><h2>Как работает распознавание паспорта СНГ</h2><p>Распознавание паспортов стран СНГ – задача нетривиальная: разные государства используют свои форматы документов, шрифты и уровни защиты. Мы разработали универсальную технологию, которая одинаково уверенно работает с паспортами России, Казахстана, Беларуси, Армении, Узбекистана, Таджикистана и других государств региона. В общей сложности система поддерживает более 100 языков, включая редкие письменности.</p><p>На распознавание паспорта любой страны СНГ в браузере с помощью нашего движка уходит всего несколько мгновений. Форма заполняется корректными данными за секунды, а пользователь не тратит время на перепечатку.</p><h3>Как встроить распознавание паспорта СНГ в веб</h3><p>Перейдем к делу. Для начала отметим, что источник входа, откуда система будет получать изображения, может быть совершенно любым. Например, камера —  тогда речь о фотографии или видео в реальном времени. Документ также может быть прикреплен из галереи или упакован в многостраничный PDF. Все эти форматы можно отрисовать на canvas и передать на распознавание.</p><p>Вы выбираете в вашем дизайне место для расположения canvas для вывода видео или делаете его скрытым для отрисовки PDF, например. Этот же подход используется, если вы пользователь айфона и хотите распознавать файл в формате HEIC.</p><p>Получаем ссылку на DOM-элемент:</p><p>Вот так мы извлекаем из него данные</p><p>Теперь же мы переключимся на воркер и заберем эти данные уже из него.</p><h3>Воркер</h3><p>Воркер или веб-воркер — это дополнительный поток браузера, который можно использовать для выполнения тяжелых задач, чтобы не нагружать основной поток, где осуществляется отрисовка UI и взаимодействие с пользователем.</p><p>Загружаем наш модуль для инициализации WASM.</p><p>Инициализируем Wasm-модуль</p><p>Создаем инстанс библиотеки распознавания</p><h2>Сессия распознавания</h2><p>Теперь мы подготовим сессию для распознавания. Создаем объект настроек</p><p>Указываем режим распознавания и маску документа. Можно указать маску звездочкой «*», а режим «anydoc», тогда поиск будет осуществляться по всем доступным документам.</p><p>Следующая настройка позволяет вернуть изображение документа, исправленное по перспективе. Эта очень удобная опция для визуальной проверки документа, он всегда возвращается в одной проекции и обрезанным по пропорциям физического документа.</p><p>Теперь мы инициализируем сессию.</p><h3>Передача изображений. Видеопоток</h3><p>В браузере для захвата изображений с камеры необходимо сначала отрисовать видеопоток на canvas, и после этого мы получаем доступ к пикселям, которые передаем в специальный объект Image.</p><p>Отметим, что объект canvas возвращает пиксели в формате RGBA, то есть с альфа каналом.</p><p>Создание объекта seImage класса se.common.image, необходимого для распознавания, возможно практически из любого набора пикселей, в том числе подходит и четырехканальное изображение.</p><p>Изображение создано. Теперь мы можем передать его на распознавание.</p><h3>Результат</h3><p>Объект result содержит в себе всю информацию о документе: текстовые поля, координаты шаблона и полей документа, изображения (подписи и фото держателя).</p><p>И на этом этапе мы рекомендуем не закрывать сессию, а продолжать подавать в нее изображения, то есть мы рекомендуем использовать распознавание документа в видеопотоке.</p><p>У этого подхода есть большое преимущество в виде устойчивости к бликам ламинированных документов и другим артефактам распознавания, поскольку их результаты комбинируются.</p><p>Если система больше не ожидает получить более качественное изображение на вход, она переводит флаг терминальности сессии в true и вы можете забрать результат.</p><p>Проверяйте результат каждый раз на терминальность:</p><p>Теперь вы видите, что добавить магию искусственного интеллекта в ваше веб-приложение совершенно несложно. Все работает прямо в браузере и по скорости практически не уступает нативному приложению. Подчеркнем, что вся обработка происходит локально на устройстве пользователя – это позволяет исключить риск утечек персональных данных на этапе распознавания.</p><p>А если вам интересно узнать больше про возможности искусственного интеллекта на WebAssembly, рекомендуем почитать наши прошлые статьи про распознавание <a href="https://tproger.ru/articles/raspoznavanie-bankovskoj-karty-v-brauzere--kak-s-pomoshhyu-tehnologii-webassembly-integrirovat-raspoznavanie-v-veb-stranicu">банковских карт</a> и <a href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-pasporta-rf-v-brauzer">паспорта РФ</a> в браузере.</p>]]></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>Как встроить распознавание банковской карты в браузер</title>
      <link>https://tproger.ru/articles/raspoznavanie-bankovskoj-karty-v-brauzere--kak-s-pomoshhyu-tehnologii-webassembly-integrirovat-raspoznavanie-v-veb-stranicu</link>
      <comments>https://tproger.ru/articles/raspoznavanie-bankovskoj-karty-v-brauzere--kak-s-pomoshhyu-tehnologii-webassembly-integrirovat-raspoznavanie-v-veb-stranicu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Smart Engines]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/raspoznavanie-bankovskoj-karty-v-brauzere--kak-s-pomoshhyu-tehnologii-webassembly-integrirovat-raspoznavanie-v-veb-stranicu</guid>
      <description><![CDATA[<p>Рассказываем, как с помощью технологии WebAssembly интегрировать распознавание в веб-страницу</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/raspoznavanie-bankovskoj-karty-v-brauzere--kak-s-pomoshhyu-tehnologii-webassembly-integrirovat-raspoznavanie-v-veb-stranicu">Как встроить распознавание банковской карты в браузер</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[GTK]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 18 Jul 2025 07:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет, Tproger!</p><p>Мы в Smart Engines занимаемся разработкой интеллектуальных систем для распознавания документов. Мы уже рассказывали вам, как просто и быстро интегрировать наши решения для <a href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-pasporta-rf-v-android--powagovoe-rukovodstvo">распознавания паспорта</a>, а также <a href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo">распознавания жестких и гибких форм</a> в Android.</p><p>Сегодня речь пойдет про браузерное распознавание. Оно в последние несколько лет пользуется колоссальным спросом со стороны рынка – прежде всего у  финтеха. Кроме того, развертывание PWA-приложений понадобится компаниям при интеграции функциональности в новый отечественный мессенджер MAX.</p><p>Поговорим о том, в чем плюсы распознавания в вебе и главное – как его развернуть на примере банковской карты.</p><h2>Исторический экскурс</h2><p>Технология WebAssembly (WASM) появилась в 2015 году и два года спустя была реализована во всех основных браузерах. Тогда же ученые Smart Engines начали проводить с WASM первые эксперименты.</p><p>Немного похвастаемся: в 2021 году мы первыми в стране представили промышленные технологии для распознавания документов в вебе. Это оказалось очень кстати, поскольку на фоне удаления мобильных приложений из магазинов к интерес к технологиям распознавания QR и банковских карт в браузере вырос.</p><p>Банки и финтех стали искать способы, как перенести привычную для пользователя функциональность – платежи по QR, распознавание номера телефона, распознавание банковской карты – из мобильного приложения в веб.</p><p>Ответ нашелся быстро – WASM и Smart Engines.</p><h2>В чем плюсы?</h2><p>Браузерное распознавание имеет очень много преимуществ. <b>Во-первых</b>, это все преимущества веб приложения:</p><ul><li>Кроссплатформенность;</li><li>Возможность доступа к приложению из любой точки с интернет-соединением</li><li><b>Мгновенное</b> развертывание и обновление приложения, что <b>позволяет пользователям всегда работать с актуальной версией</b>.</li></ul><p><b>Во-вторых</b>, предусматривает совершенно иной уровень защиты персональных данных. Пользователь не выгружает свои данные на сервер для распознавания, а, напротив, загружает модуль для распознавания изображений с персональными данными себе.</p><p>И, <b>в-третьих</b>, позволяет в сжатые сроки реализовать фронтэнд-интеграцию силами web-разработчиков.</p><p>Все преимущества браузерного распознавания уже оценили наши партнёры, нацеленные на развитие своих интернет-сервисов. Среди них – Альфа-Банк, Газпромбанк и другие.</p><h2>Распознавание кодифицированных объектов</h2><p>Одним из самых востребованных направлений в OCR сейчас является распознавание кодифицированных объектов, таких как баркоды, номера телефонов, банковских карт и прочие машиночитаемые зоны.</p><p>В своё время мы выделили распознавание таких объектов в отдельный продукт <a href="https://smartengines.ru/smart-code-engine/">Smart Code Engine</a> для того, чтобы иметь возможность гибче работать с различными сценариями распознавания, а также иметь возможность пойти дальше в деле оптимизации скорости и размера библиотеки. В результате появился Smart Code Engine 2.0 – продукт получил новый интерфейс и возможность максимально гибко настраивать поведение для получения лучшего качества распознавания.</p><p>Библиотека Smart Code Engine написана на С++ и портировалась в веб с помощью инструмента Emscripten. Поскольку вся кодовая база, от низкоуровневых вычисления над изображениями до архитектуры поисковой сети, поддерживается нашим научным отделом, качественное портирование не составляло особых проблем.</p><p>Js-интерфейс библиотеки представляет собой практически зеркальный С++ интерфейс и с его помощью распознавание банковской карты реализуется вот так:</p><p>Этот код необходимо поместить в веб-воркер, чтобы не нагружать UI поток браузера лишними вычислениями.</p><p>Передача изображений в библиотеку осуществляется прямо с чтения пикселей элемента canvas, где вы выводите изображения с камеры устройства или прикрепленного файла PDF.</p><p>В процессе работы распознавания у вас есть возможность нарисовать поверх изображения найденные элементы документа за мгновение до распознавания.</p><p>Вот как это выглядит на выходе:</p><figure><img src="https://media.tproger.ru/user-uploads/110363/2025-07-17/fd81bc20-66a7-4d20-90ee-ce1bf5a93827.gif" alt="Автоматический ввод данных банковской карты в браузере" /><figcaption>Распознавание банковской карты в браузере при помощи Smart Code Engine</figcaption></figure><p>Как вы можете заметить, интеграция Smart Code Engine SDK не вызывает сложностей – внедрение происходит практически мгновенно, а скорость распознавания сопоставима с нативными библиотеками.</p>]]></content:encoded>
    </item>
    <item>
      <title>Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</title>
      <link>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</link>
      <comments>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</guid>
      <description><![CDATA[<p>Эпохи развития программирования в России и в мире. Какие стадии прошли разработчики и к чему пришли в настоящий момент. Прогнозы на будущее. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov">Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние 20 лет программирование изменилось до неузнаваемости. Если в 2005 году разработчики писали код на PHP 4.0 под мерцание CRT-экранов, то в 2025-м нейросети помогают им генерировать целые модули, а квантовые компьютеры становятся частью исследовательских проектов.</p><p>Эта статья — подробная хроника эволюции программистов: какие языки и технологии они осваивали, как менялись их рабочие места, методы обучения и даже само восприятие профессии. Мы разберем ключевые этапы, от первых веб-гигантов до эпохи совместного программирования с ИИ, и попробуем представить, что ждет нас дальше.</p><h2>2005-2009: Эпоха авторских решений и первых веб-фреймворков</h2><p>В середине 2000-х типичный рабочий инструмент программиста — это громоздкий системный блок с процессором Intel Pentium 4 или новеньким Core 2 Duo. Мониторы с ЭЛТ-трубкой постепенно уступали место LCD-экранам с разрешением 1024×768 — именно на таких дисплеях создавались первые версии Wikipedia и набирающих популярность соцсетей. Оперативная память в 1-2 ГБ считалась нормой, а жесткие диски на 80-160 ГБ часто заполнялись до отказа — проекты редко весили меньше нескольких гигабайт.</p><p>Серьезная разработка велась преимущественно на стационарных компьютерах. Ноутбуки только начинали входить в обиход — их брали в офис, но для реальной работы предпочитали мощные десктопы. Операционная система Windows XP доминировала на рабочих станциях, в то время как серверы чаще всего крутили на Linux — Red Hat Enterprise или Debian.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/d5fca723-5450-4b72-8e8d-4cd57627fb99.jpg" alt="" /></figure><p>Среды разработки того времени сегодня кажутся архаичными. Eclipse и NetBeans потребляли гигабайты памяти, Visual Studio 2005 требовала серьезных ресурсов. Многие разработчики предпочитали простые текстовые редакторы вроде Notepad++, а для отладки использовали примитивные методы вроде вывода значений переменных через print. Контроль версий только начинал входить в практику — Git появился в 2005 году, но большинство команд продолжали использовать SVN или вообще заливали файлы по FTP напрямую на продакшен.</p><p>Языковая экосистема этого периода вращалась вокруг трех основных технологий. PHP версий 4 и 4.3 доминировал в веб-разработке — на нем работало около 80% всех сайтов в интернете. Однако его объектно-ориентированные возможности были крайне ограничены до выхода PHP 5 в 2004 году.</p><p>Java в лице J2EE оставалась стандартом для корпоративных решений — банковских систем, крупных порталов и ERP-комплексов. Spring Framework только начинал набирать популярность, а Hibernate упрощал работу с реляционными базами данных. C++ сохранял свои позиции в разработке игр (особенно с использованием Unreal Engine), драйверов и высоконагруженных сервисов.</p><p>Фронтенд-разработка в те годы была невероятно простой по современным меркам. Верстали преимущественно таблицами, а всю динамику реализовывали через jQuery, который появился в 2006 году и быстро вытеснил нативный JavaScript из повседневной практики. AJAX-запросы казались революционной технологией, позволяющей обновлять части страницы без ее полной перезагрузки.</p><p>Обучение программированию в этот период кардинально отличалось от современных подходов. Онлайн-курсы практически отсутствовали. Основными источниками знаний служили бумажные книги:</p><ul><li>«Философия Java» Брюса Эккеля;</li><li>«Совершенный код» Стива Макконнелла;</li><li>«PHP и MySQL. Разработка веб-приложений» Люка Веллинга.</li></ul><p>Русскоязычное сообщество активно обсуждало вопросы разработки на форумах RSDN.ru и CyberForum.ru. В 2008 году появился Stack Overflow, который постепенно стал главной площадкой для профессиональных обсуждений.</p><p>Университетское образование давало хорошую теоретическую базу — алгоритмы, структуры данных, принципы ООП. Однако практическим навыкам приходилось учиться самостоятельно, методом проб и ошибок. Документацию часто скачивали в формате CHM-файлов или читали непосредственно на сайтах вроде php.net и MSDN.</p><p>Типичный стек начинающего разработчика в 2009 году:</p><ul><li>HTML/CSS с jQuery для фронтенда;</li><li>PHP или Ruby on Rails для бэкенда;</li><li>MySQL в качестве базы данных.</li></ul><p>ORM-технологии еще не получили широкого распространения, поэтому SQL-запросы писали вручную. Многие проекты представляли собой монолитные приложения, где весь код хранился в единой кодовой базе без четкого разделения на модули.</p><p><b>Показательный кейс</b>:</p><p>В 2007 году разработчик PHP-приложений из МЭСИ (Москва) столкнулся с типичной для того времени проблемой — SQL-инъекциями. Вместо стандартных решений он создал DLAC (Data Logic Access Component) — обертку для работы с базой данных, которая автоматически экранировала параметры запросов. Это выглядело революционно на фоне типичного кода того периода, где строки запросов часто собирали через конкатенацию с пользовательским вводом.</p><p>Компонент использовал новую для 2005 года технологию Generics в C#. Он генерировал параметризованные запросы, что резко снижало риски взлома.</p><p><i>Разработчики в университетской среде тогда редко задумывались о безопасности — многие проекты содержали уязвимости вроде  </i>SELECT * FROM users WHERE name = ‘.$_POST[‘name’]<i>. </i></p><p><i>DLAC стал локальным спасением для внутренних систем МЭСИ, пока в 2009 году не появился NHibernate — порт популярного Java-фреймворка Hibernate.</i></p><p>Этот кейс хорошо иллюстрирует дух эпохи: отсутствие готовых безопасных решений заставляло программистов изобретать велосипеды. Многие подобные наработки позже легли в основу ORM-библиотек, но тогда они рождались в муках — через пробелы в безопасности и километры самописного кода.</p><h2>2010-2014: Мобильная революция и рассвет JavaScript</h2><p>Начало нового десятилетия ознаменовалось стремительным ростом мобильных технологий. Выход iPhone 4 в 2010 году и Android 2.3 Gingerbread задал новые стандарты мобильной разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/7b640694-b2cd-4f03-a68f-51ed138557b2.jpg" alt="" /></figure><p>Программисты массово переходили на MacBook Pro — не столько из-за преимуществ macOS, сколько благодаря появлению Retina-дисплеев в 2012 году, которые кардинально улучшили качество отображения кода.</p><p>Железо продолжало стремительно эволюционировать. Твердотельные накопители (SSD) начали вытеснять традиционные жесткие диски в рабочих станциях. Облачные платформы вроде AWS и Heroku стали реальной альтернативой локальным серверам, которые раньше часто стояли прямо под рабочими столами в офисах. Оперативная память в 8 ГБ стала стандартом для комфортной разработки, а четырехъядерные процессоры ускорили сборку крупных проектов.</p><p>Языковая палитра этого периода значительно расширилась. Objective-C стал основным языком для iOS-разработки и оставался таковым до появления Swift в 2014 году. Python 3 начал набирать популярность благодаря веб-фреймворку Django и научным библиотекам NumPy и Pandas, которые открыли дорогу для анализа данных в массовом сегменте.</p><p>JavaScript пережил настоящий ренессанс — после выхода AngularJS в 2010 и Node.js в 2009 году он перестал быть просто «языком для анимаций на сайте», превратившись в полноценную платформу для fullstack-разработки.</p><p><b>Важный факт</b>. В 2011 году разработчик из Сан-Франциско Райан Даль представил Node.js — среду выполнения JavaScript на стороне сервера. За первые 24 часа после релиза проект собрал 10 000 звезд на GitHub, что для того времени стало рекордом. Многие скептически относились к идее использовать JavaScript вне браузера, но уже через год такие компании как LinkedIn и Walmart перевели части своего бэкенда на Node.js, получив прирост производительности в 2-3 раза по сравнению с традиционными решениями на Java и Ruby.</p><p>Образовательная сфера претерпела значительные изменения. В 2011 году запустилась Coursera с первым массовым курсом по программированию — Machine Learning от Эндрю Ына. В 2012 году в Кремниевой долине открылся Hack Reactor, ставший прототипом современных coding bootcamps (интенсивов по программированию). Эти форматы предложили альтернативу традиционному университетскому образованию, сделав акцент на практических навыках.</p><p>Параллельно в России:</p><ul><li>В 2012 году появился Hexlet — одна из первых русскоязычных платформ с практико-ориентированными курсами по программированию. Особенность: выполнение заданий в реальной среде разработки через браузер. Платформа до сих пор работает: на текущий момент 80% выпускников трудоустраиваются в IT, <a href="https://ru.hexlet.io/blog/posts/hse-research">согласно исследованию ВШЭ</a>. В 2012 этот показатель был еще выше.</li><li>«Нетология» (основана в 2011) к 2013 году запустила курсы по веб-разработке с акцентом на JavaScript и Python, сотрудничая с российскими tech-компаниями. Их модель включала менторство и проектные работы.</li><li>В 2013 году стартовал Stepik — платформа с открытыми курсами от ведущих вузов (ИТМО, МФТИ). Особенность: интерактивные задачи с автоматической проверкой кода, что было прорывом для местного рынка.</li></ul><p>Курс «Введение в Linux» от Stepik (2014) за полгода собрал 50 тыс. студентов — рекорд для Рунета. Задания включали настройку виртуальных серверов, что сразу применялось в работе.</p><p>Эти проекты заложили основу для бума EdTech в России после 2015 года, доказав, что онлайн-формат может давать актуальные навыки быстрее вузов.</p><p>Типичный разработчик среднего уровня в 2014 году:</p><ul><li>понимал принципы REST API;</li><li>начинал осваивать основы DevOps с появлением Docker в 2013;</li><li>экспериментировал с микроконтроллерами вроде Arduino или Raspberry Pi, создавая собственные IoT-устройства.</li></ul><p>В профессиональной среде начал формироваться консенсус о том, что PHP устаревает для сложных коммерческих проектов.</p><h2>2015-2019: Эра больших данных и облачных технологий</h2><p>Аппаратные возможности сделали очередной рывок вперед. Многоядерные процессоры Intel i7 и AMD Ryzen стали стандартом для рабочих станций. 16 ГБ оперативной памяти перестали быть роскошью, а мониторы с разрешением 4К стали доступны широкому кругу разработчиков. В 2015 году появился Visual Studio Code, который быстро обогнал по популярности Sublime Text и Atom благодаря удачному сочетанию функциональности и производительности.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/c92b70be-b3eb-4924-a40a-587ed3d43592.png" alt="" /></figure><p>Языковая экосистема продолжила развитие. TypeScript, представленный в 2014 году, предложил решение проблемы масштабируемости JavaScript-кода в крупных проектах. Go от Google, созданный еще в 2009, нашел свою нишу в разработке микросервисов и инструментов оркестрации вроде Kubernetes (2015). Rust от Mozilla начал завоевывать доверие системных программистов благодаря уникальной системе владения памятью.</p><p>JavaScript-сообщество столкнулось с первыми серьезными проблемами. В 2016 году инцидент с пакетом left-pad показал уязвимость экосистемы npm — удаление одного небольшого модуля привело к сбоям в работе тысяч проектов по всему миру. Это заставило разработчиков задуматься о зависимости от сторонних библиотек.</p><p>Типичный senior-разработчик в 2019:</p><ul><li>разбирался в микросервисной архитектуре и понимал, как избежать vendor lock-in (привязки к поставщику) при работе с облачными провайдерами;</li><li>имел опыт работы с React или <a href="http://vue.js">Vue.js</a>;</li><li>знал, что понимание принципов работы алгоритмов становится менее важным, чем развитие soft skills для работы в команде.</li></ul><p>Ключевые технологии этого периода включали Kubernetes, который стал стандартом де-факто для оркестрации контейнеров, а также TensorFlow (2015) и PyTorch (2016), открывшие эру машинного обучения для широкого круга разработчиков. Появились первые серьезные инструменты для работы с большими данными — Apache Spark, Hadoop.</p><p><i>Ключевой момент. В 2016 году Netflix раскрыл детали своего перехода на облачную инфраструктуру AWS. Компания полностью перенесла все сервисы — от рекомендательной системы до биллинга — в облако за семь лет. Главным триггером стала катастрофа 2008 года, когда три дня простоя дата-центра оставили 8,4 млн подписчиков без доступа к сервису. Миграция потребовала перепроектирования архитектуры: инженеры разбили монолит на 500 микросервисов и внедрили Chaos Monkey — инструмент для тестирования отказоустойчивости, который случайно отключал серверы в продакшене.</i></p><p>Этот кейс стал хрестоматийным примером cloud-native подхода. Облачные технологии стали активно использоваться в разработке, а обращение с ними — обязательным навыком для прогеров.</p><h2>2020-2024: AI-assisted разработка и новые парадигмы</h2><p>Пандемия COVID-19 ускорила переход на удаленную работу. Программисты по достоинству оценили макбуки на чипах M1 (2020) за их энергоэффективность и производительность. Домашние офисы оснащались 32-дюймовыми 4К-мониторами и механическими клавиатурами, ставшими своеобразным профессиональным стандартом.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/65ba41e0-844c-419f-8656-e78905e93540.jpg" alt="" /></figure><p>Языковая палитра продолжала обогащаться. Rust официально вошел в ядро Linux в 2022 году, подтвердив свой статус системного языка нового поколения. Zig появился как современная альтернатива «C» с акцентом на безопасность. WebAssembly (Wasm) позволил запускать ресурсоемкие приложения прямо в браузере, открыв новые возможности для веб-разработки.</p><p>Искусственный интеллект начал проникать в повседневную работу программистов. GitHub Copilot на базе GPT-3, представленный в 2021, изменил сам процесс написания кода, предлагая контекстные подсказки. Low-code платформы вроде Retool упростили создание внутренних инструментов для бизнеса.</p><p>Типичный lead-разработчик в 2024 году:</p><ul><li>умел эффективно работать в гибридных командах (офис + удаленка);</li><li>автоматизировал рутинные задачи через ChatGPT API;</li><li>следил за развитием квантовых вычислений, хотя практическое применение пока оставалось ограниченным.</li></ul><p><i>Ключевой момент. В 2023 году GitHub Copilot, разработанный совместно с OpenAI, стал катализатором перемен в индустрии. За первый год после релиза инструмент использовали более 1,3 млн разработчиков — каждый десятый подписчик GitHub. Система анализировала контекст кода и предлагала целые функции: например, при написании SQL-запроса она автоматически генерировала соответствующую модель данных на Python. Amazon внедрил аналогичный инструмент Amazon Q Developer для внутренних команд — по заявлению CEO Энди Джесси, это сэкономило компании 4,500 человеко-лет работы и $260 млн ежегодно.</i></p><p><i>Но были и курьезы. В 2024 году разработчик из Берлина случайно отправил в продакшен код, полностью сгенерированный Copilot. Система использовала фрагмент из GPL-лицензированной библиотеки, что нарушило политику компании по открытому ПО. Инцидент заставил пересмотреть процессы ревью: теперь 78% команд требуют ручной проверки AI-кода перед мержем (слиянием).</i></p><p><i>Параллельно выяснилось, что Copilot в 40% случаев предлагает уязвимый код при работе с СУБД — это привело к взлому API стартапа через SQL-инъекцию. Такие кейсы показали, что ИИ пока не заменяет программистов, а требует от них новых навыков — критического анализа машинных предложений и понимания юридических аспектов кода.</i></p><h2>2025: Современное состояние профессии</h2><p>Современные рабочие станции программистов оснащены ноутбуками с процессорами Apple M4 (3 нм) или Windows-машинами на Snapdragon X Elite. Мониторы с разрешением 8К используются для разработки AR-приложений, а OLED-экраны с HDR стали стандартом для работы с графикой. Появляются первые экспериментальные IDE с нейроинтерфейсами, способные предсказывать код на основе анализа мозговой активности.</p><p>Среди языков программирования выделяется Mojo (2023) — «Python для GPU», набирающий популярность в сфере машинного обучения. Carbon как потенциальный наследник C++ пока остается в тени Rust. Квантовые языки вроде Q# и Cirq интересуют в основном энтузиастов и исследователей.</p><p>Профессия претерпела значительные изменения. ИИ стал не конкурентом, а помощником — по некоторым оценкам, около 60% рутинного кода в 2025 году (тесты, документация) генерируется автоматически. Знание английского языка стало важнее знания сложных алгоритмов — без него невозможно эффективно работать с современными AI-инструментами. Понятие «fullstack-разработчик» трансформировалось — теперь оно подразумевает владение фронтендом, одним бэкенд-языком и основами машинного обучения.</p><p>За два десятилетия программисты прошли путь от одиночек за CRT-мониторами до участников глобальных распределенных команд. Если в 2005 ключевым навыком было умение написать работающий код, то в 2025 главное — способность эффективно взаимодействовать с ИИ-ассистентами. Однако основы профессии остались неизменными — логическое мышление, способность к абстракции и желание автоматизировать рутинные задачи.</p><p>Будущее обещает новые трансформации. К 2030 году нейроинтерфейсы смогут заменить традиционные устройства ввода, а квантовые компьютеры — перевернуть основы криптографии. Но пока актуальными остаются проверенные временем принципы: изучать перспективные технологии (вроде Rust и Mojo), осваивать работу с ИИ и, конечно, совершенствовать главный навык любого программиста — умение быстро и грамотно гуглить.</p><p>Ты уже программист, если читаешь это! Больше о кодинге <a href="https://t.me/+ezugB7gnIEsxNGMy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Если бы я хотел стать разработчиком на Rust в 2025, с чего бы я начал?</title>
      <link>https://tproger.ru/articles/esli-by-ya-hotel-stat-razrabotchikom-na-rust-v-2025--s-chego-by-ya-nachal-</link>
      <comments>https://tproger.ru/articles/esli-by-ya-hotel-stat-razrabotchikom-na-rust-v-2025--s-chego-by-ya-nachal-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/esli-by-ya-hotel-stat-razrabotchikom-na-rust-v-2025--s-chego-by-ya-nachal-</guid>
      <description><![CDATA[<p>Гайд по Rust. Показываем, что нужно знать, чтобы научиться языку программирования Раст. Рассматриваем пошаговую инструкцию и практические примеры ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/esli-by-ya-hotel-stat-razrabotchikom-na-rust-v-2025--s-chego-by-ya-nachal-">Если бы я хотел стать разработчиком на Rust в 2025, с чего бы я начал?</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Haskell]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Apr 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Rust — язык общего назначения, который ориентирован на высокую производительность и безопасное управление памятью. На нем можно писать софт практически для любого направления: CLI-утилиты, высоконагруженные сервера, десктопные приложения, мобильные приложения (с некоторыми оговорками), игры и игровые движки, прошивки для микроконтроллеров, операционные системы, драйвера и даже браузерные приложения (через компиляцию в WebAssembly).</p><p>В рейтинге языков программирования TIOBE Rust занимает 14 место. Для сравнения — в прошлом марте он был на 17 позиции. Вместе с экспертами <a href="https://solvery.io/?utm_source=article&amp;utm_medium=partner&amp;utm_term=tproger&amp;utm_content=rust_2025&amp;utm_campaign=main_page">Solvery</a> <a href="https://solvery.io/ru/mentor/bondiano?utm_source=article&amp;utm_medium=partner&amp;utm_term=tproger&amp;utm_content=rust_2025&amp;utm_campaign=vasiliy_kuzenkov">Василием Кузенковым</a>, full-stack разработчиком в Web3 стартапе, и <a href="https://solvery.io/ru/mentor/belyaev_dmitry?utm_source=article&amp;utm_medium=partner&amp;utm_term=tproger&amp;utm_content=rust_2025&amp;utm_campaign=belyaev_dmitriy">Дмитрием Беляевым</a>, Rust developer в Wildberries, разбираемся, как стать разрабом на Расте в 2025 году.</p><h2>Немного об особенностях</h2><p>Если вы до этого программировали на ООП языках, то вам, возможно, бросалось в глаза отсутствие привычных классов. Вместо них здесь алгебраические типы данных и трейты для решения expression problem. Их механизм куда больше похож на typeclasses из Haskell, что также будет для вас новой концепцией при построении крупных приложений, и нужно будет перестраивать мышление.</p><blockquote>Также когда стартуешь, немного непривычно работать с move-семантикой, RAII, borrow checker’ом и лайф-таймами. Но компилятор сыпет довольно подробными ошибками, которые можно легко поправить, если разобраться.</blockquote><p>А еще у Rust очень строгая типизация и очень мощная система типов, а сами типы построены так, чтобы предоставлять некоторые гарантии программисту. Например, ссылки в Rust всегда ссылаются на объект, гарантировано существующий в памяти, а стандартные строки содержат только валидный UTF-8. При этом в подавляющем большинстве случаев тип необязательно указывать явно, компилятор способен выводить типы, анализируя контекст функции целиком. Кроме того, Rust следует идеологии «компилируется, значит, работает». От логических ошибок, конечно, Раст не спасёт, но тем не менее очень большой пласт багов можно отловить на этапе кодинга. Да, это сложно, но лучше помучиться при разработке, чем потом разбираться почему упал прод.</p><p>Ещё одна отличительная фишка — абстракции с нулевой стоимостью. Rust позволяет писать высокоуровневый и понятный код, который при этом будет иметь ту же производительность, что и более низкоуровневый оптимизированный вручную вариант.</p><blockquote>Хороший пример здесь — итерация по различным коллекциям. Многие языки позволяют использовать итераторы с их абстракциями вроде map или filter. Только такой код, как правило, будет в несколько раз медленнее, чем если то же самое переписать на циклы. Компилятор Rust способен развернуть такой итератор в обычные циклы сам, и производительность будет сравнима, а порой даже лучше, так как программисты часто при написании низкоуровневого кода заставляют процессор делать много лишних вычислений.</blockquote><h2>Сложно ли переходить на Rust</h2><p>У Rust достаточно нетривиальная кривая входа, и без понимания некоторых важных принципов сложно написать код, который хотя бы будет компилироваться. Это относится не только к полным новичкам в программировании, но и к людям, которые уже владеют другим языком.</p><blockquote>На рынке фактически все вакансии требуют уже какого-то опыта в разработке. И сложность перехода сильно разнится от вашего текущего стека. Для Go-программиста переход будет средне-сложным, а язык, возможно, покажется перегруженным. Для С++ — менее сложным, но язык покажется местами ограничивающим. Я переходил на него с JS/TS’а и столкнулся со множеством низкоуровневых концепций, о которых раньше мог не задумываться. Но если у вас есть опыт в системном программировании — переходить будет в разы проще.</blockquote><p>Однако Rust прививает программисту очень много хороших привычек, которые меняют подход к написанию кода и на других языках. Это однозначно хороший выбор в качестве первого языка, но при условии, что у вас есть достаточно времени и терпения на освоение.</p><blockquote>В моей практике менторства много успешных кейсов перехода на Rust с самых разных языков, но проще всего он даётся тем, кто раньше писал на современном C++ и уже понимает такие концепции, как move-семантика и RAII. Много привычного здесь обнаружат и те, кто писал на функциональных языках (Haskell  или OCaml). Но в целом, для остальных тоже нет никаких проблем, даже если вы совсем новичок.</blockquote><h2>С чего начать изучать Rust</h2><p>Вместе со стартом в изучении языка с The Rust Book — бесплатной официальной книгой по Rust’у — стоит углубить свои знания в более низкоуровневых вещах: в чем разница стека и кучи, что такое разметка памяти и адресация в памяти, как работает процессор, подходы и проблемы многопоточного программирования, плюс почитать про операционные системы и сети. Если вы решили осознанно применять Rust, оно вам пригодится.</p><blockquote>Начать можно даже имея только самую базу в программировании: переменные, ветвления, циклы, функции. Крайне желательно разобраться в устройстве памяти, что такое стек и куча, а так же какие области памяти бывают помимо них.</blockquote><p>Вот примерный список того, что нужно учить на старте:</p><ul><li><b>Переменные.</b> Они по умолчанию неизменяемые (let x). Чтобы x стал изменяемым, нужно указать это явно через let mut. Константы (const) и статические переменные (static) вам будут нужны редко, они имеют свои особенности.</li><li><b>Типы.</b> Стоит разобраться с составными типами, такими как массивы и кортежи, а также с пользовательскими объявляемыми конструкциями struct (тип-произведение) и enum (тип-сумма). Также типы данных в Расте есть стандартные: bool, i32, u64 и прочие числовые, но строки могут удивить, так как их видов сильно больше.</li><li><b>Match.</b> Нужно понять такую вещь, как pattern-matching, познакомиться с оператором match, а также осознать, что pattern-matching применяется не только в нём, а везде, где возможно объявление переменных.</li></ul><p>Таким образом, вы можете сразу проверить что-то и присвоить результат в переменную:</p><p>Здесь мы сразу проверили и присвоили:</p><p>Тут нам потребовалась дополнительная изменяемая переменная.</p><h2>Что такое Cargo</h2><p>Cargo —  это консольная утилита, которая устанавливается вместе с компилятором языка. Она служит одновременно для управления зависимостями, сборки проекта и запуска тестов. Плюс для Cargo есть расширения, например, в поставке по умолчанию уже есть форматтер и линтер clippy.</p><p>Cargo рассчитан на то, что вы будете запускать его через терминал, самые полезные команды это:</p><ul><li>cargo new — создаёт новый шаблонный проект в указанной папке;</li><li>cargo build — собирает проект;</li><li>cargo run — собирает проект и запускает получившийся исполняемый файл;</li><li>cargo check — dry-run сборки, делает все проверки компилятора, но ничего не собирает, что заметно быстрее полноценной сборки;</li><li>cargo test — собирает проект со всеми тестами и запускает их;</li><li>cargo fmt — форматирует проект в общепринятый стиль кода;</li><li>cargo clippy — запускает линтер, очень полезно, можно подсказать более оптимальные варианты кода, найти некоторые потенциальные логические ошибки;</li><li>cargo install — устанавливает пакет, содержащий исполняемые файлы;</li><li>cargo clean — очищает все артефакты сборки.</li></ul><p>Cargo позволяет описать структуру, настройки (профили сборки, описание крейта) и зависимости вашего крейта или даже монорепозитория (с помощью workspace). Кроме непосредственного запуска через терминал, многие вещи могут запускаться через средства интеграции в IDE, такие как rust-analyzer для VSCode.</p><h2>Как работать с ownership, borrowing и lifetimes?</h2><p>Для многих новичков системы владения (ownership), заимствования (borrowing) и времен жизни (lifetimes) выливаются в борьбу с компилятором раста. Эти механизмы нужны в первую очередь для безопасности памяти без сборщика мусора. Общее правило владения такое:</p><p><i>Каждое значение в Rust имеет переменную, которая называется его <b>владельцем</b>. В каждый момент времени может быть только <b>один владелец</b>. Когда владелец выходит из области видимости, значение уничтожается.</i></p><p>Когда значение перемещается (передается другой переменной или функции), владение переходит, и исходная переменная становится недействительной.</p><p>Для типов, реализующих трейт Copy (например, целые числа, булевы значения), значения копируются автоматически:</p><p>Для более сложных типов нужно использовать метод clone(), чтобы создать глубокую копию. В местах программы, где производительность не так важна — использование clone() не возбраняется.</p><p>Если же у вас критичный к производительности кусок кода, то вам также понадобится заимствоватние и лайфтаймы.</p><p>Заимствование позволяет использовать значение без получения владения через ссылки (&amp; и &amp;mut). Для мутабельных ссылок `&amp;mut` есть дополнительные ограничения: в каждый момент времени может существовать только одна изменяемая ссылка на значение.</p><p>Нельзя иметь изменяемую ссылку, если уже есть неизменяемая ссылка на то же значение.</p><p>Времена жизни же гарантируют, что ссылки действительны на протяжении всего времени их использования.</p><p>Аннотация 'a указывает, что возвращаемая ссылка будет жить как минимум столько же, сколько кратчайшая из входных ссылок.</p><p>Общие советы по заимствованию здесь такие:</p><ul><li>Используйте ссылки, когда не нужно владение.</li><li>Возвращайте значения из функций для передачи владения обратно.</li><li>Используйте клонирование для создания новых экземпляров (с пониманием стоимости).</li><li>Используйте типы с трейтом Copy, когда это возможно.</li><li>Еще полезно не забывать о контейнерах. Rc&lt;T&gt; позволяет иметь несколько владельцев одного значения через счетчик ссылок, а RefCell&lt;T&gt; обеспечивает проверку правил заимствования в рантайме.</li></ul><h2>О структурах, перечислениях, модулях и функциях, замыканиях, итераторах</h2><p>Структуры (structs) в Rust позволяют создавать пользовательские типы данных, объединяющие связанные значения и выступающие типом произведения.</p><p>Перечисления (enum) позволяют определить тип, перечисляя все возможные варианты значений.</p><p>Перечисления в Rust являются типами суммы, поскольку значение может быть одним из вариантов:</p><p>Тип Shape представляет объединение (сумму) всех возможных вариантов. И к этому есть мощное сопоставление с образцом для работы с ADT:</p><p>Модули позволяют организовать код и контролировать видимость элементов. Определяются они через синтаксис mod &lt;name&gt; {} и могут быть вложенны друг в друга:</p><p>Также модули могут быть организованы в различных файлах (имя файла в таком случае будет именем модуля):</p><p>Импорт модуля осуществляется через ключевое слово use:</p><p>Функции в Rust определяются через ключевое слово fn:</p><p>Можно делать функции высшего порядка и передавать в них, как обычные, так и анонимные функции:</p><p>Еще одним элементом функционального программирования в Rust выступает итератор:</p><p>Здесь мы создаем собственный итератор Counter, реализуя стандартный трейт Iterator. Он используется для многих встроенных коллекций, таких как Vec или HashMap. Этот трейт особенно удобен из-за различных функциональных комбинаторов из стандартной библиотеки:</p><p>Трейт Iterator предоставляет множество методов адаптеров, таких как enumerate, filter или map, которые возвращают новый итератор. Методы адаптеров ленивые, они не запускают итерацию. Также есть методы исполнители, которые итерируют пока не закончатся значения, например, collect, fold или count.</p><p>Большинство коллекций (и ссылки на них) реализуют трейт IntoIterator (способность кастоваться в Iterator). Также IntoIterator автоматически реализуется для любого Iterator (ничего не стоящий каст сам в себя). Цикл for в Rust работает только с объектами, реализующими IntoIterator.</p><h2>Как обрабатывать ошибки в Rust</h2><p>В Rust принято разделять ошибки на 2 вида: паники и результаты операций:</p><ul><li><b>Паники</b> используются для непредвиденных ситуаций и ошибок программиста, например, деление целочисленного типа на 0 или выход за границу массива. И хотя паники можно отловить, стандартное и рекомендуемое поведение при них — программа упадёт, будет напечатан стектрейс.</li><li><b>Результаты операций</b> выражаются типом Result&lt;T, E&gt;, который является перечислением из двух вариантов — Ok(T) и Err(E). Такой подход гарантирует, что все ошибки строго типизированы, а без обработки ошибки невозможно извлечь результат операции.</li></ul><p>Option&lt;T&gt; используется для представления значения, которое может отсутствовать:</p><p>Result&lt;T, E&gt; используется для операций, которые могут завершиться ошибкой:</p><p>Для удобства проброса ошибок наверх существует оператор ?, который пишется после любого выражения, возвращающего Result, и возвращает Ok вариант. В случае Err варианта будет выход из функции с возвращением ошибки.</p><p>Обычно все ошибки описываются в перечислениях, а для уменьшения шаблонного кода используются крейты вроде <a href="https://google.github.io/comprehensive-rust/error-handling/thiserror.html">thiserror</a>.</p><h2>Про асинхронное программирование</h2><p>Асинхронное программирование в Rust строится вокруг трейта Future— его реализуют для типов, представляющих значение, которое будет доступно в будущем.</p><p>Также в Rust есть синтаксис async/await. Ключевым словом async могут быть отмечены функции и блоки кода — они будут возвращать анонимный тип, реализующий Future. Async-блоки также могут захватывать окружение подобно замыканиям. Внутри async-блоков и функций возможно использовать ключевое слово await на любом выражении, возвращающем Future или IntoFuture (способность кастоваться к Future). В отличие от других языков с подобным синтаксисом, await записывается через точку после выражения, что очень удобно для построения цепочек вычислений.</p><p>Для исполнения асинхронного кода необходим рантайм, но стандартная библиотека такого рантайма не предоставляет, поэтому приходится использовать сторонние библиотеки. Самым популярным рантаймом является библиотека tokio.</p><blockquote>В асинхронное программирование на Rust я рекомендую приходить уже после углубленного изучения языка, первых пет-проектов и небольшой работы с многопоточным кодом. Хотя синтаксис и общие правила работы с асинхронным кодом покажутся знакомыми тем, кто знает JS или C#, из-за более низкоуровневой природы языка работать с ним немного сложнее.</blockquote><h2>Что еще должен знать новичок в Rust</h2><p>Вот примерный список:</p><ul><li>Очень желательно погрузиться в устройство памяти процесса, узнать, что помимо стека и кучи существуют и другие области (например, исполняемый машинный код так же отражён на память, а static-переменные хранятся не в стеке и не в куче, а в своей собственной области). Неплохо было бы и разобраться с тем, что у типов помимо размера есть выравнивание. Что в Rust бывают ZST (zero size type) — типы, размер которых честный 0, и DST (dynamic size type) — типы, размер которых неизвестен во время компиляции.</li><li>Обязательно разобраться, как Rust освобождает память, не используя сборщик мусора. Почитать, что такое RAII. Понять, как работает трейт Drop.</li><li>Избавится от стереотипов о Rust. Rust — не самый сложный язык, как только вы поймёте, как он работает. Плюс платят за Rust, как правило, больше, чем на аналогичных позициях на других языках.</li><li>Оставить свои привычки из других языков (за исключением разве что Haskell/OCaml). Здесь не получится писать, как на C++/Java/Go и т.д. Привыкайте к хорошему и станете лучше, чем были до освоения Rust.</li></ul><h2>Что изучать, если есть вся база: чек-лист</h2><ul><li>Макросы и метапрограммирование</li><li>Unsafe Rust для низкоуровневого контроля</li><li>Интеграция с C/C++ через FFI</li><li>Разработка встраиваемых систем</li><li>WebAssembly</li><li><a href="https://doc.rust-lang.org/nomicon/">rustnomicon</a></li><li>Undefined Behavior</li><li>unsafe-код</li></ul><h2>Тренды на 2025 год</h2><p>На Rust’е пишут все. Более полный список можно посмотреть тут: <a href="https://github.com/rust-unofficial/awesome-rust">https://github.com/rust-unofficial/awesome-rust</a></p><p>Вот несколько топовых фреймворков и библиотек:</p><ul><li>serde — фреймворк для сериализации/десериализации</li><li>tokio, futures — для асинхронного программирования</li><li>clap — парсер аргументов командной строки</li><li>anyhow, thiserror — удобная работа с ошибками</li><li>chrono — работа с датой и временем</li><li>dashmap — многопоточная hashmap</li><li>bytes — эффективная работа с сырыми байтами</li><li>log, tracing — для логирования</li><li>reqwest — для http запросов</li><li>axum — для http сервера и REST api</li><li>mockall, test-case — упростит написание тестов</li><li>bevy — игры</li><li>clippy — линтер</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Новый компилятор TypeScript на Go собирает код быстрее, но не делает его быстрее</title>
      <link>https://tproger.ru/news/novyj-kompilyator-typescript-na-go-sobiraet-kod-bystree--no-ne-delaet-ego-bystree</link>
      <comments>https://tproger.ru/news/novyj-kompilyator-typescript-na-go-sobiraet-kod-bystree--no-ne-delaet-ego-bystree?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/novyj-kompilyator-typescript-na-go-sobiraet-kod-bystree--no-ne-delaet-ego-bystree</guid>
      <description><![CDATA[<p>Microsoft переписала компилятор TypeScript на Go: сборка быстрее в 10 раз, но код работает так же. Что это меняет для разработчиков</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/novyj-kompilyator-typescript-na-go-sobiraet-kod-bystree--no-ne-delaet-ego-bystree">Новый компилятор TypeScript на Go собирает код быстрее, но не делает его быстрее</a>»</p>]]></description>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 25 Mar 2025 05:07:21 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Microsoft переписывает компилятор TypeScript с JavaScript на Go</b> и <b>обещает 10-кратный прирост производительности</b>.</p><p>Новость быстро разлетелась по сообществам, но на деле всё не так однозначно, <a href="https://www.architecture-weekly.com/p/typescript-migrates-to-go-whats-really">пишет</a> разработчик Оскар Дудич в рамках Architecture Weekly.</p><p><b>Речь идёт о скорости компиляции, а не исполнения кода</b>. Ваши приложения не станут работать быстрее — только собираться. Это как если бы производитель автомобилей сказал, что «машина стала в 10 раз быстрее», а потом уточнил, что речь о производстве, а не скорости на трассе.</p><h2>Почему решили переписать и причём тут Go</h2><p><b>Компилятор — это CPU-bound задача</b>. Он не ждёт ответа от базы данных и не занимается сетевыми запросами. Он грузит процессор на полную, разбирая дерево типов, анализируя код и генерируя выходной файл.</p><p><b>Node.js с его однопоточной моделью и event loop плохо подходит для таких задач</b>. Он отлично работает в веб-серверах — там важна скорость отклика и работа с I/O, но не тяжёлые вычисления. Компилятор TypeScript вырос, стал сложнее, и старая архитектура начала тормозить.</p><p><b>Go здесь оказался подходящим выбором:</b></p><ul><li>у него есть <b>легковесные потоки (goroutines)</b>;</li><li><b>параллельное выполнение</b> встроено на уровне языка;</li><li>нет нужды в трюках с worker threads, как в Node.js;</li><li>проще работать с памятью и сложными структурами.</li></ul><h2>Почему просто не использовать worker threads в Node.js?</h2><p>Это возможно, и они действительно дают параллельность. Но:</p><ul><li><b>переписывать старый код с учётом многопоточности — больно</b>;</li><li>обмен данными между потоками в Node.js идёт через сериализацию;</li><li>каждый поток создаёт свой V8-инстанс, что дорого по ресурсам.</li></ul><p><b>Команда решила не латать старое, а начать с чистого листа</b>. И, как показали первые тесты, даже однопоточный Go-компилятор оказался быстрее, чем старый на Node.js.</p><h2>А что с браузерами и плагинами?</h2><p>Это пока не ясно. <b>В браузерах Go не работает нативно</b>, и придётся либо компилировать его в WebAssembly, либо сохранить JS-версию для playground'ов. Вопросов больше, чем ответов:</p><ul><li>как сохранить совместимость с TypeScript-плагинами;</li><li>будет ли 100% повторяемость в поведении компилятора;</li><li>изменятся ли ошибки, предупреждения и тонкости типов.</li></ul><h2>Зачем вообще об этом думать</h2><p><b>Это кейс о масштабировании и выборе инструментов</b>. То, что хорошо работало в 2012 году, перестаёт тянуть в 2025-м. Переписывание проекта — не всегда трагедия. Иногда это необходимость, если фундамент начал мешать росту.</p><p><b>Важно не повестись на «10x быстрее»</b>. Такие цифры всегда требуют контекста. Но и отрицать ценность изменений не стоит — особенно если вы работаете с большими кодовыми базами и каждый процент ускорения важен.</p>]]></content:encoded>
    </item>
    <item>
      <title>DOOM запустили внутри... TypeScript-компилятора. Да, это реально</title>
      <link>https://tproger.ru/news/--doom-zapustili-vnutri----typescript-kompilyatora--da--eto-realno</link>
      <comments>https://tproger.ru/news/--doom-zapustili-vnutri----typescript-kompilyatora--da--eto-realno?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--doom-zapustili-vnutri----typescript-kompilyatora--da--eto-realno</guid>
      <description><![CDATA[<p>Разработчик запустил DOOM внутри TypeScript-компилятора, создав WASM-рантайм на 177 ТБ кода. Проект рендерил первый кадр 12 дней</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--doom-zapustili-vnutri----typescript-kompilyatora--da--eto-realno">DOOM запустили внутри... TypeScript-компилятора. Да, это реально</a>»</p>]]></description>
      <category><![CDATA[Игры для программистов]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 27 Feb 2025 06:05:31 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик <a href="https://github.com/MichiganTypeScript">Димитри Митропулос</a> год работал над проектом, который звучит как чистое безумие: <b>он запустил DOOM внутри TypeScript-компилятора</b>.</p><p>Видео о проекте уже <a href="https://www.youtube.com/watch?v=0mCsluv5FXA">стало</a> вирусным, набрав <b>более 84 000 просмотров</b> за 14 часов (на момент написания материала).</p><p>При этом на его производство ушло около <b>200 часов</b>, но сам проект занял <b>целый год</b>.</p><h2>Как это вообще возможно?</h2><p>Чтобы заставить DOOM работать в <b>TypeScript types</b>, разработчик:</p><ul><li><b>Реализовал полноценную WASM-виртуальную машину</b> внутри типовой системы TypeScript.</li><li><b>Воссоздал 116 инструкций WebAssembly</b>, начиная с арифметики и заканчивая динамическим диспетчированием вызовов.</li><li><b>Управлял памятью</b> и обрабатывал бинарные числа <b>в строковых литералах</b>.</li></ul><p>В результате компилятор <b>создавал 20 млн конкретных типов в секунду</b>, из-за чего <b>рендеринг первого кадра DOOM занял 12 дней</b>.</p><h2>Что в итоге?</h2><ul><li>Финальный размер проекта — <b>177 ТБ</b> (3.5 триллиона строк TypeScript-типов).</li><li>Опубликован полный исходный код <b>WASM-рантайма</b>.</li><li>Отдельного внимания заслуживают <b>реализации сложения, деления и сдвига битов</b> — там видно, сколько боли пришлось пережить разработчику.</li></ul><h2>Почему это круто?</h2><p>Этот проект — не просто технический абсурд.</p><p>Чтобы реализовать такое, пришлось разобраться не только в TypeScript, но и в <b>WebAssembly, виртуальных машинах, внутреннем устройстве TypeScript-компилятора и архитектуре DOOM</b>.</p><p>Если вам казалось, что <b>DOOM запустили на всём</b>, попробуйте повторить это на TypeScript-типах.</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>После двух лет закрытого теста вышел «убийца» iTerm 2 — эмулятор терминала Ghostty 1.0</title>
      <link>https://tproger.ru/news/posle-dvuh-let-zakrytogo-testa-vywel--ubijca--iterm-2---emulyator-terminala-ghostty-1-0</link>
      <comments>https://tproger.ru/news/posle-dvuh-let-zakrytogo-testa-vywel--ubijca--iterm-2---emulyator-terminala-ghostty-1-0?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/posle-dvuh-let-zakrytogo-testa-vywel--ubijca--iterm-2---emulyator-terminala-ghostty-1-0</guid>
      <description><![CDATA[<p>Ghostty 1.0 — новый эмулятор терминала для macOS и Linux, «убийца» iTerm 2. Быстрый, функциональный, с нативным интерфейсом. Есть поддержка xterm и Kitty</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/posle-dvuh-let-zakrytogo-testa-vywel--ubijca--iterm-2---emulyator-terminala-ghostty-1-0">После двух лет закрытого теста вышел «убийца» iTerm 2 — эмулятор терминала Ghostty 1.0</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Бета]]></category>
      <category><![CDATA[GTK]]></category>
      <category><![CDATA[Инструменты терминала Linux]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 27 Dec 2024 02:43:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Состоялся долгожданный релиз амбициозного эмулятора терминала — <a href="https://ghostty.org/">Ghostty 1.0</a>.</p><p>После почти двух лет разработки и закрытого бета-тестирования проект, созданный с целью превзойти существующие решения, такие как iTerm 2, будет выпущен под лицензией MIT.</p><p>Разработчик поделился подробностями о целях проекта, особенностях версии 1.0 и планах на будущее.</p><h2>Цель – лучший эмулятор терминала</h2><p>Основная идея Ghostty – предоставить пользователям macOS и Linux быструю, функциональную и имеющую нативный интерфейс альтернативу существующим эмуляторам.</p><p>Разработчик стремился создать продукт, который не заставлял бы пользователей выбирать между скоростью, функциональностью и нативным внешним видом.</p><p>Ghostty 1.0 не ставит целью революционизировать концепцию терминала, а скорее предлагает лучший опыт использования уже существующих возможностей.</p><figure><img src="https://media.tproger.ru/user-uploads/98945/2024-12-27/b1d2ea6a-c15a-4b0f-b050-4bae9ace64de.jpeg" alt="" /></figure><h2>Быстрый, функциональный и нативный</h2><p>Ключевыми характеристиками Ghostty являются скорость, богатая функциональность и нативный интерфейс.</p><p>Скорости работы было уделено особое внимание, о чем свидетельствует доклад разработчика на Systems Distributed 2024.</p><p>В плане функциональности Ghostty поддерживает больше escape-последовательностей xterm, чем любой другой эмулятор (кроме самого xterm), а также современные стандарты, такие как стилизованные подчеркивания, протокол клавиатуры Kitty и графический протокол.</p><p>Интерфейс реализуется за счет использования соответствующих системе GUI-инструментариев: на macOS – нативные инструменты, на Linux – GTK (с libadwaita, если доступно). Благодаря этому Ghostty выглядит и ощущается как родное приложение на обеих платформах.</p><h2>Версия 1.0 и причины длительного бета-тестирования</h2><p>Первый публичный релиз Ghostty сразу получит номер версии 1.0, минуя стадию ZeroVer.</p><p>Длительное закрытое бета-тестирование, в котором участвовало около 2000 человек, было обусловлено личными обстоятельствами разработчика (рождение ребенка), а также желанием выпустить стабильный и качественный продукт.</p><p>Разработчик признает, что такой подход мог создать впечатление эксклюзивности и вызвать критику, но благодарит всех тестеров за их вклад в стабильность Ghostty.</p><p>Скачать версию 1.0 можно по <a href="https://ghostty.org/">ссылке</a>.</p><h2>Планы на будущее: libghostty и расширение функциональности</h2><p>В будущем разработчик планирует развивать два основных направления: libghostty и функциональность терминальных приложений.</p><p>libghostty – это кроссплатформенная библиотека, лежащая в основе Ghostty, доступная через API на Zig и C. Цель – создать экосистему терминальных приложений, от отдельных программ до встроенных терминалов в редакторах и веб-интерфейсах.</p><p>После релиза 1.0 планируется сделать libghostty доступной как отдельную библиотеку и расширить поддержку платформ, включая WebAssembly.</p>]]></content:encoded>
    </item>
    <item>
      <title>WebVM 2.0 — полноценный Linux прямо в браузере</title>
      <link>https://tproger.ru/news/predstavlen-polnocennyj-linux-pryamo-v-brauzere---webvm-2-0</link>
      <comments>https://tproger.ru/news/predstavlen-polnocennyj-linux-pryamo-v-brauzere---webvm-2-0?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/predstavlen-polnocennyj-linux-pryamo-v-brauzere---webvm-2-0</guid>
      <description><![CDATA[<p>Разработчики из Leaning Technologies представили WebVM 2.0 — инновационное веб-окружение Linux, доступное через браузер. WebVM 2.0 позволяет запускать Linux-приложения и работать с файлами в полноценной среде без установки операционной системы</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/predstavlen-polnocennyj-linux-pryamo-v-brauzere---webvm-2-0">WebVM 2.0 — полноценный Linux прямо в браузере</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 14 Nov 2024 09:34:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики из Leaning Technologies <a href="https://labs.leaningtech.com/blog/webvm-20">представили</a> WebVM 2.0 — полноценное окружение Linux, доступное через веб-браузер.</p><p>Новинка позволяет запускать Linux-приложения и работать с файлами в полностью функциональной среде без необходимости установки операционной системы на компьютер.</p><h2>Как работает WebVM 2.0</h2><p>WebVM 2.0 создан на базе WebAssembly, что позволяет ему использовать мощные возможности браузера для быстрой работы даже с относительно ресурсоемкими Linux-приложениями.</p><p>Веб-система запускается на стороне пользователя, что обеспечивает безопасность и производительность, так как вся обработка данных происходит локально.</p><p>WebVM 2.0 поддерживает достаточно широкий спектр утилит и приложений, доступных в Linux, включая компиляторы, редакторы и другие инструменты для разработчиков.</p><p>Пользователи могут загружать файлы, запускать программы и писать код, работая с удобным интерфейсом, похожим на традиционное терминальное окно Linux.</p><figure><img src="https://media.tproger.ru/user-uploads/98945/2024-11-14/e7754f9e-5628-4537-83fa-37571e2f00af.jpeg" alt="" /></figure><h2>Основные возможности и преимущества</h2><p>Одной из ключевых особенностей WebVM 2.0 является его доступность на любых устройствах, где есть веб-браузер — будь то ноутбук, планшет или даже смартфон.</p><p>Это делает платформу полезной для разработчиков, студентов и IT-энтузиастов, которым требуется доступ к Linux-инструментам «на ходу».</p><p>Кроме того, WebVM 2.0 не требует сложной установки или настроек, что позволяет запустить окружение буквально в пару кликов. Отличный вариант на случай, когда надо быстро протестировать код или выполнить определенные команды в Linux.</p>]]></content:encoded>
    </item>
    <item>
      <title>Почему WebAssembly всё ещё не переплюнул JS и TS</title>
      <link>https://tproger.ru/articles/pochemu-webassembly-vsyo-eshhyo-ne-pereplyunul-js-i-ts</link>
      <comments>https://tproger.ru/articles/pochemu-webassembly-vsyo-eshhyo-ne-pereplyunul-js-i-ts?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-webassembly-vsyo-eshhyo-ne-pereplyunul-js-i-ts</guid>
      <description><![CDATA[<p>Узнали у мидл и сеньор-разработчиков, почему WebAssembly, который считается "ускоренным JS", так и не стал популярнее классического JS, TypeScript или CoffeeScript за почти десятилетие.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-webassembly-vsyo-eshhyo-ne-pereplyunul-js-i-ts">Почему WebAssembly всё ещё не переплюнул JS и TS</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 16 Mar 2024 13:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Узнали у мидл и сеньор-разработчиков, почему WebAssembly, который считается "ускоренным JS", так и не стал популярнее классического JS, TypeScript или CoffeeScript за почти десятилетие.</p><p>Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики.</p><p>Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на <a>experts@tproger.ru</a>, мы расскажем, как это сделать.</p><p>Если мы <a href="https://webassembly.org">обратимся к сайту</a>, то сможем увидеть те цели, с которым создавался WebAssembly. Это быстрота/эффективность, безопасность, простая отладка и возможность переноса нативных приложений в веб. Если со скоростью, отладкой и безопасностью более-менее понятно из названия, то на счёт желания проникнуть в веб с первого взгляда — не очень. Но оно обусловлено несколькими факторами. Один из них — простота доставки изменений. Как мы помним, из взаимодействия с нативными программами, нам нужен либо какой-то пакетный менеджер, либо магазин, который будет доставлять обновления нашим клиентам. В случае с вебом, нам достаточно обновить код на наших серверах и наши клиенты при следующем открытии нашего сайта/приложения получат все наши изменения. Ещё одним фактором проникновения в веб является задача кроссплатформенности. У нас есть прекрасные утилиты и приложения, которые можно было бы без переписывания или с минимальными изменениями сделать доступными в наших веб приложениях.</p><p>К чему всё это? К тому, что в изначальных целях не стояло и не стоит пункта который бы прямо или косвенно приводил к вытеснению JavaScript. Случайным образом этого тоже не произошло, и дальше я изложу свои мысли почему.</p><p>Если речь идёт о сравнении производительности JavaScript и WebAssembly, то в общих случаях она будет сопоставимой, а в частных — действительно можно достичь определенного прироста. Но всё это при условии что не будет использоваться браузерный API, ибо если мы начнём манипулировать DOM деревом, то очень скоро упрёмся в производительность перерисовки DOM элементов.</p><p>Помню тот период, когда WebAssembly находился на стадии разработки и почти каждый разработчик, который не имел опыта написания веб приложений говорил “вот появится поддержка моего языка в WebAssembly, и я буду писать интерфейсы, и наконец-то исчезнет этот ваш JavaScript”. На данный момент в продуктивной среде можно использовать C/C++/Rust/Golang и ещё множество языков с разной степенью готовности. <a href="https://github.com/appcypher/awesome-wasm-langs">Пример</a>.</p><p>Как мы видим, языки, готовые для продуктива, имеют высокий порог входа и не могут конкурировать с JavaScript в плане легкости освоения. При этом разработчики C/C++/etc не спешат переходить в frontend разработчики. Энтузиасты ведущие разработку на других языках и ранее (до появления WebAssembly) имели возможность писать код на своём любимом языке вместо JavaScript, взгляните на <a href="https://brython.info/">https://brython.info/</a>. Даже мне удалось повстречать самобытный генератор JavaScript кода из Python кода. Но таких энтузиастов единицы: они не закрывают потребность рынка, а надёжность таких решений вызывает сомнения. Часть этих ребят могла бы перейти на WebAssembly и развивать компилятор под свой язык, но это не составляет конкуренции JavaScript.</p><p>Думаю, никому из вас не хотелось бы попасть на проект, на котором используется вот такое непопулярное решение, пусть и на любимом языке программирования. Хотя…</p><p>На сегодняшний день, вокруг JavaScript выросла большая экосистема. У нас есть всё что нужно для разработки: пакетные менеджеры, фреймворки, библиотеки компонентов, различные инструменты. В троицу frontend фреймворков по сей день не может попасть ни один другой фреймворк. Да, инструменты для WebAssembly тоже развивались, появились фреймворки работающие с DOM, но вы, как и я, наверняка о них ничего не слышали. Мы смеёмся над frontend фреймворками и библиотеками, которые десятками появляются каждый день, и тут же умирают. Пока писал этот текст и искал фреймворки для написания веб приложений с компиляцией в WebAssembly повстречал немало ссылок, которые ведут на нерабочие сайты. В целом, всё это не выглядит живым и перспективным, посмотрите <a href="https://github.com/mbasso/asm-dom">пример кода этого фреймворка</a>.</p><p>С браузером и frontend разработкой всё стало немного понятнее, но у нас же есть ещё серверная среда исполнения — Node.js. Но и там возможность писать кастомные модули, расширяя возможности самой Node.js, или переносить сложные вычисления в реализацию на языке более низкого уровня, <a href="https://nodejs.org/api/addons.html">была давно</a>, и многие использовали в случае необходимости.</p><p>WebAssembly используется в Node.js точечно, когда в этом возникает необходимость. Писать полную реализацию в WebAssembly просто нет необходимости, проще тогда использовать микросервисный подход и писать реализацию целиком на том языке, на котором нравится.</p><p>На мой взгляд, самым лучшим назначением для WebAssembly является возможность кросплатформенного переноса. Хорошим примером будет <a href="https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/">Figma</a>. AutoCAD презентовал, что они смогли перенести 30-летнюю кодовую базу в веб благодаря WebAssembly.</p><p>Исходя из всего вышеизложенного, достаточно просто ответить на вопрос “Почему WebAssembly не заменил JavaScript или не стал популярнее? ”. Потому что WebAssembly это инструмент для решения узкого круга специализированных задач.</p><p>Начнем с того, что WebAssembly, несомненно, имеет своё коммьюнити. Однако мир JavaScript развивался около 30 лет и за это время “оброс”, такими мощными и функциональными фреймворками как, например: Angular, Vue и React. Также JavaScript используется в клиентском коде для приложений на языке PHP – всё это делает JavaScript самым популярным языком программирования в мире.</p><p>Сравнивать с ним малое подмножество малой выборки - довольно странно. Капля не сможет вытеснить море, тем более, что в клиентских приложениях, использующих WebAssembly, зачастую, также используется и JavaScript или TypeScript.</p><p>WebAssembly начал свой “путь к успеху” только в июне 2019 года, когда был выпущен Chrome 75 с включенными по умолчанию потоками WebAssembly. Но началом попыток серьёзного использования WebAssembly в мире .NET можно считать 2020-й год, благодаря выходу Blazor WebAssembly 3.2.0, и с тех пор комьюнити, использующее WebAssembly, постоянно растёт.</p><p>Так как WebAssembly  построены на стековой виртуальной машине, исполняющей инструкции бинарного формата, они позволяет выполнять клиентский код на традиционно “серверных” языках программирования, таких как C, C++, C#, Rust, Go, что позволяет использовать на стороне клиента, в браузере, всю вычислительную и алгоритмическую мощь этих языков.</p><p>Это даёт ощутимые преимущества в быстродействии и функциональности клиентских приложений, по сравнению с JavaScript, TypeScript и CoffeeScript. Но так же требует других знаний и умений от прикладного разработчика клиентской части приложения. Именно это, на мой взгляд, тормозит расширение комьюнити WebAssembly, так как требует для написания клиентского кода более дорогих “серверных” программистов, коих и так постоянно не хватает.</p><p>С другой стороны, есть сферы, где преимущества WebAssembly реально ценятся, например, в крипто майнинге в браузере, подготовке и предобработке, на стороне клиента, датасетов для нейронных сетей … и другой функциональности требующей большого кол-ва сложных вычислений и вдумчивого использования аппаратных ресурсов. Та же Figma - веб-приложение, по сути, но там JavaScript используется только для обвязки интерфейса, все остальное внутри реализовано на WebAssembly.</p><p>Ну и какой-нибудь вывод, если он нужен:</p><p>Так что вернуться к данному сравнению имеет смысл ещё через пару-тройку лет, за которые, WebAssembly, конечно, не догонит JavaScript, тем более, что чаще всего они используются совместно, но можно будет оценить скорость распространения популярности WASM и сделать уже более обоснованные выводы по поводу данной технологии.</p><p>Есть ряд причин, по которым WebAssembly не набрал популярности в веб-разработке.</p><ol><li>JavaScript существует уже почти 30 лет и за это время сформировалась огромная экосистема библиотек, инструментов и сообщество разработчиков. WebAssembly, анонсированный в 215 году и выпушенный в свет 2017, все еще играет роль "догоняющего".</li><li>JavaScript является языком, доступным для изучения и использования широкому кругу веб-разработчиков. WebAssembly требует навыков низкоуровневого программирования на языках C/C++/Rust/Kotlin, что сужает круг потенциальных разработчиков.<br /></li><li>WebAssembly был задуман в первую очередь для обеспечения высокой производительности для ресурсоемких задач (игры, компьютерное зрение, криптография и т.д.). Для большинства веб-приложений JavaScript/TypeScript вполне достаточны.<br /></li><li>Согласно опросам StackOverflow за 2019 год, JavaScript используется 67.8% разработчиков, TypeScript - 21.2%, в то время как WebAssembly - всего 1.2%. К 2023 году JavaScript опустился до 63.6%, TypeScript вырос в популярности до 38.9%, а WebAssembly совсем пропал из списка популярных технологий.<br /></li></ol><p>Тем не менее, WebAssembly имеет популярность, особенно в областях, где требуется высокая производительность:</p><ol><li>Игры и мультимедиа.</li><li>Научные вычисления, машинное обучение (TensorFlow.js, Lingon.js).<br /></li><li>Криптография (Bitcoin, Ethereum).<br /></li><li>Компьютерная графика, CAD, 3D-моделирование.<br /></li></ol><p>В этих нишевых областях WebAssembly может обеспечить значительный прирост производительности по сравнению с чистым JavaScript. Также важную роль играет кроссплатформенность WebAssembly.</p><p>Основная причина, на мой взгляд почему webassembly не особо сильно распространен - необходимость изучать дополнительные языки программирования + связывание данных (из js в webassembly и наоборот) происходят не настолько удобно как этого хотелось бы рядовому разработчику, особенно это касается C++.</p><p>Ввиду этого, если код не требует особо больших вычислений, проще все сделать на обычном js без какой-либо головной боли.</p><p>В проде моего кода с webassembly нет, но для себя пробовал делать с c++ и rust (последний на мой взгляд гораздо более удобный).</p><p>У команды в ГК Альфа-Лизинг есть небольшой опыт использования WASM, недавно протестировали пару внутренних утилит на Blazor (WASM от Microsoft), чтобы ознакомиться с технологией и оценить ее перспективы и применимость для задач. Этим занимались backend-разработчики, которые отметили ряд преимуществ: разработка на привычном C#, небольшой объем кода, эффективный отлов ошибок на этапе компиляции.</p><p>Однако выявились и некоторые минусы. Во-первых, достаточно сырая библиотека Blazor, непонятны перспективы ее поддержки и развития как со стороны Microsoft (Silverlight когда-то тоже выглядел перспективным), так и со стороны разработчиков браузеров.</p><p>Во-вторых, объем сборки WASM в несколько раз превышает размер JS-бандла. 0.8 мегабайт на Angular vs 4 мегабайта на Blazor. При этом убедительных аргументов в пользу webassembly с точки зрения бизнеса не найдено. JS уже привычен, понятен и удовлетворяет всем нашим требованиям. Как правило в b2b frontend не на сколько ресурсоемкий, чтобы раскрыть возможные преимущества WebAssembly в производительности.</p><p>Лично у меня есть еще одно опасение. Эволюция процесса разработки ПО привела к усилению специализации. Те, кому ближе интерфейсы переключились на разработку фронта, а те, кому ближе базы и API - ушли в бэкенд. WASM в этом смысле толкает нас назад.</p><p>Остается актуальным вопрос - готов ли бэкендер заниматься разработкой пользовательского интерфейса в долгосрочной перспективе, приводить его в соответствие с макетом, отлаживать пагинацию или фильтры и отрабатывать множество неочевидных пользовательских сценариев.</p><p>Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики.</p><p>Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на <a>experts@tproger.ru</a>, мы расскажем, как это сделать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как благодаря WebAssembly получилось ускорить приложение в 20 раз</title>
      <link>https://tproger.ru/translations/wasm-site-speed-up</link>
      <comments>https://tproger.ru/translations/wasm-site-speed-up?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/wasm-site-speed-up</guid>
      <description><![CDATA[<p>Замена медленных вычислений на JavaScript предкомпилированным WebAssembly: компактный бинарный формат со статической типизацией работает быстрее.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/wasm-site-speed-up">Как благодаря WebAssembly получилось ускорить приложение в 20 раз</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 May 2019 09:00:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой статье мы рассмотрим реальный случай, когда команде удалось ускорить своё браузерное приложение, заменив медленные вычисления JavaScript на предкомпилированный WebAssembly.</p><h2>Что такое WebAssembly?</h2><p>Если коротко, WebAssembly (Wasm) — это новый формат инструкций, который можно исполнять в браузере так же, как JavaScript.</p><p>Огромное значение имеет то, что вы можете получить код на WebAssembly путём компиляции исходников на C/C++, Rust, Go и многих других языках. В Wasm используется статическая типизация и плоская модель памяти, а сам код хранится в компактном бинарном формате. Из-за этого код выполняется достаточно быстро, почти так же быстро, как если бы вы запустили приложение из командной строки.</p><p>Возможность использования уже готовых и известных инструментов и библиотек для веб-приложений и значительный прирост производительности по сравнению с JS делают Wasm очень привлекательным для веб-разработки.</p><h2>В каких областях используют Wasm?</h2><p>WebAssembly применяют для разработки приложений из самых разных областей. Он используется как в играх (например <a href="http://www.continuation-labs.com/projects/d3wasm/">Doom 3</a>), так и для портирования известных десктопных приложений (например <a href="http://blogs.autodesk.com/autocad/autocad-web-app-google-io-2018/">Autocad</a> или <a href="https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/">Figma</a>). Даже если вам не нужно веб-приложение, Wasm можно использовать как эффективный и гибкий инструмент для serverless вычислений.</p><p>В этой статье будет рассмотрен опыт использования Wasm для ускорения веб-инструмента анализа данных. Мы возьмём уже существующий инструмент на C, скомпилируем его в WebAssembly и используем для замены медленных участков JS.</p><h2>Что за приложение для анализа данных?</h2><p>Приложение, о котором пойдёт речь, — <a href="http://fastq.bio">fastq.bio</a>. Это интерактивный браузерный инструмент, который показывает учёным, насколько качественные данные секвенирования ДНК были ими получены. Секвенирование — это процесс, при котором считываются «буквы» (точнее, нуклеотиды) образца ДНК.</p><figure><img src="https://media.tproger.ru/uploads/2019/05/wasm-screen-1.jpg" alt="" /></figure><p>Мы не будем вдаваться в подробности вычислений, но в общих чертах эта инфографика даёт учёным наглядное представление о том, насколько хорошо прошло секвенирование и есть ли проблемы с качеством данных.</p><p>Конечно, есть множество десктопных инструментов, которые позволяют сгенерировать подобные отчёты. Цель fastq.bio — дать интерактивное представление качества данных прямо в бразуере. Это особенно полезно для учёных, которые не очень хорошо владеют командной строкой.</p><p>Входные данные для приложения поставляются в виде обычного текстового файла. Он генерируется инструментами, используемыми для секвенирования, и содержит список последовательностей ДНК и оценку качества для каждого нуклеотида в последовательности. Формат файла называется .FASTQ, отсюда и название приложения.</p><h2>Как это было реализовано с помощью JS?</h2><p>В изначальной версии fastq.bio пользователь начинал с выбора FASTQ-файла на своём компьютере. Используя объект File, приложение считывало небольшой фрагмент данных начиная со случайной позиции (с помощью API FileReader). Обрабатывая этот фрагмент данных, JavaScript выполнял несложные строковые операции и считал нужные показатели. Один из таких показателей — количество нуклеотидов A, C, G и T на каждой из позиций фрагмента ДНК.</p><p>Как только все необходимые показатели посчитаны, они отображаются в инфографике с помощью Plotly.js, а приложение переходит к следующему фрагменту файла. Файл разделяется на фрагменты для улучшения UX: обработка файла целиком занимает очень значительное время, так как FASTQ-файлы обычно весят сотни гигабайт. По опыту можно сказать, что оптимальный размер фрагмента — от 0,5 до 1 Мбайт — при таком объёме приложение будет обновлять инфографику достаточно плавно и у пользователя не будет возникать дискомфорта. Однако при выборе размера стоит учитывать, насколько сложные вычисления производит именно ваше приложение.</p><p>Архитектура приложения на JavaScript была достаточно прямолинейна:</p><figure><img src="https://media.tproger.ru/uploads/2019/05/wasm_illu_1edited-1.jpg" alt="" /></figure><h2>А как получится на WebAssembly?</h2><p>Чтобы понять, можно ли использовать Wasm для оптимизации этого приложения, команда стала искать готовые решения для построения QC-инфографики (quality control, контроль качества) FASTQ-файлов. Искать нужно было инструменты, написанные на C, C++ или Rust, чтобы их можно было лёгким движением руки портировать на WebAssembly. В то же время инструмент должен был быть достаточно надёжным и уже проверенным научным сообществом.</p><p>После недолгих поисков было решено остановиться на <a href="https://github.com/lh3/seqtk">seqtk</a>. Это приложение достаточно часто используют, у него открытый исходный код, и оно написано на C — подходит по всем параметрам.</p><p>Прежде чем компилировать его в WebAssembly, посмотрим, как мы бы компилировали seqtk для использования на десктопе. Согласно Makefile, вот параметры gcc, которые нам нужны:</p><p>Чтобы скомпилировать seqtk в WebAssembly, нам необходим <a href="https://emscripten.org/">Emscripten</a>. Он предоставляет замены существующим инструментам сборки, чтобы работать с WebAssmebly было проще. Если Emscripten у вас не установлен, вы можете воспользоваться <a href="https://hub.docker.com/r/robertaboukhalil/emsdk/tags">образом Docker</a>.</p><p>Вы можете также <a href="https://emscripten.org/docs/getting_started/downloads.html">собрать его самостоятельно</a>, но это обычно занимает значительное время.</p><p>Внутри контейнера мы можем использовать emcc как прямую замену gcc:</p><p>Как вы можете видеть, изменения по сравнению с компиляцией в бинарный файл минимальны:</p><ol><li>Вместо вывода в бинарный файл мы просим Emscripten сгенерировать файлы .wasm и .js. Последний отвечает за запуск модуля WebAssembly.</li><li>Для поддержки библиотеки zlib необходимо использовать флаг USE_ZLIB. Эту библиотеку используют настолько часто, что она уже портирована на WebAssembly, и Emscripten просто включит её в наш проект.</li><li>Мы включаем виртуальную файловую систему Emscrippten. Это POSIX-подобная ФС (исходный код), правда работает она в оперативной памяти внутри браузера и очищается, когда вы обновляете страницу (кроме случаев, когда вы сохраняете состояние в IndexedDB, но это уже тема для отдельной статьи).</li></ol><p>Зачем нам виртуальная файловая система? Для ответа на этот вопрос давайте сравним, как мы запускаем seqtk из коммандной строки и как мы запускаем скомпилированный модуль WebAssembly с помощью JS:</p><p>Доступ к виртуальной файловой системе очень полезен потому что тогда нам не придётся переписывать seqtk под использование строкового, а не файлового ввода. Мы можем просто отобразить фрагмент данных как файл data.fastq в виртуальной ФС и вызвать main() seqtk на нём.</p><p>С использованием seqtk, скомпилированного в WebAssembly, архитектура преобразилась:</p><figure><img src="https://media.tproger.ru/uploads/2019/05/wasm_illu_2-1.jpg" alt="" /></figure><p>Как видно из диаграммы, вместо запуска вычислений в основном потоке браузера мы используем <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers">WebWorkers</a>. Это позволяет выполнять вычисления в фоновом потоке, не слишком ухудшая отзывчивость бразузера. Контроллер WebWorker’а запускает Worker и управляет его взаимодействием с основным потоком.</p><p>Мы можем попросить Worker’а запустить команду seqtk на файле, который мы только что примонтировали. Когда seqtk закончит выполнение, Worker отошлёт результаты назад в виде Promise. Как только основной поток получит сообщение, он сразу использует его, чтобы обновить инфографику. Как и в реализации через JavaScript, мы обрабатываем файл фрагментами и обновляем картинку на каждой итерации.</p><h2>Оно того стоит? На WebAssembly получилось быстрее?</h2><p>Да. Чтобы понять, принесла ли замена JS на Wasm свои плоды, команда сравнила реализации по параметру «количество операций чтения в секунду». Время, которое уходит на генерацию интерактивных графиков, не учитывается, потому что в обоих случаях для этой части используется JS.</p><p>Используя решение «из коробки» команда получила прирост производительности в 9 раз:</p><figure><img src="https://media.tproger.ru/uploads/2019/05/wasm_illu_3-1540x1046.jpg" alt="" /></figure><p>Это уже довольно неплохой результат. Особенно учитывая, как просто его было достичь (а его очень просто достичь, как только вы поймёте, как работает WebAssembly).</p><p>После этого разработчики заметили, что seqtk выводит очень много полезных результатов QC-анализа, но их большая часть не используется в инфографике приложения. После удаления вывода этих параметров результат версии на JS удалось превзойти в 13 раз:</p><figure><img src="https://media.tproger.ru/uploads/2019/05/wasm_illu_4-1540x1046.jpg" alt="" /></figure><p>Но на этом история не закончилась. На данном этапе fastq.bio получал результаты анализа вызывая две различные функции C, каждая из которых вычисляла свой набор характеристик. К сожалению, это означало, что каждый фрагмент файла считывается по два раза, хотя это совсем не обязательно.</p><p>Решение нашлось довольно быстро — совместить две эти функции в одну. В результате функция получилась ужасна, но знания C особо не потребовалось. Результаты работы функции пришлось сначала совмещать, а потом дополнительно обрабатывать, чтобы разделить назад. Однако это того стоило и позволило увеличить производительность в 20 раз по сравнению с результатом JS.</p><figure><img src="https://media.tproger.ru/uploads/2019/05/wasm_illu_5-1540x1077.jpg" alt="" /></figure><h2>И что, подобного выигрыша получится достичь всегда?</h2><p>Конечно нет. Двадцатикратного прироста производительности от простой замены JS на Wasm ожидать не стоит. Вы можете получить ускорение в 2 раза или на 20 %… На самом деле, ваше приложение может наоборот замедлиться, если вы будете загружать большие файлы в память или если ваш код будет требовать большого числа взаимодействий между WebAssembly и JavaScript.</p><h2>Заключение</h2><p>Мы увидели, что замена медленного JS-кода на вызовы предкомпилированного Wasm может привести к значительному улучшению производительности. Когда код, необходимый для вычислений, уже написан на C, из этого можно извлечь огромную выгоду. Однако, как уже было сказано выше, WebAssembly — не всегда правильный инструмент для ваших целей. Используйте его с умом.</p><h2>Дополнительные ресурсы для изучения</h2><ul><li>«<a href="http://levelupwasm.com/">Level Up With WebAssembly</a>» — практическое руководство по созданию приложений на WebAssembly.</li><li><a href="https://github.com/robertaboukhalil/aioli">Aioli</a> (GitHub) — фреймворк для создания быстрых браузерных инструментов для геномики.</li><li><a href="https://github.com/robertaboukhalil/fastq.bio">Исходный код fastq.bio</a> (GitHub) — интерактивный онлайн-инструмент для контроля качества результатов секвенирования ДНК.</li><li>«<a href="https://www.smashingmagazine.com/2017/05/abridged-cartoon-introduction-webassembly/">An Abridged Cartoon Introduction To WebAssembly</a>» — краткое введение в WebAssembly с милыми картинками.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Mozilla анонсировала стандарт интерфейса для использования WebAssembly вне браузера</title>
      <link>https://tproger.ru/news/wasi-announce</link>
      <comments>https://tproger.ru/news/wasi-announce?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/wasi-announce</guid>
      <description><![CDATA[<p>Системный интерфейс WASI свяжет WebAssembly с операционной системой, сохранив межплатформенность и безопасность: доступно уже три реализации стандарта.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/wasi-announce">Mozilla анонсировала стандарт интерфейса для использования WebAssembly вне браузера</a>»</p>]]></description>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 28 Mar 2019 15:09:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Mozilla анонсировала проект нового стандарта — WASI, системного интерфейса для WebAssembly.</p><h2>Зачем он нужен?</h2><p>Чтобы создать основу для применения WebAssembly вне браузера, для взаимодействия с операционной системой. Главная идея состоит в том, чтобы сохранить основные плюсы WebAssembly: межплатформенность и безопасность.</p><p>Помимо Mozilla в разработке участвуют представители других проектов: Fastly, npm, Node. Сейчас уже доступно три реализации WASI.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Qt 5.12 с длительным сроком поддержки</title>
      <link>https://tproger.ru/news/qt-5-12-release</link>
      <comments>https://tproger.ru/news/qt-5-12-release?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/qt-5-12-release</guid>
      <description><![CDATA[<p>Фреймворк Qt 5.12 будет поддерживаться ещё три года и приносит полную поддержку Qt for Python, стандарт ECMAScript 7 и двоичный формат CBOR.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/qt-5-12-release">Вышел Qt 5.12 с длительным сроком поддержки</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 07 Dec 2018 12:20:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики Qt <a href="https://blog.qt.io/blog/2018/12/06/qt-5-12-lts-released/">выпустили</a> новую версию фреймворка — она будет поддерживаться ещё три года. По сравнению с прошлым LTS-релизом, в Qt 5.12 исправлено 2000 багов, добавлена полная поддержка Qt for Python, стандарта ECMAScript 7 и двоичного формата CBOR, превосходящего JSON по гибкости и количеству типов данных.</p><h3>Основные изменения в Qt 5.12</h3><p>Команда проекта обеспечила полную поддержку <a href="https://tproger.ru/news/qt-for-python-was-announced/">Qt for Python</a>, включая все Qt API. Пока что модуль доступен только для тестирования, а полноценный релиз состоится чуть позже. Таким образом, теперь с помощью Qt на Python можно создавать сложные графические приложения и пользовательские интерфейсы.</p><p>Кроме того, в Qt 5.12 доступна вторая превью-версия <a href="https://tproger.ru/news/qt-for-webassembly/">Qt for WebAssembly</a>. Этот модуль позволяет компилировать Qt-приложения для запуска в любом современном браузере. Команда Qt утверждает, что, несмотря на статус превью, модуль довольно зрелый и функциональный и его можно использовать в работе.</p><p>Разработчики довели до стабильной версии ещё два модуля, которые в предыдущих релизах Qt значились как превью:</p><ul><li><a href="https://doc.qt.io/qt-5.11/qtremoteobjects-gettingstarted.html">Qt Remote Objects</a> — делает обмен данными (<a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BD%D0%BE%D0%B5_%D0%B2%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5">IPC</a>) между основными процессами Qt бесшовным, что позволяет раскрывать свойства, сигналы и слоты класса QObject другим процессам, вне зависимости от того, где они запущены.</li><li><a href="https://blog.qt.io/blog/2018/11/23/qt-quick-webgl-release-512/">Qt WebGL Streaming Plugin</a> — предназначен для потоковой передачи данных UI приложения любому современному браузеру.</li></ul><p>В новом релизе Qt QML получил поддержку стандарта ECMAScript 7 для работы с наиболее современной версией JavaScript и упрощения интеграции с JS-библиотеками.</p><p>В Qt Quick добавлен тип Item View — TableView, который работает более эффективно по сравнению с предыдущей реализацией, QQC1. Кроме того, появилась поддержка функции <a href="https://blog.qt.io/blog/2018/10/10/introducing-distance-field-generator/">предварительной генерации текстур дальних областей</a>, позволяющая создавать <a href="https://ru.wikipedia.org/wiki/%D0%93%D0%BB%D0%B8%D1%84">глифы</a>, необходимые для отрисовки текста, во время компиляции, чтобы увеличить производительность приложения при его запуске. Pointer Handlers переименованы в Input Handlers и также полностью поддерживаются в Qt Quick — эта функция упрощает создание сложных жестовых взаимодействий с сенсорным экраном.</p><h3>Остальные нововведения</h3><ul><li>Qt Core — добавлен двоичный формат CBOR (Concise Binary Object Representation). Он похож на JSON, но обгоняет его по гибкости и количеству поддерживаемых типов данных. Кроме того, улучшен класс QRegularExpression, что позволило отказаться от старого класса QRegExp.</li><li>Qt Network — добавлена поддержка DTLS (<a href="https://ru.wikipedia.org/wiki/DTLS">Datagram Transport Layer Security</a>). На macOS и iOS теперь поддерживаются TLS-расширение <a href="https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation">ALPN</a> и HTTP/2, действующее через бэкенд.</li><li>Qt Gui — появилась поддержка Windows UI Automation, которая унифицирует использование разных инструментов ввода с помощью Windows Pointer Input Messages на Windows 8.</li><li>Qt Location — добавлен обновлённый плагин MapBox и несколько API.</li><li>Qt WebEngine — переписан на основе Chromium 69 и получил поддержку клиентских сертификатов.</li><li>Qt for Automation — получил обновлённые модули KNX и MQTT, которые теперь поддерживают новые версии соответствующих протоколов.</li></ul><p>Предыдущая версия фреймворка, Qt 5.11, <a href="https://tproger.ru/news/qt-5-11-release/">вышла</a> в мае 2018 года с обычной годовой поддержкой. Она была ориентирована на то, чтобы обеспечить доступность фреймворка на Windows, поэтому его переписали с нуля на основе Microsoft UI Automation.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышла стабильная версия Go 1.11</title>
      <link>https://tproger.ru/news/go-1-11-release</link>
      <comments>https://tproger.ru/news/go-1-11-release?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/go-1-11-release</guid>
      <description><![CDATA[<p>Главные изменения релиза языка Go — поддержка WebAssembly и новая концепция модулей, предложенная как альтернатива переменной среды GOPATH.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/go-1-11-release">Вышла стабильная версия Go 1.11</a>»</p>]]></description>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 26 Aug 2018 18:54:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда Go <a href="https://blog.golang.org/go1.11">анонсировала</a> стабильный релиз версии языка под номером 1.11. По словам разработчиков, наиболее значительные изменения в выпуске касаются поддержки WebAssembly и новой концепции модулей. Go 1.11 требует версий ОС не старше OpenBSD 6.2, macOS 10.10 Yosemite или Windows 7.</p><h3>Новое в Go 1.11</h3><ul><li>Как альтернатива GOPATH, реализована <a href="https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more">экспериментальная концепция модулей</a> со встроенной поддержкой управления версиями и дистрибуции пакетов.</li><li>Добавлена <a href="https://github.com/golang/go/wiki/WebAssembly">поддержка WebAssembly</a>, позволяющая компилировать программы на Go в wasm-модули со всеми необходимыми компонентами.</li><li>Представлен <a href="https://godoc.org/golang.org/x/tools/go/packages">новый пакет</a>, который предоставляет простой API для поиска и загрузки пакетов c исходным Go-кодом.</li><li>Усовершенствовано представление информации во время отладки, включая информацию о номерах строк и размещении точек останова.</li><li>Добавлена поддержка большего количества функций для встраивания по умолчанию, включая те, что вызывают panic.</li><li>Представлен новый формат экспорта данных пакетов. Предполагается, что для конечных пользователей он будет более прозрачным и понятным, к тому же, он ускоряет сборку больших проектов. В случае проблем его можно выключить на время компиляции.</li></ul><p>Полный список изменений доступен на странице <a href="https://golang.org/doc/go1.11">Release Notes</a> на сайте проекта Go.</p><p>Версия Go 1.10 <a href="https://tproger.ru/news/go-1-10-release/">вышла</a> в феврале 2018 года. Значительных изменений в ней не было, разработчики только улучшили проверку на устаревшие файлы, реализовали автозапуск go vet для выявления критических ошибок перед тестированием и добавили поддержку FreeBSD версии 10.3.</p>]]></content:encoded>
    </item>
    <item>
      <title>Обновление WebAssembly вновь сделает браузеры уязвимыми к Meltdown и Spectre</title>
      <link>https://tproger.ru/news/meltdown-spectre-through-webassembly</link>
      <comments>https://tproger.ru/news/meltdown-spectre-through-webassembly?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/meltdown-spectre-through-webassembly</guid>
      <description><![CDATA[<p>Поддержка разделяемой памяти в WebAssembly нейтрализует защиту браузеров от атак Meltdown, Spectre и других side-channel. Разработка приостановлена.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/meltdown-spectre-through-webassembly">Обновление WebAssembly вновь сделает браузеры уязвимыми к Meltdown и Spectre</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 25 Jun 2018 14:00:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Дополнение к стандарту WebAssembly — поддержка тредов с разделяемой памятью — <a href="https://www.bleepingcomputer.com/news/security/changes-in-webassembly-could-render-meltdown-and-spectre-browser-patches-useless/">нивелирует</a> защиту основных браузеров от Meltdown, Spectre и других атак по сторонним каналам. Разработка по этой функции пока прекращена, однако, по словам команды-разработчика стандарта, пока неизвестно, что делать дальше.</p><p>Chrome, Edge, Firefox и Safari <a href="https://tproger.ru/news/all-browsers-support-webassembly/">объявили</a> о поддержке WebAssembly в ноябре 2017 года, спустя два года работы.</p><h3>В чем суть проблемы?</h3><p>Как только WebAssembly получит поддержку тредов с разделяемой памятью, станет возможным создание чрезвычайно точных таймеров на JavaScript, а это приведет к тому, что ограничения для защиты от атак по сторонним каналам перестанут работать. Об этом <a href="https://www.forcepoint.com/blog/security-labs/webassembly-potentials-and-pitfalls">заявил</a> Джон Бергбом(<a href="https://www.forcepoint.com/company/biographies/john-bergbom">John Bergbom</a>), специалист по информационной безопасности из Forcepoint.</p><p>Он сослался на атаки по времени, которые считаются подвидом атак по сторонним каналам. Тайминг-атаки — это класс криптографических атак, с помощью которых сторонние наблюдатели могут получать доступ к содержимому зашифрованных данных, отслеживая и анализируя время, требуемое для выполнения криптографических алгоритмов.</p><p>Атаки Meltdown и Spectre проводились через запускаемый в браузере JavaScript-код, использующий внутренние функции браузера вроде SharedArrayBuffer или performance.now(). Обновление WebAssembly позволит проводить подобные атаки с той же эффективностью.</p>]]></content:encoded>
    </item>
    <item>
      <title>Autodesk представила версию AutoCAD для работы в браузерах</title>
      <link>https://tproger.ru/news/autocad-for-chrome</link>
      <comments>https://tproger.ru/news/autocad-for-chrome?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даниил Шатухин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/autocad-for-chrome</guid>
      <description><![CDATA[<p>Autodesk выпустила браузерную версию AutoCAD на WebAssembly. Официально поддерживается Chrome на Windows и macOS, но работает и на Linux.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/autocad-for-chrome">Autodesk представила версию AutoCAD для работы в браузерах</a>»</p>]]></description>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 04 Jun 2018 17:11:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Пользователи Reddit поделились новостью, что Autodesk открыла <a href="https://web.autocad.com/#/">версию</a> системы автоматизированного проектирования AutoCAD для запуска в браузерах. Исходный код программы разработчики скомпилировали в WebAssembly.</p><h3>Искусственные границы</h3><p>Официально доступна только поддержка Chrome на системах Windows и macOS. Однако пользователи <a href="https://www.reddit.com/r/linux/comments/8nsa4j/web_assembly_verson_of_autocad_is_out_but_only_on/">отметили</a>, что это ограничение создано искусственно. Новая сборка AutoCAD работает в браузере и под Linux, но для корректного запуска требуется <a href="https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg">с помощью расширения</a> сменить User Agent на идентификатор Chrome.</p><p>Поддержка низкоуровневого байт-кода со временем расширяется. В апреле 2018 года <a href="https://tproger.ru/news/qt-for-webassembly/">вышла</a> бета-версия Qt для WebAssembly для запуска приложений в браузере, а также <a href="https://tproger.ru/news/?s=webassembly">началось тестирование</a> онлайн-среды разработки WebAssembly Studio. В начале июня 2018 года Nebulet <a href="https://tproger.ru/news/nebulet-for-webassembly/">объявила</a>, что разрабатывает микроядро, способное выполнять модули на WebAssembly с правами нулевого кольца защиты процессора в одном адресном пространстве с ядром.</p>]]></content:encoded>
    </item>
    <item>
      <title>Nebulet выпустит микроядро для запуска модулей на WebAssembly</title>
      <link>https://tproger.ru/news/nebulet-for-webassembly</link>
      <comments>https://tproger.ru/news/nebulet-for-webassembly?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Наташа Маркова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/nebulet-for-webassembly</guid>
      <description><![CDATA[<p>Микроядро Nebulet выполняет модули WebAssembly с правами нулевого кольца, снижая накладные расходы на системные вызовы. Релиз не ранее осени 2018.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/nebulet-for-webassembly">Nebulet выпустит микроядро для запуска модулей на WebAssembly</a>»</p>]]></description>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 01 Jun 2018 08:20:54 GMT</pubDate>
      <content:encoded><![CDATA[<p>Создатель Nebulet <a href="https://www.reddit.com/r/rust/comments/8j7y1f/i_am_lachlansneff_creator_of_nebulet_a_rust/">написал</a> на Reddit пост о том, что проект разрабатывает микроядро, способное выполнять модули на WebAssembly с правами нулевого кольца защиты процессора в одном адресном пространстве с ядром.</p><h3>Производительность</h3><p>По словам создателя Nebulet, когда используемый для сборки компилятор <a href="https://github.com/cretonne/cretonne">Cretonne</a> будет готов, модули на WebAssembly смогут обогнать по скорости традиционные приложения для Linux. Это станет возможным за счет снижения накладных расходов на системные вызовы и переключения контекста. Кроме того, помогут «экзотические» оптимизации, которые невозможно реализовать в традиционных операционных системах.</p><h3>Выпуск</h3><p>Микроядро находится на начальной стадии разработки и выйдет в свет не ранее осени 2018 года.</p><p>В апреле 2018 года разработчики Qt <a href="https://tproger.ru/news/qt-for-webassembly/">выпустили</a> предварительную версию своего фреймворка для бинарного формата WebAssembly. Порт позволяет разработчикам запускать графические приложения в браузере без использования плагинов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышла бета-версия Qt для WebAssembly для запуска приложений в браузере</title>
      <link>https://tproger.ru/news/qt-for-webassembly</link>
      <comments>https://tproger.ru/news/qt-for-webassembly?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рамис Ганиев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/qt-for-webassembly</guid>
      <description><![CDATA[<p>Бета-порт Qt для WebAssembly позволяет запускать графические приложения в браузере без плагинов; финальный вариант обещают для Qt 5.11 31 мая.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/qt-for-webassembly">Вышла бета-версия Qt для WebAssembly для запуска приложений в браузере</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 24 Apr 2018 08:12:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики Qt <a href="https://blog.qt.io/blog/2018/04/23/beta-qt-webassembly-technology-preview/">выпустили</a> предварительную версию своего фреймворка для бинарного формата <a href="https://ru.wikipedia.org/wiki/WebAssembly">WebAssembly</a>. Порт позволяет разработчикам запускать графические приложения в браузере без использования плагинов.</p><h3>Как использовать Qt для WebAssembly?</h3><p>Проект находится в разработке, поэтому его бета-версию можно скачать только в виде исходного пакета из раздела загрузок в <a href="https://login.qt.io/login">аккаунте</a>. В качестве компилятора рекомендуется использовать <a href="https://kripken.github.io/emscripten-site/docs/getting_started/downloads.html">Emscripten</a>. Также для работы необходимы порты <a href="https://code.qt.io/cgit/qt/qtbase.git/log/?h=wip/webassembly">QtBase</a> и <a href="https://code.qt.io/cgit/qt/qtdeclarative.git/log/?h=wip/webassembly">QtDeclarative</a>. Инструкция по настройке среды и созданию пакета <a href="https://wiki.qt.io/Qt_for_WebAssembly">представлена</a> на официальной wiki-странице.</p><p>Финальный вариант порта станет доступен в версии 5.11, релиз которого <a href="https://wiki.qt.io/Qt_5.11_Release">запланирован</a> на 31 мая 2018 года. После выпуска обновления разработчики <a href="https://tproger.ru/news/qt-for-python-was-announced/">хотят представить</a> модули для создания графических приложений на Python.</p>]]></content:encoded>
    </item>
    <item>
      <title>Представлен инструмент wasm-pack для более глубокой интеграции JavaScript и Rust</title>
      <link>https://tproger.ru/news/wasm-pack-release</link>
      <comments>https://tproger.ru/news/wasm-pack-release?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/wasm-pack-release</guid>
      <description><![CDATA[<p>Инструмент wasm-pack связывает JavaScript и Rust: он собирает проекты на Rust в пакеты и помогает публиковать их в реестре npm.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/wasm-pack-release">Представлен инструмент wasm-pack для более глубокой интеграции JavaScript и Rust</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 21 Apr 2018 13:20:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Эшли Уильямс (Ashley Williams), член команды Rust Core, <a href="https://hacks.mozilla.org/2018/04/hello-wasm-pack/">рассказала</a> в Mozilla Hacks о новом инструменте для интеграции JavaScript и Rust. Она представила wasm-pack, предназначенный для создания из проектов на Rust пакетов и публикации их в реестре npm. Исходный код опубликован на crates.io и <a href="https://github.com/ashleygwilliams/wasm-pack">GitHub</a>.</p><figure><img src="https://media.tproger.ru/uploads/2018/04/2018-04-21.-wasm-pack_1.gif" alt="" /></figure><h3>Функциональность</h3><p>С npm можно устанавливать пакеты для фронтенд-разработки, а так как он не умеет компилировать код на Rust, с этим помогает wasm. Однако создание npm-пакета для дальнейшего распространения — сложная задача, и wasm-pack упрощает работу.</p><p>Уильямс рассказала о четырех шагах, которые подготовят код на Rust для публикации пакета в реестре npm:</p><ol><li>Компиляция в WebAssembly.</li><li>Запуск <a href="https://tproger.ru/news/mozilla-wasm-bindgen-project/">wasm-bindgen</a>.</li><li>Создание package.json.</li><li>Формирование документации — копирование README.md из Rust-проекта в npm-пакет.</li></ol><p>Проект все еще развивается — в планах у разработчиков интеграция с rustdoc, расширение набора инструментов для работы в Rust с Node.js и так далее. Для более близкого знакомства с инструментом создатели подготовили руководство.</p>]]></content:encoded>
    </item>
    <item>
      <title>Представлена бета-версия онлайн-среды разработки WebAssembly Studio</title>
      <link>https://tproger.ru/news/webassembly-studio-beta</link>
      <comments>https://tproger.ru/news/webassembly-studio-beta?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Хачатурян]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/webassembly-studio-beta</guid>
      <description><![CDATA[<p>Браузерная среда разработки для WebAssembly теперь доступна в бета. В IDE реализована начальная поддержка C/C++ и Rust, а также представлены редактируемые артефакты компилятора и всплывающие подсказки над ключевыми словами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/webassembly-studio-beta">Представлена бета-версия онлайн-среды разработки WebAssembly Studio</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 13 Apr 2018 14:46:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики <a href="https://hacks.mozilla.org/2018/04/sneak-peek-at-webassembly-studio/">анонсировали</a> старт открытого бета-тестирования веб-IDE для работы с кодом <a href="https://tproger.ru/translations/introduction-to-webassembly/">WebAssembly</a> — <a href="https://webassembly.studio/">WebAssembly.Studio</a>. Инструмент вобрал в себя возможности сред <a href="https://mbebenita.github.io/WasmExplorer/">WasmExplorer</a> и <a href="https://wasdk.github.io/WasmFiddle/">WasmFiddle</a> и получил несколько новых уникальных функций.</p><h3>Краткий обзор возможностей</h3><p>В WebAssembly Studio представлены:</p><ul><li>базовая поддержка C/C++ и Rust;</li><li>редактикуемые артефакты компилятора (бинарные модули .wasm можно изменять так же, как текстовые файлы):</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/04/mainwasm-editable-comliler-artefacts.png" alt="" /></figure><ul><li>всплывающие подсказки к ключевым словам:</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/04/wasm2-doc.png" alt="" /></figure><ul><li>обширные контекстные меню с популярными действиями:</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/04/wasm-context-menu.jpg" alt="" /></figure><ul><li>Binary Explorer, визуализирующий бинарное представление кода на WebAssembly:</li></ul><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-19/211d0440-d7b9-46ee-b1d9-1c56bbb222d8.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-19/927af27d-1096-47dc-ba79-37bb91b4ba63.png" alt="" /></figure><ul><li>граф вызовов из отношений вызывающего / вызываемого объекта между функциями, чтобы лучше разобраться в структуре модуля WebAssembly:</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/04/wasm9callgraph.jpg" alt="" /></figure><p>Некоторые функции WebAssembly Studio требуют предустановки бэкенд-сервисов (компиляция), но все остальные запускаются прямо из браузера. <a href="https://github.com/WebAssembly/binaryen/">Binaryen</a>, <a href="https://github.com/WebAssembly/wabt">Wabt</a>, <a href="https://alexaltea.github.io/capstone.js/">Capstone.js</a> компилируются в код WebAssembly, что упрощает процесс масштабирования приложений и одновременно снижает нагрузку на сервер.</p><h3>Дальнейшие действия</h3><p>В ближайшие несколько месяцев разработчики обещают улучшить WebAssembly Studio по следующим направлениям:</p><ul><li>поддержка проектов на C/C++ и Rust вместе с полезными API;</li><li>возможность скачивать и собирать проекты WebAssembly Studio на локальной машине с использованием привычных инструментов;</li><li>пользовательский интерфейс и производительность.</li></ul><p>Больше о новом инструменте можно прочитать в <a href="https://github.com/webassembly">официальной документации</a>. Лучше разобраться в технологии WebAssembly поможет наша <a href="https://tproger.ru/translations/webassembly-tutorial-first-steps/">небольшая инструкция</a> с примером игры «Жизнь».</p>]]></content:encoded>
    </item>
    <item>
      <title>Mozilla представила инструмент для улучшения взаимодействия JavaScript и Rust</title>
      <link>https://tproger.ru/news/mozilla-wasm-bindgen-project</link>
      <comments>https://tproger.ru/news/mozilla-wasm-bindgen-project?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рамис Ганиев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/mozilla-wasm-bindgen-project</guid>
      <description><![CDATA[<p>Проект wasm-bindgen облегчает обмен между JavaScript и кодом в WebAssembly, скомпилированным из Rust; в будущем возможна поддержка C/C++.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/mozilla-wasm-bindgen-project">Mozilla представила инструмент для улучшения взаимодействия JavaScript и Rust</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 06 Apr 2018 13:37:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Программист Алекс Кричтон (Alex Crichton) из команды Mozilla <a href="https://hacks.mozilla.org/2018/04/javascript-to-rust-and-back-again-a-wasm-bindgen-tale/">рассказал</a> о проекте wasm-bindgen, предназначенном для улучшения взаимодействия между JavaScript и скомпилированными в <a href="https://tproger.ru/translations/introduction-to-webassembly/">WebAssembly</a> кодами. На данный момент он ориентирован на Rust, но так как его основа не зависит от языка программирования, в будущем может появиться поддержка C/C++.</p><h3>Что включает в себя проект?</h3><p>Ключевые возможности wasm-bindgen:</p><ul><li>Импорт из JavaScript в Rust таких функциональностей, как <a href="https://github.com/rustwasm/wasm-bindgen/tree/master/examples/dom">DOM-манипуляции</a>, <a href="https://github.com/rustwasm/wasm-bindgen/tree/master/examples/console_log">вывод сообщений на консоль</a> и <a href="https://github.com/rustwasm/wasm-bindgen/tree/master/examples/performance">мониторинг производительности.</a></li><li><a href="https://github.com/rustwasm/wasm-bindgen/tree/master/examples/smorgasboard">Импорт</a> из Rust в JavaScript классов, функций и т.д.</li><li>Работа со сложными строками, числами и объектами вопреки возможности WebAssembly манипулировать исключительно с низкоуровневыми числовыми типами.</li></ul><p>Пример работы проекта <a href="https://github.com/rustwasm/wasm-bindgen">опубликован</a> на GitHub. Для более глубокого погружения рекомендуется <a href="https://github.com/rustwasm/wasm-bindgen/blob/master/DESIGN.md">прочитать</a> документацию.</p><p>В мае 2017 года другой программист из Mozilla <a href="https://tproger.ru/news/mozilla-firefox-fathom-framework/">представил</a> JavaScript-фреймворк Fathom, обучавший браузер Firefox оценивать веб-страницы так же, как человек.</p>]]></content:encoded>
    </item>
    <item>
      <title>Представлены первые рабочие проекты WebAssembly</title>
      <link>https://tproger.ru/news/webassembly-first-working-drafts</link>
      <comments>https://tproger.ru/news/webassembly-first-working-drafts?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Хачатурян]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/webassembly-first-working-drafts</guid>
      <description><![CDATA[<p>W3C открыла три рабочих проекта WebAssembly: спецификацию ядра wasm 1.0, веб-API и интерфейс JavaScript. Технологию поддерживает большинство браузеров.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/webassembly-first-working-drafts">Представлены первые рабочие проекты WebAssembly</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 16 Feb 2018 10:05:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики <a href="https://tproger.ru/translations/introduction-to-webassembly/">WebAssembly</a> <a href="https://www.w3.org/blog/news/archives/6838">открыли доступ</a> к первым трем рабочим проектам новой технологии.</p><h3>Больше возможностей</h3><p>Все желающие могут ознакомиться со следующими документами:</p><ul><li><a href="https://www.w3.org/TR/2018/WD-wasm-core-1-20180215/">Спецификация ядра</a>, детально раскрывающая особенности версии 1.0 стандарта WebAssembly;</li><li><a href="https://www.w3.org/TR/2018/WD-wasm-js-api-1-20180215/">JS-интерфейс</a>, предоставляющий открытый Javascript API для взаимодействия с WebAssembly;</li><li><a href="https://www.w3.org/TR/2018/WD-wasm-web-api-1-20180215/">Веб-API</a>, описывающий процессы интеграции WebAssembly с более широкой веб-платформой.</li></ul><p>WebAssembly — это безопасный портируемый низкоуровневый формат кода для компактного представления и быстрого исполнения. Технология <a href="https://tproger.ru/news/all-browsers-support-webassembly/">поддерживается</a> большинством современных браузеров. А в Mozilla Firefox уже <a href="https://tproger.ru/news/firefox-58-two-tiered-compiler/">внедрен</a> двухуровневый компилятор для ускорения обработки машинных кодов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Введение в WebAssembly: как устроена технология и почему она важна</title>
      <link>https://tproger.ru/translations/introduction-to-webassembly</link>
      <comments>https://tproger.ru/translations/introduction-to-webassembly?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/introduction-to-webassembly</guid>
      <description><![CDATA[<p>WebAssembly — низкоуровневый формат байт-кода для браузеров, который позволяет компилировать код разных языков и использовать инфраструктуру JavaScript.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/introduction-to-webassembly">Введение в WebAssembly: как устроена технология и почему она важна</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 15 Jan 2018 17:55:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>В большой войне против JavaScript появилось новое оружие, позволяющее разработчикам выбирать свой любимый стиль программирования, одновременно повышая производительность и свою продуктивность. Это оружие — WebAssembly, которое может произвести революцию в веб-разработке на стороне клиента.</p><p>WebAssembly или wasm – это низкоуровневый формат байт-кода для клиентских скриптов на стороне браузера. Если вы пишете компилятор для языка программирования, один из вариантов — выбрать готовую платформу, например JVM или .NET, и компилировать ваш язык в её байт-код. WebAssembly занимает ту же роль, поэтому при компиляции в WebAssembly вы делаете свою программу доступной для всех платформ, на которых поддерживается wasm, другими словами, для всех браузеров.</p><p>На практике WebAssembly реализуется разработчиками браузеров на основе существующего JavaScript-движка. По сути, он предназначен для замены JavaScript как целевого языка. Например, вместо компиляции TypeScript в JavaScript его разработчики теперь могут компилировать свой код в WebAssembly. Иными словами, это не новая виртуальная машина, это новый формат для той же самой виртуальной машины JavaScript, которая включена в каждый браузер. Это позволит использовать существующую инфраструктуру JavaScript без использования самого JavaScript.</p><p>Разработка <a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE_%D0%B6%D0%B8%D0%B7%D0%BD%D0%B5%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82">MVP</a> была завершена в марте 2017, и сейчас есть готовые <a href="https://caniuse.com/#feat=wasm">реализации для всех основных браузеров</a>.</p><h2>Почему это важно?</h2><p>Во-первых, новый формат WebAssembly обещает значительное увеличение производительности парсинга. Как сказано в <a href="http://webassembly.org/docs/faq/">FAQ WebAssembly</a>, тип бинарного формата, используемый в WebAssembly, может быть декодирован гораздо быстрее, чем JavaScript может быть пропарсен (эксперименты показывают более чем 20-кратную разницу). На мобильных устройствах большому скомпилированному коду может запросто потребоваться 20–40 секунд только на парсинг, поэтому встроенное декодирование (особенно в сочетании с такими технологиями, как улучшенная по сравнению с gzip потоковая подача для сжатия) имеет решающее значение для обеспечения хорошего пользовательского опыта.</p><p>Обратите внимание, что речь идёт о производительности парсинга, а не о производительности исполнения, т.к. во многих случаях будет использоваться существующий JavaScript-движок. Однако даже это позволит использовать в вебе ПО, которое раньше было бы нецелесообразно разрабатывать, например: <a href="http://webassembly.org/docs/use-cases/">виртуальные машины, виртуальную реальность, распознавание изображений и многое другое</a>.</p><p>Первыми пользователями wasm, вероятно, будут разработчики игровых движков, поскольку они всё время ищут, как бы улучшить производительность. До WebAssembly лучшим, на что они могли надеяться, был asm.js (упрощённый JavaScript, оптимизированный для скорости), который был хорошей технологией, но не очень полезной для многих игр.</p><p>В сущности, <a href="https://research.mozilla.org/webassembly/">Autodesk планирует добавить поддержку WebAssembly для своего игрового движка Stingray</a>, а Unity Technologies, создатели игрового движка Unity, <a href="https://blogs.unity3d.com/2015/06/18/webgl-webassembly-and-feature-roadmap/">начали экспериментировать с WebAssembly ещё в 2015 году</a>. Разработчики Rust также <a href="https://users.rust-lang.org/t/compiling-to-the-web-with-rust-and-emscripten/7627">работают над поддержкой WebAssembly для запуска кода Rust в вебе</a>.</p><p>Прим.перев. На самом деле, Rust <a href="https://www.hellorust.com/news/native-wasm-target.html">уже умеет компилировать в wasm напрямую</a>, без Emscipten. Кроме того, с момента написания статьи произошли изменения: Autodesk сообщила о прекращении разработки и продажи Stingray.</p><h2>Зачем это вам</h2><p>Приход WebAssembly означает, что вам больше не придётся использовать JavaScript для веба, только потому что это единственное, что выполняется в браузере. JavaScript имеет плохую репутацию, хотя на самом деле это хороший язык в том, для чего он предназначен: позволяет быстро писать небольшие скрипты. Однако в настоящее время вы вынуждены использовать его для всего, что запускается в вебе, и это проблема для многих крупных проектов.</p><p>Конечно, вы можете использовать лучшие версии JavaScript, такие как TypeScript или даже новые языки вроде <a href="https://superkotlin.com/kotlin-javascript/">Kotlin</a>. Но, в конце концов, все они должны быть скомпилированы в JavaScript. В свою очередь это создало проблемы для разработчиков языка JavaScript, которые должны поддерживать практически все возможные сценарии и все стили программирования. WebAssembly изменит это и позволит всем сосредоточиться на том, что у них получается лучше всего.</p><p>Это ещё не всё: WebAssembly можно будет переносить на другие платформы. Это означает, что, если вы пишете программное обеспечение на языке, который компилируется в WebAssembly, вы сможете <a href="https://www.hanselman.com/blog/NETAndWebAssemblyIsThisTheFutureOfTheFrontend.aspx">запустить его на .NET</a>. Тот факт, что wasm позволяет повторно использовать уже существующую инфраструктуру JavaScript в вебе, означает, что вы уже можете использовать его для разработки.</p><p>Более того, вы можете создать свою собственную реализацию для своих нужд. Вы можете создать оптимизированный компилятор для своего языка. Его можно создать с нуля, а можно добавить поддержку WebAssembly в существующий компилятор. Таким образом, вы можете воспользоваться всеми модулями WebAssembly.</p><p>Например, вы можете создать компилятор WebAssembly для <a href="https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA">DSL</a>, который вы используете внутри вашей компании, и запустить его в сети на стороне клиента без использования настраиваемых плагинов, таких как Oracle Java Plug-in или Adobe Flash.</p><h2>Как это работает</h2><p><a href="http://webassembly.org/docs/high-level-goals/">Основополагающий принцип WebAssembly</a> — хорошая интеграция с существующим миром JavaScript, от технических характеристик, таких как совместимость и общие политики безопасности, до интеграции инструментов, таких как поддержка функции View Source браузеров.</p><p>Для достижения этой цели WebAssembly определяет как двоичный формат, так и эквивалентный текстовый формат для инструментов и людей. Технически текстовый формат использует <a href="https://ru.wikipedia.org/wiki/S-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5">S-выражения</a>, поэтому он будет выглядеть следующим образом:</p><p>Однако инструменты, вероятно, покажут нечто более похожее на это (пример из документации):</p><p><a href="https://media.tproger.ru/uploads/2018/01/screen_introdution_to_webassembly.jpg"></a></p><p>Если вас интересует, почему в качестве примера используется C++, то это из-за того, что целью начального выпуска (<a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE_%D0%B6%D0%B8%D0%B7%D0%BD%D0%B5%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82">MVP</a>) WebAssembly была поддержка C/C++. Поддержка других языков будет позже; в данный момент они находятся в разработке. Этот выбор был сделан по нескольким техническим и практическим причинам:</p><ul><li>MVP WebAssembly не поддерживает сборку мусора (<a href="http://webassembly.org/docs/future-features/">в разработке</a>);</li><li>Реализация компилятора C/C++ в WebAssembly может полагаться на проверенные временем инструменты вроде <a href="https://ru.wikipedia.org/wiki/Low_Level_Virtual_Machine">LLVM</a> (один из наиболее используемых наборов инструментов для компилятора).</li></ul><p>Разработчики WebAssembly используют LLVM для сокращения объёма работы, необходимой для получения рабочего продукта. Кроме того, это позволило им легко интегрироваться с другими инструментами, которые работают с LLVM, такими как Emscripten.</p><p>Наличие MVP даёт обычным разработчикам возможность тестировать и использовать WebAssebmly, что позволяет соответственно его улучшать.</p><h2>Инструменты WebAssembly</h2><p>На данный момент официальные инструменты WebAssembly могут компилировать только C/C++ в WebAssembly, хотя другие разработчики уже начали работу по добавлению поддержки других языков и платформ (ранее мы упоминали .NET и Rust). Однако даже с помощью официальных инструментов вы уже можете использовать его для веб-разработки двумя способами:</p><ul><li>Записывать WebAssembly в текстовом формате и преобразовывать его в двоичный файл с использованием предоставленных инструментов;</li><li>Использовать сторонний инструмент, основанный на этих инструментах.</li></ul><p>Первый вариант не очень практичен для общего использования, но он подойдёт, если вы хотите получить представление о формате или начать работу по его интеграции в свои собственные инструменты. В настоящее время есть два набора инструментов: <a href="https://github.com/WebAssembly/wabt">WebAssembly Binary Toolkit</a> и <a href="https://github.com/WebAssembly/binaryen">Binaryen</a>.</p><p>WABT включает в себя инструменты для разработки и/или использования в инструментах, предназначенных для работы с WebAssembly:</p><ul><li>Он отлично поддерживает спецификацию формата;</li><li>Он может конвертировать в текстовый формат и из него;</li><li>Он включает в себя интерпретатор.</li></ul><p>Иными словами, он обеспечивает чистый и лёгкий доступ к данным в формате WebAssembly, чтобы вы могли с ними работать.</p><p>С другой стороны, Binaryen — это мощный набор инструментов, предназначенный для использования в инфраструктуре компилятора:</p><ul><li>Он может работать с кодом WebAssembly или графом потока управления, предназначенным для компиляторов;</li><li>Он оптимизирует код многими способами, с использованием как стандартных техник оптимизации, так и специально рассчитанных на WebAssembly;</li><li>Он может компилировать из и в asm.js, Rust MIR (промежуточный язык для Rust) и LLVM.</li></ul><p>Таким образом, этот набор инструментов готов к интеграции в ваш бэкенд.</p><p>По сути, оба позволяют создавать инструменты, которые управляют WebAssembly, но WABT предназначен для инструментов, которые используются во время разработки (например, статический анализ), в то время как Binaryen предназначен для поддержки WebAssembly в компиляторах.</p><p>Эти инструменты отлично подходят для тех, кто разрабатывает инструменты и продукты, связанные с компилятором: они предоставляют как инструменты для разработки, так и готовые к использованию в продакшене. Однако они не идеальны для обычных разработчиков, поэтому для них есть более простой способ.</p><p>Если вам нужно создать такие инструменты, есть ещё и второй вариант — написать всё с нуля. Этот вариант подойдёт, если вам нужен собственный компилятор или интерпретатор для вашего собственного языка, нужна лучшая производительность или лёгкий инструмент. В этом деле вам может помочь библиотека <a href="https://github.com/ftomassetti/wasmcompilerkit">WasmCompilerKit</a>. Это Kotlin-библиотека, которую вы можете использовать для загрузки WASM-файлов, их изменения и создания. Учитывая то, что она написана на Kotlin, вы можете использовать её также с Java и Scala.</p><h2>Использование WebAssembly</h2><p>Если вы просто разработчик, заинтересованный в использовании WebAssembly, то для знакомства с ним вы можете использовать <a href="http://kripken.github.io/emscripten-site/index.html">Emscripten (SDK)</a>. Emscripten — это набор инструментов, который уже используется для компиляции C/C++ в asm.js. С Emscripten вам будет легче использовать ранее упомянутый Binaryen и интегрировать его со своим собственным набором инструментов.</p><p>После установки Emscripten или его компиляции из <a href="https://github.com/juj/emsdk">исходного кода</a> необходимо установить binaryen:</p><p>Затем для того, чтобы активировать среду для компиляции и проверить, что установлены правильные пути и переменные, нужно использовать следующие команды:</p><p>Наконец, вы можете писать ваш код:</p><p>И затем скомпилировать в WebAssembly и увидеть результат в браузере:</p><p>Первая команда создаст три файла: модуль WASM, HTML-файл, который показывает код в действии, и JS-файл, который запускает модуль и отвечает за всё, что нужно для его запуска. Параметр WASM=1 говорит Emscripten, что мы хотим сгенерировать модуль WASM вместо asm.js-файла.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/webassembly.png" alt="" /></figure><p>Вы также можете вывести свой код в настраиваемый шаблон, используя флаг --shell-file. Emscripten SDK содержит базовый шаблон в этом месте: (папка с esmdk)/emscripten/incoming/src/shell_minimal.html. Скопируйте этот файл в свой проект и адаптируйте его под свои нужды (например, добавьте остальную часть вашего JS-кода).</p><p>Также вы можете напрямую сгенерировать JS-файл, но это не рекомендуется на данный момент, поскольку коду нужно заботиться о таких низкоуровневых вещах, как распределение памяти, утечки памяти и т.д.</p><p>Конечная цель состоит в том, чтобы подключать модуль WebAssembly так же легко, как подключается код JavaScript, с помощью HTML-тега &lt;script type = "module"&gt;, но это ещё только впереди.</p><h2>Взаимодействие между C и JavaScript</h2><p>Взаимодействие между C и JavaScript — проблема для Emscripten. Первое, что вам нужно сделать — это подключить заголовочный файл emscripten:</p><p>Самый простой способ вызвать JavaScript — использовать функцию emscripten_run_script:</p><p>Вызвать C-функцию из JavaScript немного сложнее. Во-первых, вы должны сделать её доступной из кода C/C++, потому что по умолчанию Emscripten делает недоступными все функции C, кроме основной (main). Необходимо добавить модификатор EMSCRIPTEN_KEEP_ALIVE ко всем функциям, которые вы хотите использовать в JavaScript:</p><p>Если вы пишете на C++, не забудьте поместить любую функцию, которую вы хотите сделать доступной, внутри блока extern "C", чтобы C++ не задекорировал имя функции (это то, что делает C++, а не баг WebAssembly или Emscripten).</p><p>Во-вторых, вам необходимо скомпилировать модуль WebAssembly с параметром NO_EXIT_RUNTIME, чтобы избежать остановки среды выполнения при выходе из основной функции, что сделало бы невозможным вызов кода C из JavaScript:</p><p>В-третьих, вы не можете напрямую вызвать свою C-функцию, поэтому вы должны использовать следующий синтаксис:</p><p>Есть <a href="https://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html#ccall">три типа</a> на выбор: number, string и array.</p><p>Если вам нужно использовать функцию в JS-коде несколько раз, вы можете обернуть её с помощью функции cwrap:</p><p>Вы можете легко проверить, как это работает, в консоли:</p><figure><img src="https://media.tproger.ru/uploads/2017/12/Englo.png" alt="" /></figure><h2>Подводим итоги</h2><p>Это было короткое введение в WebAssembly: что это такое, почему это важно и как вы можете это использовать. WebAssembly станет отличной платформой для дальнейшей эволюции веба: это сделает веб-разработку проще и эффективней.</p><p>Его разработка поддерживается людьми из Mozilla, Microsoft, Google и Apple. Внимание к WebAssembly — ещё одно доказательство его важности.</p><p>Вы можете использовать WebAssembly уже сегодня и посмотреть подробную документацию на <a href="https://developer.mozilla.org/en-US/docs/WebAssembly">сайте MDN</a>. Если вас интересует более подробная информация о формате, вы можете прочитать её на <a href="http://webassembly.org/">официальном сайте</a>. Вы также можете посмотреть <a href="https://kripken.github.io/emscripten-site/index.html">документацию Emscripten</a>, чтобы понять детали, связанные с взаимодействием между JavaScript и C/C++.</p>]]></content:encoded>
    </item>
    <item>
      <title>В Mozilla разработан способ увеличить скорость работы WebAssembly в Firefox</title>
      <link>https://tproger.ru/news/mozilla-improves-firefox-performance</link>
      <comments>https://tproger.ru/news/mozilla-improves-firefox-performance?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лапа]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/mozilla-improves-firefox-performance</guid>
      <description><![CDATA[<p>Инженер Mozilla Бенджамин Бувье сократил время запуска asm.js в браузере: работа виртуальной машины уходит из главного потока на разные ядра процессора.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/mozilla-improves-firefox-performance">В Mozilla разработан способ увеличить скорость работы WebAssembly в Firefox</a>»</p>]]></description>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Firefox]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 25 Apr 2016 12:04:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Mozilla с помощью распараллеливания компиляции будет увеличивать скорость работы байткода WebAssembly и asm.js.</p><p>Один из инженеров компании разработал способ сократить время запуска asm.js в браузере с помощью технологии параллелизма. «Так как для WebAssembly используется тот же обработчик, что и для asm.js, браузер будет обрабатывать быстрее и его», — сообщает автор технологии Бенджамин Бувье.</p><p>Распараллеливание состоит из разбиения последовательной программы на более мелкие независимые задачи и их запуска на разных ядрах процессора. Принцип технологии, используемой в Firefox, заключается в том, чтобы убрать из главного потока работу виртуальной машины для выполнения asm.js, а также удаление и генерацию кода. Семантика asm.js и wasm схожа, то есть можно просто кодировать wasm опкодами WebAssembly вместе с некоторыми специфическими для asm.js.</p><p>Хотя компиляция и ускорена, в мобильных приложениях она все равно может сильно тормозить выполнения кода, так как парсинг — все еще слабое место, а в работе asm.js он занимает важную роль. Парсинг WebAssembly же происходит на порядок быстрее.</p><p>По словам разработчика технологии, в будущем будет проводиться дальнейшая оптимизация процесса.</p>]]></content:encoded>
    </item>
  </channel>
</rss>