Обновить
32K+

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

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

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

Разработка виртуальной RTOS для ПЛК на микроконтроллере

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

Хотя я считаю свой проект серьезным - не являюсь узким специалистом по разработке ОС. Проект пока любительский, и могу позволить себе некоторую свободу по разработке. Тут ставил для себя такие задачи:

Читать далее

Новости

С нуля до чипа: программирование FPGA на t27

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

Большинство курсов по FPGA начинаются со слов «установите Vivado». Мы пошли с другого конца: в каждом из 27 уроков есть рабочий виджет, собранный из реальных запусков на нашем стенде. Сначала разбираем, что такое FPGA и как числа становятся битами. Потом пишем спеку на t27, компилируем её t27c и превращаем в битстрим на плате. В конце — лаборатория из трёх уроков о наших собственных исследованиях, включая результаты, которые нам не понравились. Каждая картинка ниже — снимок живого виджета; нажмите, чтобы открыть его.

Читать далее

Сфера — полностью кириллический язык программирования: от «Привет, мир» до HTTP‑сервера и bare‑metal

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

На фоне десятков языков с привычным английским синтаксисом появление «Сферы» выглядит почти вызовом: это полностью кириллический язык программирования с настоящим компилятором — не интерпретатор и не транспайлер, а генерация машинного кода через LLVM.

За внешней необычностью стоит вполне зрелая инженерия: автоматическое управление памятью, обобщённые типы, контракты, многопоточность, сеть, графика, пакетный менеджер поверх git и отладчик с полноценной поддержкой DWARF. «Сфера» не претендует на то, чтобы заменить индустриальные языки — но доказывает, что кириллический синтаксис способен быть не курьёзом, а рабочим инструментом. И в этой статье честно говорим не только о том, что уже получилось, но и о том, что ещё предстоит сделать.

Читать далее

Rust 1.99.0: функции с переменным числом аргументов, информация о схеме размещения типа

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

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

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

$ rustup update stable

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

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

Читать далее

ROUGE‑V: как я транслировал CUDA/PTX в LLVM IR и запускал его без CUDA runtime

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

Я написал транслятор CUDA/PTX в LLVM IR: он берёт PTX от настоящего nvcc и собирает его обычным clang. Восемь ядер уже исполнены на живой GeForce MX450 и побитово совпали с хост‑эталоном. А главное — как настоящий nvcc и видеокарта сломали мои зелёные тесты.

Читать далее

Как я перенёс сборку лексера в compile-time

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

Я написал source generator для лексера HydraScript. Он собирал регулярное выражение из описаний токенов. После этого мне оставалось скопировать регулярку и руками вставить её в другой файл.

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

Проблема была в том, что результат моего генератора требовался другому генератору — тому, который стоит за атрибутом [GeneratedRegex] в .NET. Хотелось описать токен один раз и поручить остальное сборке. Для этого пришлось разобраться, в каком порядке Roslyn вообще выполняет генераторы.

Читать далее

Я удалил классы, но оставил объекты с методами

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

HydraScript — мой интерпретатор на C#. В нём есть объекты, статическая типизация и вызовы методов. А class, interface и constructor я вообще не добавлял.

Точке на плоскости нужны две координаты, для вычисления расстояния до другой точки нужна функция. Хотелось, чтобы эти вещи работали без обязательной упаковки в класс.

Тут я вдохновлялся сразу двумя языками: структурной типизацией TypeScript и методами с явным получателем из Go. Подход Go заодно сильно упрощал жизнь мне самому — автору языка. Функции у меня уже работали, и методы можно было построить на их основе, не вдаваясь в реализацию классов.

Читать далее

В 100 раз эффективнее ARM: потоковый процессор Electron E1

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

Если энергопотребление ЦОДов будет и дальше расти, то для них придётся выкупать мощности АЭС, как это сделали Microsoft и Amazon. Но должен быть другой выход. Поэтому есть большая потребность в энергоэффективных CPU.

Год назад стартап Efficient Computer представил «самый энергоэффективный в мире» процессор Electron E1. Разработчики попытались заново изобрести универсальный CPU, ориентируясь именно на энергоэффективность. Правда, конкретно этот CPU предназначен для embedded-систем, но схожую архитектуру применяют и для ЦОДов.

Новый CPU в 10−100 раз эффективнее ARM на типичных embedded-задачах, таких как быстрое преобразование Фурье (по данным с сенсоров) или выполнение свёрток (вычисление карты признаков) в свёрточных нейросетях.

Сейчас E1 и компилятор проходят тестирование среди разработчиков. Участники закрытой программы тестирования могут проверить свой код С и С++ в веб-песочнице, оценить его энергоэффективность на новом CPU.

Читать далее

Native AOT заставил меня переписать весь .NET проект

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

Мне хотелось, чтобы знакомство с HydraScript выглядело просто: скачал интерпретатор, запустил скрипт. Сомнительно предлагать человеку сначала установить подходящий .NET Runtime ради моего языка программирования.

Переход на Native AOT поначалу казался правкой .csproj. Включил настройку, опубликовал бинарник, пошёл дальше. На практике пришлось переписать всё. Досталось даже интеграционным тестам. А в процессе рефакторинга ещё и пропали логи.

Читать далее

Почему "+=" сложнее реализовать, чем "+": опыт HydraScript

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

Мой язык программирования HydraScript, написанный на C#, уже умел выполнять такой код:

let x = 10 x = x + 1 >>> x

Получаем 11; >>> — это оператор вывода. Присваивание работает, сложение работает. Захотелось добавить привычное сокращение:

