Прежде чем я начал изучать компьютерное программирование, меня пугала уверенность в том, что мне потребуется гораздо более глубокое понимание того, как работают компьютеры, прежде чем я смогу делать что-либо удаленно полезное. И хотя месяцы самообучения и несколько недель интенсивной программы обучения действительно углубили мое понимание, я стал лучше понимать, что языки программирования подобны множеству других инструментов современности: их можно грамотно использовать, не понимая, как они Работа. (И разве это не действительно здорово?) На этом этапе моего образования, возможно, в частности, я часто размышляю о том, сколько я узнал, но как мало я чувствую, что понимаю. Я имею в виду не столько синтаксис языка, сколько базовые структуры языков программирования.

Если использовать Ruby в качестве примера, что позволяет нашему компьютеру понимать инструкции, написанные на языке, очень близком к английскому? Что происходит с этими словами на самом базовом, электрохимическом уровне? Я не могу ответить на этот вопрос (пока), но я начал понимать некоторые из этих основных функций. Изучая экземпляры объектов в Ruby, я познакомился с «идентификатором объекта» - уникальным номером, присваиваемым объектам, созданным во время выполнения программы. Эти «идентификаторы» - это места в свободной памяти компьютера, которые Ruby поручил вашему компьютеру «хранить» эти объекты. Создайте объект, и Ruby найдет место для его хранения.

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

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

Вернемся к компьютерам: в хранилище вашего компьютера Ruby зарезервировал место для своих данных. Я буду разбираться не в форме, которую эти данные принимают в хранилище, а в том, как это интересно в Ruby. Как упоминалось выше, каждому объекту, созданному в программе Ruby, назначается уникальный идентификатор, который ссылается на его местоположение в хранилище. Вы можете поиграть с этим в терминале вашего компьютера, используя Ruby REPL, irb.

Объект создан, ему присваивается идентификатор. Обратите внимание, что для «hello» этот идентификатор является временным. Если мы выйдем из REPL, войдем повторно и создадим объект «hello», ему будет назначен другой идентификатор. Однако некоторым объектам присвоены постоянные идентификаторы. К ним относятся объекты true, false, nil и целые числа. Поиск их object_ids дает удивительные результаты.

«True» присваивается 20, «false» - 0 и «nil» - 8. Ранние версии Ruby, по-видимому, назначали их по-разному: «true» было 2, а nil было 4. Прочитав немного, я узнал, что обновление связано с повышение производительности, но детали того, как эта перестановка способствует лучшему функционированию, все еще вне меня. Что немного более понятно, так это методология присвоения идентификаторов целым числам. Вы заметите закономерность. Идентификатор 1 указывает на 0. Идентификатор 3 указывает на 1. Идентификатор 5 указывает на 2. При тестировании с другими целыми числами мы можем экстраполировать идентификатор целого числа, соответствующий добавлению 1 к их удвоенному значению, то есть (i*2+1). Другими словами, другие слова, идентификаторы с нечетными номерами зарезервированы для целых чисел.

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

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