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

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

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

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

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

Уровень сложности Средний
Время на прочтение 7 мин
Количество просмотров 5.5K
Когда я только начинал изучать компиляторы, я не понимал одного важного момента: Разработка языка программирования и написание компилятора — это два почти совершенно разных навыка. Конечно, между ними есть некоторое пересечение, но меньшее, чем может показаться на первый взгляд!

Я думаю, что это важно знать, потому что обе эти задачи очень сложны! Легче овладеть этими навыками, если решать их по очереди. Ваше первое решение сложной задачи, скорее всего, будет… ну, не таким хорошим, как десятое! Однако довольно часто разработчики создают игрушечный язык, когда пишут свой первый компилятор, а это значит, что они совершают ошибки и учатся сразу на двух сложных проблемах. Хуже того, эти две проблемы взаимосвязаны: Ошибка в одной из них усложняет жизнь в другой. Кроме того, как мы увидим, хотя компиляторы и сложны на первых порах, они, по сути, являются решенной проблемой, в то время как разработка языка программирования — это, скажем так, область продолжающихся исследований.
Читать дальше →
Всего голосов 18: ↑18 и ↓0 +18
Комментарии 4

Новости

Развитие RISC-V & мультиклеточная архитектура

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

Рост популярности RISC-V с момента его появления в 2010 году позволяет говорить, что архитектура состоялась.

Пока успех архитектуры RISC-V — это, в первую очередь, ее открытость. Все остальные факторы вторичны. Минимализм системы команд, ее стандартизация, программная инфрастуктура — все это очень важно. Но, если бы за все это платили, как платят создателям ARM, то RISC-V, скорее всего, не было бы. Говорить о действительном успехе этой архитектуры можно будет только тогда, когда она создаст реальную конкуренцию ARM и х86 на высокомаржинальных рынках мобильных телефонов, планшетов, ПК, встроенных систем, суперкомпьютеров и искусственного интеллекта.

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

Так, если уровень системы команд RISC-V рассматривать как
архитектурный, доступный компилятору и программисту, то реализация этого уровня
внутри процессора на мультиклеточных принципах будет микроархитектурным
уровнем, недоступным программисту, но именно этот уровень отвечает за
характеристики процессора.

Читать далее
Всего голосов 10: ↑9 и ↓1 +8
Комментарии 20

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

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

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


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


rustup update stable

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


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

Читать дальше →
Всего голосов 17: ↑15 и ↓2 +13
Комментарии 4

Поговорим об оптимизирующих компиляторах. Сказ седьмой: борьба с проверками диапазонов

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

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

Читать далее
Всего голосов 33: ↑33 и ↓0 +33
Комментарии 14

Истории

Что GCC делает для усиления защиты ядра?

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

Усиление защиты ядра Linux — это задача, предполагающая постоянную работу сразу по нескольким направлениям. И иногда эта работа может быть выполнена даже не в самом ядре, а с помощью других инструментов, или даже в компиляторах. На конференции 2023 GNU Tools Cauldron Цин Чжао (Qing Zhao) рассказала о работе, проделанной в компиляторе GCC для укрепления ядра, а также о работе, которую еще предстоит проделать.

Проект Kernel self-protection является отправной точкой для львиной доли работ по укреплению ядра, — начала она. Усиление защиты может быть выполнено несколькими способами, начиная с исправления известных ошибок безопасности, которые могут быть обнаружены с помощью статических анализаторов, фаззеров или инспекции кода. Однако исправление ошибок — это задача, не имеющая конца, и гораздо лучше, когда у нас есть возможность полностью исключить целые классы ошибок. Таким образом, большая часть усилий по укреплению ядра была направлена на устранение таких проблем, как переполнения стека и кучи, целочисленные переполнения, инъекции форматных строк, утечки указателей, использование неинициализированных переменных, use-after-free уязвимости и т.д. Также ведется работа по блокированию разных методик эксплойтов, включая возможность перезаписи текста ядра или указателей функций.

