HL-лаборатория -> Клондайк -> Тексты по темам -> Очерки о принципах

КОМПЬЮТЕРЫ


Компьютеры. Кто они?
Зачем он нам такой нужен?
А что у него внутри?
Ввод информации.
Память.
Процессор.

Компьютеры. Кто они?

Что же такое компьютеры, или по-русски ЭВМ?

Лирическое отступление! Можно не читать.

Не ловитесь на словах. Многие технические термины и названия придуманы так, словно их авторы специально хотели нас запутать. Как известно, самолет сам без пилота не летает, а снегоход не ходит, а ездит. Когда термины переводят с одного языка на другой, вносится дополнительная путаница. В языке может просто не быть сходных понятий, а при переводе слово в слово получается такое…

Английское слово "компьютер" происходит от глагола compute - считать. Если дословно перевести означает "счетчик" (как-то не очень подходит). Русское название ЭВМ расшифровывается как "Электронная Вычислительная Машина" (уже лучше). Хотя поначалу и отечественные машины назывались "Электронно-счетными", отсюда и названия первых машин - МЭСМ (малая электронно-счетная) и БЭСМ (большая). Некоторое время существовал даже термин "Счетно-решающее устройство", но быстро вышел из употребления, поскольку его сокращение до аббревиатуры получилось весьма неприличным.

В общем, понятно, что компьютер это электронная машина (технически более правильно "устройство") которая, несомненно, что-то считает или вычисляет. Хорошо если компьютер считает зарплату или траекторию спутника. Тут все понятно. А если мы играем в игру? Что же он тут считает?

Вот мы сидим за компьютером и нажимаем кнопки. Пред нами на экране приборная доска самолета, на которой колышутся стрелки и мигают лампочки. Под крылом воображаемого (технически более правильно "симулируемого") компьютером самолета проплывают пейзажи неведомых стран. Что же при этом происходит внутри?

Когда мы нажимаем кнопки на клавиатуре, то по проводу внутрь компьютера пробегают невидимые нам сигналы. Где-то в недрах компьютера хранятся сведения о том, как выглядит приборная доска самолета и приборы на ней. Есть там законы и правила, которым подчиняется движение самолета в зависимости от его текущего положения и от положения его рулей, то бишь кнопок нашей клавиатуры. Там же хранятся и фотографии живописных кусочков местности, над которой мы "пролетаем".

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

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

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

Правила и формулы (более точно - алгоритмы), выраженные опять же цифрами называются программой. Именно программа определяет, как и что компьютер будет делать с поступающей в него и хранящейся в нем информацией, куда и как он ее будет выдавать.

Теперь соберем все вместе и попробуем составить короткое и четкое определение компьютера.

Компьютер - это электронное программируемое устройство для цифровой обработки и хранения информации.

Вот такое у нас получилось определение. Мы его сами вывели, и впредь будем поступать так же. С точки зрения принципов оно нас устраивает, не беда, что в энциклопедии и учебниках, скорее всего не так (Специально не смотрел, чтобы не расстраиваться).

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

Зачем он нам такой нужен?

Ну и зачем нам нужно это "электронное программируемое …", если мы и сами, в общем-то, неплохое устройство для обработки информации? Чем же компьютер лучше нас? Ответ на этот вопрос знает почти каждый: "Компьютер быстро считает и может хранить много информации". Вот тут я с вами и не соглашусь.

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

Объемы хранимой современными компьютерами информации действительно поражают, особенно если их измерять в количестве произведений Льва Николаевича Толстого или томах Большой Советской Энциклопедии (была у советских компьютерщиков такая традиция). Но объемы накапливаемой за всю жизнь человеческим мозгом информации неизмеримо больше, и при этом человек достаточно быстро в этом объеме находит то, что ему нужно.

Следует учесть еще одно немаловажное обстоятельство. За первые 3 года жизни человек усваивает около 90% всей необходимой ему информации. Умение ходить, видеть и говорить - это наиболее сложные и объемные сведения, хранящиеся в нашем мозгу. Все достижения современной науки не идут с этим ни в какое сравнение. Компьютеры же ни ходить (управлять движением двуногих шагающих автоматов), ни нормально видеть и говорить пока не могут.

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

Я всегда стараюсь покупать сахар или в пакетах или уже целым мешком. Дело в том, что сахар очень гигроскопичен (впитывает влагу). Продавцы это хорошо знают и специально держат сахар во влажных помещениях. Если я покупаю 10 килограммов сахара, то "размочить" или "обвесить" меня на один килограмм не представляет никакого труда, а вот недодать мне один пакет из десяти весьма сложно.

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

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

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

