Понятно, что знание вещей низкого уровня очень важно в нашей работе.
Но в ситуации, когда вы уже разрабатываете коммерческое программное обеспечение на высоком уровне, и когда у вас уже есть выбранное направление, но у вас нет навыков сборки, не разумнее ли сосредоточиться на изучении вещей, связанных с вашим направлением? Или есть причина, по которой вам стоит потратить некоторое время на изучение основ низкого уровня?
Когда уже слишком поздно, а когда нет? И если еще не слишком поздно, то как можно оптимально учиться (в том смысле, что не нужно тратить слишком много времени, чтобы получить немного глубины и понимания)?
Ответы:
Не могу поверить, что никто не упомянул отладку ...
Я не писал строки ассемблера уже много лет. Но я читаю это достаточно часто. Отладка высокого уровня хороша, когда у вас есть информация об источнике и символах, но когда ваша модная библиотека выдает необработанное исключение на клиентских компьютерах, уже слишком поздно требовать, чтобы это было включено в лицензию ...
Но я все еще могу открыть дизассемблер и посмотреть, что в итоге сделала ваша высокоуровневая логика , отследить неверные данные до их источника, узнать, кто изменил регистр управления FPU ...
Это спасло мой бекон чаще, чем я хочу думать. И учиться никогда не поздно - в сети есть множество отличных ссылок и учебных пособий , и практически любая программа, работающая на вашем компьютере, может предоставить практическую среду.
источник
Вам не нужно изучать язык ассемблера, вам просто нужно понять, как он работает. Вам нужно знать, что такое XOR, и считать в двоичном виде во сне и т. Д. Но мне никогда не требовался ассемблерный код в моей работе.
Итак, как вы говорите, знание низкоуровневых вещей важно, а практические знания по сборке - нет.
источник
Если у вас действительно нет навыков программирования на низком уровне, я очень рекомендую изучать некоторые из них в свободное время. Вам не нужно становиться экспертом в этом; просто достичь определенного уровня мастерства. Вы должны выполнить большую часть математической работы самостоятельно, а не полагаться на то, что компилятор или библиотеки сделают это за вас. Это поможет вам понять удобочитаемость в программировании, так как большинство инструкций по сборке соответствуют одной инструкции процессора. Вы должны сами управлять сложностью в немного больших программах, не прибегая к таким вещам, как
if...else
. Это поможет вам писать более простые высокоуровневые программы, потому что опыт сборки научил бы вас, насколько легче читать.Также помните, что сборка не является языком! Это общий термин, который в основном означает набор команд процессора, который был абстрагирован от символического языка. Разные процессоры имеют разные наборы команд и, следовательно, разные языки ассемблера. Когда вы изучаете «сборку», вы изучаете процесс, а не язык.
источник
Вам всегда будет полезно заглянуть под одеяло и немного лучше понять, что находится под абстракцией, над которой вы стоите. Как однажды сказал мой профессор в колледже: «Все хорошие программисты понимают аппаратное обеспечение» - вы не должны быть в состоянии создавать схемы и манипулировать ими, но вы должны иметь некоторое представление о том, что там происходит - это только сделает ты лучше.
Попробуйте компьютерную организацию и дизайн
источник
Да. Непрерывное непрерывное обучение является неотъемлемым компонентом карьеры в разработке программного обеспечения. Если вы заинтересованы в том, чтобы продолжать изучать программирование и совершенствовать свое мастерство, тогда да, в какой-то момент вы должны изучить ассемблер, поскольку он откроет вам совершенно новый язык и способ написания кода. По этой же причине я рекомендую экспериментировать со многими языками / стилями программирования, включая Ruby / Python (динамический язык), Haskell / F # (чисто функциональный язык), Lisp / Scheme (функциональный язык) и т. Д.
Я бы сказал, что уже слишком поздно, если вы больше не заинтересованы в том, чтобы больше узнать о программировании. Например, если вы достигли точки в своей карьере, когда вы, возможно, скоро перейдете от программирования в другую область, такую как управление, системная инженерия, продажи / маркетинг и т. Д. Если вы считаете, что вы можете перейти в новую область в в последующие несколько лет я бы больше сосредоточился на навыках, необходимых для развития в этой области, а не на навыках программирования.
источник
Вы должны знать, что это такое и что делает компьютер. Изучение что-то вроде MIX Кнута поможет вам. В основном возможность судить об эффективности вашего кода. Получите Искусство программирования и прочитайте его. Это сделает вас умнее программиста.
источник
Ответ:
источник
Я думаю, что вы достигаете точки снижения прибыли по мере продвижения по службе. То есть вы должны изучать ассемблер рано, так как это поможет лучше понять все, что будет после. Тем не менее, если вы уже работаете и у вас есть опыт работы в течение нескольких лет, вы уже почувствуете, как все работает, поэтому изучение фактических подробностей о гайках и болтах может не дать вам особого понимания. ,
источник
Я не знаю, насколько полезным будет изучение ассемблера. Но, по крайней мере, было бы полезно немного программировать на языке, подобном Си. Недавно мне пришлось заниматься программированием на C, и я нашел, что это довольно поучительно. C удаляет большую часть абстракции, присутствующей в языках более высокого уровня. Эти абстракции не обходятся без затрат. Вы должны управлять более подробной информацией нижнего уровня в C, где, как и на языке более высокого уровня, эти детали управляются для вас. Занимаясь программированием на C, вы должны осознать эти детали. Поэтому, когда вы вернетесь к своему повседневному языку, у вас все еще будет это осознание, и вы будете лучше понимать, что на самом деле происходит. Это должно помочь вам стать лучшим программистом.
источник
В преподавательской профессии, по крайней мере, здесь, в Великобритании, учителя должны иметь квалификацию, намного превышающую то, что они преподают. Учитель средней (старшей) школы должен иметь степень по предмету, который они преподают, а учителя начальной (начальной) школы тоже имеют степени и должны хорошо владеть всеми основными предметами вплоть до хорошего уровня GCSE (средняя школа) выходных экзаменов?, нет реального США широкий эквивалент).
Зачем? Потому что для того, чтобы чему-то научить или действительно хорошо что-то использовать, вы должны это понять. Это требует понимания базовой структуры, цепочки решений до того, с которым вы работаете, что привело к ней. Чтобы правильно понять высокоуровневый код, вы должны понимать уровень, на котором он построен, как он работает, в чем его сильные и слабые стороны. Это рекурсивно, чтобы понять слой под ним, вы должны понимать и слой под ним.
В конце концов, именно поэтому приличные курсы по информатике в университетах / колледжах требуют хорошей математической подготовки, прежде всего, потому что это фактически нижняя ступень.
Если вам не хватает знаний в этих областях, то ваше понимание под угрозой. Чем ближе к уровню вы управляете другим слоем, тем важнее иметь в нем заземление.
Итак: Вам нужно знать ассемблер как высокоуровневый кодер? Это поможет.
источник
Это было очень важно в моей предыдущей жизни как гуру суперкомпьютера. В то время я чувствовал, что вы не понимаете машину, пока не написали по крайней мере несколько сотен строк ассемблера, и возились с ней, пытаясь выжать производительность. Поскольку очень немногие программисты хотели зайти так глубоко, это сделало меня действительно незаменимым. И у меня все еще есть общий язык, когда я говорю с дизайнерами HW.
Но на самом деле потребность / выгода для этого в основном произошла пару десятилетий назад. Между продвижением компилятора и продвинутым внеплановым исполнением HW очень мало возможностей для того, чтобы играть героя, написав ассемблер. Хотя я думаю, что это полезно для понимания того, как все работает. Я планирую научить своих детей (первокурсников CS) программировать на очень упрощенном ассемблере на простой виртуальной машине, чтобы они чувствовали, что происходит. Надеюсь, мы сможем поиграть с такими вещами, как развертывание, конвейерная обработка программного обеспечения, кэширование и предварительная выборка, загрузка снизу и т. Д. Так что, по крайней мере, они будут знать, что на каком-то уровне это происходит.
источник