Найти в Дзене
Hex Club

Базовые понятия об устройстве процессора и процессе компиляции

Большинство курсов по программированию основываются на быстром старте. Где на первом уроке уже предлагается написать первую программу, что то вроде “Hello, world!”. Которая оказывается набором эльфийских слов для начинающего программиста. И, к сожалению, остается таковым для большинства. Дело в том, что отсутствует понимания того, что происходит. Как текст на английском языке становится понятным для нашего ПК, гаджета, МК?
Ну а у кого-то и такого вопроса не возникает, потому что нет понимания того, что такое вычислительная система (в частности ПК, гаджет, или Мк). Давайте немного развеем пелену и приблизимся к понимаю того, что же такое ЭВМ в целом. Для начала немного определений.
Вычисли́тельная маши́на, счётная маши́на — механизм, электромеханическое или электронное устройство, предназначенное для автоматического выполнения математических операций.
Прародителями наших ПК были именно калькуляторы, как это не иронично. Но тогда они назывались гордо, вычислительными машинами. Нек

Большинство курсов по программированию основываются на быстром старте. Где на первом уроке уже предлагается написать первую программу, что то вроде “Hello, world!”. Которая оказывается набором эльфийских слов для начинающего программиста. И, к сожалению, остается таковым для большинства. Дело в том, что отсутствует понимания того, что происходит. Как текст на английском языке становится понятным для нашего ПК, гаджета, МК?
Ну а у кого-то и такого вопроса не возникает, потому что нет понимания того, что такое вычислительная система (в частности ПК, гаджет, или Мк). Давайте немного развеем пелену и приблизимся к понимаю того, что же такое ЭВМ в целом.

Для начала немного определений.

Вычисли́тельная маши́на, счётная маши́на — механизм, электромеханическое или электронное устройство, предназначенное для автоматического выполнения математических операций.

Прародителями наших ПК были именно калькуляторы, как это не иронично. Но тогда они назывались гордо, вычислительными машинами. Некоторых из них были механическими, какие, появившиеся позже стали работать на электричестве. Но всех их объединяло одно, они могли считать числа. Выполнять арифметические операции над ними. В дальнейшем с той же целью стали разрабатывать и компьютеры. Первые из них вовсе не были персональными, а очень дорогими и огромными ЭВМ, которые даже не каждая компания могла себе позволить. Со временем ситуация изменилась. Но не принцип.

Процессор нашего ПК по прежнему продолжает считать. В состав каждого процессора входит несколько основных блоков.

Набор регистров - это специфическая память, характерная именно для процессоров, отличается от остальной крайне высоким быстродействием.

Арифметико-логическое устройство (АЛУ) - устройство, часть процессора, предназначенная для выполнения арифметических и логических операций. Например, оно может сложить два числа. Или выполнить логическое “И” между ними, но об этом мы поговорим когда будем обсуждать мат. Логику.

Устройство управления (УУ) - это то, что определяет логику работы нашего процессора. Если АЛУ может вычислить что-то, то УУ говорить ему, что нужно вычислить.

Во всех современных процессорах существует еще много всего интересного, например кэш, но об этом мы поговорим, когда затронем архитектуру более серьезно.

А теперь самое сложное и важное. Как эльфийские магические руны, превращаются в понятный для железа язык? Для начала поймем, что же является для “железа” понятным языком? Многие слышали о каких-то там байтах и битах. 0-лях и 1-цах.

Введем понятия байта и бита.

Бит - единица измерения количества информации.
Байт = 8 бит.

-2

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

Так вот. Любая ЭВМ способна понимать и манипулировать лишь напряжением. Есть напряжение - это 1-ца. Нету, значит 0. Именно так все и кодируется. Внезапный переход от программирования в текстовом редакторе к электронике, но он очень важен.

