Обновить
26.58

Компиляторы *

Из исходного кода в машинный

Сначала показывать
Порог рейтинга
Уровень сложности

Blueprint VM изнутри: ~80 инструкций, которые двигают вашу игру

Уровень сложностиСложный
Время на прочтение18 мин
Охват и читатели5.5K

Каждый раз, когда вы соединяете ноды в Blueprint и нажимаете Play, Unreal Engine запускает маленький процессор. У него свои инструкции, свой стек, своя защита от бесконечных циклов. Он написан в ~4000 строках C++ и живёт в одном файле. Через него проходит каждый Event Tick, каждый Event BeginPlay, каждый вызов Blueprint-функции.

Этот процессор - Blueprint VM (Virtual Machine). И сегодня мы разберём его по винтикам.

Читать далее

Новости

Обратная сторона лаконичности знаков в языках программирования

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели8.9K

Обратная сторона лаконичности знаков в языках программирования. Правила отсеивания неподходящих вариантов при выработке системы знаков для языка программирования.

Читать далее

Flame: Системный язык программирования на C и LLVM с мета-исключениями и Memory Safety без Borrow Checker

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели9.3K

Пока индустрия движется в сторону усложнения компиляторов, я задался вопросом: можно ли создать инструмент, который дает безопасность Rust, гибкость C и при этом не весит сотни мегабайт?

Так появился Flame — системный язык с компилятором в 226 КБ, который реализует управление памятью через статический анализ AST и предлагает альтернативный взгляд на обработку ошибок через патчинг дерева токенов.

Читать далее

Профилирование и PGO в LLVM

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели7.4K

Нередко при оптимизации приложений, написанных на языках со статической компиляцией (C, C++, Rust), наступает момент, когда стандартные методы оптимизации, такие как улучшение алгоритмов, подбор структур данных, флаги компиляции вроде -O3, перестают давать дополнительный прирост производительности. В этот момент многие вспоминают про фундаментальное ограничение статических компиляторов. В отличие от JIT, они не знают, какой код будет горячим, а какой холодным. JIT-компиляторы (JVM, V8, .NET) получают эту информацию в runtime и адаптируют оптимизации под реальную нагрузку. Статические компиляторы генерируют машинный код заранее и лишены информации о поведении программы в runtime. Для решения этой проблемы используется подход Profile Guided Optimization (PGO). Он позволяет собрать данные о выполнении программы и передать их компилятору для принятия более оптимальных решений при генерации кода. По сути, PGO - это способ дать статическому компилятору некоторые преимущества JIT, сохраняя при этом все преимущества ahead-of-time компиляции: отсутствие пауз на перекомпиляцию и полный контроль над билдом.

Читать далее

Выделение памяти в Go

Уровень сложностиСложный
Время на прочтение36 мин
Охват и читатели7.6K

Эта статья посвящена языку программирования Go 1.24, работающему на Linux на архитектуре ARM. Она может не охватывать специфические для других операционных систем (ОС) или аппаратных архитектур детали.

Читать далее

Литания: создаем свой язык программирования с лексером, парсером и интерпретатором

Время на прочтение16 мин
Охват и читатели11K

В наше время программирование стало очень доступным из-за развития инструментов и языков. Написать «привет, мир» может практически каждый, а количество фреймворков для JavaScript уже воспевается в шутках. Теперь, чтобы выделиться и впечатлить друзей и коллег, нужно спускаться глубже. Придумаем свой язык шуточный программирования! 

В этой статье кратко рассмотрим базу компиляторов и мемные эзотерические языки программирования. В конце придумаем свой язык и попробуем его реализовать. 

Это упрощенная статья, которая расширит ваш кругозор, а у некоторых вызовет интерес и любопытство погрузиться в тему.

Читать далее

Фотонный проц на одной инструкции: как Akhetonics строит комп из чистого света. И почему это куда сложнее, чем кажется

Уровень сложностиПростой
Время на прочтение17 мин
Охват и читатели6.1K

Представьте, что вы читаете громкий заголовок: «Самая простая Turing‑complete архитектура SUBLEQ (всего одна инструкция!) и реализовали её на фотонных логических вентилях». Звучит как настоящий прорыв из научной фантастики — один‑единственный тип команды, и вот уже у нас полноценный универсальный компьютер, работающий на скорости света, без кремния, без транзисторов, с терагерцевыми частотами и энергопотреблением в разы ниже.

