На каком языке сейчас чаще всего программируют микроконтроллеры?
==================================================================

 Когда я только начинал вливаться в программирование, то в книге я прочитал про историю появления Java и про ее подход к работе программ. Узнал, что при помощи JVM язык добивается кроссплатформенности и за счет этого Java стала такой популярной. Т.е. в моем понимании язык тогда как раз таки и подходил для микроконтроллеров, но сейчас когда ищу информацию про программирование для микроконтроллеров, то встречаю, что в основном это сейчас делают на языке Си. Вопрос в следующем: какой же язык сейчас наиболее популярен для разработки ПО под микроконтроллеры и почему для этой цели (как я читал на других источниках) язык Си выбирают чаще чем свой более развитый аналог - Java? 

 У [Java ME](https://docs.oracle.com/javame/config/cdc/cdc-opt-impl/ojmeec/1.0/install/html/z40000921003133.html) есть минимальные системные требования для целевых устройств.  

Взглянув на них, становится понятно, что это не для микроконтроллеров в общем случае. Конечно, встраиваемая система встраиваемой системе рознь, но вот микроконтроллеры ещё используют не только для встраиваемых систем, а прямо в железо, например, радио-приемопередающего устройства, спроектированного на работу с протоколом физического уровня. Такие контроллеры могут иметь килобайты памяти всех видов. Зачастую, такие девайсы предлагают не так много ассемблерных инструкций, чтобы имело смысл делать под них компилятор Си. В более универсальных микроконтроллерах компилятор есть, поэтому это вполне себе повод для радости.   

  

Там, где можно развернуть JME, уже есть Linux kernel, поэтому ответ на вопрос о том, почему больше используется Си, чем Java, заключается в том, чем занимается компания, в чем у нее бизнес и какой у нее рынок. Количественно, решений, которым нужно JME просто меньше, относительно тех, в которых не нужна прослойка в виде ОС. 

> почему для этой цели (как я читал на других источниках) язык Си выбирают чаще чем свой более развитый аналог - Java

  

Пример контроллера - ATTiny13:  

- 1 КБ внутрисистемно программируемой Flash памяти программы  

- 64 байта внутрисистемно программируемой EEPROM памяти данных,  

- 64 байта встроенной SRAM памяти  

  

Удачи с размещением виртуальной машины Java + кода самой программы с учетом имеющихся ресурсов... 

 Я в шоке от масштабов трагедии... Java? В микроконтроллеры?! Да там и Си не всегда подходит, нужен Ассемблер. Потому, что Си генерирует более громоздкий бинарный код.  

Java... Тихий шок. 

 Тут чистая экономика.  

Контроллеры ставят в основном в массовые устройства.  

Это значит что каждый сэкономленный доллар - это десятки, а то и сотни миллионов прибыли на ровном месте.  

Подобные суммы с лихвой покрывают время программистов, поэтому им ставят задачу уложить функционал на самый дешёвый контроллер, который ещё хоть как-то способен потянуть этот функционал.  

Отсюда - высокая степень оптимизации кода при работе с контроллерами.  

Нужно максимально использовать все особенности конкретного контроллера - программисты много работают с даташитом.  

Язык должен позволить максимально полно использовать систему команд конкретного контроллера, и гибко управлять регистрами и памятью контроллера.  

Поэтому в ходу в основном ассемблер - с ним можно писать максимально компактный код.  

Но функционал зачастую достаточно большой, чтобы его целиком писать на ассемблере.  

Поэтому, в целях экономии времени, пишут на Си, с использованием библиотек, а самые ответственные места реализуют с помощью ассемблерных вставок.  

Благодаря этому удается реализовать почти все преимущества и ассемблера и Си: быстрая и достаточно полно контролируемая разработка, с достаточно компактным и быстрым кодом.  

  

С симками ситуация иная - там важно было реализовать кроссплатформенный код. Поэтому используют java, не смотря на ресурсы.  

  

В более мощных контроллерах в ходу уже не конкретный язык, а целые ОС. В основном в прошивках просто зашивают Линукс, а отдельные части по управлению контроллером реализуют на Си как драйвера.  

  

Там, где важна производительность, вообще не пользуются программным кодом, а переходят на железную логику - плисы. Это в основном оборудование для обработки сигналов, в т.ч. всевозможные радиомодули, модемы, видеооборудование, и т.п.  

  

Так что все зависит от здравого смысла и стоимости.  

Просто так везде пихать java - немного глупо. 

> знал, что при помощи JVM язык добивается кроссплатформенности и за счет этого Java стала такой популярной. Т.е. в моем понимании язык тогда как раз таки и подходил для микроконтроллеров

  

Не знаю с какого потолка вы взяли подобное понимание, но именно из-за JVM JAVA совершенно неприемлем для микроконтроллеров. За кроссплатформенность JAVA приходится расплачиваться большим расходом памяти и низким быстродействием.  

  

 Можно и на яве писать, только под это дело компилятор нужен, чтобы код перевести в машинные коды, понятные процессору.  

Не важно на каком языке писать код, он все равно будет преобразован компилятором. Так уж сложилось исторически, что был выбран Си. 

 языки ну C, Rust тк обычно от контроллеров требуется не просто данные обрабатывать, а обрабатывать именно в реальном времени, тоесть выполнять конкретные действия, точно в назначенное время, а джава машина не работает в реальном времени. 

 Java хороша там где нужны большие объемы данных, масштабируемость , потокобезопастность , при этом плевать на требования к железу , всегда можно поставить сервак помощнее   

На микроконтроллерах в силу специфики нужны минимальный размер скомпилированного кода , более оптимальный код , минимальное потребление электроэнергии.   

Потому си или даже ассемблер в особых случаях 

 Я просто оставлю это здесь, для всех кто этого не видел раньше и не в курсе java процессоров  
 

 Всё зависит от задачи!  

С, С++, Rust, asm. Примерно такое распределение использования я вижу.  

Я С++ использую скорее как "С с классами". Замечу что С++ не намного жрёт ресурсы по сравнению с С. Нужно "уметь готовить" (-fno-exceptions, -fno-rtti, виртуальные функциию, наследования и т.д.).  

С++ позволил написать драйверы на периферию (таймеры, spi, i2c, uart). И при переходе с платформы на платформу минимизировать изменения, а то и избежать их. Естественно не обошлось без использования STL (в основном контейнеры), но не использовать методы с exception.  

Но вся низкоуровненвая часть на Сях.