Яким чином навчання монтажу допомагає програмуванню? [зачинено]


132

Я програмую мовами вищого рівня (Python, C #, VBA, VB.NET) близько 10 років, і я абсолютно нульове розуміння того, що відбувається, "під капотом".

Мене цікавить, у чому переваги навчання монтажу, і як це допоможе мені як програмісту? Чи можете ви надати мені ресурс, який точно покаже мені зв'язок між тим, що я пишу в коді вищого рівня, і тим, що відбувається в зборах?


2
Якщо ви дійсно хочете дізнатися, що знаходиться під вашим кодом, тоді подивіться посібник з процесорів Intel (лише вступна частина): download.intel.com/products/processor/manual/325462.pdf . Можливо, це трохи глибше, ніж ви хотіли, але я вважаю це корисним.
superM

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

6
Якщо ви навчитесь складанню, ви можете уникнути думки, що ви оптимізуєте forцикл, оголосивши змінні поза ним. приклад
StriplingWarrior

7
Боже мій. Ви щойно нагадали мені про клас мов Асамблеї, який я взяв у коледжі близько 1 року тому. Просто дивовижно бачити, як надзвичайно прості речі, які ми сприймаємо як належне, перекладаються сотнями, а то й тисячами менших і більш низьких операцій. Комп'ютери - надзвичайні машини.
Radu Murzea

14
Навчання збірці подарує вам глибоку та незмінну любов до концепції мови програмування, яка захистить вас від КОГО-небудь, коли потрібно буде знову писати складний код на зборах.
Шадур

Відповіді:


188

Тому що ти зрозумієш, як це насправді працює.

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

Це зводиться до того, що всі речі, які ми пишемо на C # або Python, потрібно перекласти в послідовність основних дій, які може виконати комп'ютер. Дуже легко думати про комп’ютер з точки зору класів, дженериків та списків, але вони існують лише у наших мовах програмування високого рівня.

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


12
+1 для "Ви більше оціните конструкції в мовах програмування вищого рівня". Чудова відповідь.
DevSolo

42
За винятком того, що через кілька тижнів роботи asm, ви почнете думати про С як про мову програмування високого рівня. Якщо ви не розмовляєте з розробниками вбудованих пристроїв низького рівня, кажучи, що вголос змусить більшість людей думати, що ви трохи з розуму.
Dan Neely

19
@Dan: Смішно, як ці терміни змінюються з часом. 20 років тому, коли я починав програмувати, якщо ви попросили когось, що він скаже: "Звичайно, C - це мова високого рівня!" Це повинно бути очевидним; він забезпечує стандартизовану модель доступу до купи та пам’яті. І це якась серйозна абстракція від апаратури; мовою низького рівня вам потрібно буде самостійно відслідковувати всі адреси пам'яті, або якщо ви робите щось по- справжньому фантазійне, ви пишете власний розподільник купи! Тож я маю задатися питанням, які критерії, які сьогодні роблять щось на високому чи низькому рівні?
Мейсон Уілер

9
Високий / низький рівень не є бінарним. Добре закруглений програміст, який написав і збірку, і Python у своїй кар'єрі, може вважати C або C ++ мовою середнього рівня.
Рассел Борогов

6
Це важливі речі для розуміння, але вони легко висвітлюються на абстрактному рівні: наприклад, у вступному курсі на комп’ютерах на рівні машинного навчання. Я не програміст з монтажу, але я їх добре розумію, якщо сам це скажу. У деяких відповідях ТА я бачу обговорення кешів інструкцій та конвеєрів, і ці дійсно змушують мою голову крутитися; але цей рівень підінструкції (поки що) відсутній у відповідях. То яка ж користь від того, щоб насправді вивчити програму монтажу, на відміну від курсу основ?
alexis

33

Це дасть вам краще розуміння того, що "відбувається під кришкою" та як працюють покажчики та значення змінних регістрів та архітектури (розподіл пам'яті та управління, передача параметрів (за значенням / за посиланням) тощо) загалом.

Для швидкого погляду з C як це?

#include <stdio.h>

main()
{
  puts("Hello World.");
  return(0);
}

компілюйте gcc -S so.cі подивіться на висновок збірки в so.s:

 $ cat so.s

    .file   "so.c"
    .section    .rodata
.LC0:
    .string "Hello World."
    .text
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    $.LC0, (%esp)
    call    puts
    movl    $0, %eax
    leave
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
    .section    .note.GNU-stack,"",@progbits

2
+1: Гарна порада! Ви можете багато чого навчитися, подивившись, що робить компілятор C.
Джорджіо

8
... Чи був SOS навмисним? (заклик на допомогу тощо)
Ізката

1
@Izkata ha ha .. хороший, я навіть цього не помічав. У мене є стандартний so.cфайл для StackOverflow питань (наприклад , у мене є so.py, і so.awkт.д.) , щоб перевірити речі швидко. So.S .. :)
Левон

9
Якщо ви компілюєте, gcc -O -c -g -Wa,-ahl=so.s so.cви можете побачити вихідний збірник для кожного рядка коду С. Це полегшує розуміння того, що відбувається.
Маккі Мессер

1
Так, вихід довгий. Ви можете шукати 5:so.cкод для рядка 5 so.c.
Маккі Мессер

30

Я думаю, що відповідь, яку ви шукаєте, тут: http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language

Цитата зі статті:

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

Справа в тому, що чим складніші мови високого рівня стають, і чим більше записаних ADT (абстрактних типів даних), тим більше витрат на підтримку цих варіантів. У випадках .NET, можливо, роздутий MSIL. Уявіть, якби ви знали MSIL. Ось де блищить мова складання.

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

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

Додатково я рекомендую цю книгу, оскільки вона має спрощену версію комп’ютерної архітектури: Вступ до обчислювальних систем: від бітів і воріт до C і далі, 2 / е Йель Н. Патт, Техаський університет в Остіні Санджай Дж. Патель, Університет Іллінойсу в Урбані / Шампань


7
Тут описано, для чого використовується ASM, і згадується, що ЛПВЩ роздуті, але єдиною конкретною перевагою, що надається для вивчення ASM, є написання надшвидкого коду. Так, але навіть якщо ви дізнаєтесь про ASM, наскільки ймовірно, ви насправді включите його в додатки? Припустимо, що ви пишете бізнес-програми, а не апаратні контролери чи драйвери пристроїв.

+1 @notkilroy, дякую за посилання та особливо рекомендацію щодо книги
Ентоні

2
@Jon, я дійсно не розумію, чому б ти це робив, якщо розробляєш бізнес-програмне забезпечення. Одна справа, якщо ви DBA або пишете компілятор або маєте обмежений простір пам’яті, але я не думаю, що багато людей до нього часто торкаються. Оптимізацією в основному опікується компілятор, що є найбільшою причиною писати на зборах. Іноді це допомагає відстежувати витоки пам'яті.
Brynne

Оскільки я спеціалізуюся на розробці бізнес-додатків, я в основному покладаюся на засоби розробки додатків на основі SQL, які використовують 4GL. Вони дозволяють мені швидко прототипувати додаток і налаштувати його у виробничу систему. Рідко мені потрібно написати cfunc для дзвінка. Час доставки та час на зміни - це великі фактори в моєму світі!
Френк Р.

2
Я зовсім не згоден. Автоматизований оптимізатор часто може вибити людину-програміста при створенні швидкої збірки.
DeadMG

22

На мою скромну думку, це не дуже допомагає.

Раніше я дуже добре знав збірку x86. Це трохи допомогло, коли збірка з'явилася на моїх курсах, вона з’явилася один раз під час інтерв'ю, і це допомогло мені довести, що компілятор (Metrowerks) генерував поганий код. Це захоплююче, як комп’ютер насправді працює, і я відчуваю себе інтелектуально багатшим за те, що навчився цьому. У той час було також дуже весело грати.

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

Я визнаю, що багато питань, які програмісти на C ++ досі корисно задають, отримують інформацію, знаючи збірку. Наприклад: чи слід використовувати змінні стека чи купи? я повинен пройти за значенням або за посиланням const? Практично у всіх випадках я думаю, що цей вибір слід робити на основі читабельності коду, а не обчислювальної економії часу. (Наприклад, використовуйте змінні стека всякий раз, коли ви хочете обмежити змінну областю.)

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


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

Оптимізація - це не причина, щоб навчитися цьому. У цьому аспекті я погоджуюся з Нілом Г. Однак, Ніл G не вистачає суті; Він недооцінює, як його основне розуміння реальної машини повідомляє, як він використовує мову високого рівня.
Warren P

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

У наші дні дуже мало випадків кодування при складанні, але знання того, як це працює, просто безцінне і багато допоможе тим, хто хоче знати, як це все працює. Мені, наприклад, важко слідкувати за речами, коли я не знаю, чому це відбувається.
Вінгер Сендон

21

Ви повинні бути знайомі з рівнем «глибше» в системі, в якій працюєте. Пропустити занадто далеко вниз за один рух - це не погано, але може бути не таким корисним, як хотілося б.

Програміст на мові високого рівня повинен вивчити мову нижчого рівня (C - відмінний варіант). Вам не потрібно пройти весь шлях до складання, щоб зрозуміти, що відбувається під кришками, коли ви кажете комп'ютеру створити об'єкт, створити хеш-таблицю чи набір - але ви повинні мати змогу кодувати їх.

Для програміста Java, вивчення деяких С допоможе вам у управлінні пам'яттю, передачі аргументів. Написання деякої великої бібліотеки Java на C допоможе зрозуміти, коли використовувати яку реалізацію Set (ви хочете хеш чи дерево?). Робота з char * у потоковому середовищі допоможе зрозуміти, чому String незмінний.

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


1
Один рівень глибший - приблизно правий. Я схильний піти на пару, але припускаючи, що знання монтажу x86 варті інвестицій порівняно з вивченням MSIL для програміста на C # дуже багато просять. Як хтось, хто вивчав фізику складання та фізику твердого тіла в університеті, я не думаю, що знання фізики дизайну воріт мені зовсім не допомогло, окрім того, що закінчив ступінь з електроніки.
Мухаммед Алкарурі

@MuhammadAlkarouri Я роздумував над принципами розуміння витоку струму, тривалості пробігів, опору та впливу тепла на систему. Розуміння основного "чому" допомагає у прийнятті рішень більше, ніж правила мінімального розділення слідів та допусків до експлуатації.

5

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

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

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


5

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

Чому? Коли справи йдуть не так, знання базової механіки набагато простіше налагодити дивні проблеми, і, природно, написати більш ефективний код

Використовуючи Python (/ CPython) як приклад, якщо ви починаєте отримувати дивні збої або низьку продуктивність, знання про те, як налагодити код C, може бути дуже корисним, як і знання про метод управління перерахунком пам'яті. Це також допоможе вам дізнатися, коли / якщо написати щось як розширення C і так далі ...

Щоб відповісти на ваше запитання в цьому випадку, знання монтажу насправді не допомогло б досвідченому розробнику Python (це занадто багато кроків в абстракції - все, що зроблено в Python, призведе до безлічі інструкцій по збірці)

.. але якщо у вас є досвід роботи з C, то знання "наступного рівня вниз" (складання) дійсно було б корисним.

Аналогічно, якщо ви використовуєте CoffeScript, тоді (дуже) корисно знати Javascript. Якщо ви використовуєте Clojure, знання Java / JVM є корисним.

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


3

Напишіть невелику програму c і розберіть вихід. Це все. Однак будьте готові до більшої чи меншої міри коду "ведення господарства", який додається на користь Операційної системи.

Збірка допомагає зрозуміти, що відбувається під кришкою, оскільки вона стосується безпосередньо пам’яті, регістрів процесорів тощо.

Якщо ви дійсно хочете пройти голий метал без усієї складності операційної системи, що ускладнює справи, спробуйте запрограмувати Arduino на мові збірки.


3

Однозначної відповіді немає, оскільки програмісти не всі типу. ЧИ ПОТРІБНО знати, що ховається під ним? Якщо так, то дізнайтеся це. ви просто хочете навчитися цього з цікавості? Якщо так, то дізнайтеся це. Якщо це не матиме практичної користі для вас, то навіщо турбуватися? Чи потрібен рівень знань механіка лише для того, щоб керувати автомобілем? Чи потрібен механіку рівень знань інженера, просто для роботи на машині? Це серйозна аналогія. Механік може бути дуже хорошим, продуктивним механіком, не пірнаючи на глибину інженера, розуміючи транспортні засоби, які він підтримує. Те саме для музики. Ви справді обробляєте складності мелодії, гармонії та ритму, щоб бути хорошим співаком чи гравцем? Ні. Деякі винятково талановиті музиканти не можуть прочитати лайку з нот, не кажучи вже про різницю між режимами Доріана та Лідії. Якщо ви хочете, добре, але ні, не потрібно. Якщо ви веб-розробник, монтажу немає практичного використання, яке я можу придумати. Якщо ви перебуваєте у вбудованих системах чи щось справді спеціально, то це може знадобитися, але якби воно було, ви б це знали.

Ось Джоел взяв на себе ці значення нахилу мови не високого рівня: http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html


2

Насправді, що, напевно, було б найкращим для вас - це клас, який не існує (наскільки мені відомо) ніде: це був би клас, який поєднує короткий огляд концепцій машин / асемблера та зберігання адресних концепцій з туром через побудову компілятора , генерація коду та середовища виконання.

Проблема полягає в тому, що з мовою на високому рівні, далеко від апаратної мови, як C # або Python, ви не дуже цінуєте той факт, що кожен ваш хід перетворюється на сотні, якщо не тисячі інструкцій на машині, і ви не не схиляюсь до розуміння того, як кілька рядків мови високого рівня можуть спричинити доступ і модифікацію величезної кількості сховищ. Справа не стільки в тому, що потрібно точно знати, що відбувається "під обкладинками", але потрібно оцінити масштаби того, що відбувається, і загальну концепцію видів речей, що відбуваються.


1

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

Відповідно до цієї публікації в блозі Джеффа Етвуда , в якій згадується дослідження, розуміння завдання є ключовим питанням у розумінні програмування. Програмісти, які навчаються, або розуміють, що позначення просто представляє кроки, якими слід комп'ютер, і причини, що їх виконують, або ж постійно заплутується в оманах аналогій з математичними рівняннями тощо.

Ну, якщо ви розумієте наступне з 6502 асемблера ...

LDA variable
CLC
ADC #1
STA variable

Це насправді лише кроки. Тоді, коли ви навчитеся перекладати це на заяву про призначення, ...

variable = variable + 1;

Вам не потрібна оманлива аналогія з математичним рівнянням - у вас вже є правильна ментальна модель, щоб відобразити її.

EDIT - звичайно, якщо пояснення, яке ви отримуєте, LDA variableє в основному ACCUMULATOR = variable, саме це ви отримуєте з підручників та довідок, ви опинитесь там, де ви почали, і це зовсім не допоможе.

Я засвоїв асемблер 6502 як свою другу мову, перша - Commodore Basic, і я не дуже навчився цього часу - почасти тому, що вивчити було так мало, а також тому, що тоді асемблер здавався набагато цікавішим . Частково часи, частково тому, що я був 14-річним виродком.

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


0

Якщо ви не письменник-компілятор або вам не потрібне щось високо оптимізоване (наприклад, алгоритм обробки даних), навчання кодування асемблерів не надасть вам ніяких переваг.

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

Стаття " Оптимізація для SSE: Аналіз випадку " показує, що можна зробити, якщо ви переходите до складання. Автору вдалося оптимізувати алгоритм від 100 циклів / вектор до 17 циклів / вектор.


1
Автор не використовував жодних векторних вказівок чи внутрішніх текстів у версії C ++. Вам не потрібен асемблер, щоб написати код SSE.
gnasher729

@ gnasher729 Так, вам не потрібно. Але при складанні програма може працювати набагато швидше. Людина може бути розумнішою, ніж компілятор (в рідкісних випадках).
BЈоviћ

0

Писання в збірці не дасть вам магічного збільшення швидкості, оскільки завдяки кількості деталей (розподіл реєстру тощо) ви, ймовірно, напишете самий тривіальний алгоритм.

Крім того, з сучасними (читання - розробленими після 70-80-х років) складання процесорів не дасть вам достатньої кількості деталей, щоб знати, що відбувається (тобто - на більшості процесорів). Сучасні ПУ (процесори та графічні процесори) є досить складними, оскільки йдеться про інструкції щодо планування. Знання основ складання (або псевдоскладування) дозволить зрозуміти книги / курси архітектури комп’ютера, які дадуть додаткові знання (кеші, виконання поза замовленнями, MMU тощо). Зазвичай вам не потрібно знати складні ISA, щоб їх зрозуміти (MIPS 5 - досить популярний IIRC).

Навіщо розуміти процесор? Це може дати вам набагато більше розуміння того, що відбувається. Скажімо, ви пишете матричне множення наївно:

for i from 0 to N
    for j from 0 to N
        for k from 0 to N
            A[i][j] += B[i][k] + C[k][j]

Це може бути "досить добре" для вашої мети (якщо це матриця 4x4, вона все одно може бути складена до векторних інструкцій). Однак при складанні масивних масивів є досить важливі програми - як їх оптимізувати? Якщо ви пишете код на зборах, у вас може бути поліпшення на кілька% (якщо ви не зробите так, як це робить більшість людей - також наївним способом, недостатньо використовуючи регістри, постійно завантажуючи / зберігаючи в пам'ять і фактично маючи повільнішу програму, ніж на мові HL) .

Однак ви можете перетворити рядки тхо і магічним чином отримати продуктивність (чому? Я залишаю це як "домашнє завдання") - IIRC, залежно від різних факторів для великих матриць, це може бути навіть 10 разів.

for i from 0 to N
    for k from 0 to N
        for j from 0 to N
            A[i][j] += B[i][k] + C[k][j]

Це сказало - там працюють над компіляторами, які можуть це зробити ( графіт для gcc та Polly для будь-якого використання LLVM) Вони навіть здатні перетворити це на (вибачте - я пишу блокування з пам'яті):

for i from 0 to N
    for K from 0 to N/n
        for J from 0 to N/n
            for kk from 0 to n
                for jj from 0 to n
                    k = K*n + kk
                    j = J*n + jj
                    A[i][j] += B[i][k] + C[k][j]

Підводячи підсумок - знання основ складання дозволяє вам зануритися в різні "деталі" з дизайнерського процесора, що дозволить вам писати швидші програми. Можливо, буде добре знати відмінності між архітектурами RISC / CISC або VLIW / векторний процесор / SIMD / ... Однак я б не починав з x86, оскільки вони, як правило, досить складні (можливо, і ARM) - знаючи, що таке реєстр тощо, достатньо для запуску IMHO.


Мені цікаво, що ви надали кілька зразків коду, але жоден з них не є мовою складання.
Роберт Харві

-1

Зазвичай це ДУЖЕ важливо для налагодження. Що ви робите, коли система переривається посеред інструкції і помилка не має сенсу? Набагато менше проблем з мовами .NET, поки ви використовуєте лише безпечний код - система майже завжди захищатиме вас від того, що відбувається під кришкою.


-2

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

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

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


-3

Я б рекомендував вивчати алгоритми: сортування, зв'язані списки, двійкові дерева, хешування тощо.

Також дізнайтеся lisp, див. Структура та інтерпретація комп'ютерних програм groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures Цей відеокурс навчить вас усьому, що вам потрібно знати, включаючи алгоритми (як робити все на основі декілька примітивних команд, одна примітивна примітка та деякі провокатори асемблера).

Нарешті, якщо ви повинні навчитися асемблеру, вивчіть такий простий, як ARM (також він використовується приблизно в 4 рази більше пристроїв, ніж x86).


-8

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

Дизайн мов походить від того, як працює процесор. Більше для програм низького рівня, менше для програм високого рівня.

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

Деякі приклади: Є багато програмістів java, які не розуміють, чому це не працює, і навіть менше, ніж знають, що відбувається при його запуску.

String a = "X";
String b = "X";
if(a==b)  
    return true;

Якби ви знали невеликого асемблера, ви завжди знали б, що це не той самий вміст місця в пам'яті та число в змінній покажчика, яке "вказує" на це місце.

Ще гірше, що навіть у виданих книгах ви прочитаєте щось на зразок у JAVA, примітиви передаються за значенням та предметами за посиланням, що абсолютно невірно. Усі аргументи на Java передаються за значенням, і Java НЕ може передавати об'єкти функціям, лише покажчики, які передаються за значенням.

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

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


5
Ваш перший абзац абсолютно невірний: мови не компілюються в ASM, вони збираються в машинний код. Інтерпретатори також не компілюються в ASM, вони інтерпретують код або байт-код і викликають функції або методи на попередньо складеному машинному коді.

6
Жодна річ, на яку ви заявляєте про Java, також неправильна. Починаючи з того, String a = "X"; String b = "X"; if( a==b) return true;що робить насправді == trueчерез щось, що називається String interningкомпілятором. Усі інші заяви Java також неправильні. У Java немає вказівників, у неї є посилання, які не є тим самим. І жодне з цього не має нічого спільного з асемблером. Java передає примітиви за значенням, а також посилання за значенням. У Java немає покажчиків, тому вона не може передати їх нічим. Знову все неважливо до знання ASM.

Я завжди думав, що мови вищого рівня збираються в об'єкт (машинний код) або псевдо-код, а не в ASM.
Френк Р.

@FrankComputer правильний, але машинний код байтує в значній мірі мапу 1: 1 до інструкцій по збірці, тому ви можете легко перекласти між кодовим об'єктом і ASM (декомпіляція або складання)
1212

2
@FrankComputer востаннє я шукав компільований gcc C / C ++ / fortran / java / ada / тощо на внутрішній байт-код, а внутрішній байт-код на асемблер. Потім він відправляє цей код асемблера до асемблера, щоб перетворити його в машинний код.
ctrl-alt-delor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.