Любое значение для программиста, чтобы понять процессор более глубоко? - PullRequest
5 голосов
/ 28 февраля 2009

Недавно мне пришло в голову, что я (и я думаю, что большинство людей) изучил компьютерное программирование, начиная с чего-то вроде Visual Basic. Я начал задаваться вопросом, начали ли мы сначала с более низкого уровня, будет ли сейчас легче.

Считаете ли вы, что программисту важно понимать такие вещи, как работа процессора, основные инструкции и тому подобное? Я имею в виду, в конце концов, разве мы не говорим с этим в конце концов?

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

Ответы [ 12 ]

12 голосов
/ 28 февраля 2009

Это идет в обе стороны.

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

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

Кто-то, кто понимает, что происходит за кулисами (сколько тактов выполняют различные операции, как работает конвейер ЦП, влияние кэширования и т. Д.), Может часто писать код, который очень быстр, но может быть трудным для многих людей, чтобы понять / поддерживать. (Это особенно сложно в приложениях, где «оптимизация» не дает ощутимых преимуществ, а ремонтопригодность важнее)

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

Честно говоря, на данный момент я не против оставить компилятору много деталей / оптимизаций низкого уровня. Это, вероятно, делает лучше, чем я в любом случае:]

5 голосов
/ 28 февраля 2009

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

Мы профессионалы. Мы должны знать, как все работает "под капотом", даже если мы обычно не работаем на этом уровне.

5 голосов
/ 28 февраля 2009

Я довольно много узнал о низкоуровневом программировании, и я думаю, что он чрезвычайно полезен для каждого кода, который я пишу. Даже языки высокого уровня имеют некоторые версии, скажем, базовых примитивов синхронизации (мьютексы / блокировки, условия, семафоры); они все еще должны читать с диска или с сетевой карты; им по-прежнему приходится копировать байты из одного места в памяти в другое и т. д. Дело в том, что тот факт, что вы используете язык высокого уровня, не означает, что бесполезно знать, как эти вещи работают. Если у вас есть понимание того, как компьютер работает на самом низком уровне, вы всегда можете применить эти знания для написания более эффективного и / или менее подверженного ошибкам кода независимо от того, насколько абстрактна ваша платформа. Знание низкоуровневых операций может даже научить вас вещам, которые вы, возможно, никогда бы не узнали иначе - нет лучшего способа научиться правильно использовать что-то вроде мьютекса, чем применять его. (Хорошо, может быть, это немного преувеличено, но вы поняли мою точку зрения, я надеюсь)

В итоге, я бы сказал, что да, для программистов на всех уровнях абстракции абсолютно хорошая идея изучить основы. Но я не думаю, что это хорошая идея, чтобы начинать с основ. Программы на уровне ассемблера, как известно, трудны для понимания, и я думаю, что попытка навязать это новичку в программировании, скорее всего, обескуражит его / ее. Я упомянул, что понимание основных операций поможет вам писать более эффективный и / или менее подверженный ошибкам код, но, конечно, совсем не обязательно писать код. Так что, по моему мнению, большинству людей лучше всего начинать где-то посередине, где они все еще могут привязываться к знакомым понятиям, таким как объекты, знакомясь с процессом кодирования. После некоторого опыта в этой области, процессорные ресурсы стали честной игрой; -)

2 голосов
/ 28 февраля 2009

Языки программирования - это виртуальные машины. C, C #, Fortran, Basic и т. Д. Сами по себе процессоры, хотя и переносимые. Они говорят, что если вы программируете на Фортране, вы программируете на каком-то компьютере с Фортраном. Если вы программируете на C, вы программируете на каком-то C-компьютере. Есть даже язык, реализованный на аппаратном уровне, LISP.

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

Вы можете получить доступ ко всем закоулкам указателей, ручным манипуляциям с памятью, инструкциям, указателям на работу и т. Д. С такими языками, как C или C # с небезопасной опцией.

Вы не пропускаете что-то, даже если вы не знаете процессор глубоко.

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

2 голосов
/ 28 февраля 2009

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

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

2 голосов
/ 28 февраля 2009

По-прежнему существует сообщество программистов, которые научились этому.

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

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

1 голос
/ 28 февраля 2009

Я начал программировать на Basic (на бумажной ленте!), Но одним из лучших событий в моей ранней карьере была работа во встроенных системах, написание программ на языке C и ассемблере, и часто кросс-компиляция. Знание того, что делает оборудование, как язык более высокого уровня отображается на ЦП и т. Д., Очень полезно. Это, безусловно, поможет вам понять указатели, арифметику указателей, выравнивание структуры данных, расширение знаков и даже производительность программного обеспечения и поведение операционной системы, если вы в некоторой степени понимаете аппаратное обеспечение.

1 голос
/ 28 февраля 2009

Это дало мне больше уверенности в том, что я делал, и дало мне знания о том, когда сосредоточиться на производительности или удобстве обслуживания (почти в 99% случаев я выбираю последнюю:)

1 голос
/ 28 февраля 2009

«Если мы начнем с уровня ЦП и научим оттуда, мы можем обнаружить, что можем понять, как легче манипулировать им на высоком уровне».

Ложные.

Я начал программировать в 70-х годах, когда вам абсолютно необходимо было знать, как работает аппаратное обеспечение, потому что вы выбрали Fortran (или Jovial) против ассемблера.

Теперь я использую Java и Python - ну, я понятия не имею. У меня есть ноутбук Dell, MacBook, iMac и сервер, который я не могу точно идентифицировать.

Это могут быть процессоры Intel или PowerPC или, ну, я думаю, сервер 64-битный, но я не знаю, какой именно.

Знание (очень много) о некоторых процессорах не помогло. Ничего не зная о современных процессорах, не мешает.

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

1 голос
/ 28 февраля 2009

Это один из тех вопросов, на которые нет единого ответа.

Практически, нет, в этом нет особой пользы, если только вы не делаете что-то очень конкретное (в этом случае вы бы задали гораздо более конкретный вопрос).

Теоретически, и это аргумент, который будут использовать все противники, да, всегда полезно знать (... почти все) ... пока не дойдет до программирования только с единицами и нулями:)

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

...