Наприклад, при порівнянні двох цілих чисел наступним чином на мові, подібній С:
if (3 > 2) {
// do something
}
Як судження, 3 чи більше, ніж 2 (істинне) чи ні (помилкове), зроблене внутрішньо?
Наприклад, при порівнянні двох цілих чисел наступним чином на мові, подібній С:
if (3 > 2) {
// do something
}
Як судження, 3 чи більше, ніж 2 (істинне) чи ні (помилкове), зроблене внутрішньо?
Відповіді:
По всьому кроликовій норі, так? Гаразд, я спробую.
Крок 1. Від C до машинної мови
Компілятор C трансформує ваше порівняння в опкоди, що зберігаються машинною мовою . Мова машини - це серія чисел, яку процесор інтерпретує як інструкцію. У цьому випадку буде два коди: "відняти з ніс" і "стрибнути, якщо нести". Іншими словами, 2 віднімається від 3 в одній інструкції, а наступна інструкція перевіряє, чи не переповнюється вона. Цьому передують дві інструкції щодо завантаження чисел 2 і 3 у місця, де їх можна порівняти.
MOV AX, 3 ; Store 3 in register AX
MOV BX, 2 ; Store 2 in register BX
SUB AX, BX ; Subtract BX from AX
JC Label ; If the previous operation overflowed, continue processing at memory location "Label"
Кожне з перерахованих вище має бінарне подання; наприклад, код SUB
є 2D
гекс, або00101101
в двійковій системі .
Крок 2. Провокує до АЛУ
Арифметичні опкоди подобається ADD
, SUB
, MUL
і DIV
виконувати основні целочисленную арифметику з використанням ALU або арифметико - логічний пристрій , вбудований в CPU. Числа зберігаються в регістрах деякими опкодами; інші опкоди доручають мікросхемі викликати ALU, щоб робити математику на тому, що зберігається в регістрах на той час.
Примітка. На даний момент ми набагато перевищує те, про що будь-який інженер-программіст буде хвилюватися, працюючи з 3GL зразок C.
Крок 3. АЛУ, напівсума і повний суматор
Чи знали ви, що всі математичні операції, про які ви знаєте, можна звести до серії операцій NOR ? І саме так працює АЛУ.
АЛУ знає, як працювати з двійковими числами, і може виконувати лише логічні операції, такі як АБО, НЕ, І і XOR. Реалізація двійкового додавання і віднімання здійснюється за допомогою ряду логічних операцій, розташованих певним чином, в підсистемі, відомій як суматор . Ці підсистеми складаються з мережі "напівдобавок", які працюють на два біти і визначають їх однобітну суму та однорозрядний прапор перенесення. Об’єднавши їх разом, ALU може виконувати операції над номерами з 8, 16, 32 і т.д. бітами.
Що з відніманням? Віднімання - це ще одна форма додавання:
A - B = A + (-B)
В обчислює ALU -B
, взявши з доповненням до двох зB
. Після того як воно буде перетворене в негативне, подання значення на суматор призведе до операції віднімання.
Крок 4: Останній крок: на мікросхемі транзистори
Операції суматорів реалізуються за допомогою комбінації електричних компонентів, які взаємодіють для створення "логічних воріт", таких як ті, що знаходяться в логіці транзистора-транзистора або TTL, або в CMOS . Клацніть тут для декількох прикладів, щоб побачити, як вони підключаються.
На мікросхемі, звичайно, ці "схеми" реалізовані мільйонами крихітних шматочків струмопровідного та непровідного матеріалу, але принцип такий же, як якщо б вони були повнорозмірними компонентами на макетній дошці. Подивіться це відео, яке показує всі транзистори на мікрочіпі через об'єктив електронного мікроскопа.
Деякі додаткові примітки:
Код, який ви написали, був би фактично попередньо обчислений компілятором і не виконується під час виконання, оскільки він складається виключно з констант.
Деякі компілятори не компілюються в машинний код, але вводять ще один рівень, наприклад, байт-код Java або проміжну мову .NET. Зрештою, все це виконується за допомогою машинної мови.
Деякі математичні операції насправді не обчислюються; вони розглядаються в масивних таблицях на арифметичній копроцесорній одиниці або містять комбінацію пошуку та обчислення або інтерполяції. Прикладом може бути функція обчислення квадратного кореня . Кожен з сучасних процесорів ПК має в кожному ядрі процесора блок вбудованої плаваючої точки.
CMP
би використовувався, ні SUB
- але знову ж таки, це більш-менш " SUB
коли результат ігнорується і встановлюються лише прапори"
if
взагалі , переходячи безпосередньо до кодуванняdo something
.