ruby для встраиваемых устройств / Петр Зотов (evil martians)
TRANSCRIPT
![Page 1: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/1.jpg)
FoundryRuby для встраиваемых устройств
![Page 2: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/2.jpg)
Петр Зотов
whitequark.org, github.com/whitequark
PICOBIT для STM32, gem parser, gem ast, gem ruby-llvm, gem furnace, gem furnace-avm2, LLVM contributor, stlink gdbserver
![Page 3: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/3.jpg)
Демонстрация
![Page 4: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/4.jpg)
![Page 5: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/5.jpg)
![Page 6: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/6.jpg)
Ресурсы0 байтов RAM
80 байтов ROM
![Page 7: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/7.jpg)
Что такое «embedded» и зачем это нужно
![Page 8: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/8.jpg)
Определение эмбеддед-устройствЧасть более крупной системы
Должно выполнять единственную задачу
Центральная часть — микропроцессор
![Page 9: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/9.jpg)
Где используются?Всевозможные бытовые устройства
В автомобиле — до 80 модулей
В смартфонах и ноутбуках как вспомогательные модули
Билеты, ключи
![Page 10: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/10.jpg)
Как выглядят?Маленькие: размер, энергопотребление, стоимость
![Page 11: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/11.jpg)
Наша предметная областьInternet of Things
Nest
Thingsquare Mist
HarvestGeek, PlantLink
Hue, LIFX
SmartThings
![Page 12: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/12.jpg)
Где деньги в embedded?Только 2010, только ARM: 6.1 млрд устройств
Только 2011, только контроллеры (не готовые устройства), ARM: $ 32 млрд
![Page 13: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/13.jpg)
Проблемы в embedded-разработке
![Page 14: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/14.jpg)
Ограничения, ограниченияRasberry Pi, Arduino: любительская микроэлектроника
Простые, надежные, ограниченные по памяти (десятки Кб)
Способность загрузить Linux — исключение, а не правило
![Page 15: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/15.jpg)
ТребованияПроще контроллер — меньше стоимость
Меньше требования к другим частям — опять же, меньше стоимость
Энергопотребление: беспроводные датчики должны работать годами
Кастомизация контроллеров под задачи
![Page 16: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/16.jpg)
Существующие решенияСи. Иногда — ассемблер.
Разработка: долго и дорого. Тесты очень важны, но тестировать сложно.
Попытки:
mruby, espruino, uJ, megapython, pymite, ...
Отдельно про mruby.
![Page 17: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/17.jpg)
Что не так с альтернативойВиртуальная машина
Нет низкоуровневых операций
Разработчику все равно нужно знать внутренности VM, Си и ассемблер.
Большая часть не работает в реальном времени.
![Page 18: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/18.jpg)
Программирование для встраиваемых устройств
![Page 19: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/19.jpg)
Си: 1973Маленький, простой в реализации компилятор
Легко портировать на другие платформы
Нет: замыканий, метапрограммирования, ООП, GC, модулей, стандартных способов сборки и тестирования...
![Page 20: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/20.jpg)
Си: 2013GCC 4.8: 2000 KLOC (C/C++) / 7300 KLOC
LLVM+Clang 3.3: 780 KLOC
Портирование: новый бекенд для существующего компилятора
Всё еще нет: замыканий, метапрограммирования, ООП, GC, модулей, стандартных способов сборки и тестирования...
(C++11: ООП, smart pointers, замыкания)
![Page 21: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/21.jpg)
Код для встраиваемых устройствНизкоуровневая часть: RTOS, настройка периферии, ввод-вывод
Высокоуровневая часть: логика работы устройства
Эффективная оптимизация: вся программа целиком
![Page 22: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/22.jpg)
Давайте писать на Ruby!
![Page 23: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/23.jpg)
FoundryСтатически компилируемый диалект языка Ruby
Область применения — системное программирование, встраиваемые устройства
Компилируется в машинный код
Можно использовать большинство высокоуровневых конструкций Ruby
Не нужно писать на Си или ассемблере
![Page 24: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/24.jpg)
Как компилировать RubyСтатическая типизация
Автоматический вывод большинства типов
![Page 25: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/25.jpg)
Как компилировать RubyУтиная типизация
![Page 26: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/26.jpg)
Как компилировать RubyПромежуточные массивы, splat
![Page 27: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/27.jpg)
Как работает компиляторИсходник →
виртуальная машина → оптимизатор Foundry → оптимизатор LLVM →
машинный код
Foundry: семантика Ruby
LLVM: семантика целевого процессора
![Page 28: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/28.jpg)
Embedded-разработка с FoundryКомпилятор — важно, но board support packages еще важнее
Cortex-M0/M3/M4; STM32F/STM32V
Maple Leaf, STM32VLDISCOVERY, etc.
![Page 29: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/29.jpg)
Embedded-разработка с FoundryЯзык и компилятор не ограничивают программиста, а помогают ему
Стандартная библиотека Foundry написана полностью на Foundry
Покрывает стандартные задачи: работа со строками, fixed point вычисления, TCP/IP, ...
![Page 30: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/30.jpg)
Embedded-разработка с FoundryТестирование, тестирование, тестирование
Foundry может выполнять код на хосте, симулируя семантику цели
Метапрограммирование упрощает замену периферии на mock-объекты
![Page 31: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/31.jpg)
Embedded-разработка с FoundryАбстракции полезны, если упрощают и ускоряют разрабоку
Foundry позволяет, но не требует использование абстракций
Можно: работать напрямую с периферией, использовать ручное управление памятью, делать ассемблерные вставки, ...
![Page 32: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/32.jpg)
Foundry как продуктКоммерческий компилятор с open source частями
Кроссплатформенный, работает на JRuby+FFI+LLVM
Первый релиз — лето 2013
http://foundry-lang.org/
![Page 33: Ruby для встраиваемых устройств / Петр Зотов (Evil Martians)](https://reader031.vdocuments.pub/reader031/viewer/2022012401/5598ca5d1a28ab4c568b47a5/html5/thumbnails/33.jpg)
Что дальше?http://foundry-lang.org — подписывайтесь.
Github:
whitequark/parser, /ast, /picobit, /furnace, /furnace-avm2
ruby-llvm/ruby-llvm