Код
#статьи

Ассемблер в 2k21: кто и зачем продолжает писать на машинно-ориентированном языке

Жизнь слишком коротка, чтобы кодить на ассемблере. И всё же в некоторых задачах он до сих пор незаменим.

В этом году ассемблер ворвался в топ-10 языков программирования по версии TIOBE, а значит, старичка ещё рано отправлять на пенсию. Мы пообщались с разработчиками, которые пишут код на ассемблере, а ещё изучили мнения зарубежных девелоперов на Quora и Stack Overflow.

Где используют ассемблер в 2021 году

Сегодня ассемблер используют как минимум в четырёх направлениях.

Операционные системы и компиляторы. Современные операционные системы, например дистрибутивы Linux, пишут на C/C++, но там есть фрагменты на ассемблере. Некоторые фрагменты g++ и компиляторы для BASIC и Fortran тоже написаны на машинно-ориентированном языке.

Встроенные системы и драйверы. На ассемблере пишут драйверы под Windows для архитектуры процессоров x86 и программы для AVR-микроконтроллеров и Arduino.

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

Виртуальные машины / эмуляторы. Виртуальные машины тесно взаимодействуют с ОС, поэтому частично написаны на ассемблере. Как, например, LLVM или Surface Duo Emulator.

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

Кадр: мультсериал «Губка Боб Квадратные Штаны»

«Считается, что веб-разработчику ассемблер знать ни к чему. Правда, потом страница с текстом потребляет 100% ресурсов процессора и 2 гигабайта ОЗУ. Если честно, всем, кто пишет прикладные программы, полезно знать, как работает компьютер. Хочется, чтобы все эти люди думали не в стиле „запустилось на моём сверхсовременном компе, и ладно“, а хоть немного пытались оптимизировать свои поделки и уж тем более не использовали всякие извращения вроде Electron».

Юрий Иваник,
администратор Telegram-чата про ассемблер pro.asm


Мария Даровская

Журналист, коммерческий автор и редактор. Пишет про IT, цифровой маркетинг и бизнес.
Сайт: darovska.com.


Операционные системы и низкоуровневое ПО

Ассемблеры — это целая группа машинно-ориентированных языков программирования. Набор команд (ISA) и архитектура конкретного ассемблера зависит от типа процессора. Поэтому для разных процессоров команды тоже будут разными — единого стандарта языка не существует.

«Ассемблер — это лёгкая мнемоническая обёртка для машинных команд процессора, в которой человеку их легче понять и запомнить. Чтобы писать на ассемблере, нужно понимать архитектуру процессора, набор его команд и адресные пространства. Сейчас ассемблер используют в основном разработчики микроконтроллеров, драйверов и чипов — в общем, те, кто непосредственно работает с железом».

Басист Аксель,
team lead, full stack ASP .NET. Комментарий для Skillbox Media


«Иногда ассемблер называют машинным языком, но это не совсем корректно. Машинный язык — это нули и единицы, понятные процессору. А программа на ассемблере проходит фазу компиляции — преобразования кода, понятного человеку, в набор байтов, понятный процессору.

Ассемблер используют ​​там, где важен каждый такт работы исполнительного ядра, высокая производительность или ресурсы крайне ограничены. На языке ассемблера можно писать программы, драйвера, да хоть саму ОС! И такая даже есть — KolibriOS».

Юрий Иваник,
администратор Telegram-чата про ассемблер pro.asm. Комментарий для Skillbox Media


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

Лоуренс Стюарт,
технический директор Serissa Research


«Ассемблер незаменим для загрузчиков, демосцен (маленькие демки — интро до 512 байт, как правило), оптимизации кода. В ситуациях, когда крайне важна производительность и мало памяти для кода».

Евгений Красников,
участник pro.asm. Комментарий для Skillbox Media

Встроенные системы

«Встроенные системы» — это микрокомпьютеры, которые решают определённые задачи. Они встречаются в автомобилях, телевизорах, цифровых камерах, IoT-устройствах и мобильных телефонах. Для встроенных систем исторически использовали именно ассемблер.

«Когда компиляторы и языки программирования были относительно примитивными, многие программы и даже операционные системы полностью писали на ассемблере. На машинном языке почти не кодили, а Fortran и COBOL плоховато подходили для встроенных систем.

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

Билл Вестфилд,
разработчик


«Несколько лет назад я был разработчиком в компании, которая устанавливала видеодомофоны. Мы закупили гигантскую партию домофонов в Китае, а к ним прилагалось ПО, написанное на С++, документация — всё как положено.

На внутренних тестах выяснилось, что аппаратура страшно тормозит, и клиенты, очевидно, будут недовольны. А так как я был опытным разработчиком, мне поставили задачу ускорить работу системы. Классическая история, когда ошибку менеджеров и руководителей пытаются заткнуть техническими специалистами.

При анализе оборудования мы выяснили, что оно построено на микроконтроллерах с открытой архитектурой, у которых есть очень толковая документация, а вот ПО для них написали китайцы — причём чуть ли не перед отправкой к нам.

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

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

Василий Сысоев,
ведущий разработчик ООО «Встроенные системы». Комментарий для Skillbox Media

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

«Ассемблер до сих пор используют во встроенных системах, когда ресурсов мало или нужна жёсткая оптимизация. Но чаще всего код для встраиваемых систем пишут на С».

Евгений Красников,
участник сообщества pro.asm. Комментарий для Skillbox Media

Кибербезопасность и хакинг

«Некоторые важные части микропрограмм для смарт-карт написаны на ассемблере — это помогает защитить программное обеспечение от атак. Ассемблер — единственный язык, на котором вы полностью контролируете двоичный код программы. Это важно, ведь компилятор может оставить „дыру“ в прошивке, через которую злоумышленник взломает аппаратуру».

