Как стать автором
Обновить
36.18

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

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

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

Компилятор WebAssembly, который помещается в один твит

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

▍ Введение


Наш первый «компилятор WebAssembly в твите» имел длину 269 байт; с тех пор мы смогли снизить её всего до 192 байтов.

В результате мы получили компилятор, получающий арифметическое выражение, записанное в обратной польской нотации, и компилирующий его в валидный модуль WebAssembly. Этот модуль экспортирует одну функцию, которая возвращает результат исходного арифметического выражения. Компилятор выглядит так:

let c=(b,l)=>WebAssembly.instantiate(new Int8Array(
[,97,115,109,1,,,,1,5,1,96,,1,127,3,2,1,,7,4,1,,,,10,
l=(b=b.split` `.flatMap(t=>t>-1?[65,t]:107+'-*/'.indexOf(t)))
.length+4,1,l-2,,...b,11]))

А вот пример его использования:

(await c('11 11 1 - + 4 * 2 /')).instance.exports['']()

Но это не просто хитрый трюк — если вы начнёте разбираться, как работает этот код, то на удивление много узнаете о WebAssembly! В этом посте мы объясним, как это всё работает, пошагово деобфусцируя код.
Читать дальше →

Путеводитель C++ программиста по неопределённому поведению

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

Путеводитель C\+\+\ программиста по неопределённому поведению


Вашему вниманию предлагается полный список разделов электронной книги (12 из 11 :)), посвящённой неопределённому поведению. Книга не является учебным пособием и рассчитана на тех, кто уже хорошо знаком с программированием на C++. Это своего рода путеводитель C++ программиста по неопределённому поведению, причём по самым его тайным и экзотическим местам. Автор книги — Дмитрий Свиридкин, редактор — Андрей Карпов.

Читать дальше →

Rust 1.84: новый релиз отличного языка программирования. Еще лучше, еще эффективнее, как всегда

Время на прочтение6 мин
Количество просмотров13K

Источник изображения.

Вышел новый релиз языка программирования Rust версии 1.84. Этот язык общего назначения изначально разрабатывался проектом Mozilla, но теперь его поддерживает независимая некоммерческая организация Rust Foundation. Rust ориентирован на безопасную работу с памятью и обеспечивает высокий уровень параллелизма выполнения задач, не прибегая к сборщику мусора или полноценному runtime (runtime ограничен базовой инициализацией и поддержкой стандартной библиотеки). Что нового? Давайте разбираться.
Читать дальше →

Rust 1.84.0: MSRV при выборе зависимости, новый резолвер трейтов и API для отслеживания происхождения указателей

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

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


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


$ rustup update stable

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


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

Читать дальше →

Как я собственный язык на КуМире писал

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

Привет, Хабр!

Хочу поделиться одним любопытным и совершенно нетривиальным кейсом использования Русского Алгоритмического Языка. В этой статье я расскажу, зачем мне это вообще понадобилось и почему в конечном счете я влюбился в него.

(картинка позаимствована с одного из официальных туториалов)

Читать далее

Новогодний плейлист инженера-программиста: что послушать в подкасте «Битовые маски»

Время на прочтение5 мин
Количество просмотров2.6K

Новогодние каникулы — отличное время не только для отдыха, но и для саморазвития. Если вы хотите узнать больше о низкоуровневой оптимизации, тонкостях работы с GPU или разобраться в архитектуре ядра Linux, эти выпуски подкаста «Битовые Маски» точно стоит добавить в свой плейлист. Эксперты с многолетним опытом обсуждают самые сложные темы из мира низкоуровневого программирования, делятся ценными инсайтами и реальными историями из профессиональной практики.

Читать далее

Тензорные компиляторы: что это за «звери» и где они «обитают»

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров4.8K

Компилятор — привычный инструмент для многих разработчиков, но не все сталкивались в работе с тензорным видом. Их частые  пользователи — специалисты по машинному обучению и дата-инженеры. В этой статье совершим экскурсию в «зоопарк» тензорных компиляторов, понаблюдаем за их «поведением» и выберем самых функциональных «зверушек». А еще поделимся ссылкой на бесплатный курс о построении и использовании тензорных компиляторов для ускорения вывода глубоких нейронных сетей, который разработан сотрудниками института ИТММ ННГУ им. Н. И. Лобачевского.

