Лекция 1 Понятие программы и языка программирования

Лекция 1

Понятие программы и языка программирования. 1 Компоненты языка программирования. 3 Структурная схема компьютерной программы.. 3

Компоненты языка программирования

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

Структурная схема компьютерной программы

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

 
 

 

 


 

Рис.1.1. Структурная схема компьютерной программы

Жизненный цикл программного средства

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

Технология подготовки и решения задачи на компьютере

o ознакомление с поставленной задачей – анализ исходных данных, условий и целей решения задачи, формулировку требований к программе, разработку… o составление плана решения – определение структур данных, состава и… o осуществление решения – переработку согласно составленному плану входной информации в выходную информацию,…

Вычисление значения функции в заданной точке

  Представленные варианты программы используют разные средства ввода-вывода:   //proba_2_1.cpp #include <iostream> #include <conio.h> //нет директивы using…

Вычисление суммы и количества целых чисел, введенных пользователем с клавиатуры

Proba_3.cpp

#include <conio.h> using namespace std; //директива есть!!!, std:: перед cout далее отсутствует … int main()

Демонстрация работы со строками на основе использования класса string

//proba_4.cpp

#include <iostream>

#include <string> //библиотечный класс string

#include <conio.h>

using namespace std;

int main() {

string response="Enter Your name: "; //определение строки response класса string

cout << response;

string name; //определение объекта-строки name класса string

cin >> name; //ввод значения объекта-строки name до пробела

string greeting ="Hello, "; //определение строки greeting класса string

greeting = greeting + name + "!"; //конкатенация (сцепление) строк

cout << greeting << endl;

_getch();

return 0;

}

Результаты выполнения программы:

Enter Your name:Larisa<enter>

Hello, Larisa!

 

Виды представления программы и данных

Программа имеет два представления:

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

o двоичный машинный код, готовый к исполнению и хранимый в виде exe-файла;

 

Данные имеют также два представления:

· внешнее – в тексте программы, при вводе или выводе значений на экран и, возможно, хранении (в текстовом файле)

· внутреннее – двоичный код, формируемый по определенным правилам компилятором и средой исполнения в оперативной памяти (в зависимости от типа данного).

Процесс компиляции программы

Функцию перевода программы в машинный код выполняет программа-транслятор,имеющая две разновидности: компилятор и интерпретатор.

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

Компиляция–перевод текста программы с исходного формального языка на другой, более простой язык. Скомпилировать исходный код – означает выполнить программу-компилятор.В С++ компилятор является одним их компонентов IDE (Integrated Development Environment) – интегрированной среды разработки, предоставляющей программисту средства для комплексной работы с программой (редактирование, компиляция, компоновка, загрузка, выполнение, отладка, справка). Удобство IDE (например, Microsoft Visual Studio 2005) заключается в том, что не приходится работать с множеством приложений, так как все задачи выполняются в рамках IDE.

Компиляция и интерпретация отличаются совмещением фаз обработки объектов программы во времени:

· при компиляции фазы преобразования и выполнения действий разнесены во времени, но зато каждая из них выполняется над всеми объектами программы одновременно;

· при интерпретации, наоборот, преобразование и выполнение действий объединены во времени, но для каждого объекта программы. Отлаженные скомпилированные программы выполняются более эффективно.

Различные языки программирования включают процессы компиляции и интерпретации в разных пропорциях и сочетаниях. Язык Си++ является «чистым компилятором»:результатом трансляции является программный код, в который транслятор не включает никаких «лишних» команд (например, проверки установленных ограничений или обнаружения ошибок), что позволяет гарантировать эффективность и независимость программного кода и делает язык единственным (кроме Ассемблера) языком системного программирования, на котором пишутся ядро операционной системы, драйверы и т.п.

 

Классическая схема подготовки исполняемой программы

Программа выполняется в компьютере, архитектура которого обеспечивает язык программирования, именуемый машинным кодом.Данные в этом языке представлены машинными словами,хранящимися в памяти и в регистрах процессора, а выполняемые действия – системой команд. Рассмотрим схему подготовки исполняемой программы в типичной среде программирования С++ (Рис.1.3):

(1) – программа набирается в текстовом редакторе среды разработки и запоминается на диске (расширение имени файла .срр);

