Является ли ассемблер единственным языком программирования низкого уровня, а если нет - наиболее широко используемым?

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


person kjh    schedule 23.07.2012    source источник
comment
Частично вопрос, который вы задаете, требует скорее мнения, чем неопровержимого факта. Независимо от того, стоит ли дополнительная скорость (люди говорят, что компиляторы настолько хороши, что вы не можете получить дополнительную скорость десятилетиями, это все еще неправда) потраченного на нее дополнительного времени, зависит. Распространенное мнение гласит, что с производительностью нужно быть как можно более небрежно, и оправдывает это тем, что с законом Мура это ускорится в следующем десятилетии.   -  person harold    schedule 24.07.2012
comment
Это действительно очень сложно превзойти нынешние компиляторы. Вы также можете спросить себя, хотите ли вы, чтобы я потратил много часов (из расчета 100 долларов в час) на оптимизацию программы, или вы хотите потратить свои 100 долларов на дополнительную оперативную память и дополнительный процессор? Железо дешевое, хорошие программисты - дорогие.   -  person Bo Persson    schedule 24.07.2012
comment
@BoPersson Вы зарабатываете 100 долларов в час? Во всяком случае, эта аргументация работает только для программного обеспечения, которое вы собираетесь использовать только сами. В противном случае миллиону людей пришлось бы потратить 100 долларов на дополнительную память или просто купить программное обеспечение вашего конкурента вместо вашего.   -  person harold    schedule 24.07.2012
comment
@Harold - Я стою 100 долларов в час для компании, в которой я работаю (к сожалению, не только из-за зарплаты). Я программировал на ассемблере в 1980-х, когда компьютер стоил 6 месяцев зарплаты и его нельзя было модернизировать. Если бы конкурент сейчас написал свою программу на ассемблере, это заняло бы у него на несколько лет больше времени, и он бы за это время ничего не продавал. И когда он закончит, я могу перекомпилировать свою программу до 64-битной версии, а ему придется начинать все заново.   -  person Bo Persson    schedule 24.07.2012
comment
@BoPersson ну конечно, писать целые программы на ассемблере просто глупо   -  person harold    schedule 24.07.2012


Ответы (4)


Неужели эффективность между языковой программой высокого уровня и программой низкого уровня действительно даже недостаточно заметна, чтобы на нее обращать внимание в наши дни?

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

Я бы порекомендовал вам прочитать Черную книгу по программированию графики Абраша - много по сборке и оптимизациям + приятные истории из реальной жизни.

и есть ли другой язык низкого уровня, такой как ассемблер, который используется более широко?

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

Однако программирование выходит за рамки программного обеспечения. Аппаратное обеспечение тоже нужно программировать. Существуют языки описания оборудования (HDL), которые можно использовать для программирования оборудования (т.е. вы можете создать свой собственный ЦП). Самыми популярными языками HDL являются Verilog и VHDL.

person Community    schedule 23.07.2012
comment
@kjh: Пожалуйста. Я только что заметил смешную цену на книгу на Амазоне. Он также доступен в Интернете бесплатно здесь - gamedev.net/page/resources / _ / Technical / - person ; 23.07.2012

Написание ассемблера было уместно в более простые времена. В те времена, когда генератор кода в компиляторе C был еще не очень умен, и время выполнения машинного кода было просто предсказать.

С этим покончено, человек не может превзойти ни ум, заложенный в современный генератор кода, ни его неустанное внимание к деталям. Детализация, необходимая для того, чтобы точно знать, когда вы вставляете предварительную выборку из кеша, чтобы данные были доступны в нужное время. И как правильное изменение порядка инструкций обеспечивает максимальную масштабируемость. И вставка nops точно так, чтобы цели прыжка были выровнены. И как развернуть петли механически. И как воспользоваться автоматическим распараллеливанием, предоставляемым SIMD. И так далее. И делать это не один раз, а снова и снова по мере изменения кода.

person Hans Passant    schedule 23.07.2012

Ну, собственно, «сборка» - это скорее собрание разных разновидностей. Это зависит от архитектуры, для которой вы программируете. Например, сборка для x86 может (и будет) сильно отличаться от сборки для ARM, MIPS или любой архитектуры, о которой вы только можете подумать. Это вызвано тем фактом, что сборка представляет собой однозначное преобразование двоичного кода, выполняемого процессором. Поскольку разные архитектуры имеют разные наборы инструкций, их язык ассемблера также отличается.

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

person Landervdb    schedule 23.07.2012

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

Примеры: сдвиг вместо деления, манипулирование счетчиком программ в таблице переходов для переключателя / случая, встраивание функций, если они используются только один раз, и т. Д.

Еще есть место для оптимизации, но прирост производительности будет настолько низким, что лучше использовать язык более высокого уровня и пойти на ремонтопригодность.

person huysentruitw    schedule 23.07.2012