Основы программирования и Playground. Часть 1

image

В первой главе мы разберем основы. В начале вы узнаете о том, как работает код, а затем – об инструментах для написания это кода на базе языка программирования Swift.

Как работает компьютер

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

Вы вновь можете посчитать, что это невероятно, но на самом деле в строении компьютера нет ничего сложного. Его центр или “сердце” – это Central Processing Unit (CPU) или Центральный процессор (ЦП), являющийся по сути вычислительным устройством. Он совершает сложение, вычитание и другие арифметические операции с числами. То есть весь базис функционала компьютера, который вы видите и которым пользуетесь, построен на обработке ЦП многомиллионными числами каждую секунду. Удивительно, как из всего лишь чисел строится целая система.

Numbers!

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

Как только ЦП перемещает цифровые величины из RAM в свои регистры, вычислительной устройство производит обработку и помещает числа уже в другой регистр. Каждый последующий раз ЦП совершает вычитание, сложение, заимствует данные из RAM или, наоборот, вносит их. Иными словами, процессор совершает единичную операцию. Обычно всякая компьютерная программа состоит из тысяч или даже миллионов операций. Сложные программы вроде вашей операционной системы macOS (а это тоже программа) могут насчитывать миллионы операций всего.

2

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

Таким образом, вместо написания собственной уникальной программы, вам следует реализовывать их на уже готовых основах, т.е. в виде специальных языков программирования (в ваше случае это Swift). Этот язык реализуется через программу, называемую компилятором, которая переводит написанный вами код в операцию, которую ЦП знает, как совершить. Каждая строка написанного вами кода будет переведена во множество операций, некоторые из них могут обратиться даже в целые алгоритмы!

Системы счисления

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

Кстати говоря, с изображениями та же история: в компьютере они так же представлены в виде чисел. Изображение разбито на множество тысяч или даже миллионов частей, называемых пикселями. Каждый пиксель обладает своим ярко-выраженным единым цветом. Если вы хорошенько всмотритесь в свой компьютер, то сможете, скажем, различить их цветовые границы, при учете, что у вас будет монитор с высоким разрешением, где пиксели, как правило, крайне малы. Каждый из этих элементов цветовой системы обычно состоит из 3 трех чисел: одно прикреплено к некоторому количеству красного цвета, второе - к зелёному и, наконец, третье - к синему. Как пример: пиксель абсолютно красного цвета имел бы параметры в виде 100% красного и, соответственно, 0% зелёного и синего.

Стоит отметить, что сам процессор работает не совсем с обычным типом чисел, которые мы привыкли видеть и привыкли использовать каждый день. На этот раз нам придётся работать с так называемой “десятичной системой счисления”. На самом деле даже на интуитивном уровне можно понять то, как она работает. Однако, для наглядного примера рассмотрим работу процессора с десятичной системой счисления. Например, число 423 имеет 3 единицы, 2 десятка и 4 сотни:

3

В рассматриваемой нами системе каждая отдельно взятая цифра целого числа может иметь величину от 0 до 9, т.е. всего 10 возможных величин для каждой цифры. Именно по этому эта система имеет название десятичной!

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

(0 * 1000) + (4 * 100) + (2 * 10) + (3 * 1) = 423

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

Двоичная система счисления

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

Как не трудно догадаться из названия, в сравнении с предыдущей системой счисления, каждая цифра имеет лишь две величины – 0 и 1.

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

Практически все современные компьютеры на сегодняшний день настроены на данную систему в виду того, что с точки зрения работоспособности гораздо проще манипулировать лишь двумя вариантами величин для цифр. Работа цифровых схем, которыми в оснащён компьютер, построена на наличии электрического напряжения, что обозначается величиной 1, или на его отсутствии, что, как нетрудно догадаться, обозначается величиной 0.

Для лучше понимания рассмотрим двоичную систему счисления на примере числа 1101:

4

