Простое, нестандартное процессорное ядро с открытым кодом, которое может быть использовано для создания микроконтроллера в базисе ПЛИС, в том числе ПЛИС - ОП.
Компиляторы *
Из исходного кода в машинный
Хардварный проброс
Оказывается пробрасывать можно не только сетевые порты, а еще и регистры периферии микроконтроллера(МК). Идея та же самая - открыть периферию для использования вне микроконтроллера. В случае проброса периферии, внешними клиентами будут выступать программы на ПК, и для них мы будем давать доступ к внутренним регистрам микроконтроллера. Для программ это будет выглядеть так, как будто регистры периферии находятся в адресном пространстве компьютера(ПК). Все равно, что эти самые регистры периферии висели бы на одной шине с памятью и другими устройствами ввода-вывода
Profile-guided optimization в Go 1.21
В Go 1.20 была выпущена предварительная версия profile-guided optimization (PGO), которую пользователи могли протестировать. После устранения ограничений в предварительной версии и дополнительных доработок благодаря отзывам и вкладу сообщества, PGO в Go 1.21 готова к использованию!
Rust 1.73.0: новый формат сообщений о панике, изменение в работе с локальными данными потока
Команда Rust рада сообщить о новой версии языка — 1.73.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.73.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta
) или nightly (rustup default nightly
) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.
Истории
Поговорим об оптимизирующих компиляторах. Сказ шестой: цикловые инварианты
Сегодня мы поговорим о том, как перестать считать одни и те же выражения внутри циклов и полюбить вынос инвариантов.
Компиляция моделей МО в С
Статья посвящена знакомству с инструментом micrograd и компиляции генерируемых им нейронных сетей в язык С. При этом она не является руководством по машинному обучению, но вполне может позволить вам лучше понять МО через призму компиляторов. В ходе этого процесса мы также разберём цепное правило, напишем собственный небольшой компилятор и посмотрим, как micrograd масштабируется.
Недавно у меня состоялся приятный разговор с моим другом Крисом. Он познакомил меня с основами машинного обучения, когда я разбирал написанный Андреем Карпаты micrograd.
Для тех, кто не знает, micrograd – это небольшая реализация нейронной сети, написанная на чистом Python без библиотек, в которой вычислительными единицами выступают не векторы и матрицы, а скалярные величины.
Реализация языкового сервера для языка программирования Ü
Недавно я реализовал языковой сервер для языка программирования Ü. В этой статье я хочу поведать, как я это сделал. Данное повествование будет полезно для общего понимания, что есть такое языковой сервер. Также статья может быть полезна как руководство для написания языкового сервера для своего языка программирования.
Пишем компилятор C в 500 строках Python
Несколько месяцев назад, закончив пост об SDF-пончике, я поставил перед собой задачу написать компилятор C в 500 строках Python1. Насколько сложна эта задача? Оказалось, что довольно сложна, даже после отказа от достаточно большого количества возможностей. Но в то же время она была довольно интересной, а результат оказался на удивление функциональным и вполне простым для понимания!
Кода слишком много, чтобы подробно объяснять его в посте2, поэтому я просто вкратце расскажу о принятых мной решениях, об аспектах, которые пришлось вырезать, и об общей архитектуре компилятора, коснувшись самого главного в каждой из частей. Надеюсь, после прочтения поста код станет для вас доступнее!
Написание компилятора C в 500 строк Python
Компилятор C на 500 строк Python? Почему бы и нет? Это сложно, даже если отказаться от многих функций. Но, в то же время, это ужасно интересно, а результат оказался на удивление функциональным и несложным для понимания!
Можно ли доверить компилятору оптимизацию вашего кода?
Существует три уровня понимания того, как работает SIMD (ну, по крайней мере, на данный момент я нахожусь на 3-м уровне):
- Компиляторы умны! Они автоматически векторизуют весь код!
- Компиляторы тупы, автоматическая векторизация хрупка, ее очень легко нарушить несвязанными изменениями в коде. Всегда лучше вручную написать конкретные инструкции SIMD.
- Написать SIMD вручную действительно сложно — для каждой архитектуры процессора придется писать разный код. Кроме того, вы, вероятно, понимаете, что компилятор напишет на ассемблере скалярный код лучше вас. Что заставляет вас думать, что вы превзойдете компилятор в SIMD, где еще больше странных инструкций и запретов? Компиляторы — это инструменты. Они могут надежно векторизовать код, если он написан в форме, поддающейся векторизации.
Недавно я перешел со второго уровня на третий, и я заметил, как модель, используемая компилятором, щелкнула у меня в голове. В этом посте я хочу объяснить общую структуру компиляторов, пригодную для оптимизации статических языков, таких как Rust или C++. После этого я применю эту структуру к автоматической векторизации.
Проверка компилятора GCC 13 с помощью PVS-Studio
После некоторых поисков серьёзного вызова для анализатора PVS-Studio выбор пал на открытую коллекцию компиляторов GCC. Да, это уже не первая по счёту проверка этого проекта. Однако поддерживаемые этой коллекцией языки программирования не стоят на месте, и их постоянное развитие влечёт за собой соответствующее постоянное усложнение кода GCC. Таким образом цель — обнаружить ошибки в коде GCC с помощью анализатора PVS-Studio.
Rust 1.72.0: потенциально полезные отключенные элементы, неограниченные константные вычисления
Команда Rust рада сообщить о новой версии языка — 1.72.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.72.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta
) или nightly (rustup default nightly
) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.
Техникум: Распознавание Вещественного Числа из Строчки
В программировании микроконтроллеров часто приходится в UART консоли вводить в прошивку какие-то калибровочные коэффициенты: значения токов, пороговых напряжений, уровней освещений и прочего. Как правило это действительные числа с плавающий запятой в разных форматах.
Потом часто надо анализировать текстовые логи с SD-карты. Надо выхватывать вещественные числа из CSV файлов для дальнейших расчетов.
Для всего этого нужен какой-то надежный переносимый прозрачный и простой алгоритм, чтобы распознавать вещественные числа из строчек.
В этом тексте я представил решение этой задачи.
Ближайшие события
Считаем «a=1; b=2; x=pi/3; abcos(x)»
В предыдущей серии мы научились считать выражения вида -2.1+ .355 / (cos(pi % 3) + sin(0.311))
. Один из комментариев там предложил посчитать то, что я вынес в заголовок этого поста. Что ж, вызов принят. Как и в предыдущем посте, мы "на пальцах" разбираем устройство простейшего интерпретатора.
Как уменьшали размер VS Code, используя name mangling — сокращение идентификаторов во время сборки
Не так давно, мы уменьшили на 20% объем итогового скомпилированного JavaScript-кода в Visual Studio Code. В абсолютных числах это около 3.9 МБ. Хоть это и меньше типичной гифки из блога, цифра все равно значительная! Это положительно влияет не только на объем скачиваемых данных для очередного обновления, но и на время запуска: меньше кода значит меньше работы для парсера и интерпретатора. И ко всему прочему, мы добились этого без удаления кода или каких-либо рефакторингов. Вместо этого, мы работали над новым шагом сборки: name mangling, сокращение имен сущностей.
В этой статье рассказывается, как мы обнаружили возможность такой оптимизации, какие подходы рассматривали, и как в конце концов добились уменьшения размера на 20%.
Неопределённое поведение в C/C++ и приёмы против лома
Некоторое время назад в Интернете ходила статья о неопределённом поведении, просто бесившая коренную аудиторию Rust. Завсегдатаи С и C++ в ответ только бурчали, что кто-то просто не понимает Всех Тонкостей и Нюансов Их Светлейшего Языка. Как обычно, пришло время и мне постараться изо всех сил и вставить мои пять копеек в эту застарелую дискуссию.
Готовьтесь поговорить об Основной Проблеме языков C и C++, а также о Принципе Лома.
Управляющие конструкции в языке программирования Аргентум
Управляющие конструкции языка программирования Аргентума основанны не на типе Boolean а на типе Optional. Это имеет далеко идущие последствия для надежности, выразительности и удобочитаемости.
Как написать свой режим для GNU Emacs и опубликовать его в MELPA
Некоторое время назад я разработал режим GNU Emacs для редактирования конфигурационных файлов операционной системы Embox. Кроме всестороннего изучения Emacs Lisp мне потребовалось разобраться со структурой модуля режима, а также процессом и требованиями к публикации пакетов в MELPA, наиболее популярном архиве пакетов для GNU Emacs. В этом руководстве я расскажу, что нужно знать, чтобы написать свой собственный режим, и как опубликовать свой собственный пакет.
Подводные камни C++. Решаем загадки неопределённого поведения, ч. 2
Мы продолжаем цикл статей, посвящённых теме undefined behavior. Ранее мы исследовали предпосылки неопределённого поведения в C++, предоставили формальные определения и рассмотрели несколько примеров. Сегодня углубимся в проблему: сосредоточимся на случаях UB при многопоточности и неправильном использовании move-семантики.
Подобные ситуации могут казаться тривиальными на первый взгляд. При этом они служат основой для более сложных и реальных сценариев, с которыми разработчики порой сталкиваются в своей практике.
Первые новинки C++26: итоги летней встречи ISO
На недавней встрече комитет C++ активно взялся за C++26. Уже есть первые новинки, которые нас будут ждать в готовящемся стандарте C++:
- улучшенный
static_assert
, - переменная
_
, - оптимизация и улучшение для
std::to_string
, - Hazard Pointer,
- Read-Copy-Update (так же известное как RCU),
native_handle()
,- целая вереница классов
*function*
, - множество доработок по
constexpr
, std::submdspan
,- и прочие приятные мелочи.
Вклад авторов
antoshkka 1210.0olegchir 910.0Andrey2008 704.2alizar 532.032bit_me 525.4RustLangRu 525.2tangro 449.4quasilyte 441.0zzeng 408.0Tereshkov 390.0