(2) – программа-препроцессор распознает в тексте программы директивы препроцессора (начинаются с символа #), обрабатывает директиву #include<…..>и подключает к исходному тексу программы указанные в ней файлы. Основная цель препроцессора – закончить формирование исходного кода программы на С++, поэтому типичное для него действие – добавление или изменение исходного кода перед компиляцией. Выполняя директиву, препроцессор преобразовывает исходный код программы в расширенный код («единицу трансляции»), который и подается на вход компилятора.

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

 
 

 

 


Рис.1.3. Схема подготовки исполняемой программы в типичной среде программирования С++

 

(4) – программа-ассемблерпереводитассемблерный код на машинный язык, создает объектный модуль программы с расширением .obj и сохраняет его на диске. Файл, содержащий скомпилированную программу, – это объектный модуль программы.

(5) – программа-компоновщик (редактор связей, Linker) объединяет объектный код программы (совместно компилируемые модули) с объектными кодами используемых ею библиотечных функций (библиотечные файлы имеют расширение .lib) и стандартным кодом начальной загрузки, в результате чего создается исполняемый загрузочный модуль программы – файл с расширением .exe, сохраняемый на диске. Обычно программы содержат ссылки на функции, определенные вне самой программы: в стандартных или личных библиотеках, а объектный код содержит «дыры» из-за этих отсутствующих частей; компоновщик заполняет эти «дыры».

(6) – программа-загрузчик размещает скомпонованную программу в памяти (забирает исполняемый код с диска и размещает его в памяти).

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

 

Технологический цикл обработки программы

Рис.1.4. Технологический цикл обработки программы

Организация памяти компьютера

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

Сегментация программы

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

Процесс исполнения программного кода

· программный код – последовательность команд,размещенная в сегменте кода (CS), на начало которого ссылается одноименный регистр процессора; · каждая команда имеет в сегменте свой относительный адрес (от начала… · команда представляет собой машинное слово, обычно переменной длины, и состоит из нескольких полей. Обязательным…

Область определения глобальных переменных ограничена пределами одного файла (File1.cpp), и, следовательно, эти переменные невидимы в другом файле (File2.cpp). Для их использования требуется также объявление extern (например, линия 5 для массива array; линия 7 для переменной ext_ch; только функцияfunction3() для переменной ext_pp).

File2.cpp
File1.cpp

Рис.1.9. Структура программы из двух файлов и область действия переменных в программе

Пример более сложной программы на С++ (сортировка строк)[10]*

Программа сортирует строки в лексикографическом порядке, возрастающем или убывающем в зависимости от признака, передаваемого функции main() через аргумент argv, и выводит их на экран.

Исходный текст программы представлен в текстовых файлах (main.cpp, bblsort.cpp) и в заголовочных файлах (Рис.1.10):

· стандартном заголовочном файлеstdafx.h

· файлеbblsort.h (подключаемом в начале каждого из текстовых файлов в рамках файлаstdafx.h).

 

 

 


Рис.1.10. Структура программы сортировки строк

 

Программа с комментариями и подробное описание действий, выполняемых каждым фрагментом (А, B, C, D, …), представлены ниже:

 

//bblsort.h – заголовочный файл
А #define MAXLINES 10 #define LINESIZE (12+1)
//stdafx.h – стандартный заголовочный файл
  B #include <iostream> //для ввода/вывода #include <conio.h> //для _getch() #include <cstring> //для strcmp(), strcpy_s() #include "bblsort.h" //для MAXLINES, LINESIZE int rdlines(void); //прототипы функций, определенных в файле main.cpp void wrlines(int);   int lexcmp(int, int);//прототипы функций,определенных в файле bblsort.cpp void swap(int, int); void bblsort(int);   using namespace std;
   
  //main.cpp – программный файл
C #include "stdafx.h" //подключение стандартного заголовочного файла
D //глобальные переменные char Line[MAXLINES] [LINESIZE]; //буфер строк int Revflg; //признак направления сортировки  
E //определение функции main() int main (int argc, char **argv) //аргументы вызова программы // argc - число аргументов, argv – указатель на строки-аргументы
  {  
F int numlines; //локальная переменная функции main()  
G Revflg = (argc>1 && argv[1][0] =='-'); numlines = rdlines();//вызов функции ввода строк cout << "n----------------------n" ; bblsort(numlines);//вызов функции сортировки,аргумент – количество строк wrlines(numlines);//вызов функции вывода строк,аргумент – количество строк cout << "n----------------------n" ; _getch(); //функция _getch(); ожидает нажатия клавиши return 0; }
   
H //определение функции rdlines() ввода строк с клавиатуры static int rdlines() //функция доступна только в данном файлеmain.cpp
I { int i; //локальная переменная функции rdlines() for (i=0; i < MAXLINES; i++) if (!cin.getline(Line[i], LINESIZE) ) break; return i; //функция возвращает количество введенных строк }
   
J //определение функции wrlines() вывода n строк на экран static void wrlines(int n) //функция доступна только в файле main.cpp { unsigned i; //локальная переменная функции wrlines() for (i=0; i<n; i++) cout << Line[i] << endl; return; //функция выводит строки и ничего не возвращает }
   
//bblsort.cpp – программный файл
K #include "stdafx.h" //подключение стандартного заголовочного файла
   
L extern char Line [][LINESIZE]; //объявление массива Line, // определенного в файле main.cpp
   
M //определение функции bblsort()сортировки строк void bblsort( int n) // n - число строк { unsigned i, j; //локальные переменные функции bblsort() for (i=1; i<n-1; i++) for (j=n-1; j>=i; j--) if (lexcmp(j-1, j)) swap(j-1, j); return; //функция сортирует строки и ничего не возвращает }
   
N // определение функции lexcmp() сравнения строк //аргументы i, j – номера строк для сравнения static int lexcmp (int i, int j) {//функция доступна только в файле bblsort.cpp extern int Revflg; //объявление Revflg, определение в файле main.cpp int lc; lc= strcmp(Line[i], Line[j]); //библиотечная функция сравнения строк return ((lc<0 && Revflg) || (lc > 0 && !Revflg)); }//функция lexcmp() возвращает 1 или 0 в зависимости от результата //сравнения строк lc и признака Revflg направления сортировки
   
O //определение функции swap() обмена строк // аргументы i, j – номера строк для обмена static void swap( int i, int j) //функция доступна только в этом файле { char temp [LINESIZE]; strcpy_s(temp, Line[j]); //библиотечная функция копирования строк strcpy_s(Line[j], Line[i]); strcpy_s(Line[i], temp); return; //функция swap() меняет строки и ничего не возвращает }

 

А– заголовочный файл bblsort.h с препроцессорными константами MAXLINES и LINESIZE. Препроцессорные константы обычно помещаются в заголовочный файл, включаемый в другие файлы программы, по мере необходимости. При изменении значений констант изменения затронут только файлbblsort.h.

B – стандартный заголовочный файл stdafx.h. Содержит директивы препроцессора для подключения стандартных заголовочных файлов с прототипами библиотечных функций (для работы со строками и другими функциями, вызываемыми в файле); директиву препроцессора для подключения пользовательского заголовочного файла bblsort.hс препроцессорными константами MAXLINES и LINESIZE; прототипы функций rdlines(), wrlines(), определенных в файле main.cpp, иlexcmp(), swap(), bblsort(), определенных в файле bblsort.cpp программы, а также директиву using namespace std; определяющую для данной программы в качестве пространства,в котором распознаются ее имена, стандартное пространство имен std (за пределами его имена будутнеизвестны).

БлокиотСдоJвключительно представляют содержание файла main.cppс головной функцией main()и вызываемыми в ее теле функциями rdlines()иwrlines().

С– подключение к файлу main.cppстандартного заголовочного файлаstdafx.h.

  В блоках от E до Gпредставлено определение головной функции main(),… E– заголовок функции main(): int argc – число строк-аргументов переданное в программу; char** argv (или char* argv[])…

K – подключение к файлу bblsort.cpp стандартного заголовочного файлаstdafx.h.

M – определение функции bblsort(). Функция вызывает функции сравнения – lexcmp() и обмена – swap() строк. Функция не описывается как static, потому… N – определение функции lexcmp(). Возвращаются значения Истина (1) или Ложь… O – определение функции swap(). Функция определена как имеющая тип void. Прототип стандартной функция strcpy()…