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

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

Предположу, что у вас уже есть кое-какие компьютерные знания, нужно только установить между ними определенные связи.

Начнем с самого простого: как компьютер интерпретирует числа? Скажем, как он складывает два числа?


Система счисления компьютера

Как известно, в компьютере используется двоичная система счисления.

Почему компьютеры используют именно ее? Почему они конвертируют в двоичную систему счисления и обратно, а не просто задействуют привычную нам десятичную систему счисления? Возможен ли десятичный компьютер (base10)?

Да, самый первый электронный компьютер ENIAC был основан на системе base10. Даже аналитический движок Чарльза Бэббиджа был полностью механическим и использовал стандартные числа base10.

Но зачем использовать двоичные числа? Не будет ли эффективнее хранить данные со сравнительно меньшим количеством схем (меньшим количеством цифр) для тех же вычислений?

Да, будет, но дело в том, что двоичная схема потребляет меньше энергии, что приводит к снижению стоимости и позволяет избежать однозначных вычислений.

Поэтому гораздо проще сделать схему, переключающуюся между двумя состояниями, например 0 и +5 V, чем, к примеру, между 10 состояниями.

Двухпозиционный электронный гейт переключается между выключением и включением.

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

А разве главное достоинство любой машины не состоит в снижении человеческого фактора? Небольшой просчет может нанести большой вред любому бизнесу. Причем спрогнозировать катастрофу будет невозможно.

Следовательно, нельзя полагаться на машину, склонную к сбоям.

Кто-то справедливо сказал, что компьютер не так уж и умен.

Это довольно эффективно и умно  —  взять логическую схему и заставить ее выполнять математические задания, но в конечном итоге она не делает никаких операций, с которыми бы не смог справиться 10-летний ребенок. Единственная разница между компьютером и 10-летним ребенком в этом смысле заключается в уровне точности и эффективности. Компьютеры не тормозят, не устают и не скучают.


Компьютерная алгебра

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

Следовательно, компьютеру нужна алгебра, способная работать с двоичными числами.

Ее создателем был Джордж Буль. В далеком 1847 году он разработал метод алгебры для двоичных значений, который принимает определенные входные данные и логически оценивает выходные. По сути, это он дал нам такие логические инструменты, как AND, OR, NOT, XOR и т.д.

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

Понимая это, можно легко объяснить, почему побитовые операции быстры и почему они поддерживаются на уровне процессора, учитывая тот факт, что компьютер выполняет вычисления только на уровне двоичных чисел.


А что, если потребуется написать функцию для сложения двух чисел, но без использования арифметических операторов? Без оператора + и нативных методов?

Как подойти к решению этой задачи?

Нужно знать, как компьютер работает внутри, чтобы оценить это вычисление. Тогда, возможно, потребуется пара минут, чтобы сформулировать логику.

Если вы изучали кибернетику, то, скорее всего, знакомы со схемами сумматоров. Обычно для оценки суммы заданных чисел используют две схемы суммирования, а именно полусумматор и полный сумматор.

Единственное различие между ними заключается в том, что схема полного сумматора выполняет многоуровневое сложение, учитывая бит переноса при сложении чисел, а схема полусумматора не учитывает бит переноса при сложении.

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

В данном случае алгебра сложения выполняется на двоичном (битовом) уровне, поэтому сумма и бит переноса оцениваются по отдельности. Например, если мы выполним 9 + 6 в десятичной системе счисления, это даст 15 (5 как сумма и 1 как перенос, и в итоге перенос будет оценен как 15).

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

В виде кода это можно записать следующим образом:

//логическая схема полусумматора

function addTwoNumbers(num1, num2) {
//зацикливание происходит до тех пор, пока бит переноса не станет нулевым
while (num2 !== 0) {

//применение побитового XOR между двумя входными данными для оценки суммарного бита
let sum = num1 ^ num2;

//применение побитового AND между двумя входными данными для получения бита переноса,
//а затем сдвижение влево на 1 бит, чтобы убедиться, что перенос добавлен в правильную позицию
let carry = (num1 & num2) << 1;

//переключение параметров на сумму и бит переноса, так что возвращается конечная сумма
//без переноса, и когда для num2 назначается перенос 0, while останавливается
[num1, num2] = [sum, carry];
}

//когда бит переноса становится нулевым и переключается на второй параметр,
//num1 возвращается с итоговым значением сложения
return num1;
}

addTwoNumbers(6, 9);

Следовательно, можно сказать, что вся сложная логика сводится к цифровой двоичной схемотехнике, которая есть не что иное, как цифровые логические гейты для облегчения алгебры двоичной системы счисления.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Diwakar Singh: How Does a Computer performs Mathematical Calculations under the hood?

Предыдущая статьяСбросы базовых CSS-стилей для применения в любом приложении
Следующая статья5 удивительных скрытых возможностей Python. Часть 1