Говорят, компьютеры иногда ошибаются. Не верьте, компьютеры не ошибаются никогда! Либо вы задали ему неверные исходные данные или дали неправильную команду, либо программист допустил в программе ошибку, либо компьютер неисправен, но неисправный компьютер - это уже не компьютер.

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

Специалисты-системотехники говорят, что "компьютер является детерминированной системой". Детерминированной является такая система, в которой конечное состояние (результат работы) однозначно определяется начальным состоянием (исходными данными). То есть, сколько бы вы не решали одну и ту же задачу с одними и теми же исходными данными, вы каждый раз будете получать один и тот же результат. Человек не является детерминированной системой. Это прекрасно, но создает много проблем.

Компьютер не человек. У него не бывает плохого настроения, ему не может не понравиться ваша задача, ему не надоест сотый раз делать одно и то же. Компьютер никогда не скажет вам "Отстаньте! Я хочу спать".

Компьютеру можно поручить то, что нельзя поручить человеку.

Компьютер является программируемым устройством. Что нам это дает?

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

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

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

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

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

Человеческие знания в компьютерах не только сохраняются но и накапливаются и развиваются. Ни одна программа не пишется с "чистого листа". Чтобы вычислить в программе квадратный корень или нарисовать на экране круг, уже не нужно знать, как это делается. За вас это уже сделал какой-то безвестный программист. Вам нужно только включить в свою программу написанный им модуль или подпрограмму. Каждая компьютерная программа - это труд десятков, сотен, а иногда и тысяч программистов, математиков, художников, дизайнеров и психологов, их опыт, талант и вдохновение, выраженное в сухих строчках двоичных нулей и единиц.

Снова подытожим наши рассуждения.

Цифровая природа компьютеров дает нам:

Программируемость обеспечивает:

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

Пусть он еще немного глуповат и все понимает буквально. Пусть не ловит на лету наши слова. Но зато он все сделает именно так, как мы ему сказали. И, если он, по простоте свой душевной не то "замесит" и не то "нарубит", как "Трое из ларца" из известного мультика, то в этом нет его вины. Мы сами виноваты. Мы ему так объяснили.

А что у него внутри?

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

Из чего должен, по вашему мнению, состоять компьютер? Что, как минимум, в нем должно быть, чтобы он с гордостью носил это имя?

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

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

Так есть это все в компьютерах или нет? Конечно есть, но не в каждом и не всегда. Более того, нам это совсем не нужно.

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

Для начала изобразим его наиболее схематично:

Работает это так:

Пока данная схема нам ничего нового не дает. Посему, рассмотрим все это более подробно.

Ввод информации.

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

Тут у нас снова исторически сложилась лингвистическая неразбериха.

Существующие в природе физические величины можно выразить в виде чисел, например, 100 километров, полкило, 25 мешков, тысяча поцелуев. Мы используем десятичную систему счисления и выражаем числа в виде последовательности из десяти арабских цифр. Цифры мы пишем на бумаге в виде "закорючек", которые называем символами. Кроме цифр мы используем и другие символы - буквы, знаки препинания, математические символы, иероглифы и прочее.

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

Ввод информации в компьютер - процесс совсем не такой простой, как нам кажется. Все, что мы хотим ввести в компьютер, мы сначала должны "образмерить".

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

Физические величины могут быть аналоговыми и дискретными. Аналоговая величина может принимать совершенно любое значение и может быть измерена и представлена в виде числа только приблизительно. Дискретная величина принимает значения только из определенного ряда и может быть выражена в виде числа точно. Например, количество мешков - это величина дискретная. Их всегда можно пересчитать, если считать только целые мешки и не спорить по поводу: "Мешок, из которого половину отсыпали - это мешок или нет". Количество сахара в мешке - величина аналоговая. В мешке должно быть 50 килограммов. Если взвесить, то там может оказаться 49. На более точных весах вес может быть и 49 килограммов 197 граммов. Можно брать все более точные весы и получать новую, но, тем не менее, правильную цифру. Количество молекул в мешке - опять величина дискретная, но мы их пересчитывать не будем. Прежде чем вводить в компьютер информацию об аналоговых величинах, их надо дискретизировать, то есть выразить в виде числа с устраивающей нас точностью. Мы можем это сделать сами или использовать специальное устройство "аналогово-цифровой преобразователь".

