Для CircuitPython появилась сборка CircuitPython Turbo, которая позволяет заранее компилировать критичные к скорости участки кода в машинные инструкции. Её автор — Майки Склар, а при разработке ему помогала языковая модель Claude от Anthropic. В зависимости от задачи отмеченные функции начинают работать в несколько раз, а иногда и в десятки раз быстрее.
Python нередко называют «новым BASIC», и сравнение вполне справедливо. Как и BASIC во времена домашних компьютеров, Python стал первым языком программирования для целого поколения разработчиков, а его главное достоинство — на нём легко и быстро писать. Но есть и общий недостаток: оба языка интерпретируемые, то есть программа не превращается заранее в машинный код, а исполняется построчно специальной программой-интерпретатором. За удобство приходится платить скоростью.
Почему это важно для микроконтроллеров
На настольном компьютере медлительность интерпретатора часто незаметна, но на микроконтроллере с ограниченной производительностью она быстро становится проблемой. CircuitPython отлично подходит новичкам и для быстрых прототипов, однако упирается в возможности железа гораздо раньше, чем могла бы сама плата. Выход — компилировать самые нагруженные фрагменты программы, и теперь такая возможность есть.
Идея не нова: именно так работают режимы native и viper в MicroPython. CircuitPython — это ответвление MicroPython, которое развивает Adafruit: оно дополнено удобными функциями для плат компании, например упрощённой загрузкой кода и готовыми библиотеками. А вот компилятора viper среди этих дополнений до сих пор не было — до появления Turbo-версии CircuitPython работал только в режиме интерпретации.
Режимы native и viper
Как и в MicroPython, в CircuitPython Turbo нужные функции помечаются для компиляции. Доступны два уровня:
- native — инструкции компилируются в машинный код, но значения остаются обычными объектами Python, поэтому переписывать код почти не нужно; прирост скорости — примерно в 3 раза;
- viper — требует немного доработать код и явно объявить типы переменных и указателей, зато позволяет работать с машинными целыми числами напрямую и в зависимости от задачи даёт ускорение в 20–70 раз.
В документации Adafruit приводится наглядный пример: плата Metro RP2040 рассчитывала множество Мандельброта в 3 раза быстрее в режиме native и в 19,7 раза быстрее в режиме viper по сравнению с обычным байт-кодом Python. Такие вычисления — типичный случай, где компиляция особенно полезна: много однотипной арифметики в плотных циклах.
Одного пока не хватает — встроенного ассемблера, который когда-то был доступен в некоторых версиях BASIC и позволял вставлять машинные команды прямо в программу. В основной ветке MicroPython такая возможность уже есть, так что со временем она может добраться и до CircuitPython. Python подходит для микроконтроллеров далеко не во всех задачах, но его уже применяли в самых разных проектах — от электровелосипедов до музыкального плеера в стиле Winamp, и ускорение критичных функций заметно расширяет круг таких применений.




