Читать далее

Толкаем байты, или Простейший эмулятор своими руками

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

Есть хороший способ начать свой путь в системное программирование: написать эмулятор и ассемблер для какого-нибудь простого процессора. Сегодня популярностью в узких кругах пользуются fantasy consoles: виртуальные игровые приставки в ретродухе. Я расскажу, как создать свой вариант виртуальной приставки BytePusher с процессором, имеющим всего одну команду. Если вы интересуетесь системным программированием, любите изучать необычные архитектуры процессоров или цените произведения из области демосцены, то эта статья для вас.

Читать далее

Оптимизация компилятора на пальцах

Время на прочтение15 мин
Количество просмотров5.8K

Почему я это написал, и как читать статью

Недавно получил от друга такое сообщение:

Знаешь, какая статья была бы реально интересна? Если бы в ней было показано, что именно происходит с твоим кодом в результате оптимизаций.

Я сразу же подумал: «Ну конечно, я знаю тысячу статей и видеороликов на эту тему», но вскоре осознал, что практически во всех таких источниках от читателя требуется знать компьютерный жаргон, внутреннее устройство, промежуточные представления, т.д. Вот какая проблема здесь возникает: те, кто пользуется компиляторами (как, например, мой друг), всем этим не заморачиваются. Их не волнует, каково именно промежуточное представление LLVM, или что такое φ-узел, или какой проход и почему называется «ротацией циклов». Нет, их интересуют (в порядке убывания приоритета) ответы на вопросы: (1) что, (2) почему, (3) как.

Читать далее

Практика использования парсер-комбинаторов peco и оператора match для создания простых DSL на языке Python

Уровень сложностиПростой
Время на прочтение13 мин
Количество просмотров5.6K

Задачи разработки компиляторов и интерпретаторов конфигурационных языков или даже полноценных Тьюринг-полных языков программирования время от времени встают перед разработчиками программного обеспечения. На практике, как правило, речь идёт о разработке предметно-ориентированных языков (англ. Domain Specific Language, DSL), проектируемых специально для решения узкого класса прикладных задач.

В статье рассматривается один из способов реализации DSL на примере разработки системы символьного дифференцирования, как в SymPy, с использованием парсер-комбинаторов peco и структурного сопоставления с образцом по PEP 636. Материал рассчитан на прикладных разработчиков, уже знакомых с Python, но, надеюсь, может быть полезен и продолжающим компиляторщикам.

Читать далее

Сравнение эффективности компиляторов под Эльбрус на примере решета Эратосфена

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

Сравнение эффективности компиляторов под Эльбрус на примере решета Эратосфена

На Хабре уже тестирование Эльбрусов на разных языках программирования (например, здесь). И данный обзор стоит рассматривать как дополнение, с ещё одним тестом, новыми версиями компиляторов и новыми участниками (Rust, С++). Так же обзор сделан с упором на тест возможностей именно компиляторов и настройки оптимизации.

Читать далее

Rust 1.83.0: новые возможности констант

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

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


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


$ rustup update stable

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


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

Читать дальше →

ISO C++ — встреча международного комитета в Польше

Время на прочтение9 мин
Количество просмотров16K
В конце ноября состоялась встреча международного комитета по стандартизации языка программирования C++.



В этот раз без внимания не остались темы:
  • Рефлексия времени компиляции и оператор «монобровь»
  • Constexpr, много constexpr
  • SIMD
  • Structured bindings as a pack
  • Безопасность, контракты, libc++ hardening, профили, UB и std::launder
  • Сколько бит в байте?

Об этом и других новинках расскажу в посте

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

Книги и статьи про спецпроцессоры: от «волны Макимото» до систолических массивов и ASIP

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров2.9K

Спецпроцессоры не настолько известны, как универсальные процессоры. Действительно, куда им до популярности той же архитектуры RISC-V! Которая, впрочем, спроектирована в том числе для использования множества специализированных ускорителей. Современный универсальный процессор все чаще выполняет роль «дирижера», основное занятие которого — управление «оркестром» разнообразных спецпроцессоров. В статье собрали список материалов, которые помогут глубже понять принципы работы, проектирования и программирования таких процессоров.

