The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

19.07.2019 15:07

Доступен выпуск проекта 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. Поддержки контроллеров ESP8266/ESP32 пока нет, но отдельно развивается проект по добавлении поддержки чипа Xtensa в LLVM, который пока отмечен как нестабильный и не готовых для интеграции с TinyGo.

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

  • Генерация очень компактных исполняемых файлов;
  • Поддержка наиболее распространённых моделей плат микроконтроллеров;
  • Возможность применения для 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, улучшение поддержки языка (поддержка битовых полей с использованием геттеров и сеттеров, поддержка анонимных структур).

    1. Главная ссылка к новости (https://github.com/tinygo-org/...)
    2. OpenNews: Релиз языка программирования Go 1.12
    3. OpenNews: Обновление языка Go 1.11.5 и 1.10.8 с устранением уязвимости
    4. OpenNews: Уязвимости в системе загрузки модулей для языка Go
    5. OpenNews: Релиз языка программирования Go 1.11
    6. OpenNews: Релиз языка программирования Go 1.10
    Лицензия: CC BY 3.0
    Короткая ссылка: https://opennet.ru/51126-golang
    Ключевые слова: golang
    При перепечатке указание ссылки на opennet.ru обязательно


    Обсуждение (63) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Анонимно (?), 15:25, 19/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    Под ESP32 кто-нибудь пробовал это дело?
     
  • 1.2, Аноним (2), 15:31, 19/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Жаль поддержки ESP32 нет, а было бы просто огонь - хорошая поддержка веб-технол... большой текст свёрнут, показать
     
     
  • 2.3, Аноним (2), 15:38, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Во что нашёл:
    https://tinygo.org/faq/what-about-esp8266-esp32/
     
  • 2.18, proninyaroslav (ok), 18:46, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >- горутины (а эта железка двухъядерная).

    И они никак не связаны с многоядерностью, асинхронность не всегда равно параллелизм. Так что не вижу тут никакого преимущества для многоядерных процах по сравнению с другими языками. К тому же по дефолту (по крайней мере так было) рутины запускаются на 1 ядре, поочерёдно переключаясь, так как работа с потоками ОС не такая уж и дешёвая вещь.

     
     
  • 3.50, АноНеМаус (?), 16:08, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    По дефолту уже давно горутины запускаются не на одном ядре. И потоки ОС почти не используются (запускается столько потоков сколько ядер, а дальше уже свой планировщик)
     
  • 2.25, asdasd (?), 19:49, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Любители Go, не минусуйте - в контексте встраиваемых систем "настольный" Go действительно весьма жирный.

    Любая статически скомпилированная прога будет столько весить (а микрики как раз статично собранные, ибо там не то что shared library, там ОС то нет).

     
     
  • 3.26, Аноним (26), 19:52, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ничего подобного. Дело даже не в том, что у Go весьма жирный рантайм, а в самой «модели памяти», которую сии деятели героически пытаются протащить на МК. При малом объёме оперативки вообще кучу использовать противопоказано, не говоря уже про GC.
     
  • 3.39, Аноним (2), 06:16, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Любая статически скомпилированная прога будет столько весить

    Да что вы такое говорите?

     
     
  • 4.40, Анон12345 (?), 10:55, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    frog@frog-ThinkPad-X240 /tmp> cat q.c
    #include <stdio.h>
    void main()
    {
    printf("Hello World\n");
    }
    frog@frog-ThinkPad-X240 /tmp> gcc q.c -static
    frog@frog-ThinkPad-X240 /tmp> ls -la a.out
    -rwxrwxr-x 1 frog frog 844696 Jul 20 10:54 a.out*
    frog@frog-ThinkPad-X240 /tmp>
     
     
  • 5.42, Аноним (42), 11:15, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не умеешь.




    $ musl-gcc q.c -static
    $ ls -l a.out
    -rwxr-xr-x 1 user user 26064 июл 20 11:12 a.out



     
     
  • 6.56, Аноним qwerty_qwerty1 (?), 09:51, 21/07/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Не бьется что то


    #include <stdio.h>                                                                                                                  
    int main()                                                                                                                          
    {                                                                                                                                    
    printf("Hello World\n");                                                                                                            
    return 0;                                                                                                                            
    }    

    gcc q.cc -static
    ls -l

    844696 июл 21 09:48 a.out                                                                                  
    70 июл 21 09:48 q.cc    

     
  • 5.43, Аноним (42), 11:18, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ну и для сравнения:




    $ cat q.go
    package main

    import "fmt"

    func main() {  
        fmt.Println("Hello World")
    }
    $ go build
    $ ls -l hello
    -rwxr-xr-x 1 user user 1906945 июл 20 11:16 hello



     
     
  • 6.65, Fedd (ok), 18:26, 28/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    package main
    func main() {
        print("Hello World!\n")
    }
    go build -ldflags -s hello.go
    ls -l hello
    -rwxr-xr-x 1 Unit RedstarOS 760160 Jul 28 18:16 hello
     
  • 5.44, пох. (?), 14:03, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    и это он еще man strip не прочитал!

     

  • 1.5, НяшМяш (ok), 16:04, 19/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > так как он более прост в изучении

    А вот мне он очень трудно даётся, после C-подобного синтаксиса в разных языках постоянно в голове крутится вопрос "зачем так сделали вообще"

     
     
  • 2.6, metanprog (?), 16:09, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Попробуй метапрог, вот там-то заживём!

    </sarcasm>

     
     
  • 3.17, VarflomeyKote4ka (ok), 18:09, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Дык реально заживем. По твоему вот то что выше - лучше?
     
  • 2.7, Аноним (26), 16:15, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    У Go вполне себе C-подобный синтаксис. Слегка упрощённый (можно не ставить лишние скобочки и разделители).
     
     
  • 3.16, Аноним (16), 17:44, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Таки плюсую
     
     
  • 4.62, Аноним (-), 23:12, 22/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не надо, плюсы то еще го*но монструозное. Даже Страуструп там уже ногу сломает.
     
  • 3.35, НяшМяш (ok), 23:54, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не спорю, у Go синтаксис ближе к С, чем к тому же Python. Но, например, зачем было делать 2 способа объявить переменную, оставлять возможность variable shadowing - чтобы потом ловить лулзов на этапе дебага и впиливать в go tool ещё один флаг проверки? Или, например, синтаксис методов на структуре - его вообще упорыш писал. Ладно, нет в языке классов, наследования и вот этого всего - но сделать человеческий синтаксис, чтобы в теле структуры можно было обьявить метод без тонны ((())) наверное можно было? Прямо современный язык, на котором писать сложнее чем на С. Даже жабоскрипт в этом плане куда проще и красивее.
     
     
  • 4.37, Аноним (42), 00:20, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > сделать человеческий синтаксис, чтобы в теле структуры можно было обьявить метод

    Зачем тебе его там объявлять? Чтобы дублировать один и тот же прототип в двух местах, как в сишечке? Так в сишечке это не от хорошей жизни сделано.

     
     
  • 5.53, НяшМяш (ok), 00:27, 21/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Дык в этом-то и вопрос - зачем в современный ЯП тащит конструкции из С? Я считаю, что следующая запись куда проще парсится гдазами:

    type Foo struct {
        func Bar() string { ... }
    }

    Сразу видно, где метод как операция над структурой, а где просто глобальная функция. А в обычном Go-шной записи мне приходится смотреть на тип в скобках - вдруг там какой-нибудь саботажник в том же файле воткнул функцию для другого типа? Вот эта запись просто вызывает вопрос - зачем мне нужен Go, если я так же могу написать на С?:

    type Foo struct {
        
    }

    func (f Foo) Bar() string { ... }

     
     
  • 6.54, funny.falcon (?), 00:43, 21/07/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Вообще, горный синтаксис лучше выглядят в результатах грепа: хочешь найти, где метод объявлен, грепаешь, и сразу видишь, на каких типах он объявлен.

    А с С++/Java/etc синтаксисом приходится лезть в файл и искать начало объявления класса.

    Безусловно, с навороченными IDE это все не проблема. Но иногда хочется использовать VIM.

     
     
  • 7.63, Аноним (63), 23:30, 22/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    В C++ никто не запрещает писать определение метода вне определения класса. Собственно, обычно так и делают, если только речь не идёт о шаблонах и/или предназначенной для инлайнинга мелочи.
     
  • 6.61, Аноним (26), 13:36, 22/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Я считаю, что следующая запись куда проще парсится гдазами:
    >
    > type Foo struct {
    >     func Bar() string { ... }
    > }

    Такая — проще, да. А вот когда на месте «...» оказывается несколько десятков строк, и число методов тоже начинает измеряться десятками, — уже не проще.

     
  • 4.64, Наше имя Легион (?), 02:28, 23/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    структура есть сучность хранения данных. методы досступа к оным (к модификации,чтению, созданию нового etc) - это не к структуре. (ладно, в крестах - да, но то - кресты...)
     
  • 2.9, Аноним (2), 16:50, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Правильно, пусть дальше будем жрат тормозной JS!
     
     
  • 3.10, user90 (?), 16:54, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • –3 +/
    js хоть просмотреть можно (возникни у меня такое извращенное желание)..
    Вообще-то очень забавно рассматривать браузер как среду для исполнения кода))
     
     
  • 4.11, Аноним (2), 16:57, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > js хоть просмотреть можно

    Его сейчас всюду минифицируют... Толку немного.

     
  • 4.12, Аноним (12), 16:58, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > js хоть просмотреть можно

    https://code.jquery.com/jquery-3.4.1.min.js - чайтате, пожалуйста. И это ещё без обфускатора.

     
     
  • 5.14, user90 (?), 17:09, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Убедил. Поэтому давно использую технику блокировки всех сторонних js, чтобы не сталкиваться с подобными простынями :) Ну не нужны мне ПРИЛОЖЕНИЯ в браузере.
     
     
  • 6.15, Аноним (2), 17:22, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > не нужны мне ПРИЛОЖЕНИЯ в браузере.

    Вот с этого и нужно было начинать.

     
  • 6.21, Аноним (21), 19:22, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Сейчас всё идет к тому, что в браузере будут всё более мощные и крутые приложения (уже, собственно), в частности без убогого дома и с wasm.
    Нет смысла этому противиться.
     
     
  • 7.28, user90 (?), 20:24, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Проблема в том, что эти какбы-приложения по существу все равно внешние сервисы. Да и использование браузера как среды выполнения выходит все равно довольно накладно, и тут ничего сделать нельзя. То есть никаким прогрессом тут и не пахнет..
     
     
  • 8.58, VelikiiNehochuha (ok), 13:00, 21/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    доставка приложений, обновлений, не нужна установка, плюсов тоже хватает ... текст свёрнут, показать
     
  • 7.48, Аноним (42), 15:48, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Сейчас всё идет к тому, что в браузере будут всё более мощные и крутые приложения (уже, собственно), в частности без убогого дома и с wasm.

    Где-то я что-то подобное уже слышал лет 15 назад. Только вместо wasm фигурировал flash.

     
     
  • 8.49, Аноним84701 (ok), 16:00, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Java апплеты, ActiveX Причем, совсем не примитив https www csm ornl gov ge... текст свёрнут, показать
     
  • 6.41, CryNet (?), 10:56, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Поэтому давно использую технику блокировки всех сторонних js

    Ох и не завидую я тебе

     
  • 3.13, Аноним (12), 16:59, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А что толку-то? К DOM'у всё равно толком не проберёшься.
     
  • 3.20, Аноним (21), 19:20, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Справедливости ради, JS - один из быстрейший интерпретируемых языков. Браузерные войнушки пошли ему на пользу за последние десять лет.
     
     
  • 4.22, Аноним (21), 19:23, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    а больное место браузера -- тормозной DOM, который в идеале заменить бы на WebGL / WebAssembly
     
     
  • 5.24, Crazy Alex (ok), 19:40, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Больное место браузера - возможность гонять код вместе с данными и менять его в любой момент,напрочъ убившее любые осмысленные стороние (и подконтрольные пользователю) клиенты
     
  • 5.29, Аноним (29), 20:55, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >а больное место браузера -- тормозной DOM, который в идеале заменить бы на WebGL / WebAssembly

    Ишь чего удумали, текст с сайтов копировать! Дадим им картинку, пусть утрутся.

     
     
  • 6.36, НяшМяш (ok), 23:56, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Будем скриншотить и прогонять через OCR. Чёрт, звучит как идея для дополнения (если они к тому времени останутся).
     
     
  • 7.59, гуглезила (?), 10:05, 22/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    останутся, но доступа к изображению на странице у них не будет, для вашей большей безопастносте - а то ж они его могут - украсть!

     
  • 5.47, мяя (?), 15:16, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    DOM не такой уж тормозной, просто не надо его использовать как хранилище данных.
     

  • 1.19, Аноним (19), 18:58, 19/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Убийца раста.
     
     
  • 2.23, Аноним (21), 19:25, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Смотря на различный код, Раст, пускай и многословней, но на вид как-то поадекватнее Го
    Так что пускай лучше живёт
     
     
  • 3.33, Аноним (33), 23:00, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Адекватнее. Одни сплошные сголашения и синтаксис просто хакерский какие-то двоеточия вертикальные пайпы блоки выполнения. Ну нахрен.
     
     
  • 4.45, Илья (??), 14:49, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Да, синтаксис не очень красивый. Но если разобраться поглубже - то становится понятно, что в расте всё на своих местах.
     
     
  • 5.52, Аноним (52), 19:46, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А вы не хакер случаем?
     
     
  • 6.57, Аноним (57), 12:51, 21/07/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > А вы не хакер случаем?

    Хyякер

     
  • 2.32, Ordu (ok), 22:26, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Не, это разные языки. Сферы их применения пересекаются, но не совпадают.
     

  • 1.27, Аноним (27), 20:20, 19/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > компактное представление
    > LLVM

    Как-то не верится.

     
  • 1.30, Аноним (33), 21:10, 19/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Вот добавить бы упралвение подкапотными потоками (создавать, удалять, группировать в группы и т.д.) ну цены бы не было, а так приходиться изгаляться всякими GetOSLockThread.
    А да еще хорошо бы более прозрачную интеграцию с C runtime и вообще бы цены небыло, а так какая игрушка.
     
  • 1.31, Аноним (31), 21:39, 19/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    И у нас там был недалеко топор. И мы подумали — может топор запустить?! Отсюда и родилась мысль — сделать летающий топор. (c)
     
     
  • 2.34, Аноним (33), 23:01, 19/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Откуда это? Хочу почитать ...
     
     
  • 3.38, Аноним (2), 06:14, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    В поиск вбей, что ты как маленький.

    https://www.ominform.com.ua/2015/08/28/letayushhiy-topor/

     
     
  • 4.46, Илья (??), 14:51, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Какая-то токсичная газета, вы не находите?
     
     
  • 5.51, Аноним (52), 19:44, 20/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    То есть летающий топор это нормально, а гезета значит токсичная. Да помоему это все идиотизм вмесете взятое,
     
  • 5.55, Аноним (2), 03:13, 21/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Хорошо, в следующий раз просто кину ссылку на DuckDuckGo с соответствующим запросом.
     

  • 1.60, vantoo (ok), 13:34, 22/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > разработчики рассудили, что если существует вариант Python для микроконтроллеров, то почему бы не создать подобное для языка Go

    Рассуждение из области "вон кто-то намусорил, значить почему бы и мне не намусорить?".

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру