Разумно ли для разработчика высокого уровня тратить время на изучение ассемблера? [закрыто]

33

Понятно, что знание вещей низкого уровня очень важно в нашей работе.

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

Когда уже слишком поздно, а когда нет? И если еще не слишком поздно, то как можно оптимально учиться (в том смысле, что не нужно тратить слишком много времени, чтобы получить немного глубины и понимания)?

zkaje
источник
Много вопросов в одном посте :)
Шамим Хафиз
Я наслаждался языком ассемблера Step by Step. Сначала много чего интересного в программировании, но автор очень увлекателен. Я обнаружил, что полезно иметь общую идею, и я в первую очередь пишу JavaScript.
Эрик Реппен
Мой первый (преподаваемый) язык был ассемблерным. Я вижу, как это было бы полезно (из множества способов, на которые указывали другие), и это поможет вам внести различные вклады для остальной части команды.
Джейми Тейлор

Ответы:

43

Не могу поверить, что никто не упомянул отладку ...

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

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

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

Shog9
источник
10
+1, и я бы больше проголосовал, если бы мог. Каждый серьезный разработчик должен иметь возможность читать ASM для этого, если нет других причин.
Мейсон Уилер
3
Следствием этого является оптимизация. Знание того, как компилятор переводит ваш код в сборку, может помочь вам сделать его значительно быстрее!
lambacck
3
+1 Сборка - это один из немногих языков, который заставляет вас понять, как на самом деле работает процессор. Это поможет вам в вашем развитии с языком высокого уровня. Должен прочитать: blogs.msdn.com/b/ericlippert/archive/2010/09/30/...
Знание лежащего в основе компьютера ПОЛЕЗНО полезно, будь то отладка, оптимизация или просто любопытство. Если серьезно, научитесь читать хотя бы одно или два семейства ассемблера. Даже если вы никогда не читаете или не пишете это после изучения, это повлияет на то, как вы понимаете вещи в будущем. Теперь, если вы предпочитаете писать не на каком-либо другом языке, это может быть немного ...
Майкл Трауш
1
@ Мейсон: я не знаю, должен ли "каждый серьезный разработчик" читать ASM. Если вы пишете JavaScript или используете язык программирования, построенный на толстой платформе (например, .NET или Java), я бы не считал, что способность читать ASM необходима для серьезного разработчика. При этом понимание того, как компьютер выполняет инструкции на очень низком уровне, может оказаться весьма полезным даже в языках программирования и средах более высокого порядка.
Скотт Митчелл
15

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

Итак, как вы говорите, знание низкоуровневых вещей важно, а практические знания по сборке - нет.

Леннарт Регебро
источник
1
Я второй. Вы можете зарабатывать на хорошем программировании, и вам никогда не придется читать / писать ASM. Есть некоторые позиции, которые требуют этого. Чтение дампа после состояния гонки в вашем коде остановило процесс. Или если вы пишете очень интенсивные программы (например, распараллеливание GPU / OpenCL). Процент рабочих мест разработчиков, где вам потребуется выполнить эти задачи, очень мал.
yzorg
11

Если у вас действительно нет навыков программирования на низком уровне, я очень рекомендую изучать некоторые из них в свободное время. Вам не нужно становиться экспертом в этом; просто достичь определенного уровня мастерства. Вы должны выполнить большую часть математической работы самостоятельно, а не полагаться на то, что компилятор или библиотеки сделают это за вас. Это поможет вам понять удобочитаемость в программировании, так как большинство инструкций по сборке соответствуют одной инструкции процессора. Вы должны сами управлять сложностью в немного больших программах, не прибегая к таким вещам, как if...else. Это поможет вам писать более простые высокоуровневые программы, потому что опыт сборки научил бы вас, насколько легче читать.

Также помните, что сборка не является языком! Это общий термин, который в основном означает набор команд процессора, который был абстрагирован от символического языка. Разные процессоры имеют разные наборы команд и, следовательно, разные языки ассемблера. Когда вы изучаете «сборку», вы изучаете процесс, а не язык.

