
- •Лекция 1
- •Понятие программы и языка программирования
- •Компоненты языка программирования
- •Структурная схема компьютерной программы
- •Жизненный цикл программного средства
- •Технология подготовки и решения задачи на компьютере
- •Функция как компонент структуры программы
- •Примеры простых программ в ычисление значения функции в заданной точке
- •Вычисление суммы и количества целых чисел, введенных пользователем с клавиатуры
- •Демонстрация работы со строками на основе использования класса string
- •Виды представления программы и данных
- •Процесс компиляции программы
- •Классическая схема подготовки исполняемой программы
- •Технологический цикл обработки программы
- •Особенности внутреннего представления программы и ее исполнения 9*
- •Организация памяти компьютера
- •Сегментация программы
- •Процесс исполнения программного кода
- •Структура текстового файла программы
- •Структура программы из двух текстовых файлов
- •В результате изучения материала лекции необходимо знать
Особенности внутреннего представления программы и ее исполнения 9*
Для понимания и осознанного использования многих особенностей языка программирования полезны знания о внутреннем представлении программы и принципах ее исполнения, а также о компьютерной архитектуре. Попробуем представить все это на самой примитивной модели.
Организация памяти компьютера
Все данные, хранящиеся в памяти компьютера, представляются в двоичной системе счисления в виде машинных слов – наборов двоичных разрядов (совокупность битов – нулей и единиц). Биты объединяются в последовательности: байты, слова и т.д. Минимальный размер машинного слова для хранения, обработки и передачи данных – 8 битов (1 байт). Все остальные слова кратны ему. Стандартное машинное слово имеет разрядность, соответствующую разрядности процессора (32 разряда или 4 байта).
Какой смысл заключен в данных, какими символами они выражены – буквенными или цифровыми, что означает то или иное число – все это определяется программой обработки. Все данные, необходимые для решения практических задач, подразделяются на несколько типов, причем понятие тип связывается не только с представлением данных в адресном пространстве, но и со способом их обработки. Данные могут быть отнесены к одному из двух типов: основному (простому), форма представления которого определяется архитектурой компьютера, или сложному, конструируемому пользователем для решения конкретных задач. Данные простого типа это – символы, числа и т.п. элементы, дальнейшее дробление которых не имеет смысла. Из элементарных данных формируются структуры (сложные типы) данных.
Основу компьютерной архитектуры составляет прямо адресуемая память: массив элементарных ячеек памяти, номера которых называются адресами. Каждому участку оперативной памяти, который может вместить один байт или слово, присваивается адрес (порядковый номер). Как адрес памяти, так и ее содержимое представляют собой машинные слова.
Для представления содержимого машинных слов используется шестнадцатеричная система счисления. В дальнейшем описании мы будем применять более привычные десятичные значения, не забывая, что в реальности имеем дело с двоичными (шестнадцатеричными) эквивалентами.
Поэтому на самом низком уровне адрес можно рассматривать как целое число. Все формы представления данных (целые со знаком и без него, вещественные, символы) проецируются в двоичное представление и в машинные слова. Но!!!: хранятся числовые значения в памяти, начиная с младшего байта, в порядке, обратном привычному нам при записи чисел (Рис.1.6).
Рис. 1.6. Организация памяти компьютера
Сегментация программы
Следующий важный принцип организации памяти – сегментация. Сегментом называется непрерывная область памяти, хранящая данные одного вида (назначения) и имеющая собственную систему относительной адресации и ограничения доступа. К программированию это имеет отношение потому, что при трансляции разные компоненты программы попадают в различные сегменты программного кода.
Одновременное нахождение в памяти «алгоритма» и данных соответствует принципу хранимой программы, который заключается в том, что программный код хранится в той же самой памяти, что и обрабатываемые данные, и в свою очередь сам представляет собой специфические данные, с которыми работает процессор во время выполнения программы. В настоящее время применяется немодифицируемый программный код. Это, в свою очередь, означает, что несколько программ могут его читать и исполнять, не мешая друг другу, в том числе и на физически параллельных процессорах.
Компоненты программы находятся в памяти, которая, в принципе, является общей для них, но логически разделяется на области, именуемые сегментами: прежде всего, это сегмент данных, содержащий данные программы; сегмент кода (команд), в котором находится алгоритмическая компонента (выражения, операторы); сегмент стека, в котором находятся локальные данные функций, «история» работы программы.
Процессор имеет в своем составе набор машинных слов – регистров. В зависимости от назначения они могут хранить как данные, так и адреса памяти. Сегментация поддерживается в процессоре при помощи регистров двух видов. Базовый регистр сегмента содержит его начальный адрес. Регистры, работающие с данными сегмента, содержат относительный адрес данных от начала сегмента, или смещение. Результирующий адрес получается путем сложения содержимого этих регистров. Таким образом, каждый сегмент имеет собственную «систему координат», связанную с его началом (Рис.1.7). Если программа использует только сегментную адресацию, то сегменты можно перемещать по памяти при сохранении работоспособности программы: достаточно перенастроить соответствующие им базовые регистры.
Выполняемая программа состоит из нескольких сегментов. Некоторые из них создаются при трансляции, другие – при загрузке и при работе программы. В принципе, программа может иметь несколько сегментов одного вида:
Сегмент |
Регистры |
Что содержит |
Когда создается |
Сегмент команд |
CS- сегментный, IP- адрес команды |
Программный код (операции, операторы) |
трансляция |
Сегмент данных |
DS – сегментный |
Глобальные (статические) данные |
трансляция |
Сегмент стека |
SS – сегментный, SP– указатель стека |
Локальные данные функций, «история» работы программы |
при загрузке |
Динамическая память |
DS – сегментный |
Динамические переменные, создаваемые при работе программы |
при загрузке, выполнении |
Динамически связываемые библиотеки (DLL) |
CS– сегментный, IP– адрес команды |
Программный код разделяемых библиотек |
при загрузке |
Рис. 1.7. Сегментация программы
Следующий элемент архитектуры тоже имеет отношение к внутреннему представлению программы – виртуальное адресное пространство (виртуальная память). Его идея состоит в том, что каждая программа имеет свое, независимое от других, виртуальное адресное пространство (виртуальную память), в котором размещаются сегменты программы, определяются адреса и т.п. В процессоре имеется скрытая от программ система отображения виртуальных адресов на физические адреса. Виртуальное адресное пространство находится под управлением операционной системы и реализует защиту памяти программ, ее разделение (сегменты динамически связываемых библиотек), загрузку программы в память «по частям» и иллюзию наличия неограниченной памяти. Для нас из всего этого важно то, что внутренне представление программы в виртуальной памяти занимает все адресное пространство, как будто других программ и операционной системы в памяти нет вовсе.