Читать далее
Всего голосов 18: ↑15 и ↓3 +12
Комментарии 5

Простое CPU ядро на ПЛИС

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

Простое, нестандартное процессорное ядро с открытым кодом, которое может быть использовано для создания микроконтроллера в базисе ПЛИС, в том числе ПЛИС - ОП.

Читать далее
Всего голосов 58: ↑58 и ↓0 +58
Комментарии 20

Хардварный проброс

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

Оказывается пробрасывать можно не только сетевые порты, а еще и регистры периферии микроконтроллера(МК). Идея та же самая - открыть периферию для использования вне микроконтроллера. В случае проброса периферии, внешними клиентами будут выступать программы на ПК, и для них мы будем давать доступ к внутренним регистрам микроконтроллера. Для программ это будет выглядеть так, как будто регистры периферии находятся в адресном пространстве компьютера(ПК). Все равно, что эти самые регистры периферии висели бы на одной шине с памятью и другими устройствами ввода-вывода

Два пути как это сделать
Всего голосов 24: ↑24 и ↓0 +24
Комментарии 20

Profile-guided optimization в Go 1.21

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

В Go 1.20 была выпущена предварительная версия profile-guided optimization (PGO), которую пользователи могли протестировать. После устранения ограничений в предварительной версии и дополнительных доработок благодаря отзывам и вкладу сообщества, PGO в Go 1.21 готова к использованию!

Читать далее
Всего голосов 11: ↑10 и ↓1 +9
Комментарии 4

Делаем JavaScript компилируемым с помощью llvm.js

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

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

Читать далее
Всего голосов 24: ↑14 и ↓10 +4
Комментарии 18

Rust 1.73.0: новый формат сообщений о панике, изменение в работе с локальными данными потока

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

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


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


rustup update stable

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


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

Читать дальше →
Всего голосов 21: ↑20 и ↓1 +19
Комментарии 2

Поговорим об оптимизирующих компиляторах. Сказ шестой: цикловые инварианты

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

Сегодня мы поговорим о том, как перестать считать одни и те же выражения внутри циклов и полюбить вынос инвариантов.

Читать далее
Всего голосов 23: ↑23 и ↓0 +23
Комментарии 11

Компиляция моделей МО в С

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

Статья посвящена знакомству с инструментом micrograd и компиляции генерируемых им нейронных сетей в язык С. При этом она не является руководством по машинному обучению, но вполне может позволить вам лучше понять МО через призму компиляторов. В ходе этого процесса мы также разберём цепное правило, напишем собственный небольшой компилятор и посмотрим, как micrograd масштабируется.

Недавно у меня состоялся приятный разговор с моим другом Крисом. Он познакомил меня с основами машинного обучения, когда я разбирал написанный Андреем Карпаты micrograd.

Для тех, кто не знает, micrograd – это небольшая реализация нейронной сети, написанная на чистом Python без библиотек, в которой вычислительными единицами выступают не векторы и матрицы, а скалярные величины.
Читать дальше →
Всего голосов 54: ↑53 и ↓1 +52
Комментарии 0

Реализация языкового сервера для языка программирования Ü

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


Недавно я реализовал языковой сервер для языка программирования Ü. В этой статье я хочу поведать, как я это сделал. Данное повествование будет полезно для общего понимания, что есть такое языковой сервер. Также статья может быть полезна как руководство для написания языкового сервера для своего языка программирования.

Читать дальше →
Всего голосов 8: ↑8 и ↓0 +8
Комментарии 0

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

Импульс Т1
Дата 1 декабря
Время 12:30
Место Москва Онлайн
YaTalks 2023 — главная конференция Яндекса для IT сообщества
Дата 5 – 6 декабря
Время 9:00 – 23:59
Место Москва Белград Онлайн
Avito Analytics meetup #11
Дата 12 декабря
Время 18:00 – 20:00
Место Онлайн

Пишем компилятор C в 500 строках Python

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

