да, и еще тысячу раз да![/uquote]ПростоНуб писал(а):искусство программирования возможно только на ассемблере?
Вы можете привести пример MQTT брокера на ассемблере? А полноценной реализации WiFi и TCP/IP?
Что либо действительно сложное, как тот же ESP IDF, насчитывающий почти полмиллиона строк на C объемом свыше 200 МБ, на ассемблере Вы не напишете и не отладите за адекватное время. То бишь, к тому времени, когда напишете, это никому не будет нужно, так как система команд ESP32 существенно расширится или даже в очередной раз кардинально изменится, как уже произошло при переходе с архитектуры Tensilica на архитектуру RISC-V. Кому нужен код, который эффективно работал на МК, выпуск которых прекращен и неэффективен на имеющихся на рынке МК?
[uquote="Starichok51",url="/forum/viewtopic.php?p=4643649#p4643649"]ни один компилятор с языка высокого уровня с любой оптимизацией не сравнится с программированием на ассемблере.[/uquote]
Теоретически. Я даже не буду рассматривать случай, когда потребуется перенести написанный код с ESP32 на ESP32-C3, то есть с ассемблера Tensilica на RISC-V.
Возьмем более простой вариант. Написали Вы, предположим, за год какой то супер-пупер оптимальный код для ESP32-S2. Например, TCP/IP стек вроде https://github.com/lwip-tcpip/lwip. Тут вдруг вышел ESP32-S3 с поддержкой SIMD инструкций. И если аналогичный код на С, который проигрывал раньше ассемблерному в производительности, просто перекомпилировать, то он может оказаться в разы эффективней Вашего ассемблерного кода. А переписывать такой ассемблерный код с учетом новых SIMD инструкций займет месяцы. А если такого кода накопилось уже много? Да пока Вы его перепишите, появятся новые расширения системы команд и потребует переписывать всё заново!
А ведь у современных МК нередко несколько ядер и без учета этого, ассемблерный код легко может деградировать в производительности, если NUMA для конкретного МК не была учтена изначально.
Практически же, программируя на ассемблере невозможно предугадать особенности развития целевой архитектуры. В этом году вышли ESP32-P4 и С5, в прошлом - H2 и С6, в 2022 - С2, в 2021 - С3 и S3. Будете что ли каждые полгода переписывать все свои наработке на ассемблере под расширяющуюся систему команд, новую логику конвейера, предсказания ветвлений, спекулятивного выполнения, кешей или NUMA? Или все же проще писать на языке высокого уровня, по необходимости компилируя свои наработки под обновленную архитектуру?
[uquote="Starichok51",url="/forum/viewtopic.php?p=4643649#p4643649"]на ассемблере можно делать такие "чудеса", на которые не способен никакой компилятор с языка высокого уровня.[/uquote]
Само собой. Поэтому и Rust, и C поддерживают ассемблерные вставки для тех случаев, когда такие чудеса действительно необходимы. Но программирование только на ассемблере практически умерло, как только МК стали располагать мегабайтами программной и сотнями килобайт оперативной памяти. Остается это лишь принять.
И не стоит меня агитировать за Советскую власть. В свое время я написал тысячи строк кода на ассеблере IBM/370, не меньше - на ассемблере Z80, чуть меньше - на ассемблере i8086, сотни строк кода на ассемблере AVR. Вот только их уже нет с нами и они никому не нужны. Даже Padauk для своих двухцентовых МК не поддерживает разработку на ассемблере, так как система команд изменяется даже от ревизии к ревизии. Разработчики sdcc уже обругались на такие приколы. Стабильную поддержку pdk13 так и не удалось сделать за четыре года.
[uquote="Starichok51",url="/forum/viewtopic.php?p=4643649#p4643649"]к тому же, рабочий код (хекс) с ассемблера в несколько раз короче аналогичного кода на Си.[/uquote]
Если заархивировать любой текст архиватором, он тоже станет в несколько раз короче. Вот только как Вы его в этом виде читать будете? )))
Ну это не считая того, что на каком бы языке программирования Вы для МК не программировали, заливается в любом случае бинарный код. В том же Linux больше половины firmware в виде бинарников (тот самый "хекс"), написанных на самых разных языках.
Добавлено after 14 minutes 6 seconds:
[uquote="Огонёк",url="/forum/viewtopic.php?p=4643676#p4643676"]А не надо ничего поддерживать. Написал один раз идеальный код, и он потом сам нормально работает, не требуя правок и дополнений.[/uquote]
Код на ассемблере, идеальный для ESP32-S2 может с треском проиграть в производительности не слишком оптимальному коду на Rust или C при переносе его на ESP32-S3. Потому для языков высокого уровня компилятор сам сгенерирует код с поддержкой появившихся в ESP32-S3 SIMD инструкций, а в ассемблере останется ровно то, что было - легаси.
Более того, аналогичные приколы можно получить даже на разных ревизиях одного МК при изменениях в логике NUMA, спекулятивного или out-of-order исполнения команд.
Тот же Espressif клепает новые МК по паре ежегодно. И на каждый за год легко может появится 2-3 ревизии.
Так что в реальной жизни этот самый "идеальный код на ассемблере" необходимо переписывать чуть ли не каждые два месяца, чтобы он оставался "идеальным".