Каковы практические преимущества обучения Assembly?

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

какие ваши предложения? Что я упускаю, не изучая сборку и указатели / управление памятью в целом?

14 ответов


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

средний разработчик может написать простой цикл и подумать: "этот код повторяет набор целых чисел и записывает каждый в консоль."

эксперт-разработчик может написать то же самое цикл и подумайте: "этот код повторяет набор целых чисел и должен поместить каждый элемент в поле для вызова метода ToString, а ToString должен отформатировать строку в базе 10, которая несколько нетривиальна, а затем как целое число в коробке, так и отформатированная строка скоро будут иметь право на сборку мусора, поскольку никаких ссылок не останется, и при первом запуске этого метода его нужно будет JIT'Ed..."и так далее.

9 раз из 10, это может не иметь значения. Но это 1 раз из 10, эксперт разработчик, вероятно, заметит проблему в коде, которую средний разработчик никогда не подумает рассмотреть.


вам нужно научиться читать сборку, чтобы вы могли понять, что идет не так, когда сложная инструкция бомбит. Окно отладки CPU не должно быть таинственным местом.


указатели/управления памятью являются более общими, чем язык ассемблера. Вы также должны понимать их для C и C++, что вам может понадобиться, если вам нужно поддерживать код, написанный на C.

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


Я думаю, это здорово, чтобы узнать новые языки. Это открывает мой разум. Некоторые языки более открыты для ума, чем другие. Я бы сказал, что ассемблер-один из них. Это заставляет вас думать о таких вещах, как стек вызовов и указатель инструкций. И это заставит вас ценить языки более высокого уровня еще больше. Еще один интересный язык для изучения-PostScript.


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


Это один из тех вопросов, которые всегда будут спрашивать: "почему я должен что-нибудь знать." п. Ну, возможно, вы могли бы получить работу, делая что-то помимо создания следующего общего приложения CRUD или что-то в этом роде. Если вы хотите сделать какую-либо разработку системы, наличие рабочих знаний сборки очень полезно, если не жизненно важно. Что касается того, что вы "упускаете", возможно, вы упускаете из виду, действительно зная, как работают компьютеры. Некоторые считают это желательным. Некоторые-нет. Некоторые люди строят процессоры. Некоторые копают канавы. Все дело в личных предпочтениях:)


но то, что я ищу, - это некоторые практические предложения, которые сделают усилия по обучению сборки стоящими того.

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

но, не удосужился научиться write assembly: вместо этого обучение написанию C или c++, вероятно, "низкое" для большинства практических целей.


указатели и управление памятью действительно другой вопрос, чем сборка. Если вы хотите сделать C / C++, вам нужно изучить указатели и управление памятью, потому что они являются частью языка. Но, даже если вы планируете использовать только (скажем) Java всю свою жизнь, вы должны узнать что-то об управлении памятью, чтобы не писать утечку памяти, несмотря на GC, а указатели-это просто разница между атомарными типами и ссылками на объекты. Вам нужны концепции, или вы напишете программы, которые не работают!

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

в конечном счете, я думаю, что ваше различие между "знанием основной работы вашего компьютера" и " практическим предложения, которые сделают усилия по обучению сборки того стоящими", являются ложными. Невежество не окупается. Изучение того, как работает ваш компьютер is практическое предложение стоит усилий!

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


в наши дни многие языки сборки на самом деле довольно высокого уровня.

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

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


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

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


ну, на практическом уровне я сделал класс в ассемблере 6502, когда я впервые учился кодировать начало 80-х. Я также сделал ассемблер 8088. С тех пор он иногда использовался, но я не могу сказать, что это когда-либо действительно вытащил меня из ямы более одного или двух раз за 25 лет. Groking C на довольно фундаментальном уровне гораздо более полезен. YMMV и это, безусловно, полезно в качестве фона, но как прямая практическая польза? Предельный действительно.

извращенно, хотя одна вещь, которая оказалась полезной, находится на еще более низком уровне. Я сделал класс по дизайну микросхем (NAND gates и тому подобное), и в рамках этого был обучен формальной булевой логике на некоторой глубине. Это было массово полезно с тех пор-удивительно количество кодеров, которые действительно не знают, что они делают с ands, ors и nots: -)


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

Это поможет объяснить множество проблем с производительностью-например, парсер медленный, потому что есть много ветвей, и конвейер очень легко смывается, предсказатель ветвей не может компенсировать все.

кроме того, разные архитектуры имеют свои причуды. Кто-то говорил о трюке сборки для замены 2 регистров на месте, с участием xor. Это работает, и это будет отлично работать для ядра выполнения в порядке (последним примером будет Intel Atom и Via C7 в нетбуках), но не так здорово в ядрах вне порядка.

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


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


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

Сборка И Искусство Отладки

Отладка – Изменение Кода Во Время Выполнения