Ну вот, опять "цифровой"!

С дискретными величинами проще, можно, например, поставить счетчик с кнопкой. Нажал кнопку - один мешок, еще нажал - два. Или поставить кнопку под конвейер, пусть мешки сами нажимают.

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

К сожалению, этих самых "кодировок" расплодилось великое множество. За совсем не долгую историю компьютеров, каждая страна, а то и отдельные фирмы, успели разработать и утвердить свою собственную кодировку. В нашей стране, только для персональных компьютеров, существует и официально утверждено их, как минимум, шесть. Чтобы не делать отдельную клавиатуру для каждой страны, в персональных компьютерах в компьютер передается не код символа, а номер нажатой на клавиатуре клавиши. А какому коду соответствует эта клавиша, разбирается уже специальная программа, руководствуясь той или иной кодовой таблицей.

Числа десятичные, двоичные и прочие.

Когда мы что-нибудь считаем или записываем, то выражаем числа в виде последовательности десятичных цифр (десяти значений), из которых мы поразрядно "складываем" любое, необходимое нам число. Компьютер хранит и обрабатывает числа в виде электрических сигналов (напряжений, токов, магнитных полей). Чтобы не усложнять устройства и повысить их устойчивость к помехам, разработчики компьютеров используют всего два значения этих сигналов: "сигнал есть" и "сигнала нет". Возможны и другие варианты: "высокий уровень сигнала" и "низкий уровень сигнала", "положительный сигнал" и "отрицательный сигнал". В принципах это ничего не меняет. Главное, что значений всего два.

Получается, что компьютер использует всего 2 цифры (их обозначают "0" и "1"). При этом говорят, что компьютер использует двоичную систему счисления, в отличие от принятой у нас десятичной.

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

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

В десятичной форме счисления последовательность цифр "10" означает десять, "100" - сто. Говорят, что вес одного разряда в этой системе равен 10 в степени N. Число 1386 можно представить как 1*1000 + 3*100 + 8*10 + 6*1 (одна тысяча, три сотни, восемь десятков и еще шесть).

В двоичной системе вес одного разряда равен 2 в степени N. Круглыми числами здесь будут 2, 4, 8, 16, 32, 64, 128, и так далее. То же десятичное число 1386 здесь будет представлено как 1*1024 + 0*512 + 1*256 + 0*128 + 1*64 + 1*32 + 0*16 + 1*8 + 0*4 +1*2 + 0*1. То есть получится число 10101101010.

Немного длинновато, и слегка рябит в глазах.

Пользователям компьютеров обычно не приходится писать таких "паровозов" нулей и единиц, а вот в практике программистов и системных администраторов это обычное дело. Чтобы облегчить себе жизнь и допускать меньше ошибок, программисты объединяют разряды двоичных чисел в группы по четыре, и пишут их в виде шестнадцатеричных цифр, десять обычных арабских цифр и еще пять латинских букв (A - 10, B - 11, C - 12, D - 13, E - 14, F - 15). То же самое число 1386 они запишут как 56A.

Получилось даже короче, чем десятичное.

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

Странно, что ни один народ не догадался, не считать пальцы, а загибать их. Загнут палец - 1, не загнут - 0. Тогда на одной руке можно показывать числа от 0 до 31, а на двух даже до 1023.

Биты, байты и слова. Целые и вещественные числа.

Чем больше число, тем больше необходимо двоичных разрядов для его представления. Если число состоит всего из одного двоичного разряда, то оно может принимать всего два значения: 1 или 0, "Да" или "Нет", "Истина" или "Ложь", "Присутствует" или "Отсутствует". Такой, минимально возможный, объем информации, который можно выразить одним двоичным разрядом, называется бит (bit). Одному биту в компьютере обычно соответствует один логический элемент его схемы, одна линия связи, один электрический сигнал (одна ячейка, один провод, один импульс). Размерность обрабатываемой компьютером информации или информационная емкость его узлов измеряется в битах. Так, для хранения одного числа в диапазоне от 0 до 255 требуется 8 бит. В 16 битах можно хранить два таких числа, или одно, не превышающее 65535. В компьютерах можно обрабатывать и отрицательные числа. При этом один (обычно самый старший, то есть левый) разряд придется отвести на знак (0 - положительное число, 1 - отрицательное). В восьми битах тогда поместятся числа от -127 до +127.

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