В программировании, на мой взгляд, можно считать бит - единицей информации, которая сообщает нам что то, говорит о событии или о каком-то конкретном значении. Все числа в итоге кодируются с помощью бит в двоичной системе и могут быть представлены человеку как в двоичном виде, так и в десятичном, не редко используется 16-типичная форма записи (HEX). Связанно это с удобством представления байта в HEX. Байт как правило является не делимой величиной, компьютер не способен работать с объемом данных менее одного байта.

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

0b00001000(BIN) = 8(DEC) = 8(HEX)
HEX - 16-ричная
DEC - десятичная (наша, человеческая)
BIN - бинарная или двоичная

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

Я понял, что у нас образовался пробел. Вам сложно понять, как это хранится. Давайте представим, что память, будь то оперативная или регистровая, о которой мы говори ранее. Это такая микросхема, которая может поддерживать нужное напряжение, максимальное (U питания) или минимальное, 0. В зависимости от того, что ей было сказано делать. Которые позже интерпретируются как биты, а группы по 8 таких микросхем, лучше сказать структур, образуют ячейки в 1 байт памяти. Такие ячейки могут быть сгруппированы в большие интегральные схемы. (интегральные, это те, которые объединены в одном корпусе)

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

И так, существует два варианта сделать так, что бы наш код на эльфийском был выполнен компьютером. Компилировать или интерпретировать.

-3

«Пример кода на языке С++»

Компиляция - это процесс преобразования кода (эльфийских рун) в понятный компьютеру, машинный код. Машинный код, это и есть последовательность тех самых битов, объединенных в байты. Процесс компиляции крайне сложен, для высокоуровневых языков и включает себя множество этапов. Но если взглянуть в общем, то мы получаем постоянные преобразования и проверки правильности. Сначала наш код будет проверен, преобразован в специальные таблицы, которые будут представлением того же кода, но более структурированным и подготовленным к преобразованию в ассемблерный код. Далее на их основе будет получен код на языке ассемблера, о котором мы говорили в первой вводной статье по программированию, а позже он преобразовывается в машинный код.

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

Но сегодня нам интересна именно компиляция. И так, мы выяснили что наш код превратится в машинные команды. Но что это такое?

Машинная команда представляет собой закодированное по определенным правилам указание процессору на выполнение некоторой операции или действия.

То есть это инструкция для того самого устройства управления, о котором мы говорили ранее.
Получая ее, УУ определяет что идет следом, это может быть другая инструкция или данные для этой инструкции. Возможно, ему поступила команда на сложения двух чисел и следом за ней идут два значения для сложения. Тогда УУ отправит их АЛУ, и сообщит о том, что их нужно сложить. Примерно так все и работает. Стоит так же понимать, что набор инструкций у каждого процессора свой, именно поэтому, как я уже говорил в прошлой статье существует множество ассемблеров. Но вы скажете, С++ ведь един для всех. Если вы вспомните, что прочти пару минут назад про компиляцию, то заметите что после получения специальных таблиц, происходит преобразования их в ассемблерный код. Именно в этот момент, все еще универсальные данные, которые изменили свое представление в удобное для нашего компилятора, можно преобразовать в необходимый ассемблер, для AMD или Intel, а может быть AVR или STM, ARM и прочие.

Именно в этом суть высокоуровневого программирования, о котором более подробно мы поговорим, наверное, в следующей статье. Затронем базовые конструкции С++. Разберем код первой программы, на языке C++.

p.s. Мы будем писать код в среде Microsoft Visual Studio, актуальную версию совершенно бесплатно можно загрузить с официального сайта (https://visualstudio.microsoft.com/ru/downloads/) вас интересует версия для комьюнити. И пакеты для работы с языками C++ и C#. Установка не особо сложная, а информации опять же очень много. Но если у кого-то все-таки возникнут проблему пиши в комментарии , мы решим проблему. Если вы не успеете скачать до выхода следующей статьи, это не критично, в ней все еще будет очень много теоретического материала, и сама среда пригодитсяскорее через статью.