let x = 10 x += 1 >>> x

Результат должен остаться тем же — 11. Зачем учить весь компилятор ещё одной операции, если всё необходимое у него уже есть? Можно прямо в парсере превратить x += 1 в дерево для x = x + 1.

Эта часть уместилась в несколько строк. Основная работа досталась методу Clone().

Читать далее

Ускорение Python-сервиса с CinderX: JIT и статическая типизация

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

У любого ускорителя Python есть число: во сколько раз он быстрее. Меряют его на ядрах - сортировка, обход дерева, арифметика в цикле. Сервис устроен не так: обработчик ходит в базу, считает в numpy, сериализует ответ, и байткода, к которому это число применимо, в нём может почти не остаться. CinderX ускоряет байткод, и за пределы байткода это число не распространяется. Доля байткода в вашем сервисе - свойство вашего кода, а не расширения, и пока она не посчитана, «ставить или нет» решается угадыванием.

Читать далее

Как я учил планировщик класть широкие команды для Эльбруса, и почему LLM проиграла жадному алгоритму за 3 миллисекунды

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

Проще говоря, NEX CLI x Elbrus берет граф и модель e2k‑v6 и показывает: сколько насчитал жадный, сколько мог бы идеальный, и на какой операции и каком канале разница.

Читать далее

Положил http:// в строку, и ассемблер молча собрал 0 байт

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

Мой ассемблер резал исходник построчными правилами: срезал комментарий, искал двоеточие, делил по запятым. Я заменил это одним проходом с состоянием и попутно проверил, нельзя ли было обойтись заплатками.

Нельзя: вторая заплатка ломает то, что починила первая.

Куда делись байты?

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

Шаблоны против статической рефлексии в C++: пять операций, две реализации и дедупликация, которая не стоит памяти

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

Одна и та же операция — дедупликация списка типов — написана двумя способами: на шаблонах и на статической рефлексии из C++26. Обе реализации живут в одном дереве и проверены на идентичность результата, поэтому их можно честно вычесть друг из друга. Получилось так: шаблонная версия съедает 7,9 ГиБ памяти компилятора там, где рефлексивная не съедает ничего измеримого — ±21 МиБ на 32-кратном диапазоне размеров. А по времени обе квадратичны, и рефлексия выигрывает всего пятую часть. Разбираю, откуда берётся такая асимметрия, и заодно пять компиляторных стен, в которые упираешься по дороге, — включая sizeof…, который молча возвращает неверное число.

Читать далее

Как миллениалы переизобрели контрактное программирование для ИИ

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

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

Читать далее

Отступы или скобочки? — Да

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

Спор «скобочки или отступы» старше, чем некоторые из его участников. У этого спора нет судьи и нет призового фонда, но есть ветераны и есть потерянные души, которые однажды написали end в Питоне и с тех пор не могут остановиться. Выиграть этот спор невозможно: стороны спорят о вкусах, а не о свойствах. Поэтому предлагаю - давайте закончим этот спор не победой, а разоружением.

Я написал маленькую утилиту, которая переводит исходный код Python между тремя синтаксисами: классические отступы, C-подобные фигурные скобки, S-выражения в духе Лиспа. Один и тот же quicksort, три вида:

Читать далее

Rust 1.98.0: алгебраические методы для f32,f64, исправление взаимодействия между ManuallyDrop и Box

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

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

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

$ rustup update stable

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

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

Читать далее

Написал свой ассемблер, чтобы понять, откуда берётся ff010113. Почти половину моей программы он выдумывает

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

Написал свой ассемблер, чтобы понять, откуда в дизассемблере берётся ff010113. Заодно посчитал, сколько строк моей программы процессор вообще не умеет исполнять, и проверил это на четырёх наборах команд, включая живой ESP32 на столе. На кристалле первая программа серии сломалась: она пишет в UART быстрее, чем провод успевает передавать, и в эмуляторе этого не видно.

Что сказала плата?

Компилятор удалил вашу проверку на переполнение. И он прав

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

Проверка на переполнение есть в коде, проходит ревью и работает в отладочной сборке — а после оптимизации исчезает из бинарника. Разберём, почему компилятор имеет на это полное право, как неопределённое поведение влияет на указатели, память и проверки, и чем ловить такие ошибки до того, как они проявятся в рабочей среде.

Разобраться в UB

Переписал ядро языка целиком. Ни один из 444 эталонов не сдвинулся

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

Свой язык программирования пишут все. Обычно это калькулятор с переменными, пересказ главы про рекурсивный спуск и заброшенный репозиторий.

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

Не сломал. Полная перестройка ядра — 350 строк — прошла все 444 проверки, и ни один эталон не пришлось трогать.

Разбираю, что для этого пришлось построить: пять замков, каждый из которых закрывает то, что гниёт молча — вывод примеров в документации, списки слов в подсветке синтаксиса, формулировки сообщений об ошибках. Почему стенд замеров строится до первой оптимизации, а не после. И как выяснилось, что запас стека я всё это время мерил неправильно.

Плюс двенадцать дефектов, которые нашёл фаззер: равенство, переставшее быть симметричным; undefined, вылезающий наружу в языке, где его нет; += , вычислявший цель дважды. Два из двенадцати нашёл не фаззер, а я — когда писал тесты к его находкам.

Отдельно — про то, что четыре из пяти находок второго фаззера оказались враньём самого фаззера, и почему я довёл его до нуля ложных срабатываний вместо «ну там четыре из них шум».

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