Несколько месяцев назад, закончив пост об SDF-пончике, я поставил перед собой задачу написать компилятор C в 500 строках Python1. Насколько сложна эта задача? Оказалось, что довольно сложна, даже после отказа от достаточно большого количества возможностей. Но в то же время она была довольно интересной, а результат оказался на удивление функциональным и вполне простым для понимания!

Кода слишком много, чтобы подробно объяснять его в посте2, поэтому я просто вкратце расскажу о принятых мной решениях, об аспектах, которые пришлось вырезать, и об общей архитектуре компилятора, коснувшись самого главного в каждой из частей. Надеюсь, после прочтения поста код станет для вас доступнее!
Читать дальше →
Всего голосов 20: ↑20 и ↓0 +20
Комментарии 6

Написание компилятора C в 500 строк Python

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

Компилятор C на 500 строк Python? Почему бы и нет? Это сложно, даже если отказаться от многих функций. Но, в то же время, это ужасно интересно, а результат оказался на удивление функциональным и несложным для понимания!

Читать далее
Всего голосов 35: ↑32 и ↓3 +29
Комментарии 0

Можно ли доверить компилятору оптимизацию вашего кода?

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

Существует три уровня понимания того, как работает SIMD (ну, по крайней мере, на данный момент я нахожусь на 3-м уровне):

  1. Компиляторы умны! Они автоматически векторизуют весь код!
  2. Компиляторы тупы, автоматическая векторизация хрупка, ее очень легко нарушить несвязанными изменениями в коде. Всегда лучше вручную написать конкретные инструкции SIMD.
  3. Написать SIMD вручную действительно сложно — для каждой архитектуры процессора придется писать разный код. Кроме того, вы, вероятно, понимаете, что компилятор напишет на ассемблере скалярный код лучше вас. Что заставляет вас думать, что вы превзойдете компилятор в SIMD, где еще больше странных инструкций и запретов? Компиляторы — это инструменты. Они могут надежно векторизовать код, если он написан в форме, поддающейся векторизации.

Недавно я перешел со второго уровня на третий, и я заметил, как модель, используемая компилятором, щелкнула у меня в голове. В этом посте я хочу объяснить общую структуру компиляторов, пригодную для оптимизации статических языков, таких как Rust или C++. После этого я применю эту структуру к автоматической векторизации.
Читать дальше →
Всего голосов 41: ↑36 и ↓5 +31
Комментарии 11

Проверка компилятора GCC 13 с помощью PVS-Studio

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

После некоторых поисков серьёзного вызова для анализатора PVS-Studio выбор пал на открытую коллекцию компиляторов GCC. Да, это уже не первая по счёту проверка этого проекта. Однако поддерживаемые этой коллекцией языки программирования не стоят на месте, и их постоянное развитие влечёт за собой соответствующее постоянное усложнение кода GCC. Таким образом цель — обнаружить ошибки в коде GCC с помощью анализатора PVS-Studio.

Читать далее
Всего голосов 25: ↑24 и ↓1 +23
Комментарии 11

Rust 1.72.0: потенциально полезные отключенные элементы, неограниченные константные вычисления

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

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


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


rustup update stable

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


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

Читать дальше →
Всего голосов 20: ↑19 и ↓1 +18
Комментарии 0

AsmX: Новые горизонты программирования и мощные инструменты

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

AsmX является языком программирования, который имеет полный Тьюринг, кроссплатформенный. у AsmX имеет свой уникальный синтаксис, инструкции начинаются с символа "@", но это другая забавная мини история.

AsmX имеет ряд возможностей.

Читать далее
Всего голосов 43: ↑5 и ↓38 -33
Комментарии 46

Техникум: Распознавание Вещественного Числа из Строчки

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

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

Потом часто надо анализировать текстовые логи с SD-карты. Надо выхватывать вещественные числа из CSV файлов для дальнейших расчетов.

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

В этом тексте я представил решение этой задачи.

Читать далее
Всего голосов 25: ↑18 и ↓7 +11
Комментарии 85

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