Различные компьютеры имели разную длину машинного слова. Небольшие ЭВМ, предназначенные для управления технологическими процессами или обработки текстовой информации, обычно ограничивались 8 или 16 разрядами. Крупные машины для инженерных расчетов имели машинное слово длиной 32, 48 и даже 64 разряда.

Обрабатываемое компьютером число, не обязательно должно целиком помещаться в машинное слово. Если оно велико, то может размещаться в двух, четырех или даже восьми машинных словах. Компьютер будет обрабатывать такие числа по частям, за несколько операций. Так, восьмиразрядному компьютеру вполне по силам производить вычисления с 16 и 32-х битными числами. Только работать он будет как минимум раза в 4 медленнее.

Обычные микрокалькуляторы имеют длину машинного слова всего 4 бита. В каждое машинное слово они помещают одну десятичную цифру от 0 (0000) до 9 (1001) и выполняют вычисления с каждой парой цифр отдельно, так же, как мы складываем или умножаем "в столбик". Получается это достаточно медленно, но и стоит калькулятор не в пример меньше, чем самая дешевая персоналка.

Особняком стоят, так называемые, вещественные числа (float). Это очень большие или очень маленькие числа, например расстояние от земли до солнца или масса одного атома. Скорость света составляет около трехсот миллионов километров в секунду. Это 9 десятичных разрядов. Но для инженерных расчетов нам все девять цифр не нужны, достаточно трех-четырех. В таких случаях математики записывают такие числа в экспоненциальной форме, например: "Скорость света приблизительно равна 3*108 м/с". Цифры в начале числа, или как говорят математики "значащие цифры" называются мантиссой, а показатель степени числа 10 - порядком числа. Компьютеры почти с самого рождения умеют работать с такими числами. При этом, например 8 двоичных разрядов отводится на порядок (один на знак и 7 на величину) и 24 разряда на мантиссу (1 на знак и 23 на величину). В 32 битах тогда поместятся числа от самых больших до 1*10127, до самых маленьких - 1*10-127 и имеющих точность до 8 десятичных цифр. Если необходимы еще большие числа или более высокая точность, то необходимо использовать большее число разрядов на порядок или мантиссу.

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

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

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

Большинство используемых в настоящее время кодировок - восьмиразрядные. Это позволяет пронумеровать (закодировать) до 256 различных букв, символов и знаков. Обычно коды от 0 до 31 используются для различных управляющих целей, не имеют графического представления и никогда не печатаются. Их цель указывать начало абзацев, концы строк, переходы на новую страницу и прочие тонкости. Следующие 32 (от 32 до 63) это знаки препинания, вопросительные, восклицательные, знаки сложения, вычитания, умножения, деления и все цифры. Далее до кода 128 идут строчные и заглавные латинские буквы. Оставшиеся 128 кодов каждая страна заполняет буквами своих национальных алфавитов, и другими символами по вкусу.

Крупные объемы информации измеряют в килобайтах (Kbyte), а еще более крупные в мегабайтах (Mbyte) и терабайтах (Tbyte). Только не перепутайте! В одном килобайте 1024 байта (210), а в одном мегабайте 1024 килобайта.

Все программисты по наивности считают, что в одном километре 1024 метра, и, при покупке килограмма картошки, абсолютно уверены, что их обвесили на 24 грамма.

Память

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

Наши глаза видят, уши слышат, пальцы ощущают. Большинство из того, что мы видели, слышали или чувствовали, мы помним, то есть, храним в нашей памяти. Насмотревшись, мы можем прилечь на диван и обдумать увиденное, то есть обработать. Результаты наших раздумий мы тоже помним. То, что мы боимся забыть, мы записываем (копируем на устройство длительного хранения). Мы можем рассказать о увиденном или о том, что придумали, то есть вывести информацию из нашего "компьютера". Настоящие компьютеры поступают точно так же. У них тоже есть память, в которой они хранят исходную информацию, куда они записывают результаты обработки и где размещаются программы, по которым они эту информацию обрабатывают.

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

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

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

