Як функціонує ціле порівняння всередині?


18

Наприклад, при порівнянні двох цілих чисел наступним чином на мові, подібній С:

if (3 > 2) {
    // do something
}

Як судження, 3 чи більше, ніж 2 (істинне) чи ні (помилкове), зроблене внутрішньо?


19
Поточна відповідь в порядку, коли порівняння стосується змінного вираження, але не вистачає відмови від того, що багато сучасних компіляторів переглянуть ваш фрагмент коду, виявлять, що вираз завжди буде правдивим (через літерали) і просто ігнорують ifвзагалі , переходячи безпосередньо до кодування do something.
SJuan76

3
Можливий дублікат роботи комп’ютерів?

3
@Snowman Я не згоден. Будь-який запит програмування "як це працює" може бути скорочений до цього питання, але це не робить їх дублікатами.
user1643723

1
@ user1643723 Це робиться, коли розглядається функція є певним кодом.
chrylis -на страйк-

1
@ user1643723 Питання полягає в питанні про те, як комп'ютер виконує основну операцію, а у верхній відповіді обговорюються логічні ворота та логічні таблиці. Дві теми, які широко висвітлені у верхній відповіді цілі дупи, яка також відповідає на ваше запитання.

Відповіді:


61

По всьому кроликовій норі, так? Гаразд, я спробую.

Крок 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 . Клацніть тут для декількох прикладів, щоб побачити, як вони підключаються.

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

Деякі додаткові примітки:

  1. Код, який ви написали, був би фактично попередньо обчислений компілятором і не виконується під час виконання, оскільки він складається виключно з констант.

  2. Деякі компілятори не компілюються в машинний код, але вводять ще один рівень, наприклад, байт-код Java або проміжну мову .NET. Зрештою, все це виконується за допомогою машинної мови.

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


3
FWIW, посилання на TTL може бути заплутаним, оскільки практично жоден сучасний процесор не використовує TTL-сигналізацію, більшість з них використовує CMOS FET і нижчі напруги замість 5v BJT.
whatsisname

2
CMOS , безумовно, буде кращим посиланням, ніж TTL, як підказує @whatsisname, оскільки це не тільки точніше, що відбувається в сучасних процесорах, але й концептуально набагато простіше.
Жуль

3
@JackAidley ось що означає ця частина: "Іншими словами, 2 віднімається з 3 в одній інструкції, а наступна інструкція перевіряє, чи переповнена вона".
KutuluMike

1
Нітпікінг: я вважаю, що він CMPби використовувався, ні SUB- але знову ж таки, це більш-менш " SUBколи результат ігнорується і встановлюються лише прапори"
Хаген фон Ейтцен

5
Ваші визначення напів- та повних добавок невірні. Половина суматора бере два 1-бітні входи і повертає суму та перенос. Повний суматор приймає додатковий вхід, але все ще залишається лише одним бітом. Існує багато способів створити N-бітну суматор, найпростіший - суматор з пульсацією, який є лише ланцюжком з N повних суматорів. На практиці для великих НС це має досить погану затримку, тому більш складні конструкції використовуються в сучасних процесорах.
Voo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.