Компьютеры появились достаточно давно. Первые из них были ламповыми и занимали очень много места. Для того чтобы управлять такой машиной требовалось много обслуживающего персонала. Со временем лампы были вытеснены электронными компонентами, и компьютеры стали значительно меньше. Сейчас системные блоки компьютеров занимают совсем мало места,а их производительность стала значительно выше.
Однако основные принципы работы компьютера, заложенные во времена их рождения, действуют до сих пор. Данные пере даются с помощью сигнала методом "имеется сигнал или нет". Так появился "бит". Бит - это единица информации, которая может принимать значение 0 или 1. Восемь бит объединяются в байт, один байт равен 8 битам. Число 8 появилось из-за того что первые компьютеры были восьмиразрядными и могли работать одновременно только с 8 разрядами, например, 01011001. Первые нули можно убирать.
В один байт можно записать любое число от 0 до 255. Указанный диапазон чисел очень мал, поэтому чаще используют более крупные диапазоны: два байта = слово, два слова = двойное слово.
Компьютер стал работать в двоичной системе счисления. Любое десятичное число можно записать как двоичное. Подробное преобразование рассматривать не будем, если кому-то интересно, пишите в комментариях – расскажу.
В компьютере принято вести расчет в двоичной или шестнадцатеричной системе. Вторая стала использоваться, когда компьютеры стали 16-разрядными. При написании программ на Delphiбудем использовать привычную десятичную систему, потому что компилятор сам переведет все числа в нужный процессору вид, но понимать, с какими числами работает процессор, очень важно.
Шестнадцатеричная система выглядит по-другому. Каждый разряд содержит шестнадцать состояний. Поэтому один разряд может принимать значения: 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, Е, F. Буква "А" соответствует цифре 10 в десятичной системе, "В" - 11 и т. д.
Например, число 1B в шестнадцатеричной системе равно 27 в десятичной.
На протяжении всех материалов мы будем иногда встречаться с шестнадцатеричной системой исчисления. В этом случае, чтобы отличать шестнадцатеричное число от десятичного, перед ним будет стоять знак #, например, #25, так принято в Delphi.
С числами с плавающей точкой работа идёт совершенно не так, рассматривать это мы не будем.
Теперь разберемся отрицательными числами. Если заранее предусмотрено, что число может быть отрицательным, то его длина сокращается на один бит, который отводится под знак числа. Если первый бит равен 1, то число отрицательное, иначе положительное.
В дробных числах один байт может быть отведен для целой части и один для дробной. За счет этого дробные числа всегда будут занимать больше памяти, и операции с ними будут проходить дольше.
1.2. Машинный язык
Все данные на диске, в том числе и текстовые файлы, хранятся в двоичном виде. Точно так же выглядит и любая программа, только ее называют машинным кодом. Рассмотрим его подробнее.
Любая программа – это последовательность команд, которые называются процессорными инструкциями. Во время запуска программы компьютер загружает ее машинный код в оперативную память и начинает выполнять команду за командой. Задача программиста – написать эти инструкции так, чтобы компьютер понял, что от него хотят.
Реальная программа, которую выполняет компьютер, представляет собой последовательность единиц и нулей. Такую последовательность называют машинным языком.
Например, команда сложения двух регистров в шестнадцатеричной системе выглядит так: $03С3. Это мало о чем говорит, и запомнить такую команду очень тяжело. Намного проще написать "сложить число 1 и число 2".
Сначала программисты писали программы в машинных кодах, затем появился первый компилятор — программа, которая переводила текст программ в машинный код. Таким образом, пользователи стали писать программы более осмысленно, а всю рутинную работу по переводу текста программы в машинный байт-код стал выполнять сам компьютер.
1.3. История языков программирования
Язык, на котором пишется программа, называется языком программирования.
Первым компилятором был Assembler(переводится как "сборщик"). Писать на нем почти так же сложно, как и в машинных кодах, но теперь уже использовались не числа, а понятные человеку слова.
Текст на рисунке можно разделить на три колонки:
·адрес инструкции;
·машинный код инструкции;
·код на языке Ассемблера.
Например, команда копирования регистров выглядела так: movеах, ebx.В данном случае mov— это команда языка программирования, еах и ebx— имена регистров.
На языке Assemblerпрограмму писать легче, но программа, написанная в машинных кодах, работала быстрее и более гибко. При написании программы в машинных кодах программист ничем не ограничен, а при работе с ассемблером есть ограничения. Не всегда возможно повлиять на результат.
После создания ассемблера языки программирования стали появляться один за другим. Так появились С, ADA, FoxPro, Fortran, Basic, Pascalи др. Некоторые из них были предназначены только для обучения, другие были ориентированы на профессиональных программистов.
Язык Assemblerв настоящее время в основном используется только в качестве вставок для языков высокого уровня, а машинные коды используются для написания того, что не может сделать компилятор.
Затем получило развитие объектно-ориентированное программирование. Язык С превратился в C++, Pascalв ObjectPascalи т. д.
Последней крупной революцией, происходящей в программировании, считается переход на визуальное программирование. Этот переход происходит в настоящее время. Визуальность дает еще более удобные средства разработки для быстрого написания кода, но проигрывает ООП по быстроте работы. Одни из часто используемых языков, поддерживающих визуальное программирование, являются Delphiи C#, хотя прогресс не стоит на месте и визуальные компоненты появляются для многих других языков.
Выбрать лучший язык невозможно. Каждый из них подходит для определённого круга задач, и программист должен сам выбрать наиболее удобный для себя язык.
1.4. Исполнение машинных команд
Кроме байта существуют и другие размерности:
·1 килобайт = 1024 байт;
·1 мегабайт = 1024 килобайт;
·1 гигабайт = 1024 мегабайт.
·1 терабайт = 1024 гигабайт.
·и т.д.
В компьютере большинство значений являются степенью числа 2, потому что компьютер оперирует двоичной системой, и таким образом можно максимально эффективно использовать его возможности. Именно из-за этого при расчёте размерностей используется 1024 (2 в степени 10).
Рассмотрим некоторые понятия.
Сегмент— это область внутренней памяти компьютера.
Когда операционные системы были 16-битными, процессор не мог работать с памятью размером более 64 килобайт, потому что это максимальный размер области памяти, который можно адресовать, используя в этих целях адрес длиной в два байта. Поэтому память делилась на сегменты по размеру и по назначению. В данный момент используются 32-разрядныю ОС, которая может адресовать до 4 Гбайт оперативной памяти и 64-разрядные ОС. Поэтому можно сказать, что память стала сплошной. Однако деление ее по назначению все-таки осталось.
Существуют следующие сегментsы памяти:
·сегмент кода — область памяти, в которую загружается машинный код, который будет потом выполняться процессором;
·сегмент данных — область памяти для хранения данных;
·сегмент стека — область памяти для хранения временных данных и адресов возврата из процедур.
Каждой запущенной программе отводится свой сегмент кода, данных и стека. Поэтому данные одной программы не могут пересекаться с данными или кодом другой программы.
Регистр — ячейка памяти в процессоре. Её размер зависит от разрядности. В 32-разрядных процессорах ячейки 32-битные, но есть и 64-битные. Таких регистров у процессора несколько, и каждый из них предназначен для определенных целей. Существуют также регистры общего значения, которые программа может использовать на свое усмотрение.