Все это хорошо, пока компьютер исправен, а в программах нет ошибок. На самом деле программ без ошибок не бывает. Это знает любой программист. Если в программе допущена ошибка, то компьютер, обратившись по неправильному адресу, будет обрабатывать не те данные, или вместо данных обработает кусок какой ни будь программы. Еще хуже, если компьютер вместо программы наткнется на данные, и будет пытаться исполнить их как команды, ведь и те и другие являются числами. Не беда, если остановится ваша любимая игрушка. Компьютер можно выключить и попытаться сыграть заново. А вот что нам скажут американцы, если компьютер, управляющий полетом украинской ракеты, вместо того, чтобы запустить спутник на орбиту, шмякнет его на лужайку возле Белого дома?

Идею не делать различия между командами и данными и хранить их в общей памяти впервые высказал в 1945 году американский физик и математик Джон фон Нейман. О компьютерах имеющих такую организацию памяти теперь говорят, что они имеют "Фон-неймановскую архитектуру".

Наши математики и инженеры, собравшиеся в Феофании под Киевом, этих работ не читали, однако, это не помешало им в 1950 году создать первый в Европе компьютер в полном соответствии с этими принципами. Фон Неймана называть американцем тоже было бы не совсем правильно, поскольку родился он в Будапеште, а учился и работал в Германии. И звали его тогда Януш Нойман. Американцы об этом обычно скромно умалчивают.

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

Специализированные компьютеры и микроконтроллеры, встраиваемые в различные промышленные установки и бытовую технику, часто имеют совсем другую архитектуру. В них обычно есть две совершенно отдельные памяти: для программы и для данных. Каждая память имеет свою собственную адресацию, и даже может иметь разный размер ячеек. При этом компьютер не может перепутать программу и данные. У него просто нет таких команд. Такая архитектура называется "Гарвардской", по названию одноименного университета.

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

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

То, что мы здесь называли просто памятью, в технической литературе обычно называется "оперативной памятью" или сокращенно ОЗУ (оперативное запоминающее устройство). Американцы называют такую память RAM. Оперативная память современных компьютеров чаще всего имеет одну весьма неприятную особенность. Если компьютер выключить и снова включить, то он забудет все, что хранилось в его памяти и будет совершенно бестолковым пока снова не разместит в памяти все необходимые для работы программы и данные.

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

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

Такая память называется "постоянной памятью" или ПЗУ (постоянное запоминающее устройство). Американцы называют такую память ROM. Компьютер обычно не может ни записать, ни изменить ничего в такой памяти. Такая память доступна компьютеру только для чтения. При попытке записать в нее что ни будь, либо ничего не происходит, либо компьютер выдает сообщение об ошибке.

Наличие постоянной памяти, вообще говоря, не является для компьютера обязательным. Мне приходилось работать на миникомпьютере М-400, в котором такой памяти не было вовсе. Зато в нем был пульт, с помощью которого можно было заносить в ячейки памяти различные числа. Мне навсегда запомнились три магических числа - 5, 177560, 1, которые нужно было занести в память, чтобы компьютер, немного помигав лампочками, выдал сообщение о готовности к работе и начал воспринимать мои команды. А всего то эти числа означали послать (5) в устройство управления диском (177560) команду "читать" (1).

На протяжении всей истории развития компьютеров конструкторы стремились к тому, чтобы памяти в них было как можно больше и работала она как можно быстрее. В первых компьютерах память была сделана из микроскопических колечек из магнитного материала (феррита), прошитых тончайшими проволочками и очень напоминала плетение из бисера. В той же М-400 таких колечек было около пятисот тысяч. Память занимала целый шкаф и содержала 57344 ячейки (56 килобайт). Всего через 10 лет полупроводниковая память персональных компьютеров уже выглядела как пластмассовая планочка размером с палец, на которой размешались всего несколько малюсеньких микросхем. Такая память содержала уже более сотни мегабайт оперативной памяти. Борьба за скорость вынудила конструкторов идти на большое количество различных ухищрений, которые мы рассмотрим после того, как поговорим о процессорах.

Процессор

Вот наконец-то, мы добрались до самого главного, до сердца каждого компьютера.

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

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

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

Так сколько и каких команд должен уметь выполнять процессор? Тут мнения разработчиков сильно разошлись. Одни считают, что процессор должен быть максимально простым и выполнять всего несколько десятков команд, но зато очень быстро. Все, что не умеет процессор, сделает умная программа. Такая архитектура процессоров получила название RISC (процессоры с сокращенным набором команд). Другие считают, что процессор должен уметь как можно больше. Зачем плодить в программе одни и те же последовательности команд, если процессор все равно проектируется один раз, а потом "выпекается" в миллионах экземпляров как пирожки. Такие процессоры называются CISC (процессоры с полным набором команд) и они умеют выполнять не одну сотню сложнейших команд, вплоть до вычисления полиномов и интегралов Фурье.

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

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

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

