Чи розумно розробнику високого рівня витрачати час на вивчення монтажу? [зачинено]


33

Зрозуміло, що знання матеріалів низького рівня є дуже важливими в нашій роботі.

Але в ситуації, коли ви вже розробляєте комерційне програмне забезпечення на високому рівні, і коли у вас вже є обраний напрямок, але ви не маєте жодної навички складання, чи не розумніше зосередитись на вивченні речей, пов’язаних із вашим напрямком? Або є причина, що вам все-таки доведеться витратити трохи часу, щоб вивчити основи низького рівня?

Коли вже пізно, а коли ні? І якщо це не пізно, то як можна було б навчатися оптимально (в сенсі не витрачати зайвий час, щоб отримати певну глибину та розуміння)?


Багато запитань в одному дописі :)
Шамім Хафіз

Мені подобалося мовлення асамблеї крок за кроком. Спочатку багато програм програмування noobie-ish, але автор дуже цікавий. Я виявив, що загальна ідея корисна, і я в першу чергу пишу JavaScript.
Ерік Реппен

Моєю першою (викладаною) мовою був складальний діалект. Я бачу, як це було б корисно (у ряді способів, які інші вказували), і це допомагає вам надати різний внесок для решти команди.
Джеймі Тейлор

Відповіді:


43

Не можу повірити, що ніхто не згадав про налагодження ...

Я не писав рядок коду складання вже багато років. Але я читаю це досить часто. Налагодження на високому рівні чудово, коли у вас є інформація про джерело та символи, але коли ваша фантазійна бібліотека кидає безперебійний виняток на машинах клієнтів, занадто пізно вимагати включення її до ліцензії ...

Але я все ще можу відкрити розбиральник і побачити, що в кінцевому підсумку ваша логіка високого рівня в кінцевому підсумку зробила , простежте погані дані до їх походження, дізнайтеся, хто змінив реєстр контролю FPU ...

Це врятувало моє бекон частіше, ніж мені до думки. І ніколи не пізно вчитися - у мережі Мережі є багато чудових довідок та навчальних посібників , і майже будь-яка програма, що працює на вашій машині, може забезпечити практичне середовище.


10
+1, і я б більше підтримав це, якби міг. Кожен серйозний розробник повинен мати можливість прочитати ASM для цього, якщо немає інших причин.
Мейсон Уілер

3
Наслідком цього є оптимізація. Знання того, як комплаєр переводить ваш код на збірку, може допомогти вам зробити це значно швидше!
ламбак

3
+1 Збірка - одна з єдиних мов, яка змушує вас зрозуміти, як працює процесор насправді. Це допомагає вам у вашому розвитку з високим рівнем мови. Обов’язково прочитайте: blogs.msdn.com/b/ericlippert/archive/2010/09/30/…

Знання базового комп'ютера НЕБЕЗПЕЧНО корисно, будь то для налагодження, оптимізації чи чистої цікавості. Серйозно, навчіться читати хоча б одну-дві сім’ї асемблерної мови. Навіть якщо ви ніколи не читаєте її чи не пишете після її вивчення, це вплине на те, як ви розумієте речі в майбутньому. Тепер, якщо ви бажаєте писати ні якою іншою мовою, це може бути трохи ...
Майкл Трауш

1
@Mason: Я не знаю, чи повинен "кожен серйозний розробник" вміти читати ASM. Якщо ви пишете JavaScript або використовуєте мову програмування, побудовану на товстій основі (наприклад, .NET або Java), я б не вважав, що я можу читати ASM як важливу для серйозного розробника. Незважаючи на це, розуміння того, як комп’ютер виконує інструкції на дуже низькому рівні, може бути дуже корисним, навіть у мовах програмування більш високого порядку.
Скотт Мітчелл

15

Вам не потрібно вивчати мову складання, просто потрібно зрозуміти, як це працює. Вам потрібно знати, що таке XOR, і рахувати двійкові уві сні і т. Д. Але мені ніколи не потрібен збірний код у своїй роботі.

Отже, як ви кажете, знання матеріалів низького рівня є важливими, але практичні знання в складанні - ні.


1
Я другий. Ви можете добре заробляти на програмі, і ніколи не потрібно читати / писати ASM. Є деякі позиції, які цього вимагають. Читання дампа після умови гонки у вашому коді призвело до порушення процесу. Або якщо ви пишете дуже Perf-інтенсивні програми (наприклад, паралелізація GPU / OpenCL). Відсоток робочих завдань, де вам потрібно буде виконати ці завдання, дуже малий.
yzorg

11

