Из чего всё состоит
Итак, у нас есть компьютер: мощный процессор, до холеры оперативной памяти, алмазный дисплей. Давайте же разберёмся с этим богатством и запряжём его в работу.
Для этого потребуется программа. А любая программа хранит и обрабатывает какие-нибудь данные.
Данные
Например, робот шахтёр запоминает координаты, по которым он находится. Проверяет уровень заряда аккумулятора и заполненность инвентаря. Хранит координаты зоны, которую он должен выкопать.
Все данные, с которыми работает запущеная программа, хранятся в оперативной памяти компьютера. И эта память не бесконечна. Она зависит от количества планок памяти. Чем больше памяти, тем больше данных можно обрабатывать в программе. И наоборот.
Данные в оперативной памяти делятся по типам.
Числа
Числа имеют тип number
. Каждое число занимает в оперативной памяти ровно 8 байт.
Вы же помните табличку единиц измерения памяти? 1 байт = 8 бит, 1 килобайт = 1024 байта, 1 мегабайт = 1024 килобайта и так далее.
Числа могут быть целыми (1
, -10
, 2017
) или дробными (0.1
, -7.43
, 20.17
).
Есть только одно ограничение. Число не может быть больше, чем 9223372036854775807
, или меньше, чем -9223372036854775808
. Потому что если оно вылезет за эти пределы, оно уже не поместится в «ячейке» размером в 8 байт.
Когда требуется сохранить совсем большое число, программисты используют всякие трюки. Мы рассмотрим их попозже.
Строки
Все строки имеют тип string
. Тут всё просто. Строка — это любой текст, окружённый двойными кавычками: "I'm batman!"
.
Сколько места займёт строка в памяти, зависит от её длины. Тут всё логично. Один символ занимает в памяти один байт. Но есть две хитрости. Во-первых, некоторые символы Юникода (это почти все символы, кроме английских букв, цифр и простых знаков) могут занимать не один байт, а два, три и даже четыре. А во-вторых, компьютер — штука хитрая, и если у вас в программе много одинаковых строк, он сохранит в памяти только одну копию в целях экономии. Это называется оптимизацией.
Так что иногда проще посмотреть самому, на практике, сколько оперативной памяти сожрала ваша программа по работе с текстом.
Логика
Кроме чисел и строк, компьютер имеет ещё один интересный тип данных. Он называется булевый ("boolean").
Он «весит» всего один байт (хотя может вместиться в 1 бит, но в оперативной памяти нет таких маленьких «ячеек»). Булевый типа может хранить либо «истину» (true
) либо «ложь» (false
).
Его очень удобно использовать как флаг, который можно «поднимать» — включать, — и «опускать» — выключать. Например, вам надо где-то в коде запомнить, куда едет робот: налево или направо. Вы делаете флаг
едуНалево
. Если он будет равен «истине», значит, робот едет налево. Если он будет равен «лжи» — робот едет направо.
Вот, в общем-то, и все основные типы данных в компьютере. Кроме базовых типов, есть несколько более хитрых, и мы вскоре с ними тоже познакомимся.
А пока — едем дальше. Мы знаем, какими данными можем располагать для программы, но не знаем, как это сделать.
Как компьютер выполняет программы
Сама по себе программа — просто текст. Каждая строчка этого текста — какая-нибудь команда компьютеру. Компьютер читает программу, строчку за строчкой, и сразу выполняет то, что там написано.
Например, если у робота есть такая программа (это, конечно, не настоящий код):
вперёд вправо копать
то робот сначала двинется вперёд, потом повернёт направо, а затем выкопает один блок. После этого выполнение программы закончится: ведь больше нет команд.
То есть, если мы хотим, чтобы компьютер что-нибудь сделал, нам надо записать нужные команды друг за другом в текстовый файлик, и заставить компьютер его выполнить.
Переменные
Итак, самая простая команда для компьютера — это создать переменную. Переменная как раз и есть та самая ячейка в оперативной памяти, где будут лежать какие-нибудь полезные данные.
Для того, чтобы объявить переменную, надо использовать слово local
.
Допустим, мы пишем чатик. Нам надо хранить ник юзера, который сидит в чате. Ник — это строка (например "Fingercomp"
или "Totoro"
).
Пишем команду:
local nick = "Vasya"
Всё! Когда компьютер дойдёт до этой команды, он поймёт, что мы хотим сохранить строку в оперативную память. Он выделит где-нибудь в свободном месте ячейку в 5 байт и запишет туда Vasya
. А в программе у нас будет указатель-переменная nick
, чтобы мы потом могли эту строчку в оперативной памяти найти.
Теперь, где бы мы не написали nick
, компьютер подставит в это место строчку "Vasya"
.
Почему же она называется переменная? Потому что мы всегда можем поменять данные, на которые она показывает.
Например, если дальше в тексте программы будет такая команда:
nick = "Nikita"
То компьютер выделит новое место в памяти (на этот раз в 6 байт, где будет храниться слово Nikita
) и переадресует метку nick
на него.
И когда мы будем писать nick
, компьютер будет подставлять строку "Nikita"
, а строка "Vasya"
вообще будет почищена из оперативной памяти за ненадобностью.
Обратите внимание, что слово
local
второй раз можно уже не использовать. Компьютер помнит, что у нас была такая переменная и не будет создавать новую.
Мы можем создавать сразу кучу переменных за раз:
local name, age, fat = "Anton", 20, false
Таким образом, мы сохранили три переменных: имя Антона, возраст и флаг, который означает, что он не толстый.
Nil
А что если переменная никуда не указывает? Например, мы её создали, а чему она равна, не сказали:
local x
Компьютер увидит, что мы хотим создать переменную, но не знает, какие данные мы хотим в неё «положить». Всё сломается? Компьютер зависнет и наступит конец света?
А вот и нет. Все переменные, которые никуда не ведут, считаются равными nil
. Это такой хитрый четвёртый тип данных, который, на самом деле, нигде не хранится.
Просто считается, что если переменная никуда не ведёт, она равна nil
. И всё.
С этим связан один хитрый фокус. Если вы хотите выкинуть какие-нибудь данные из оперативной памяти (например, они вам больше не нужны, и вы хотите освободить место для чего-нибудь более полезного), вы можете приравнять переменную к nil
:
nick = nil
Прочитав такую команду, компьютер «отвяжет» переменную nick
от всех ячеек в оперативной памяти. Данные которые там хранились будут потом затёрты, когда компьютер станет чистить оперативную память. А переменная nick
станет считаться равной nil
.
Правила именования
Представьте, что вы написали такую команду:
local 1 = 2
local nil = "сhewbacca"
Тут компьютер встанет в тупик и начнёт материться на своём языке. Потому, что это полная бессмыслица. Если вы назовёте переменную 1
, то что будет означать, например, такая команда:
local x = 1
Надо ли будет компьютеру подставлять вместо 1
двойку, или вы имели ввиду именно число 1
?
Чтобы не случалось таких парадоксов, есть строгие правила о том, как должна называться переменная.
Название должно состоять из цифр, английских букв или знаков подчеркивания (_
). При этом название не может начинаться с цифры.
Иными словами, такие названия будут правильными:
local file1, test, _my_nickname, catchTheMouse, _
А вот такие вызовут ошибки:
local 2big, координата, 98, +=ThE_KiNg=+
Кроме того, в качестве названий нельзя использовать слова-команды (они называются ключевыми словами), например local
или nil
.
Обычно советуют использовать такие названия для переменных, чтобы было сразу понятно, что именно в ней хранится. Старайтесь использовать английские слова и избегать транслита. Так ваша программа будет выглядеть серьёзнее и солиднее, а другим программистам будет легче её понять.
Вот и всё. Теперь вы знаете основы программирования. Вы умеете сохранять данные в оперативную память и удалять их оттуда.
В следующих главах мы научимся каким-нибудь более зрелищным вещам.