Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)

Preview:

Citation preview

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 — подписывайтесь.

whitequark@whitequark.org

Github:

whitequark/parser, /ast, /picobit, /furnace, /furnace-avm2

ruby-llvm/ruby-llvm

Вопросы?

whitequark@whitequark.orghttp://foundry-lang.org

Recommended