Стоит ли изучать язык ассемблера? [закрытый]
стоит ли еще учиться ASM?
Я знаю немного об этом, но я действительно не использовал его или не изучал его должным образом, потому что все, что я учусь делать на ассемблере, я могу сделать в 1/10 раза с некоторым языком, таким как C или c++. Итак, должен ли я действительно учиться и использовать ASM? Это пойдет мне на пользу в профессиональном плане? Это увеличит мою находчивость? Короче говоря, это сделало бы меня лучшим программистом?
примечание: Я говорю о сборке низкого уровня, как FASM или NASM, а не что-то вроде HLA (Ассемблер Высокого Уровня).
7 ответов:
узнал от Кип Ирвин книги. Если вы игнорируете (справедливую) критику его (нерелевантных) библиотек, я могу рекомендовать его как хорошее введение в сам язык - хотя для действительно интересные вещи, которые вы должны выследить одержимых в сети.
Я думаю, что полезно понять, что происходит на более низких уровнях. По мере изучения ассемблера вы узнаете о конвейерной обработке ЦП, предсказании ветвей, выравнивании кэша, SIMD, инструкции порядка и так далее. Знание этого поможет вам лучше писать высокоуровневый код.
кроме того, общепринятая мудрость заключается в том, чтобы не пытаться вручную оптимизировать сборку большую часть времени, но позволить компилятору беспокоиться об этом. Когда вы увидите некоторые примеры искаженных вещей, которые генерируют компиляторы, вы лучше поймете, почему общепринятая мудрость держится.
пример: LFSRs работает быстро с помощью инструкции rotate-with-carry, для конкретных случаев, подобных этому, это так же просто написать версию ассемблера так, как она есть, чтобы выяснить, достаточно ли у компилятора ума, чтобы понять это. Иногда вы просто знаете что-то что компилятор не имеет.
Это также повышает понимание проблем безопасности -- запись или выполнение, переполнение стека и т. д.
некоторые параллелизм проблемы становятся очевидными только тогда, когда вы осознаете, что происходит на уровне каждой инструкции.
Это может быть полезно иногда при отладке, если у вас нет полного исходного кода.
вот значение любопытства. Как вообще реализуются виртуальные функции? Когда-нибудь пробовали писать программы DirectX или COM на ассемблере? Как возвращаются большие структуры, предлагает ли вызывающая функция пространство для них или наоборот?
тогда есть специальные языки ассемблера для графического оборудования, хотя языки шейдеров вышли на высокий уровень несколько лет назад, все, что позволяет вам думать о проблеме a другой способ-это хорошо.
Мне интересно, что так много людей прыгают, чтобы сказать, что да, вам нужно/нужно научиться сборке. Для меня вопрос в том сколько сборки вам нужно знать? Я не думаю, что вы должны знать ассемблер как язык программирования, то есть я не считаю, что каждый должен быть в состоянии написать программу в сборке, но с другой стороны, будучи в состоянии прочитать его и понять, что это на самом деле означает (что может потребовать больше знаний об архитектуре, чем ассемблер) является достаточно.
Я точно не могу написать assembly (т. е. напишите любой нетривиальный фрагмент кода в сборке), но я могу прочитать его и что вместе со знанием фактической архитектуры оборудования и используемых соглашений о вызовах достаточно для анализа производительности и определения того, какой фрагмент кода C++ был источником этой сборки.
Да-Основная причина изучить сборку для разработчиков C и C++ - это помогает понять, что происходит под капотом кода C и C++. Дело не в том, что вы на самом деле будете писать код в сборке, но вы сможете посмотреть на разборку кода оценка эффективности и вы поймете, как разные функции C и c++ работают намного лучше.
стоит изучить много разных языков, из множества разных парадигм. Изучение Java, C++, C# и Python не считается, так как все они являются экземплярами одной и той же парадигмы.
поскольку сборка находится в корне (ну, близко к корню) всех языков, я для одного говорю, что стоит изучить сборку.
опять же, стоит изучить функциональный язык программирования, логическое программирование, скриптовые языки,математические языки. Вы только есть так много времени, так что вы должны выбрать и выбрать.
ты использовать для этого в чем вы планируете заниматься? это поможет вам в любом случае в том, что вы сейчас делаете или планируете делать? это два вопроса, которые вы должны задать себе, ответ на них-это ответ на ваш вопрос.
в более общем смысле, да, я бы сказал, что, на мой взгляд, стоит изучить asm (что-то вроде x86 или arm), насколько хорошо он вам служит, зависит от того, что вы программируете и как отлаживаете его.
зависит от того, какой уровень программирования, который вы хотите достичь. Если вам нужно работать с отладчиками, то да. Если вам нужно знать, как работают компиляторы, то да. Любой ассемблер / отладчик зависит от процессора, поэтому есть много работы, просто проверьте семейство x86, насколько оно велико и Старо.