Мне совсем не интересно, что у него внутри и как он устроен. Мне интересно почувствовать себя сидящим по-турецки посередине оперативной памяти, и подсовывая ему различные команды, смотреть, как он себя при этом будет вести. Ведь главное не в том, как он выглядит, и как он устроен, а как он выполняет программу!

Процессор миникомпьютера М-400 был сделан на простейших логических элементах и занимал небольшой шкафчик. Это не мешало ему прекрасно решать мои задачи. Сердце компьютера СМ-3 уже умещалось на одной пластине стеклотекстолита и представляло собой процессор в процессоре. Сложные команды в нем сначала преобразовывались в более простые, которые выполнял маленький процессор, руководствуясь своими микропрограммами. Несмотря на большое внешнее отличие, он имел ту же систему команд, и мне не пришлось переделывать свои программы. Те же программы смогли бы выполняться и на процессоре LSI-11, имеющем вид совсем малюсенькой микросхемы.

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

Не привязываясь к конкретному типу процессора, посмотрим, какие команды у него могут быть.

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

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

В большинстве компьютеров устройства имеют свои собственные адреса, которые тогда называются адресами портов ввода/вывода или просто портами. В таких процессорах есть команды для ввода (получения числа из порта с указанным номером) и вывода (пересылки числа в порт). Без таких команд вообще то можно и обойтись, если иметь общую адресацию для памяти и устройств.

Компьютеры М-400, СМ-3, СМ-4 и, естественно, машины PDP-11, с которой они были скопированы нашими доблестными учеными, не имели ни портов, ни команд ввода/вывода. Их процессор был 16-разрядным и мог обращаться к 64К памяти. Оперативной памяти в нем было не более 56К, а остальные 8К использовались для подключения внешних устройств. Это было очень удобно, поскольку работать с устройствами можно было практически любой командой.

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

Арифметические операции и сдвиги. Это, как минимум, сложение и вычитание целых чисел, плюс, возможно, умножение и деление. Сдвигом называется такая операция, когда все нули и единицы в числе перемещаются на одну позицию влево или вправо. Фактически это равносильно умножению или делению числа на 2, но выполняется гораздо быстрее.

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

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

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

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

К основным логическим операциям относятся "И" (AND), "ИЛИ" (OR) и "НЕ" (NOT). Операция "И" фиксирует тот факт, когда в одноименных разрядах обеих чисел содержится единица, то есть присутствует "И там И там". В результате операции "ИЛИ" единица получается, когда единицы есть в одном, другом или обоих числах (есть хоть где-то). Операция "НЕ", это просто изменение всех нулей на единицы, а единиц на нули (инверсия).

В принципе, для любых логических вычислений достаточно только двух операций: И и НЕ, или ИЛИ и НЕ, но такие команды реализуются в процессорах очень просто, поэтому в большинстве процессоров есть еще и команда XOR (исключающая ИЛИ).

Команды переходов. Вся мощь и интеллект современных компьютеров обязаны всего одной маленькой команде - команде условного перехода. Что же делает такая команда? По ней процессор проверяет содержимое какой ни будь ячейки (или не ячейки), и в зависимости от того, что в ней, либо не делает ничего, то есть начинает выполнять следующую по порядку команду, либо "перепрыгивает" на указанную ячейку и дальше продолжает выполнять команды с указанного места.

Музыкантов такое не удивит: "Играем здесь, а если финал, то вот отсюда…".

Обычно процессору вовсе не обязательно лезть в какую то ячейку, чтобы проверить, что там лежит. Он это делает мимоходом. Почти в каждом процессоре есть особая ячейка, которая называется "слово состояния", "регистр флагов" или как ни будь аналогично. После выполнения очередной команды, процессор отмечает в ней свои "впечатления о содеянном": какое получилось число (больше, меньше или равное нулю), не вылез ли результат умножения за пределы отведенной ячейки, не слишком ли "круто" он поделил одно число на другое, так, что в результате ничего не осталось, ну и всякое другое. Следующая за ней команда перехода просто проверяет соответствующий флаг (двоичный разряд этой ячейки) и решает, идти ей не спеша дальше или "прыгать". Соответственно у процессора могут быть команды перехода "ЕСЛИ РАВНО 0", "ЕСЛИ НЕ РАВНО", "ЕСЛИ БОЛЬШЕ", "ЕСЛИ ПЕРЕПОЛНЕНИЕ" и даже по результату логической операции между регистром флагов и указанным числом.