Кристиан Саковски,
software engineer

Любые задачи, с которыми не справляются С/С++

Сейчас встраиваемые системы чаще всего программируют на C — это стандарт. Также популярность набирает C++. А на ассемблере в основном пишут специфические программы, например для цифровой обработки сигналов, или когда высокоуровневые языки уже не справляются:

  • не хватает возможностей стандартных библиотек;
  • компиляторы не поддерживают нужные функции;
  • объектный код генерируется некорректно;
  • нужно написать чувствительный к стеку код — например, при программировании драйверов и операционных систем, чтобы работать со специальными регистрами и командами.

Но даже в этих случаях основную часть программы пишут на C или C++, а код ассемблера встраивают с помощью механизма asm. С другой стороны, в некоторых системах код на С работает слишком медленно и переписать его на ассемблере может быть вполне практичным решением.

«Пока в России не запретили квадрокоптеры, я собирал многовинтовые летательные аппараты. Мне пришлось с нуля писать софт на ассемблере для управления периферическим оборудованием. Оно подключается к основному контроллеру коптера. Аналогов не было — они появились позже, у производителей беспилотников типа DJI.

Сначала я писал весь софт на С, но код работал медленно и непредсказуемо. Тогда решил программировать на ассемблере. В общем, сейчас на ассемблере пишут ПО для встроенных систем, носимой электроники, драйверов устройств — когда нужно обеспечить идеальную точность и скорость работы с микропроцессором. Микропроцессоры „думают“ на языке, очень похожем на ассемблер».

Василий Сысоев,
ведущий разработчик в ООО «Встроенные системы»


«Есть несколько случаев, когда оптимизированный вручную язык ассемблера будет эффективнее языка ассемблера, сгенерированного компилятором из исходного кода C. Да и разработчику, привыкшему к ассемблеру, некоторые вещи проще написать на нём. В этих случаях многие компиляторы C допускают встроенную сборку.

Но компиляторы C становятся всё лучше, так что ручная оптимизация почти не нужна. А ещё большинство платформ налагает ограничения на некоторые низкоуровневые программы».

Сева Алексеев,
пишет на С с 1993 года


«Сейчас на ассемблере пишут специфичные команды процессора, которые не поддерживаются языком C. Но это уже редкость».

Алан Меллор,
бывший старший разработчик на С в Siemens

Когда ассемблер не нужен

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

«Чем проще разработать и поддерживать ПО, тем лучше, поэтому на ассемблере с нуля пишут всё реже — в наши дни большинство использует C/C ++ или даже Python. Выигрыш от ассемблера обычно невелик — есть инструменты получше, если вы разрабатываете на языке более высокого уровня.

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

​​Арно Бревоорт,
разработчик


«Сейчас экономия памяти, особенно дисковой, уже не так актуальна, да и скорости процессоров для выполнения повседневных задач вполне хватает. А современные компиляторы зачастую оптимизируют код по скорости даже лучше человека. Поэтому острой необходимости в языке ассемблера уже нет».

Евгений Красников,
участник сообщества pro.asm. Комментарий для Skillbox Media


«Ассемблер активно вытесняется другими языками, потому что программы на них проще писать, поддерживать, структурировать и понимать. Ассемблер оставляют в частях, где нужна чёткая последовательность действий, или когда работают напрямую с железом. Например, инициализируют микроконтроллер».

@smth_new_stalker,
участник сообщества pro.asm. Комментарий для Skillbox Media

Почему в 2k21 круто знать ассемблер

Процессор не выполняет напрямую код на языках высокого уровня. Например, инструкции на интерпретируемых языках вроде Python сначала преобразуются в байт-код. А в некоторых компиляторах С/С++ команды сначала переводятся на язык ассемблера, а уже потом в машинный код объектного файла.

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

«Нужен ли ассемблер всем разработчикам и программистам? Нет, но знание машинного языка по крайней мере одного процессора CISC, например Intel x86, и одного процессора RISC, желательно семейства ARM, даст вам хорошее представление о том, на что способен и не способен процессор».

Стэнли Уайлмен — младший,
профессор CS College

Однако с ростом IoT-устройств, умных камер, видеорегистраторов и других систем популярность ассемблера снова выросла. Так что, если разбираетесь в электронике и железе, учите ассемблер — без хлеба не останетесь.

А кто это у нас на девятом месте по версии TIOBE?
Скриншот: сайт TIOBE

На самом деле ассемблер — это низкоуровневые двоичные инструкции, которые программисты пишут словами и символами.

«Ассемблер помогает понять внутреннюю кухню, что „под капотом“ у программы: работа систем, процессоров, памяти и прочее. Для программиста на Python или JavaScript, правда, это не так важно, как, скажем, для того, кто пишет на C/C++. Причём даже программисту на C/C++ это нужно не на начальном этапе изучения языка».

Евгений Красников,
участник сообщества pro.asm. Комментарий для Skillbox Media

Каким бы увлекательным ни казался ассемблер, С и С++ отняли у него большую часть работы. Поэтому лучше сначала освоить плюсы на курсе «Профессия Разработчик на С++» в Skillbox, а уже потом погружаться в регистровые дебри.


обложка: National Cancer Institute / Unsplash

Курс

Профессия Разработчик на C++


Вы пройдёте полный курс по С++ и прикладной курс по Unreal Engine 4. Вы научитесь работать с многопоточностью, использовать инструменты и средства разработки: Git, GCC, GDB. Вам будет проще найти работу программиста в геймдеве.

Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована