Стоит ли изучать язык ассемблера?

До сих пор стоит узнать ASM?

Я немного знаю об этом, но я не использовал его или не изучил его должным образом, потому что все, что я научился делать в ассемблере, я могу сделать в 1/10 раз с помощью некоторого языка, такого как C или С++. Итак, должен ли я действительно учиться и использовать ASM? Будет ли это профессионально? Увеличит ли он мою изобретательность? Короче говоря, это сделает меня лучшим программистом?

Примечание. Я говорю о низкоуровневой сборке, такой как FASM или NASM, а не о HLA (High-Level Assembler).

Ответ 1

Я узнал из книгу Кипа Ирвина. Если вы проигнорируете (справедливую) критику своих (нерелевантных) библиотек, я могу порекомендовать это как хорошее введение в язык самого себя, хотя для действительно интересных вещей вам нужно искать навязчивых идей в сети.

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

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

Пример: LFSR быстро запускаются с помощью команды rotate-with-carry, для конкретных случаев, подобных этому, так же легко написать версию ассемблера, так как он должен выяснить, достаточно ли компилятор достаточно умен, чтобы понять это. Иногда вы просто что-то знаете, что компилятор этого не делает.

Это также увеличивает понимание проблем безопасности - write-or-execute, и т.д.

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

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

Здесь значение любопытства. Как реализованы виртуальные функции? Вы когда-нибудь пытались писать DirectX или COM-программы в ассемблере? Как возвращаются большие структуры, выполняет ли вызывающая функция пространство для них или наоборот?

Тогда есть специальные языки ассемблера для графического оборудования, хотя несколько лет назад языки шейдеров вышли на уровень высокого уровня. Все, что позволяет вам думать о проблеме по-другому, хорошо.

Ответ 2

Мне интересно, что так много людей говорят, что да, вам нужно/должно научиться сборке. Для меня вопрос в том, сколько сборки вам нужно знать? Я не думаю, что вам нужно знать сборку, как язык программирования, то есть я не считаю, что каждый должен иметь возможность писать программу в сборке, но, с другой стороны, быть в состоянии прочитать ее и понять, что она на самом деле средства (которые могут потребовать больше знаний о архитектуре, чем ассемблер).

Я точно не могу написать сборку (т.е. написать какую-нибудь нетривиальную часть кода в сборке), но я могу ее прочитать и что вместе со знанием реальной аппаратной архитектуры и используемых конвенций вызова достаточно для анализа производительности и определить, какая часть кода на С++ была источником этой сборки.

Ответ 3

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

Ответ 4

Стоит узнать много разных языков, от множества различных парадигм. Изучение Java, С++, С# и Python не учитывается, поскольку все они являются примерами одной и той же парадигмы.

Поскольку сборка находится в корне (ну, ближе к корню) всех языков, я, например, говорю, что полезно изучить сборку.

Затем снова стоит изучить функциональный язык программирования, логическое программирование, языки сценариев, математические языки. У вас так много времени, поэтому вам нужно выбирать и выбирать.

Ответ 5

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

В более общем смысле, да, я бы сказал, по моему мнению, стоит изучать asm (что-то вроде x86 или arm), насколько он вам подходит, зависит от того, что вы программируете и как отлаживаете его.

Ответ 6

Знание ASM также полезно при отладке, поскольку иногда все, что у вас есть, это "Дамп ошибки ASM".

Ответ 7

Зависит от того уровня программирования, который вы хотите достичь. Если вам нужно работать с отладчиками, тогда YES. Если вам нужно знать, как работают компиляторы, то ДА. Любой ассемблер/отладчик зависит от процессора, поэтому есть много работы, просто проверьте семейство x86, насколько большой и старый он.