CircuitPython Turbo получил поддержку предварительной компиляции и режима Viper

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

Проект CircuitPython, созданный компанией Adafruit на основе MicroPython, предназначен для быстрого прототипирования на микроконтроллерах. Плата определяется как обычная флешка, а написанный код сразу выполняется прямо на устройстве без сборки прошивки и настройки сложных toolchain.

Подобный подход действительно может быть полезен для начинающих программистов и небольших проектов, но быстрее, чем хотелось бы, упирается в потолок производительности железа. CircuitPython Turbo от Майка Склара, созданный при участии Claude LLM, нацелен помочь с решением этой проблемы: теперь важные участки кода можно предварительно компилировать.

Как происходит ускорение

Если вам показалось, что чем-то это все напоминает Viper, то вам не показалось. Как мы уже вспомнили ранее, CircuitPython — это форк MicroPython с некоторыми полезными дополнениями для плат Adafruit, но до сих пор Viper не входил в их число. До появления версии Turbo CircuitPython работал только в интерпретируемом режиме.

Как и в MicroPython, важные участки кода можно перевести в нативный режим: инструкции скомпилируются напрямую, а переменные останутся объектами Python, что даст прирост скорости примерно в три раза. Если же слегка доработать код — явно объявить типы и работу с памятью, — включается режим Viper, увеличивающий производительность уже в 20–70 раз.

В официальной документации приводятся результаты тестирования на алгоритме множества Мандельброта. На плате Metro RP2040 выполнение кода в режиме Native ускорилось в 3 раза, а в режиме Viper — в 19,7 раза по сравнению со стандартным байт-кодом.

Снижаем цены на выделенные серверы в реальном времени

Успейте арендовать со скидкой до 35%, пока лот не ушел другому.

Подробнее →

Архитектурные особенности и структура проекта

Технически решение состоит из специальной прошивки и консольной утилиты. Прошивка собирается с параметром CIRCUITPY_LOAD_NATIVE=1, добавляющим загрузчик размером 2–3 КБ без набортного компилятора. Скомпилированные бинарные .mpy файлы создаются на компьютере с помощью компилятора mpy-cross и загружаются на плату.

При загрузке устройства скрипт lib/turbo.py объемом 49 строк модифицирует системный список sys.path, помещая путь к скомпилированным модулям /lib/turbo// в его начало. Исходные .py файлы переносятся в каталог /src/, который намеренно исключен из стандартного sys.path, чтобы исходный код не перекрывал бинарные модули при импорте. Главный файл code.py всегда исполняется как исходный код, так как запускается через pyexec_file.

Результаты тестов и дальнейшее развитие

Проект протестирован на двенадцати отладочных платах с архитектурами ARM Thumb, Xtensa и RISC-V. Наибольший прирост скорости в режиме Viper продемонстрировала плата Metro M0 Express, ускорившаяся в 71,7 раза. Плата ESP32-C5 на архитектуре RISC-V показала 44-кратное ускорение.

Единственное, чего тут не хватает по сравнению со старым добрым BASIC — это встроенный ассемблер. К слову, в оригинальном MicroPython он есть, так что не исключено, что появится и в Turbo. Разумеется, Python подходит далеко не для каждого микроконтроллерного проекта, но на нем уже умудряются делать всё подряд — от систем управления электровелосипедами до железных плееров в стиле Winamp.

Источник: habr.com

0 0 голоса
Рейтинг новости
1
0
Подписаться
Уведомить о
0 комментариев