Для CircuitPython появилась сборка CircuitPython Turbo, которая позволяет заранее компилировать критичные к скорости участки кода в машинные инструкции. Её автор — Майки Склар, а при разработке ему помогала языковая модель Claude от Anthropic. В зависимости от задачи отмеченные функции начинают работать в несколько раз, а иногда и в десятки раз быстрее.

Python нередко называют «новым BASIC», и сравнение вполне справедливо. Как и BASIC во времена домашних компьютеров, Python стал первым языком программирования для целого поколения разработчиков, а его главное достоинство — на нём легко и быстро писать. Но есть и общий недостаток: оба языка интерпретируемые, то есть программа не превращается заранее в машинный код, а исполняется построчно специальной программой-интерпретатором. За удобство приходится платить скоростью.

реклама кормит Уточку 🦆

Плата с микроконтроллером, на которой запускается CircuitPython Turbo

Почему это важно для микроконтроллеров

На настольном компьютере медлительность интерпретатора часто незаметна, но на микроконтроллере с ограниченной производительностью она быстро становится проблемой. 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, и ускорение критичных функций заметно расширяет круг таких применений.