Не думаю, что вы указали процессор.Различные ответы в зависимости от процессора и среды.Общий ответ: да, это все еще сделано, это не архаично, конечно.Основная причина - компиляторы, иногда они хорошо справляются с оптимизацией в целом, но не очень хорошо для конкретных целей.Некоторые действительно хороши в одной цели и не так хороши в других.В большинстве случаев это достаточно хорошо, в большинстве случаев вам нужен переносимый код на C, а не непереносимый ассемблер.Но вы по-прежнему обнаруживаете, что библиотеки C будут по-прежнему вручную оптимизировать memcpy и другие подпрограммы, которые компилятор просто не может понять, что существует очень быстрый способ его реализации.Частично, потому что этот угловой случай не стоит тратить время на оптимизацию компилятора, просто решите его в ассемблере, и система сборки имеет много, если эта цель использует C, если эта цель использует C, если эта цель использует asm, если этоцелевое использование asm.Так что это все еще происходит, и я утверждаю, что должно продолжаться вечно в некоторых областях.
X86 - это собственный зверь с большой историей, мы находимся в точке, где вы действительно не можете на практике написать один шарик ассемблераэто всегда быстрее, вы можете определенно оптимизировать подпрограммы для конкретного процессора на конкретной машине в определенный день и не выполнять компилятор.За исключением некоторых конкретных случаев, это, как правило, бесполезно.Образовательный, но в целом не стоит времени.Также обратите внимание, что процессор больше не является узким местом, поэтому небрежный универсальный компилятор C достаточно хорош, найдите производительность в другом месте.
Другие платформы, которые часто означают встроенные, arm, mips, avr, msp430, pic и т. Д.Вы можете запускать или не запускать операционную систему, вы можете запускать или не использовать кеш или другие подобные вещи, которые есть на вашем рабочем столе.Так что слабые стороны компилятора покажут.Также обратите внимание, что языки программирования продолжают эволюционировать от процессоров, а не к ним.Даже в случае C, который, возможно, считается языком низкого уровня, он не соответствует набору команд.Всегда будут времена, когда вы можете создавать сегменты ассемблера, которые превосходят компилятор.Не обязательно сегмент, который является вашим узким местом, но во всей программе вы можете часто вносить улучшения здесь и там.Вы все еще должны проверить ценность этого.Во встроенной среде это может и делает разницу между успехом и провалом продукта.Если ваш продукт имеет 25 долларов США на единицу, инвестируемую в более энергоемкую, платную недвижимость, высокоскоростные процессоры, так что вам не нужно использовать ассемблер, но ваш конкурент тратит 10 долларов или меньше на единицу и готов смешать asm с C, чтобы использовать меньшую память,использовать меньше энергии, более дешевые детали и т. д. До тех пор, пока NRE будет восстановлено, в конечном итоге смешанный с ассемблерным раствором будет.
True встроенный - специализированный рынок со специализированными инженерамиДругой рынок встраиваемых систем, ваши встроенные linux roku, tivo и т. Д. Встраиваемые телефоны и т. Д. Для выживания нужны портативные операционные системы, поскольку вам нужны сторонние разработчики.Таким образом, платформа должна быть больше похожа на настольный компьютер, чем на встроенную систему.Как уже упоминалось, в библиотеке C или операционной системе могут быть некоторые оптимизации для ассемблера, но, как и в случае с рабочим столом, вы хотите попытаться использовать больше оборудования, чтобы программное обеспечение можно было переносить, а не оптимизировать вручную.И ваша линейка продуктов или встроенная операционная система потерпит неудачу, если для успеха третьей стороны потребуется ассемблер.
Самое большое беспокойство у меня заключается в том, что эти знания теряются с угрожающей скоростью. Потому что никто не проверяет ассемблер, потому что никто не пишет на ассемблере и т. Д. Никто не замечает, что компиляторы не улучшаются, когда дело доходит до создаваемого кода. Разработчики часто думают, что им нужно покупать больше оборудования вместо того, чтобы понимать, что, зная компилятор или как лучше программировать, они могут повысить свою производительность на 5 - несколько сотен процентов с помощью того же компилятора, иногда с тем же исходным кодом. 5-10% обычно с одинаковым исходным кодом и компилятором. gcc 4 не всегда производит лучший код, чем gcc 3, я держу оба, потому что иногда gcc3 работает лучше. Конкретные целевые компиляторы могут (не всегда) обходить gcc, вы можете увидеть улучшение на несколько сотен процентов, иногда с одним и тем же исходным кодом и другим компилятором. Откуда все это? Люди, которые все еще пытаются найти и / или использовать ассемблер. Некоторые из этих людей работают с бэкэндами компилятора. Интерфейс и середина - это, конечно, весело и познавательно, но во внутреннем интерфейсе вы создаете или нарушаете качество и производительность получаемой программы. Даже если вы никогда не пишете на ассемблере, а время от времени просматриваете только выходные данные компилятора (gcc -O2 -s myprog.c), это сделает вас лучшим программистом высокого уровня и сохранит некоторые из этих знаний. Если никто не хочет знать и писать на ассемблере, то по определению мы прекратили писать и поддерживать компиляторы для языков высокого уровня, и программное обеспечение в целом прекратит свое существование.
Поймите, что, например, для gcc вывод компилятора - это сборка, которая передается ассемблеру, который превращает его в объектный код. Компилятор C обычно не создает двоичные файлы. Объекты, когда они объединены в окончательный двоичный файл, выполняются компоновщиком, еще одной программой, которая вызывается компилятором, а не частью компилятора. Компилятор превращает C или C ++ или ADA или что-то еще в ассемблер, тогда инструменты ассемблера и компоновщика делают это до конца. Динамические перекомпиляторы, такие как, например, tcc, должны каким-то образом генерировать двоичные файлы, но я вижу, что это исключение, а не правило. LLVM имеет собственное решение времени выполнения, а также достаточно наглядно показывает высокий уровень внутреннего кода для целевого кода и двоичного пути, если вы используете его в качестве кросс-компилятора.
Итак, вернемся к делу, да, это делается чаще, чем вы думаете. В основном это связано с тем, что язык не сравнивается напрямую с набором команд, а затем компилятор не всегда генерирует достаточно быстрый код. Если вам удастся, скажем, в десятки раз улучшить интенсивно используемые функции, такие как malloc или memcpy. Или хотите иметь HD-видеоплеер на вашем телефоне без аппаратной поддержки, балансировать плюсы и минусы ассемблера. По-настоящему встраиваемые рынки все еще используют ассемблер довольно часто, иногда это все на C, но иногда программное обеспечение полностью кодируется на ассемблере. Для настольного компьютера x86 процессор не является узким местом. Процессоры имеют микрокодирование. Даже если вы сделаете красиво выглядящий ассемблер на поверхности, он не будет работать очень быстро на всех процессорах семейства x86, небрежный, достаточно хороший код, скорее всего, будет работать примерно одинаково по всем направлениям.
Я настоятельно рекомендую изучать ассемблер для ISA не x86, таких как arm, thumb / thumb2, mips, msp430, avr. Цели, в которых есть компиляторы, особенно с поддержкой компиляторов gcc или llvm. Изучите ассемблер, научитесь понимать выходные данные компилятора C и докажите, что вы можете добиться большего успеха, фактически изменив этот вывод и протестировав его. Эти знания помогут сделать код высокого уровня вашего рабочего стола намного лучше без ассемблера, быстрее и надежнее.