В десятичной системе мы измеряли величину цифр десятками, умножая сами цифры на них, в данном же случае нам придётся прибегнуть к помощи двоек, т.е. 1, 2, 4, 8, 16 и так далее. Общий принцип работы весьма прост: каждая цифра множится на величину, зависящую от всё того же положения цифры в числе. Умножение начинается справа налево.

Поэтому в числе 1101 самая правая цифра 1 имеет величину в виде арифметического действия (1 * 2^0), что равняется, соответственно, 1. Величина следующей цифры 0 соответствует действию (0 * 2^1), которое равно 0. В общем-то, как уже было показано на примере принципа работы цифровых схем, величина цифр числа двоичной системы счисления либо выражает цифру (1), как часть целого числа, либо нет (0). Приведённое нами в пример число 1101 можно с лёгкостью из двоичной системы перевести в десятичную по аналогии работы десятичной системы, но заменив десятки двойками:

(1 * 8) + (1 * 4) + (0 * 2) + (1 * 1) = 13

В свою очередь, если вы хотите конвертировать число десятичной системы 423 в двоичную систему, необходимо разбить само число так на двойки:

(1 * 256) + (1 * 128) + (0 * 64) + (1 * 32) + (0 * 16) + (0 * 8) + (1 * 4) 	+ (1 * 2) + (1 * 1) = 423

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

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

5

Тот факт, что компьютер обладает ограниченной памятью, говорит также об ограниченности длины чисел. Каждый регистр, как правило, обладает пределом в 32-бита или в 64-бита. По этой же причине про ЦП говорят как о 32-битном или 64-битном. Таким образом, пределом 32-битного процессора будет число 4,294,967,295 или, переводя в двоичную систему, 11111111111111111111111111111111. Такова его работа.

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

Шестнадцатеричная система счисления

Как вы уже могли догадаться из предыдущего параграфа, работа с двоичной системой может быть скучной и занимающей много времени. По причине этого в программирование существует ещё одна базовая система счисления, называемая шестнадцатеричной. К слову, отдельных символов для всех 16 цифр не нашлось: всего их 10. Поэтому для их обозначения с 10-15 мы используем 6 первых букв английского алфавита:

• a = 10
• b = 11
• c = 12
• d = 13
• e = 14
• f = 15

Не стоит удивляться, если первое, что у вас получиться написать из шестнадцатеричного кода, будет похоже на слово.

6

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

(12 * 4096) + (0 * 256) + (13 * 16) + (14 * 1) = 49374

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

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

Для примера рассмотрим число c0de:

c = 1100
0 = 0000
d = 1101
e = 1110
c0de = 1100 0000 1101 1110

Эта опция оказывается весьма полезной, учитывая насколько длинными могут быть двоичные числа на 32-битных и 64-битных процессорах. То есть длиннейшее число для 32-битов 4,294,967,295 двоичной системы может быть записано как ffffffff в шестнадцатеричной.

Как работает код

У компьютера есть много ограничений, и сам по себе он не обладает большим функционалом. Процесс программирования – это процесс расширения функций компьютера путём кодирования, где малые элементы сложены воедино в правильном порядке. Кодирование крайне схоже с написанием рецепта: вы собираете все ингредиенты (данные) и даёте компьютеру инструкцию касательного того, как эти самые ингредиенты использовать. Например:

Шаг 1. Загрузить фото, находящееся на жестком диске
Шаг 2. Изменить размер фото по параметрам 400 пикселей в ширину и 300 пикселей в высоту
Шаг 3. Применить светло-коричневый фильтр к фото
Шаг 4. Напечатать фото

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

6

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

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

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

Это был наш краткий вводный курс по теме “компьютерного железа”, систем счисления, кода и того, как они все вместе взаимодействуют с целью создания современных программ. На самом деле не малый объём информации для одной части. Пришло время узнать об инструментах, с помощью которых мы сможем реализовывать наш код, написанный на Swift.

Данный текст является неавторизированным переводом книги iOS Apprentice.