Но если копнуть глубже, сразу вылезают два больших «но». Первое — SUBLEQ действительно может быть Turing‑полной, но только при очень конкретных условиях. Второе — реализовать даже такую «простую» архитектуру на настоящих фотонных вентилях в железе оказывается совсем не тривиальной задачей. И именно об этом мы сегодня поговорим подробно, без хайпа, но и без излишнего скепсиса.

Эта статья — разбор реальной истории, которая происходит прямо сейчас, в 2026 году. Немецкий стартап Akhetonics из Мюнхена всерьёз взялся за all‑optical general‑purpose processor и выбрал для доказательства концепции именно SUBLEQ. Мы пройдёмся по всем нюансам: от теории одной инструкции до проблем фотонной памяти, от лабораторных прототипов до того, почему чистый SUBLEQ, скорее всего, останется красивым PoC, а в реальном продукте придётся расширять набор команд.

Готовы? Поехали.

Полетели!

Шесть мыслей о генерации кода на C

Время на прочтение7 мин
Охват и читатели7.9K

Я занимаюсь разработкой компиляторов, то есть, пишу программы, преобразующие программы в программы. Иногда требуется нацелиться на более высокоуровневый язык, чем, скажем, простой ассемблер, и зачастую именно в таком качестве удобно взять язык C. Генерировать C не так страшно как писать от руки — в частности, потому, что генератор умеет не попадать в ловушки, связанные с неопределённым поведением. А когда пишешь на C вручную, именно неопределённого поведения следует особенно остерегаться. Здесь я опишу некоторые паттерны, которые обнаружил сам, и которые помогают мне результативно работать.

Считайте этот пост краткой подборкой тех вещей, которые мне действительно помогают. Рискуя, что меня могут обвинить в тщеславии, назову их «наилучшими практиками», хотя, это действительно мои рабочие практики, поэтому, если они вам понравятся — смело берите их на вооружение.

Читать далее

Маленький bool, сулящий большие беды

Время на прочтение10 мин
Охват и читатели11K

Признаюсь, я питаю слабость к классическому DOOM. Игре уже 31 год, но благодаря открытому исходному коду она живёт на всём — от смартфонов до осциллографов. В силу разных обстоятельств я стал сопровождать несколько пакетов, связанных с DOOM, в Fedora Linux.

Перед каждым релизом Fedora проводит массовую пересборку всех пакетов — и в этот раз chocolate-doom её не пережил. Виновник этому — маленький bool.

Читать далее

Я добавил трейты и указатели в свой язык

Время на прочтение30 мин
Охват и читатели8.8K

Язык активно улучшается, осталось недолго до bootstrapping'а! Также уменя есть планы писать LSP и загрузить язык на github linguist. Для последнего нужны репозитории (>200). Для тех, кому нечего делать, или кому просто не лень, попробуйте пописать программки на моем языке. Пока мало что можно будет написать, но, думаю, хотя бы что-то можно.

Читать далее

Компилируем Quake, как будто на дворе 1997 год

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели15K

Первые исполняемые файлы Quake (quake.exe и vquake.exe) программировали на HP 712-60 с NeXT и кросс-компилировали при помощи DJGPP, запущенного на DEC Alpha server 2100A. В июне 1996 года, после выпуска игры, id Software, озабоченная стагнацией NeXT, решила поменять стек разработки.

Сразу после выпуска Quake мы перешли на оборудование Intergraph с Windows NT.

- Джон Кармак[1]

Следующие версии Quake (winquake.exe, glquake.exe) и QuakeWorld (qwcl.exe и qwsv.exe) разработаны и скомпилированы в Windows NT с помощью Visual C++ 4.X.

В этой статье описываются этапы по воссозданию процесса сборки двоичных файлов Quake win32 в том виде, в котором он происходил в 1997 году.

Читать далее

Планировщик Go

Уровень сложностиСредний
Время на прочтение36 мин
Охват и читатели7.9K

Эта статья посвящена языку программирования Go 1.24, работающему на Linux на архитектуре ARM. Она может не охватывать специфические для других операционных систем (ОС) или аппаратных архитектур детали.

В этой статье подробно рассматриваются следующие вопросы:

Компиляция и среда выполнения Go
Примитивный планировщик
Улучшение планировщика
Модель GMP
Начальная загрузка программы
Создание горутины
Цикл планирования
Поиск готовой к выполнения горутины
Вытеснение горутин
Обработка системных вызовов
Сетевой и файловый ввод-вывод
Работа netpoll
Сборщик мусора
Общие функции
API среды выполнения Go

Читать далее

Компилируем TypeScript в натив: хардкор и мясо