Подборку составил и прокомментировал Пётр Советов, специалист в области разработки DSL-компиляторов и старший научный сотрудник лаборатории специализированных вычислительных систем РТУ МИРЭА.

Читать далее

19 ошибок в LLVM 19

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров4.3K

LLVM 19


Статический анализатор PVS-Studio способен находить ошибки даже в таком качественном и протестированном проекте, как LLVM. Чтобы это не было пустыми словами, мы время от времени перепроверяем проект и публикуем такие заметки, как эта.

Читать дальше →

Забытая повесть «Машины, пишущие код»

Время на прочтение26 мин
Количество просмотров2.2K

Патрик через минуту вернулся с небольшой пыльной коробкой. Мы с Дейвом смотрели, как Патрик ее открывает и достает сетевой свитч — такой староватый из тех времен, когда им еще делали железные корпуса. Он воткнул блок питания в розетку и аккуратно выпрямил шнур CAT-5, чтобы подключить этот свитч к нашей сети. Я хотел наорать на него за всю излишнюю осторожность в такой момент. Дейв сидел рядом со мной, нехарактерно тихо.

Я замер, пока у Патрика не получалось попасть шнуром в нужный порт. Я глядел на передние огоньки — Дейв, наверное, тоже. Мои глаза намокли. Патрик впихнул шнур. Сразу же огоньки загорелись и быстро замигали. Я почувствовал, как мои руки и лецо покраснели, а в углу глаза увидел как Дейв встал и открыл рот, будто пытаясь что-то сказать. Затем он нырнул лицом в сложенные руки, затем его вырвало.

Читать повесть

Как AMD выкрутилась и научилась воспроизводить операции ядер CUDA на своих видеокартах. История ROCm

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

Как AMD смогла обойти монополию NVIDIA в мире ИИ? История о том, как команда AMD создала ROCm — технологию, позволяющую запускать CUDA-приложения на своих видеокартах. Как компании удалось совершить этот технологический прорыв? Разберём путь от первых экспериментов с HSA до современных версий ROCm, поддерживающих самые популярные фреймворки для машинного обучения. А главное — в конце расскажу, как установить ROCm на Windows и Linux, избежав всех подводных камней.
Читать дальше →

Ваши генераторные выражения сломаны: чиним и разбираемся

Уровень сложностиСложный
Время на прочтение7 мин
Количество просмотров6.4K

Всем привет! Меня зовут Ефимов Михаил, я профессиональный разработчик с 2010 года и начинающий contributor в CPython.

Итак, название статьи говорит, что генераторные выражения сломаны. О чем вообще речь? Посмотрим на такой код, не содержащий никаких import:

g = (x for x in range(10))
g.gi_frame.f_locals['.0'] = range(20)
list(g)

Устанавливаем с официального сайта новенький Python 3.13.0. Запускаем интерпретатор в режиме консоли, копируем в консоль эти строки кода, ожидаем увидеть содержимое списка...

А содержимого никакого нет, да и консоль закрылась - интерпретатор завершил работу. В зависимости от того, на какой операционной системе был запущен код, будет сформирован Segmentation Fault или его вариации. Например, Windows использует обозначение STATUS_ACCESS_VIOLATION, но суть та же.

Что ж, всё честно, crash на месте, а теперь давайте разбираться, что вообще произошло. Благо, строчек у нас всего три, так что мы можем подробно описать все объекты, вызовы методов и функций.

Читать далее

Важные языки. Часть 1. Forth

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров5.6K

Этой статьей начинаю краткий цикл о трех языках программирования, знакомство с которыми считаю очень важным для любого профессионала в программировании: Форт, Лисп и Оберон.

Сразу оговорюсь, что я не призываю на этих языках разрабатывать, нужны очень веские причины, чтобы принять такое решение. Но знакомство с ними — важная часть профессионального роста.

Читать далее

Rust 1.82.0: cargo info, AArch64 для macOS в tier1, use<..>, небезопасные указатели и другое

Уровень сложностиПростой
Время на прочтение13 мин
Количество просмотров3.1K

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


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


$ rustup update stable

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


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

Читать дальше →

Вклад авторов