Я начал изучать ассемблер недавно, и, просматривая Интернет, я вижу, что все больше и больше людей говорят, что ассемблер не бесполезен, но также не стоит тратить время на программирование чего-либо на языке, который требует такого времени и усилий по сравнению с языки высокого уровня. Неужели эффективность между языковой программой высокого уровня и программой низкого уровня действительно недостаточно заметна, чтобы на нее обращать внимание в настоящее время, и существует ли другой язык низкого уровня, такой как ассемблер, который более широко используется?
Является ли ассемблер единственным языком программирования низкого уровня, а если нет - наиболее широко используемым?
Ответы (4)
Неужели эффективность между языковой программой высокого уровня и программой низкого уровня действительно даже недостаточно заметна, чтобы на нее обращать внимание в наши дни?
Часто компиляторы создают намного лучшую сборку, чем могут написать разработчики. Есть разработчики, которые могут обыграть компилятор. Но поскольку написание низкоуровневого кода требует большего внимания к деталям, и его сложнее писать и поддерживать, обычно для повышения эффективности в сборке реализуются только небольшие конкретные фрагменты кода. Разница может быть заметной. Но это также может быть незаметным, если разработчики проводят ложную оптимизацию.
Я бы порекомендовал вам прочитать Черную книгу по программированию графики Абраша - много по сборке и оптимизациям + приятные истории из реальной жизни.
и есть ли другой язык низкого уровня, такой как ассемблер, который используется более широко?
Ассемблер, вероятно, является языком программирования приложений самого низкого уровня. Единственным другим средством было бы написать двоичный код вручную, но двоичные коды операций вряд ли можно назвать «языком».
Однако программирование выходит за рамки программного обеспечения. Аппаратное обеспечение тоже нужно программировать. Существуют языки описания оборудования (HDL), которые можно использовать для программирования оборудования (т.е. вы можете создать свой собственный ЦП). Самыми популярными языками HDL являются Verilog и VHDL.
Написание ассемблера было уместно в более простые времена. В те времена, когда генератор кода в компиляторе C был еще не очень умен, и время выполнения машинного кода было просто предсказать.
С этим покончено, человек не может превзойти ни ум, заложенный в современный генератор кода, ни его неустанное внимание к деталям. Детализация, необходимая для того, чтобы точно знать, когда вы вставляете предварительную выборку из кеша, чтобы данные были доступны в нужное время. И как правильное изменение порядка инструкций обеспечивает максимальную масштабируемость. И вставка nops точно так, чтобы цели прыжка были выровнены. И как развернуть петли механически. И как воспользоваться автоматическим распараллеливанием, предоставляемым SIMD. И так далее. И делать это не один раз, а снова и снова по мере изменения кода.
Ну, собственно, «сборка» - это скорее собрание разных разновидностей. Это зависит от архитектуры, для которой вы программируете. Например, сборка для x86 может (и будет) сильно отличаться от сборки для ARM, MIPS или любой архитектуры, о которой вы только можете подумать. Это вызвано тем фактом, что сборка представляет собой однозначное преобразование двоичного кода, выполняемого процессором. Поскольку разные архитектуры имеют разные наборы инструкций, их язык ассемблера также отличается.
Так что на самом деле сборка - это самое низкое, на что вы можете пойти без написания простого двоичного кода. Но это не конкретный язык, а группа языков. Итак, если вы говорите, например, о сборке x86 и сравниваете это с другим языком такого же низкого уровня, вы обнаружите, что этот другой язык также будет некоторым вариантом сборки. Опять же, это было бы для другой архитектуры, так что это тоже было бы не очень полезно.
компиляторы языков более высокого уровня становятся умнее с каждым днем. В прошлом ассемблерные уловки могли значительно повысить производительность. В настоящее время компиляторы сами реализуют многие из этих уловок.
Примеры: сдвиг вместо деления, манипулирование счетчиком программ в таблице переходов для переключателя / случая, встраивание функций, если они используются только один раз, и т. Д.
Еще есть место для оптимизации, но прирост производительности будет настолько низким, что лучше использовать язык более высокого уровня и пойти на ремонтопригодность.