Майкл К
источник
8

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

Попробуйте компьютерную организацию и дизайн

Уотсон
источник
1

Да. Непрерывное непрерывное обучение является неотъемлемым компонентом карьеры в разработке программного обеспечения. Если вы заинтересованы в том, чтобы продолжать изучать программирование и совершенствовать свое мастерство, тогда да, в какой-то момент вы должны изучить ассемблер, поскольку он откроет вам совершенно новый язык и способ написания кода. По этой же причине я рекомендую экспериментировать со многими языками / стилями программирования, включая Ruby / Python (динамический язык), Haskell / F # (чисто функциональный язык), Lisp / Scheme (функциональный язык) и т. Д.

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

Джастин этир
источник
1

Вы должны знать, что это такое и что делает компьютер. Изучение что-то вроде MIX Кнута поможет вам. В основном возможность судить об эффективности вашего кода. Получите Искусство программирования и прочитайте его. Это сделает вас умнее программиста.

Тео белэр
источник
1

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

Ответ:

  1. Если вы не планируете сменить направление на встроенную систему, нет причин изучать ассамблею. Даже если вы думаете, что сборка зависит от процессора, вы можете изучить некоторые основы, но ваши знания будут основаны на архитектуре процессора и наборе команд для этого процессора.
  2. Допустим, вы код для Windows. Если вы хотите изучать язык более низкого уровня, чем язык высокого уровня, который может помочь вам в текущем направлении, я бы порекомендовал вам углубленно изучить Windows I, Windows API, управление памятью Windows и т. Д. Просто изучите ОС / платформу, которую вы кодируете.
  3. Совершенствуйте свои навыки владения текущим языком высокого уровня, таким как управление памятью, сборка мусора и т. Д. Если вы хотите перейти на низкий уровень.
Амир Резаи
источник
0

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

TMN
источник
0

Я не знаю, насколько полезным будет изучение ассемблера. Но, по крайней мере, было бы полезно немного программировать на языке, подобном Си. Недавно мне пришлось заниматься программированием на C, и я нашел, что это довольно поучительно. C удаляет большую часть абстракции, присутствующей в языках более высокого уровня. Эти абстракции не обходятся без затрат. Вы должны управлять более подробной информацией нижнего уровня в C, где, как и на языке более высокого уровня, эти детали управляются для вас. Занимаясь программированием на C, вы должны осознать эти детали. Поэтому, когда вы вернетесь к своему повседневному языку, у вас все еще будет это осознание, и вы будете лучше понимать, что на самом деле происходит. Это должно помочь вам стать лучшим программистом.

Росс годдард
источник
0

В преподавательской профессии, по крайней мере, здесь, в Великобритании, учителя должны иметь квалификацию, намного превышающую то, что они преподают. Учитель средней (старшей) школы должен иметь степень по предмету, который они преподают, а учителя начальной (начальной) школы тоже имеют степени и должны хорошо владеть всеми основными предметами вплоть до хорошего уровня GCSE (средняя школа) выходных экзаменов?, нет реального США широкий эквивалент).

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

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

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

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

Итак: Вам нужно знать ассемблер как высокоуровневый кодер?  Это поможет.

Orbling
источник
0

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

Но на самом деле потребность / выгода для этого в основном произошла пару десятилетий назад. Между продвижением компилятора и продвинутым внеплановым исполнением HW очень мало возможностей для того, чтобы играть героя, написав ассемблер. Хотя я думаю, что это полезно для понимания того, как все работает. Я планирую научить своих детей (первокурсников CS) программировать на очень упрощенном ассемблере на простой виртуальной машине, чтобы они чувствовали, что происходит. Надеюсь, мы сможем поиграть с такими вещами, как развертывание, конвейерная обработка программного обеспечения, кэширование и предварительная выборка, загрузка снизу и т. Д. Так что, по крайней мере, они будут знать, что на каком-то уровне это происходит.

Омега Центавра
источник