Для чого нам потрібна мова складання?
Ну, насправді є лише одна мова, яка нам коли-небудь знадобиться , яка називається "машинна мова" або "машинна код". Це виглядає приблизно так:
0010000100100011
Це єдина мова, на якій ваш комп'ютер може говорити безпосередньо. Це мова, якою розмовляє процесор (а технічно різні типи процесорів говорять в різних версіях). Це також смокче подивитися і спробувати зрозуміти.
На щастя, кожен розділ двійкового відповідає певному значенню. Він розділений на ряд розділів:
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
Ці значення відповідають:
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
Таким чином, ця операція додала б цифри в регістри 1 і 2 і поставила б це значення в регістр 3. Якщо ви буквально введете ці значення в процесор і скажете йому "йти", він додасть два числа для вас. Операція "віднімання" може бути 0011 або щось подібне, а не 0010 тут. Яке б значення не змусило процесор робити віднімання.
Отже, програма могла б виглядати приблизно так (не намагайтеся її зрозуміти, оскільки я створив саме цю версію машинного коду для пояснення речей):
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
Це смокче читати? Безумовно. Але нам це потрібно для процесора . Добре, якщо кожен машинний код відповідає певній дії, давайте просто зробимо просту "англійську" стенограму, а потім, коли ми зрозуміємо, що робить програма, перетворіть її в справжній двійковий машинний код і дамо CPU для запуску.
Тож наша оригінальна інструкція зверху могла виглядати так:
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
Зауважте, що ця англійська версія має точне відображення машинного коду . Тож коли ми пишемо рядок цієї "англійської", ми справді просто пишемо дружніший та зрозуміліший машинний код.
Ну, це мова монтажу. Ось чому воно існує і чому воно спочатку було створене.
Щоб зрозуміти, навіщо він нам потрібен зараз, прочитайте вищевказані відповіді, але ключовим для розуміння цього є: Мови високого рівня не мають єдиного представлення - це машинний код. Напр. В C, або Python, або що завгодно:
z = x + y
Це звучить так само, як наше доповнення зверху, якщо припустити, що x
це в регістрі 1, y
в регістрі 2, і z
повинно бути в реєстрі 3. Але що з цим рядком?
z = x * 2 + (y / 6) * p + q - r
Спробуйте представити цей рядок у 16 бітах двійкових і скажіть процесору "йти". Ви не можете. У машинному коді немає жодної інструкції з експлуатації для виконання додавання, віднімання та будь-чого іншого з 4 або 5 змінними одночасно. Тож спочатку його потрібно перетворити на послідовність машинного коду. Це те, що ти робиш, коли "компілюєш" чи "інтерпретуєш" мову високого рівня.
Ну, у нас є програми для цього, тож навіщо нам зараз збирання? Добре сказати, що ваша програма працює повільніше, ніж ви очікували, і ви хочете знати, чому. Дивлячись на "вихід" машинної мови цього рядка, це може виглядати так:
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
Просто для того, щоб виконати цей один рядок Python. Тож ти справді хочеш це налагодити?!?!?! НІ . Швидше ви просите свого компілятора люб’язно дати вам вихід у формі, яку ви насправді легко зрозумієте, що є мовою збірки, що відповідає саме цьому машинному коду. Тоді ви можете зрозуміти, чи робить ваш компілятор щось тупо, і спробувати це виправити.
(Додаткова примітка до порад @ Рафаеля: Ви насправді можете побудувати процесори, які працюють з іншими речами, крім двійкових кодів, як, наприклад, потрійний (основа 3) або десятковий код, або навіть ASCII. Для практичних цілей ми дійсно дотримувались двійкового.)