Якщо у вас справді немає навичок програмування низького рівня, я б дуже рекомендував вивчити деякі у вільний час. Вам не потрібно в цьому ставати експертом; просто досягти певного рівня знання. Ви повинні зробити багато математичної роботи самостійно, а не залежно від компілятора чи бібліотек, щоб зробити це за вас. Це допоможе зрозуміти читабельність в програмуванні, оскільки більшість інструкцій по збірці відповідають одній інструкції процесора. Ви повинні керувати складністю в трохи більших програмах самостійно, без вигоди подібних речей if...else. Це допоможе вам написати простіші програми високого рівня, адже досвід складання навчив би вас, наскільки простіше читати.

Крім того, пам’ятайте, що збірка - це не мова! Це загальний термін, який в основному означає набір інструкцій процесора, який був абстрагований до символічної мови. Різні процесори мають різні набори інструкцій, а отже, різні мови складання. Коли ви вивчаєте "складання", ви вивчаєте процес, а не мову.


8

Ви завжди отримаєте користь від того, щоб зазирнути під обкладинки та зрозуміти трохи більше про те, що сидить під абстракцією, яку ви стоїте на вершині. Як колись мій професор коледжу заявив, що "Всі хороші програмісти розуміють техніку" - вам не потрібно вміти створювати та маніпулювати схемами, але вам слід зрозуміти, що відбувається там - це лише зробить вам краще.

Спробуйте комп'ютерну організацію та дизайн


1

Так - Безперервне навчання протягом усього життя є важливою складовою кар'єри в галузі розробки програмного забезпечення. Якщо ви зацікавлені в тому, щоб продовжувати вивчати програмування та як вдосконалити своє ремесло, то так, у якийсь момент ви повинні вивчити складання, оскільки це відкриє вас абсолютно новою мовою та способом написання коду. З цієї ж причини я рекомендую експериментувати з багатьма мовами / стилями програмування, включаючи Ruby / Python (динамічна мова), Haskell / F # (чиста функціональна мова), Lisp / Scheme (функціональна мова) тощо.

Я б сказав, що вже пізно, якщо вам більше не цікаво дізнатися більше про ремесло програмування. Наприклад, якщо ви досягли точки своєї кар’єри, де незабаром можете перейти від програмування в іншу сферу, таку як управління, системна інженерія, продаж / маркетинг тощо. Якщо ви думаєте, ви можете перейти в нову область в У наступні кілька років я б більше зосереджувався на навичках, необхідних для розвитку в цій галузі, а не на ремеслі програмування.


1

Ви повинні знати, що це таке і чим займається комп’ютер. Вивчити щось на зразок MIX Knuth допоможе вам. Здебільшого можна судити про ефективність вашого коду. Перейдіть за мистецтвом комп’ютерного програмування і прочитайте його. Це зробить вас розумнішим програмістом.


1

Хіба не розумніше зосередитись на вивченні речей, пов’язаних із вашим напрямом? Або є причина, що вам все-таки доведеться витратити трохи часу, щоб вивчити основи низького рівня?

Відповідь:

  1. Якщо ви не плануєте змінювати свій напрямок на вбудовану програму систему, немає ніяких причин вивчати супровід. Навіть думав, що збірка залежить від процесора, ви можете вивчити деякі основи, але ваші знання будуть засновані на архітектурі процесора та інструкціях, встановлених для цього процесора.
  2. Скажімо, ви кодуєте для Windows. Якщо ви хочете вивчити мову нижчого рівня, ніж високий рівень, що може принести користь вашому поточному напрямку, я рекомендую вам вивчити Windows I глибокий, API Windows, управління пам'яттю Windows і т.д. Просто вивчіть ОС / платформу, яку ви кодуєте.
  3. Вдосконаліть свої навички на поточному мові високого рівня, такому як управління пам'яттю, збирання сміття тощо. Якщо ви хочете знизити рівень.

0

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


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

Якщо вам не вистачає знань у цих сферах, то ваше розуміння порушено під цим. Чим ближче до рівня, яким ви керуєте іншим шаром, тим важливіше мати в ньому заземлення.

Отже: Вам потрібно знати асемблер як кодер високого рівня?  Це допоможе.


0

Це було дуже важливо в моєму попередньому житті як гуру суперкомп'ютера. Тоді я відчував, що ти не розумієш машину, поки ти не написав принаймні кілька сотень рядків асемблера, і заграв у ній, намагаючись вичавити продуктивність. Оскільки дуже мало програмістів хотіли пройти так глибоко, це зробило мене справді незамінним. І я все ще маю спільну мову, коли розмовляю з типами дизайнерів HW.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.