Обратите внимание, что я все чаще вместо слов "процессор, выполняя команду, сделал это…" пишу просто "данная команда сделала следующее …". Это не спроста. Если компьютер для нас не предмет роскоши, украшающий письменный стол, то интересуют нас в нем именно программы. Только они определяют ту функциональность компьютера, которая нам от него нужна.

Виннету, вождь Апачей учил: "Чтобы поймать волка, нужно самому стать волком". Чтобы понять, как работает программа, нужно почувствовать себя программой, понять, как ей там живется, что она там, в данный момент делает, и что от нее в следующий можно ожидать. В противном случае ваша жизнь превратится в кошмар запоминания бесконечных команд, кнопок, режимов и прочих заклинаний, которые то срабатывают, то нет, по вине неистощимого на козни компьютера.

Ну да вернемся к переходам.

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

Переходы с возвратом. В отличие от обычных команд безусловного перехода и переходов по условию, эти команды, перед тем как "прыгнуть", запоминают место, откуда "прыгали", чтобы не забыть вернуться. Закончив все свои дела по новому месту работы программа выполняет команду "Возврат" и попадает на старое место, будто никуда и не прыгала. С помощью таких команд организуются подпрограммы - участки программы, которые можно использовать многократно.

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

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

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

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

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

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

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

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

Команда возврата сначала передвигает указатель на одну позицию назад и потом использует, то, на что он показывает для возврата. Стек можно использовать не только для адресов, но и передавать через него в подпрограмму исходные данные и получать результаты. Очень удобно: "Возьми там, где всегда. Получишь там, где обычно".

Особенно удобен стек для хранения промежуточных значений при вычислениях сложных математических выражений. Сначала в стек закидываются все числа в порядке скобок, а затем выполняются все операции в обратном порядке (начиная с внутренних). Каждая операция забирает из стека два последних числа и кладет туда одно - результат. В конце в стеке останется всего одно число, и, причем именно то, что нам нужно.

Прерывания. Прерывания - это не команды. Это реакция процессора на различные события, хотя, по сути, это очень похоже на команду перехода с возвратом. Без них тоже можно обойтись, но в большинстве процессоров они есть.

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

Вы на вечеринке, сидите за столиком и рассказываете своему новому знакомому что-то очень интересное (выполнение программы). В какой то момент вы слышите за спиной: "Кофе, капучино, горячий шоколад" (сигнал прерывания). Вы запоминаете свою последнюю мысль, (сохранение текущего состояния и адреса возврата), поворачиваетесь, берете чашечку кофе и, отхлебнув (обработка прерывания), продолжаете рассказ (возвращаетесь из прерывания).

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

Так же и компьютер. Он не тратит времени на бесконечные проверки: "Не нажали ли клавишу на клавиатуре?", или "Не пришел ли байт из модема?". Когда нажмут клавишу, возникнет прерывание и подпрограмма его обработки (драйвер клавиатуры) с этим символом разберется или просто отложит в область памяти, которая называется буфер клавиатуры. Разбираться тогда с ним будут позднее, когда там соберется вся строка, и вы нажмете Enter.

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

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

Чтобы выполнить действие, процессор должен знать: что делать, где взять исходные числа и куда положить результат. То есть команда сложения в простейшем случае должна состоять из четырех чисел: <Код команды> <Адрес первого числа> <Адрес второго числа> <Адрес, куда будет сохранен результат>. Такие команды называются "трехадресными".

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

Можно обойтись и одним адресом, если иметь в процессоре специальный регистр - аккумулятор. В таких процессорах одно из чисел (операндов) берется из аккумулятора, а второе из памяти. После выполнения результат тоже будет в этом регистре. Это "одноадресная" система команд.

Адрес то получается один, но для сложения нужно будет уже три команды: "Положить первое число в аккумулятор", "Сложить аккумулятор со вторым числом", "Переместить результат из аккумулятора на место". Всего на программу получается не 4, а 6 ячеек памяти. Где же тут экономия? А вот где. Если нужно сложить вместе 10 чисел, то в первом случае нужно будет 40 ячеек, а с аккумулятором всего 24, потому, что промежуточный результат не нужно пересылать в память.

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

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

Продолжение следует ...