Computer Memory Model

Существует множество различных видов электронно-вычислительных машин. В настоящее время распространено несколько из них.

Обычно память ЭВМ имеет несколько уровней. Расположим их от самой быстрой памяти к самой медленной:

Регистры процессора → Кэш → ОЗУ → ЖД

Причём ЖД (жёсткий диск) относится к внешним устройствам ЭВМ и даже может отсутствовать (или вместо него может быть аналогичное устройство, такое как карта флеш-памяти).

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

ОЗУ (оперативное запоминающее устройство) — это небольшие пластины с электросхемами. Эти пластины вставляются в главную плату ЭВМ (материнскую плату) и способны хранить данные, в миллиарды раз привышающие объём данных в регистрах, поэтому скорость доступа к этим данным значительно ниже. Для того, чтобы ЭВМ смогла произвести действия над данными в ОЗУ, они сначала должны быть загружены в регистры. Затем, данные снова выгружаются из регистров в ОЗУ. Для того, чтобы ускорить этот процесс, между регистрами и ОЗУ находится кэш — запоминающее устройство, работающее гораздо быстрее ОЗУ, но имеющее примерно в тысячу раз меньший объём.

Когда управляющее устройство ЭВМ даёт команду на загрузку данных из ОЗУ, эта команда поступает в кэш, который попутно загружает из ОЗУ отрезок памяти побольше, для того, чтобы в следующий раз, при получении очередной команды на загрузку данных, посмотреть, нет ли у него уже этих данных «под рукой». Таким образом кэш ускоряет работу ЭВМ.

С точки зрения программиста память ОЗУ представляет собой огромное скопление ячеек (байтов), в каждой из которых содержится некоторое значение, а именно — одно из 256 возможных значений. Обычно эти значения представляют как целое число от 0 до 255. Кроме того, каждая ячейка имеет свой порядковый номер, котороый называется её адресом.

Например: Ячейка, имеющая адрес 5, содержит значение 207.

Часто обращение к памяти происходит не к одной ячейке, а сразу к нескольким: к двум, четырём или восьми. Если один байт может содержать 256 различных значений, то, например, два байта, взятые как целое, могут содержать 256 * 256 = 65536 различных значений. Можно воспринимать это таким образом, что в двух байтах содержится некоторое целое число от 0 до 65535.

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

Переменные

Обычно программист не оперирует регистрами и ячейками ОЗУ напрямую, а использует при написании программ переменные. Переменная — это блок памяти, имеющий название. Название переменным даёт сам программист, поэтому они отражают смысл хранящихся в них значений. Обычно для названия переменных используют английские слова или словосочетания. Например, для хранения количества произведённых за день деталей можно завести переменную productsProduced или просто produced.

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

Типы данных

Каждая переменная, во-первых, занимает в памяти строго определённое количество байтов, а во-вторых, связана с определённым набором значений, которые она может принимать. Такой набор значений определяет и определяется типом данных. Базовые типы данных языка Оберон:

*В новом сообщении о языке Оберон не указаны диапазоны типов, кроме типа BYTE. Вместимость типа INTEGER отличается от компилятора к компилятору.

Переменная объявляется следующим образом:

VAR x: INTEGER;

Типы данных также могут быть составными и указательными. Например:

VAR m: ARRAY 30 OF INTEGER; (* Массив из тридцати целых чисел *) x: RECORD (* Запись с тремя полями *) a, b: INTEGER; c: CHAR END;