Выпуск Tinygo 0.7.0, компилятора языка Go на базе LLVM

Доступен выпуск проекта Tinygo 0.7.0, в рамках которого развивается компилятор языка Go для областей, в которых необходимо компактное представление результирующего кода и низкое потребление ресурсов, таких как микроконтроллеры и компактные однопроцессорные системы. Код распространяется под лицензией BSD.

Компиляция для различных целевых платформ реализована при помощи LLVM, а для поддержки языка применяются библиотеки, применяемые в основном инструментарии от проекта Go. Скомпилированная программа напрямую может запускаться на микроконтроллерах, позволяя применять Go в качестве языка для написания сценариев автоматизации.

Мотивом создания нового проекта послужило желание использовать привычный для себя язык Go на компактных устройствах — разработчики рассудили, что если существует вариант Python для микроконтроллеров, то почему бы не создать подобное для языка Go. Go выбран вместо Rust так как он более прост в изучении, предоставляет независимую от реализаций потоков поддержку распараллеливания на основе сопрограмм и предлагает обширную стандартную библиотеку («батарейки входят в комплект»).

В текущем виде поддерживается 15 моделей микроконтроллеров, включая различные платы Adafruit, Arduino, BBC micro:bit, ST Micro, Digispark, Nordic Semiconductor, Makerdiary и Phytec. Программы также могут быть собраны для запуска в браузере в формате WebAssembly и в виде исполняемых файлов для Linux.

Ключевые цели проекта:

  • Генерация очень компактных исполняемых файлов;
  • Поддержка наиболее распространённых моделей плат микроконтроллеров;
  • Возможность применения для Web;
  • Поддержка CGo с минимальными накладными расходами при вызове функций на языке Си;
  • Поддержка большей части стандартных пакетов и возможность компиляции типового существующего кода без его изменения.

    Не входит в число основных целей поддержка многоядерных систем, эффективный запуск огромного числа сопрограмм (сам по себе запуск сопрограмм поддерживается в полной мере), достижение уровня производительности эталонного компилятора gc (оптимизация отдаётся на откуп LLVM и в некоторых применениях Tinygo может оказаться быстрее gc) и полная совместимость со всеми приложениями на Go.

    Основным отличием от похожего компилятора emgo является попытка сохранения оригинальной модели управления памятью Go с использованием сборщика мусора и задействование LLVM для генерации эффективного кода вместо компиляции в представление на языке Си. Tinygo также предлагает новую runtime-библиотеку, в которой реализованы оптимизированные для компактных систем планировщик, система распределения памяти и обработчики строк. На базе нового runtime пересозданы некоторые пакеты, такие как sync и reflect.

    Из изменений в выпуске 0.7 отмечается реализация команды «tinygo test», обеспечение поддержки сборки мусора для большинства целевых плат (на базе ARM Cortex-M) и WebAssembly, поддержка платы HiFive1 rev B на основе архитектуры RISC-V и платы Arduino nano33, улучшение поддержки языка (поддержка битовых полей с использованием геттеров и сеттеров, поддержка анонимных структур).

    Источник: http://www.opennet.ru/opennews/art.shtml?num=51126