ruby для встраиваемых устройств / Петр Зотов (evil martians)
TRANSCRIPT
FoundryRuby для встраиваемых устройств
Петр Зотов
whitequark.org, github.com/whitequark
PICOBIT для STM32, gem parser, gem ast, gem ruby-llvm, gem furnace, gem furnace-avm2, LLVM contributor, stlink gdbserver
Демонстрация
Ресурсы0 байтов RAM
80 байтов ROM
Что такое «embedded» и зачем это нужно
Определение эмбеддед-устройствЧасть более крупной системы
Должно выполнять единственную задачу
Центральная часть — микропроцессор
Где используются?Всевозможные бытовые устройства
В автомобиле — до 80 модулей
В смартфонах и ноутбуках как вспомогательные модули
Билеты, ключи
Как выглядят?Маленькие: размер, энергопотребление, стоимость
Наша предметная областьInternet of Things
Nest
Thingsquare Mist
HarvestGeek, PlantLink
Hue, LIFX
SmartThings
Где деньги в embedded?Только 2010, только ARM: 6.1 млрд устройств
Только 2011, только контроллеры (не готовые устройства), ARM: $ 32 млрд
Проблемы в embedded-разработке
Ограничения, ограниченияRasberry Pi, Arduino: любительская микроэлектроника
Простые, надежные, ограниченные по памяти (десятки Кб)
Способность загрузить Linux — исключение, а не правило
ТребованияПроще контроллер — меньше стоимость
Меньше требования к другим частям — опять же, меньше стоимость
Энергопотребление: беспроводные датчики должны работать годами
Кастомизация контроллеров под задачи
Существующие решенияСи. Иногда — ассемблер.
Разработка: долго и дорого. Тесты очень важны, но тестировать сложно.
Попытки:
mruby, espruino, uJ, megapython, pymite, ...
Отдельно про mruby.
Что не так с альтернативойВиртуальная машина
Нет низкоуровневых операций
Разработчику все равно нужно знать внутренности VM, Си и ассемблер.
Большая часть не работает в реальном времени.
Программирование для встраиваемых устройств
Си: 1973Маленький, простой в реализации компилятор
Легко портировать на другие платформы
Нет: замыканий, метапрограммирования, ООП, GC, модулей, стандартных способов сборки и тестирования...
Си: 2013GCC 4.8: 2000 KLOC (C/C++) / 7300 KLOC
LLVM+Clang 3.3: 780 KLOC
Портирование: новый бекенд для существующего компилятора
Всё еще нет: замыканий, метапрограммирования, ООП, GC, модулей, стандартных способов сборки и тестирования...
(C++11: ООП, smart pointers, замыкания)
Код для встраиваемых устройствНизкоуровневая часть: RTOS, настройка периферии, ввод-вывод
Высокоуровневая часть: логика работы устройства
Эффективная оптимизация: вся программа целиком
Давайте писать на Ruby!
FoundryСтатически компилируемый диалект языка Ruby
Область применения — системное программирование, встраиваемые устройства
Компилируется в машинный код
Можно использовать большинство высокоуровневых конструкций Ruby
Не нужно писать на Си или ассемблере
Как компилировать RubyСтатическая типизация
Автоматический вывод большинства типов
Как компилировать RubyУтиная типизация
Как компилировать RubyПромежуточные массивы, splat
Как работает компиляторИсходник →
виртуальная машина → оптимизатор Foundry → оптимизатор LLVM →
машинный код
Foundry: семантика Ruby
LLVM: семантика целевого процессора
Embedded-разработка с FoundryКомпилятор — важно, но board support packages еще важнее
Cortex-M0/M3/M4; STM32F/STM32V
Maple Leaf, STM32VLDISCOVERY, etc.
Embedded-разработка с FoundryЯзык и компилятор не ограничивают программиста, а помогают ему
Стандартная библиотека Foundry написана полностью на Foundry
Покрывает стандартные задачи: работа со строками, fixed point вычисления, TCP/IP, ...
Embedded-разработка с FoundryТестирование, тестирование, тестирование
Foundry может выполнять код на хосте, симулируя семантику цели
Метапрограммирование упрощает замену периферии на mock-объекты
Embedded-разработка с FoundryАбстракции полезны, если упрощают и ускоряют разрабоку
Foundry позволяет, но не требует использование абстракций
Можно: работать напрямую с периферией, использовать ручное управление памятью, делать ассемблерные вставки, ...
Foundry как продуктКоммерческий компилятор с open source частями
Кроссплатформенный, работает на JRuby+FFI+LLVM
Первый релиз — лето 2013
http://foundry-lang.org/
Что дальше?http://foundry-lang.org — подписывайтесь.
Github:
whitequark/parser, /ast, /picobit, /furnace, /furnace-avm2
ruby-llvm/ruby-llvm