Представление информации в ЭВМ Понятие информации является центральным в информатике. Информация вместе с веществом и энергией есть важнейшие сущности нашего мира. Информация – это не только сведения из книг, радио- или телепередач, это сведения, которые хранятся в структуре сложнейшей биологической молекулы, сведения, который мы "считываем" с картины в музее или "вдыхаем" в лесу с ароматом цветов и т.д. Очень важно установить способ представления той или иной информации. Только представив информацию в специальном виде, её можно передавать и обрабатывать с помощью компьютера. Для этого надо принять некоторые соглашения о соответствии значения информации её представлению. В компьютерах используются физические устройства, которые способны находиться только в двух состояниях: "включено" и "выключено". Первое из состояний принято обозначать цифрой 1, а второе – цифрой 0. Таким образом, персональный компьютер устроен так, что он может "понимать" только две цифры: 0 и 1. С помощью различных комбинаций 0 и 1 можно представить и числа, и тексты, и любую другую информацию. Представление чисел в виде комбинаций 0 и 1 называется двоичным представлением, а цифры 0 и 1 – двоичными цифрами. Система представления чисел двоичными цифрами называется двоичной системой счисления. В общем случае позиционной системой счисления называется позиционное представление чисел, в котором последовательные цифровые разряды являются целыми степенями целого числа, называемого основанием системы. Например, в десятичной системе счисления, основанием которой является число 10, каждый следующий старший разряд в 10 раз больше предыдущего. Целое число М в позиционной системе счисления с основанием n записывается в виде M=ak ak-1…a1 a0 , где ak ak-1…a1 a0 – цифры из интервала от 0 до n-1. Развёрнутая форма записи целого числа имеет вид: Например, в десятичном числе 19: a1=1 и a0=9. Десятичное число 19 будет иметь представление: 1*10+9=19. Рассмотрим двоичные представления нескольких первых натуральных чисел: Двоичное число Десятичное число 0 0 1 1 10 2 ( 21) 11 3 100 4 (22) 101 5 110 6 111 7 1000 8 (23) 1001 9 … … Как видно, роль "круглых" чисел в двоичной системе счисления играют степени 2 (так же как в десятичной системе "круглыми" являются степени 10). С двоичными числами, так же, как и с десятичными можно производить обычные арифметические действия: сложение, умножение и т.д. Это совершенно естественно, так как термины "двоичные числа", "десятичные числа" содержат в себе маленький обман – числа-то, на самом деле, одни и те же, а меняется только способ их записи. Ведь безразлично, как считать общее количество пальцев на руках и ногах, пользуясь десятичными цифрами или двоичными. Главное, что результат будет одним и тем же, хотя запишется он по-разному: 10+10=20 – в десятичной записи; 1010+1010=10100 – в двоичной; Итак, любые числа можно записать в виде комбинаций двух цифр: 0 и 1, способ этот ничем не хуже десятичного, разве что запись чисел выглядит длиннее. Существуют формальные правила перевода чисел из одной системы счисления в другую, однако в нашу задачу не входит их рассмотрение. Эти правила можно найти в любом элементарном пособии по программированию. Разряд двоичной системы счисления называется битом. Бит – это наименьшее возможное количество информации. В каждом бите может храниться 0 или 1. Следует заметить, что компьютер редко работает с конкретными битами в отдельности. В памяти компьютера числа, символы и любая другая информация представляется цепочками битов. Цепочку из восьми битов будем называть байтом. Всего можно представить 256 различных таких цепочек – это позволяет закодировать 256 различных символов, например большие и малые буквы латинского и русского алфавитов, цифры, знаки препинания и т.д. Более того, давно существуют специальные таблицы кодов, где каждому символу однозначно сопоставляется его код (см. Приложение А). Количество или объём информации, хранящейся в ЭВМ, измеряется в битах или более крупных единицах: 1 байт = 8 битам 1 Кбайт (килобайт) = 1024 байтам 1 Мбайт (мегабайт) = 1024 Кбайтам 1 Гбайт (гигабайт) = 1024 Мбайтам. Число 1024 имеет своим происхождением двоичную систему счисления: это десятая степень двойки. В программировании очень часто используют шестнадцатеричные числа, поскольку они дают сокращённую запись двоичных чисел. Шестнадцатеричная запись чисел основана на использовании 16 цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Рассмотрим примеры различного представления нескольких чисел: Десятичное число Двоичное число Шестнадцатеричное число 0 0 0 1 1 1 10 2 2 11 3 3 100 4 4 101 5 5 110 6 6 111 7 7 1000 8 8 1001 9 9 1010 10 A 1011 11 B 1100 12 C 1101 13 D 1110 14 E 1111 15 F 10000 16 10 10001 17 11 … … … Фактически биты двоичной записи группируются по четыре, и содержимое каждой четвёрки бит записывается в виде одной шестнадцатеричной цифры. Например: Двоичное число: 1000101011110 Оно же, разбитое на четвёрки бит: 1 0001 0101 1110 Шестнадцатеричная запись: 1 1 5 Е Вся работа компьютера – это управление потоками байтов, которые устремляются в машину с клавиатуры или с дисков, преобразуются в соответствии с программой, временно запоминаются или записываются на постоянное хранение, а также выводятся на экран дисплея или бумагу принтера в виде хорошо знакомых нам букв, цифр, служебных знаков. Любой компьютер умеет выполнять небольшое количество очень простых команд, например: заменить 0 на 1, записать в байт 00110101, сложить пару чисел. Секрет могущества компьютера в том, что он может быстро выполнять длинные последовательности таких команд и обрабатывать большие объёмы информации. На долю человека выпадает составление описания того, какие действия, в каком порядке и над какими порциями информации должен произвести компьютер, т.е. составление программы для компьютера. Задача программиста состоит не в том, чтобы самому решить задачу, а в том, чтобы спланировать такую последовательность команд, которая позволит компьютеру отыскать решение. Компьютеры выполняют только те инструкции, которые задаются на так называемом машинном коде, т.е. выражены на языке нулей и единиц. Существенной особенностью такого языка является жёсткая ориентация на определённый тип аппаратуры. Составлять программы на машинном коде – занятие крайне утомительное и непродуктивное. Дело несколько упрощается, если воспользоваться языком ассемблера (языком низкого уровня), который разрешает вместо двоичных нулей и единиц использовать мнемонические (смысловые) коды. Язык ассемблера – это по сути дела то же самое, что и машинный язык, но в более понятной форме. Команды на машинном языке задаются шестнадцатеричными кодами, почти недоступными для понимания, тогда как система записи программы на языке ассемблера понятна опытному специалисту. При всех достоинствах ассемблера программирование на нем требует отслеживания мельчайших деталей программы и поэтому он не используется без особой в том надобности. Чтобы избежать утомительного и чреватого ошибками программирования на ассемблере, нужно пользоваться языками программирования высокого уровня. Работая с таким языком, ЭВМ сама выполняет максимально возможный объём работ по созданию команд на машинном языке. Языки высокого уровня основаны на двух принципах. Один из них заключается в том, чтобы суммировать большое число команд машинного языка в одном операторе программы. Второй же принцип заключается в том, чтобы опустить детали, связанные со спецификой данного типа компьютера, но не имеющие принципиального значения для решения задачи. Во время исполнения каждый оператор программы заменяется на большое количество команд машинного языка, что позволяет избежать уточнения многих ненужных деталей. На сегодняшний день разработаны и используются десятки языков программирования. Как же языки программирования превращаются в команды на машинном языке? Для того чтобы программа независимо от выбранного языка программирования могла работать, она должна быть переведена (оттранслирована) в команды на машинном языке, которые непосредственно может выполнить компьютер. Существует два основных способа такого перевода: это интерпретация и компиляция. Интерпретация – это такой способ трансляции, при котором программы переводятся на машинный язык шаг за шагом непосредственно во время их выполнения. Всё это похоже на синхронный перевод. Интерпретация – это медленный и неэффективный, но зато гибкий процесс. Медленный, потому что перевод производится одновременно с выполнением программы. Неэффективный, поскольку перевод делается многократно, – не просто когда программа работает, но и когда повторяется какой-либо шаг программы. С другой стороны, интерпретация – процесс очень гибкий, поскольку программу можно исправлять немедленно. Компиляция – осуществляется предварительно, чтобы компьютер затем мог выполнить всю программу целиком на машинном языке. Компилируемые программы переводятся на машинный язык специальной программой (компилятором) до того, как компьютер будет их выполнять. Подготовленные таким образом программы уже готовы к работе, тогда как интерпретируемые можно использовать только при наличии программы-интерпретатора. Любой транслятор решает следующие основные задачи: Анализирует транслируемую программу, в частности определяет, содержит ли она синтаксические ошибки; Генерирует выходную программу (её часто называют объектной или рабочей) на языке команд ЭВМ; Распределяет память для выходной программы (в простейшем случае это заключается в назначении каждому фрагменту программы, каждому объекту своих адресов участков памяти).