Время на прочтение17 мин
Охват и читатели18K

Зачем вообще компилировать TypeScript?

Есть большой проект, с кодовой базой в два миллиона строк на C++. Ядро на плюсах, поверх него работают несколько UI: десктопный интерфейс, веб и мобильное приложение. В какой-то момент проект упирается сразу в две проблемы. Первая — лицензионные ограничения: новые версии Qt, на которых мог бы жить десктопный интерфейс, становятся недоступны по санкционным причинам. Вторая — скорость разработки: UI давно хотелось писать быстрее.

Возникает логичный вопрос: что, если взять лучшие, максимально автоматизированные инструменты из веба и перенести их в мир нативных приложений без браузера и лишних прослоек? Ключевая цель — обеспечить возможность вызова C++-код из TypeScript с возвратом результата без промежуточных интерпретаторов.

Меня зовут Владимир Цышнатий @Tsyshnatiy. Я занимаюсь разработкой более 15 лет, мой основной профиль — C++. Помимо этого меня увлекают технологии на стыке разных миров. В том числе идея, лежащая в основе этой статьи: дать возможность писать на TS как на нативном языке.

Интересно узнать, как мы это делали и что получилось? Детали под катом! 

Читать далее

Ближайшие события

Охота на ошибки в компиляторах: новый подход с использованием искусственного интеллекта

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели5.3K

Исследователи разработали систему, способную находить более сотни ошибок в компиляторах всего за 72 часа, используя возможности больших языковых моделей.

Читать далее

Я написал компилятор на C++ при помощи LLVM (2)

Уровень сложностиСредний
Время на прочтение24 мин
Охват и читатели10K

GitHub

Из прошлой статьи мы знаем, что я разрабатываю свой компилятор - Onyx. С того момента язык активно развивался, теперь он поддерживает:

Читать далее

Универсальный компилятор для FPGA, который понимает 42 языка программирования

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели9.4K

Универсальный компилятор для FPGA, который понимает 42 языка программирования

Пишите код на любимом языке — получайте работающий Verilog для FPGA. Бесплатно, без vendor lock-in.

Читать далее

Rust 1.93.0: обновление встроенного musl, глобальный аллокатор и tls, cfg в asm

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели7K

Команда Rust рада сообщить о новой версии языка — 1.93.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.

Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.93.0 вам достаточно выполнить команду:

$ rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.

Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках.

Что стабилизировано в 1.93.0

Книга в Markdown: Автоматическая сборка статического сайта mdBook и файла DOCX с оформлением по ГОСТ

Уровень сложностиПростой
Время на прочтение17 мин
Охват и читатели9.1K

Markdown — популярный и удобный язык разметки, но это также и очень ограниченный формат. Поэтому задача написания в Markdown сложной технической документации по ГОСТ, научной статьи с автоматической настройкой оформления для заданного издательства или хорошо оформленного онлайн-учебника может показаться неосуществимой. В этой статье рассмотрим способ работы над научно-техническими статьями и книгами в формате Markdown на основе подхода Docs as Code с учётом строгих ограничений на оформление, используемый Петром Советовым и мной при подготовке учебных материалов в РТУ МИРЭА.

Способ заключается в применении утилиты pandoc для построения дерева абстрактного синтаксиса (AST) Markdown-документа с последующим переписыванием AST набором фильтров на Lua и трансляцией AST в форматы docx и pdf, соответствующие ГОСТ, а также в диалект markdown, совместимый с mdBook, для генерации онлайн-учебника.

Онлайн-версии книг, написанных с использованием описанного подхода, и репозитории с исходным кодом книг опубликованы на GitHub и GitHub Pages: книга по конфигурационному управлению, книга по разработке кроссплатформенных программмных систем.

Читать далее

Запуск JIT-бенчмарков под двоичными трансляторами

Время на прочтение7 мин
Охват и читатели7K

В данной статье были проведены запуски JIT-бенчмарков под двоичными трансляторами из x86 в ARM Microsoft Prism Emulator, Apple Rosetta 2 и FEX Emulator. Также была проведена оценка влияния динамических модификаций кода на производительность двоичной трансляции.

Читать далее

Я написал компилятор на C++ при помощи LLVM

Уровень сложностиСредний
Время на прочтение56 мин
Охват и читатели14K

GitHub

Onyx — язык программирования, нацеленный на базовую безопасность памяти, приятный синтаксис и опыт использования. Onyx написан на C++ с компиляцией на базе LLVM. На момент написания статьи язык поддерживает:

Читать далее
1
23 ...