PLComp
описание
Языки и компиляторы: вопросы реализации от входного синтаксиса до порождения машинного кода. Авторы: @vekazanov @igorjirkov @true_grue @clayrat @eupp7 @alexanius @AntonTrunov @GabrielFallen @ligurio
830
подписчиков
Охват к подписчикам
262,8%
ERR
Реакции к просмотрам
1,06%
461 на 20 постов
Пересылки к просмотрам
1,17%
510
Постов в день
0,0
всего 20
Где отзываются чаще
доля реакций к просмотрам- 29 мар. 2024 г.Новости PLComp №1, часть 1 📚Статья Flan: An expressive and efficient datalog compiler for program analysis от Supun Abeysinghe, Xhebraj Anxhelo и Tiark Rompf (Purdue) Реализация компилятора Datalog, который на тестах опережает по производительности известный компилятор Soufflé. Реализация основана на eDSL, что позволяет расширять Datalog с помощью механизмов хост-языка Scala. Для eDSL написан простой интерпретатор, код которого, с помощью Scala LMS (первая проекция Футамуры), транслируется в производительный код на C. 📚Заметки Compiling With Constraints (Mar 18, 2024) от Филипа Цукера (Philip Zucker) Заметки по очень перспективному подходу к использованию программирования в ограничениях для декларативного описания фаз выбора команд, планирования и распределения регистров. Во многом основано на изучении проекта Unison. Минимум теории, максимум практики в виде примеров кода на Python и MiniZinc. 📚Видео доклада Архитектурно-зависимые оптимизации компилятора LCC для микропроцессоров архитектуры Эльбрус (2024 г.), автор М.И. Нейман-Заде Доклад посвящён работе оптимизирующего компилятора lcc для процессоров Эльбрус с широким командным словом (VLIW). Компилятор lcc сам по себе структурно схож с традиционными компиляторами, однако особенности целевой платформы накладывают серьезные отпечатки на существующие низкоуровневые оптимизации. В докладе раскрываются аппаратные особенности работы процессоров Эльбрус, их отличия от "традиционных" процессоров, после чего описываются некоторые аппаратно-зависимые оптимизации, характерные для Эльбрусов. Среди оптимизаций рассказывается про: * Слияние кода (if-conversion). * Конвейеризацию циклов (software pipelining с аппаратной поддержкой). * Динамический разрыв зависимостей. * Предварительную подкачку данных (улучшенный аналог prefetch). 📚Курс Declarative Program Analysis and Optimization (Spring 2024) от Макса Уилси (Max Willsey, UC Berkley) (если ссылка не работает, попробуйте отключить VPN) Учебный курс с очень интригующим названием, поскольку декларативный подход к реализации фаз компилятора все еще остается уделом почти исключительно академистов. В курсе речь идет о переписывании термов, стратегическом переписывании, синтезе и верификации систем переписывания, использовании Datalog, о E-графах и насыщении равенствами. Словом, это ультрасовременный университетский курс по специальным вопросам компиляции. 📚Статья Fixing a Bug in PyPy's Incremental GC (2024-03-26) Починка каждого бага, связанного с GC, это сама по себе уже интересная история, потому что такие баги обычно нетривиальны. К тому же баг, про который рассказывает автор, приводит к memory corruption и это еще больше усложняет отладку. Поиск стабильного воспроизведения, пошаговая интерактивная отладка в gdb/rr, написание скриптов для GDB API для упрощения отладки GC и т.д. (продолжение следует) #news3,09%
- 30 мар. 2024 г.Новости PLComp №1, часть 2 📚Статья Troubleshooting an Intermittent Failure in CI Tests on ARM64 (October 4, 2023) Тесты для Kong Gateway время от времени падали с синтаксической ошибкой, причем происходило это только на ARM64 и только с включенным компилятором в OpenResty (использует LuaJIT). В ходе исследования бага авторы выяснили причину — некорректная кодогенерация для ARM64, и предложили исправление в основной репозиторий LuaJIT. Можно отметить, что в обеих статьях использовали отладчик rr. rr позволяет записывать выполнение программы и потом детерминировано его воспроизводить, а также выполнять инструкции в обратном порядке. 📚Видео доклада How Badly Do We Want Correct Compilers? (NDC TechTown 2023) Доклад известного исследователя Джона Регира (John Regehr). Докладчик, насколько можно заметить, ни разу не произносит слово "CompCert" и сомневается в успешности проектов формально верифицированных компиляторов для популярных ЯП, что, конечно, интригует. Рассматриваются инструменты, в разработке которых принял участие автор доклада: YARPGen, Souper и другие проекты. 📚Заметки Compiling ML models to C for fun (September 19, 2023) и Vectorizing ML models for fun (February 18, 2024), автор Макс Бернштейн (Max Bernstein) Учебное пособие в двух частях для самых маленьких по разработке DL-компиляторов с примерами на Python. Автор начинает с реализации более производительного варианта библиотеки micrograd и создает компилятор, выдающий представление на C. Во второй части делается переход от скаляров к векторам и осуществляется автовекторизация с помощью выявления скалярных произведений в коде. 📚Видео доклада A Full Employment Theorem for PL Researchers: Domain-Specific Languages от Нейта Фостера (Nate Foster, Cornell) (23 Oct 2023) Доклад призван воодушевить исследователей в области языков программирования на работу с современными DSL, в первую очередь с теми, которые используются для программирования специализированного "железа". Рассматривается Тьюринг-неполный язык P4 для разбора сетевых пакетов и ставится задача установления эквивалентности двух двоичных парсеров. Для решения задачи используется подход с использованием конечных автоматов, бисимуляции, SMT-решателя и Coq. 📚Видео доклада ægraphs: Acyclic E-graphs for Efficient Optimization in a Production Compiler, автор Chris Fallin (8 июля 2023 г.) Перенацеливаемый генератор кода Cranelift является, судя по всему, первым промышленным проектом, где широко используются E-графы для решения задачи выбора порядка фаз при компиляции. В Cranelift, как показано в докладе, используется оригинальный упрощенный вариант E-графов -- ациклические E-графы (aegraphs). В предложенную схему на основе aegraphs включены и такие "тяжеловесные" оптимизации, как GVN и LICM. Над выпуском работали: Пётр Советов, Сергей Бронников, Алексей Маркин #news2,16%
- 16 июн. 2025 г.#видеозаписи Начинаем публиковать видео докладов sysconf 2025. Первым — выступление Петра Советова «Генератор случайных процессорных архитектур для обучения системному программированию» YouTube | VK Видео Скачать презентацию с сайта sysconf1,81%
- 10 окт. 2025 г.В наше время может сложиться впечатление, что компиляторы вне LLVM уже не создаются. Это, конечно, не так и я хочу привести в пример два небольших компилятора, над которыми я работал в последнее время. 1. Компилятор HOREC из статьи HOREC: компилятор специализированных регулярных выражений для проектирования программируемой и ресурсоэффективной аппаратной архитектуры. 2. DSL-компилятор для проекта учебной игровой приставки Брус-16. Использование LLVM в этих проектах оказалось бы, по меньшей мере, избыточным.1,76%
- 28 мар. 2024 г.📚 Breno Campos, Ferreira Guimarães "Lazy Evaluation for the Lazy: Automatically Transforming Call-by-Value into Call-by-Need" Proceedings of the 32nd ACM SIGPLAN International Conference on Compiler Construction. February 2023: 239–249 Ленивыми называются такие вычисления, которые программа не производит сразу, а откладывает, пока не потребуется их результат. Если выполнять редкие вычисления лениво, средняя производительность программы может вырасти. Чтобы понять, какие вычисления выгодно производить лениво, программист делает предположения о сценариях выполнения программы или профилирует её. В языках с поддержкой ленивых вычислений можно просто пометить фрагмент программы как lazy, но во многих, особенно низкоуровневых языках, добиться ленивости сложнее, и это может потребовать существенной модификации кода. Цель авторов — научить компиляторы находить вычисления, которые предпочтительно сделать ленивыми, не используя аннотирование lazy вручную и даже поддержку ленивости со стороны языка. Для этого они реализовали внутри LLVM специальную profile-guided оптимизацию, делающую вычисление некоторых аргументов функций ленивым. Оптимизация происходит на уровне LLVM IR в SSA форме. Статья описывает два алгоритма: 1) модификацию Value Slicing, которая строит замыкание для вычисления произвольного значения в SSA IR. 2) Lazification по информации от профилировщика заменяет call-by-value на call-by-need. Выбор вычислений для lazification и необходимое профилирование программы описаны в более ранней статье: Chang, Stephen. "Laziness by need." Programming Languages and Systems: 22nd European Symposium on Programming, ESOP 2013 Авторы добились роста производительности программ на C и C++ от 1% до ~10% за счет увеличения размера на ~10%; тесты включают в себя SPEC CPU 2017. #optimization #profiling #lazy #llvm1,75%
- 29 сент. 2024 г.Я и мой студент, Кирилл Павлов, опубликовали статью "Библиотека llvm2py для анализа промежуточного представления LLVM и её применение в оценке степени распараллеливания линейных участков кода". Чем может быть интересна работа студента второго курса бакалавриата? Анализ распараллеливания делается для варианта LLVM IR, где линейные участки заданы ярусно-параллельной формой (ЯПФ). Автоматическое построение ЯПФ позволяет узнать минимальное число шагов, за которое неограниченно параллельный LLVM-процессор может выполнить код линейного участка. В реальных процессорах число параллельно работающих вычислительных элементов конечно. Поэтому важно экономить ресурсы: получить минимальную ширину ЯПФ, при которой достигается минимальное число шагов параллельной LLVM-машины. Так можно предварительно оценить выбор того или иного аппаратного ускорителя или же узнать, какой "шириной" должен обладать проектируемый нами ускоритель. В статье эта задача сводится к задаче программирования в ограничениях и эффективно решается с помощью инструментария Google OR-Tools. P.S. Сама библиотека llvm2py, предназначенная для создания такого рода статических анализаторов кода LLVM IR, была полностью реализована Кириллом. #llvm #analysis #solver1,60%
- 29 апр. 2024 г.Бенчмарки показали жизнеспособность подхода MVS — производительность оказалась на уровне между Scala Native и Swift. Отставание от Swift авторы объясняют тем, что в прототипе не использовались более продвинутые оптимизации, в частности, уменьшающие количество обращений к счётчику ссылок. Таким образом подход имеет перспективы значительного дальнейшего улучшения за счёт комбинирования с другими известными оптимизациями (например, упоминавшийся Perceus). C++ в бенчмарках использовался в качестве реализации наивного подхода "копируем всё и всегда, но с агрессивными компиляторными оптимизациями", поэтому ожидаемо показал худшую производительность, кроме тестов с преобладающим количеством изменений "по месту" с передачей аргументов через inout параметры. По итогу, MVS предлагает перспективную, формально проработанную семантику для производительных и (более) безопасных прикладных императивных языков программирования. Применимость для системных языков остаётся под вопросом как из-за недостаточной проработанности вопроса оптимизаций на текущий момент, так и по причине ограничений модели программирования, не позволяющей выражать алгоритмы, полагающиеся на использование указателей (в противовес индексам и хэндлам). #mutable_value_semantics #swift #CoW1,28%
- 21 мая 2025 г.Недавно удалось лично пообщаться с несколькими известными преподавателями разработки компиляторов. Евгений Зуев. Я был экспертом на его докладе. За семестр студентам необходимо разработать реализацию одного из возможных проектных языков. Преподаватель объясняет основы, используя мастер-язык. Идея мастер-языка мне показалась перспективной. Иван Кулагин и Дмитрий Мельник. В рамках круглого стола они подготовили детальную презентацию с обзором своего и других известных компиляторных курсов. Слайды прилагаю. На уровне слухов: эти уважаемые коллеги из ИСП РАН собираются обновить материал своего курса, в том числе, с учетом презентации. Дмитрий Булычев. Его курс по разработке компиляторов построен с точки зрения функционального программирования. Ранняя версия курса описана в статье. Особенность курса в использовании символических интерпретаторов для реализации различных компиляторных задач. Это очень красивая идея. На уровне слухов: возможно, стоит ожидать и учебник по разработке компиляторов от Дмитрия.1,14%
- 29 апр. 2024 г.Implementation Strategies for Mutable Value Semantics Dimitri Racordon, Denys Shabalin, Daniel Zheng, Dave Abrahams, Brennan Saeta https://kyouko-taiga.github.io/assets/papers/jot2022-mvs.pdf Одно из неоспоримых достоинств языка Rust — он наглядно показал, что безопасная работа с указателями и ссылками сложна, и требует следовать довольно замысловатым правилам, уберегающим от неочевидных потенциальных проблем. Даже опыт более простых языков, повсеместно использующих ссылки и GC — например, Java — показывает, что непреднамеренный алиасинг (aliasing) может создавать дыры в системе безопасности, помимо других проблем. Эти два фактора — сложность системы типов и владения в Rust, и сложность безопасного использования ссылок без контроля алиасинга — привели к появлению ряда языков, например, https://www.hylo-lang.org/ или https://vale.dev/, отказавшихся от первоклассных ссылок вообще. Отказ от первоклассных ссылок означает, что в языке просто нет механизмов, позволяющих явным образом взять ссылку на объект в памяти, передать её в функцию или того хуже — записать в поле другого объекта. Отказавшись от ссылок и ссылочной семантики, мы приходим к семантике значений. Концептуально, каждое присваивание копирует значение целиком из одного места в другое, а каждый объект владеет своими частями (whole-part relation). Благодаря этому все данные в программе образуют лес, корни деревьев которого располагаются в переменных. И поскольку в такой структуре не может быть алиасинга, можно безбоязненно сделать значения изменяемыми, откуда и возникает Mutable Value Semantics — семантика изменяемых значений. Возможность изменения "по месту" (in-place) частей объектов и отличает MVS от семантики неизменных (immutable) значений в функциональном программировании, которая тривиально реализуется поверх ссылок на общие части в персистентных структурах данных. Естественно, что наивная реализация такой семантики крайне неэффективна из-за постоянного копирования развесистых структур данных. Самое очевидное узкое место — работа с массивами: при передаче массивов в функции их пришлось бы копировать, а единственный способ вернуть массив из функции — снова создать копию. Для обхода этой проблемы и реализации работы с массивами и другими структурами "по месту" (in-place) предлагается использовать ключевое слово inout для параметров функций, передаваемых "по ссылке". Это и есть "ссылки второго класса", которые возникают и используются неявно, без возможности сохранения в переменных или полях объектов. Тем не менее, поскольку по ссылке могут передаваться только аргументы функций, а всё остальное должно копироваться — это всё ещё непозволительно много копирований. Особенно "лишних" копирований значений, которые никогда и не меняются, что значит для них алиасинг не наблюдаем и не создаёт проблем (аналогично ФП, упоминавшемуся выше). Чтобы избавиться от этих копий предлагается использовать механизмы Copy-on-Write и подсчёт ссылок при реализации языка. Для уменьшения инкрементов и декрементов счётчика предлагается обратиться к таким работам как Perceus для Koka и Lean 4. Однако возникает вопрос: коль скоро мы вводим неявные ссылки в наш язык и его реализацию, не сломают ли они семантику изменяемых значений? Чтобы на него ответить, авторы формализуют core language, его систему типов и операционную семантику, после чего доказывают корректность оптимизаций и сохранение семантики изменяемых значений теми правилами, которым подчиняется работа inout аргументов. Но авторы не ограничились теоретическим рассмотрением вопроса, а пошли дальше, и реализовали прототип предлагаемой семантики с оптимизациями в виде упрощённого языка программирования на основе Swift, используя LLVM в качестве бэкенда. Это позволило оценить производительность прототипа в сравнении с другими языками, использующими LLVM (C++, Swift, Scala Native) на ряде синтетических бенчмарков и общеизвестных примеров (Mandelbrot, NBody, NQueens, etc.).1,08%
- 26 нояб. 2024 г.В ближайшее время в Москве пройдет три конференции, связанные с системным программированием, а, значит, и с компиляторами. 1. 11-12 декабря. Открытая конференция ИСП РАН. Часть программы уже опубликована. Для преподавателей отдельный интерес представляет круглый стол по проблемам образования в области системного программирования. Для компиляторщиков -- секция «Технологии анализа, моделирования и трансформации программ». 2. 20–21 марта. Хорошо известная C++ Russia 2025. Заявки до 28 декабря. На конференции регулярно бывают компиляторные доклады. 3. 22 марта. Sysconf 2025. Заявки до 15 декабря (возможно продление). Совершенно новая конференция по системному программированию. Компиляторы, низкоуровневое программирование, ... Здорово, что появилась отдельная конференция по такой тематике!0,91%
- 17 мая 2024 г.Возможно вы знакомы с алгоритмами сборки мусора, которые используются в языках программирования. Американский программист Кен Фокс (Ken Fox) написал программу с использованием разных алгоритмов сборки мусора и вариант программы без освобождения памяти, собрал данные для каждого варианта запуска программы и сгенерировал анимированные изображения для них. В репозитории представлены визуализации четырех основных алгоритмов сборки мусора: - Mark-sweep - Mark-compact - Copying - Reference counting Каждому из этих алгоритмов посвящена отдельная глава в основополагающем учебнике The Garbage Collection Handbook. Рекомендуем обратиться к этому учебнику для полного погружения в тему. Каждое анимированное изображение - это пространство памяти, выделенное процессу. Чёрным цветом изображена неиспользуемая память, по мере использования память начинает подсвечиваться жёлтым (операции записи) и зелёным (операции чтения) цветами. Цвет фрагментов памяти, которые используются дольше, начинает тускнеть, чтобы визуализировать развитие процесса во времени. По ходу выполнения программа перестаёт использовать отдельные участки памяти. Они и считаются "мусором". Первая анимация демонстирует отсутствие всякой сборки мусора - NO_GC, в этом случае память освобождается только при завершении процесса. Механизм NO_GC прост в реализации, он удобен, когда есть способ разбить задачу на отдельные подпроцессы. Так, например, работает веб-сервер Apache. Вторая анимация демонстрирует работу сборщика мусора с использованием техники подсчёта ссылок. Суть алгоритма заключается в подсчёте количества ссылок на объекты в памяти, если количество ссылок становится равным нулю, то объект удаляется. Подсчёт ссылок - единственный алгоритм, хорошо совместимый с разными менеджерами ресурсов. По сравнению с первой анимацией появились красные пиксели, они соответствуют операциям подсчёта ссылок. Можно оценить и эффективность сборщика, если сразу после красной вспышки область памяти освобождается. Третья анимация демонстрирует работу алгоритма "mark-and-sweep". Все объекты делятся на достижимые и недостижимые. Определённое множество объектов считается достижимым изначально - так называемые корневые объекты. Объект, на который есть ссылка из достижимого объекта, тоже считается достижимым. При запуске сборщик мусора выполняет следующие шаги: - Фаза Mark: отмечает все достижимые объекты - Фаза Sweep: проходит рекурсивно по объектам в куче, удаляет недостижимые объекты и возвращает их в пул свободной памяти. Визуализации остальных алгоритмов приведены в репозитории. Помимо описанных визуализаций алгоритмов сборки мусора есть и другие, например интерактивная визуализация алгоритма tricolor mark-sweep, используемого в реализации языка Go.0,90%
- 23 июл. 2024 г.Bertot, [2008] "Structural abstract interpretation, A formal study using Coq" + порт на Агду В статье обсуждается кодирование внутри теории типов подхода к статическому анализу программ, известного как абстрактная интерпретация (АИ). Для анализа взят простой императивный язык с целочисленными значениями (можно ограничить до натуральных) со сложением и булевым сравнением, мутабельными переменными, последовательной композицией и while-циклами. Корректность полученного абстрактного интерпретатора доказана относительно аксиоматической (Хоаровой) семантики языка, а гарантия завершимости получается по построению. Идея абстрактной интерпретации заключается в вычислении приближенных значений для некоторых аспектов поведения программы - обычно анализ делается по графу потока управления программы, но в статье анализируется напрямую синтаксическое дерево. Такую аппроксимацию, как правило, можно получить значительно быстрее, нежели исполнять саму программу, при этом на её основании можно проводить компиляторные оптимизации и делать выводы о корректности. Стандартным примером приближенного анализа является огрубление точных значений числовых переменных до бита четности или интервала значений. Классически при этом выводится аппроксимация "сверху" (overapproximation), т.е. мы хотим гарантировать отсутствие ложноотрицательных результатов за счет возможных ложноположительных (стандартный компромисс статического анализа). Формально отношения между точными (конкретными) и приближенными (абстрактными) множествами значений описываются в теории АИ через соответствия Галуа (пара функции абстракции α и функции конкретизации γ, необходимы для транспорта отношений порядка), в статье используется ad-hoc форма этой конструкции. Также требуется, чтобы домен абстрактных значений имел структуры полугруппы (т.к. моделируются числовые значения) и ограниченной (полу)решетки. Для задания семантики анализируемого языка используется исчисление предусловий, состоящее из (1) бескванторных логических формул (предусловий/assertions) и аннотированных ими программ, (2) функции вычисления наислабейшего предусловия (формулы, которой должны удовлетворять переменные в начале исполнения) по аннотированной программе и (3) функции для генерации условий проверки (набор импликаций, которые, будучи валидными, гарантируют что любое исполнение программы, стартующее из удовлетворяющего предусловию состояния, будет удовлетворять всем последующим формулам). Для while-циклов также добавляются явные инварианты. Нужно заметить, что в самой статье полноценная аксиоматическая семантика c пред- и постусловиями не вводится, но это проделано в предыдущей статье автора, откуда я взял соответствующий кусок с доказательствами корректности аксиоматической семантики относительно операционной и корректности генератора условий. Ключевым же свойством генератора условий для корректности абстрактного интерпретатора является монотонность, т.е. валидность условий, построенных из некой формулы влечет валидность условий, построенных из её ослабления. Задача абстрактного интерпретатора - по исходной программе и абстрактному начальному состоянию одновременно вывести аннотированную программу и абстрактное конечное состояние. В статье демонстрируется построение двух вариантов абстрактного интерпретатора, причем во втором, более продвинутом, сделана попытка обнаруживать незавершимость и мёртвые ветки кода. В качестве базовой инфраструктуры для обоих вариантов вводится таблица поиска (lookup table) для абстрактных состояний переменных (пары из имени переменной и абстрактного значения; отсутствующие переменные имеют по умолчанию значение верхнего элемента полурешетки) и набор функций для отображения этих состояний в логические формулы, каковые функции должны иметь ряд свойств (включающие, например, требования параметричности отображения и перевода верхнего элемента в тривиальную истину). Для верификации интерпретатора также нужна функция построения предиката внутри метатеории (теории типов) по его сигнатуре.0,86%