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

Технологический цикл обработки программы выглядит следующим образом:

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

 

Упрощенная модель компиляции представлена на рисунке 1.5.

 

 

Рис.1.5. Упрощенная модель компиляции

 

Во всех языках программирования (в том числе и в С++) программа рассматривается как последовательность лексем. Лексема – это неделимая единица программы. Лексический анализ текста программы – это выделение основных категорий лексем языка (их мы рассмотрим на следующей лекции). Лексический анализ проводится в порядке расположения символов в программе. За очередную лексему принимается наибольший ряд символов, который может быть распознан как лексема. Например, запись a++-b трактуется как a++ -b, т.е. увеличить значение a на 1 и затем найти разность; запись elseif трактуется как elseif а не как else и if; if – также лексема (ни ‘i’, ни ‘f’ сами по себе не имеют в программе на С++ никакого значения); оператор равенства == также является лексемой. Строковая константа, даже содержащая пробельный символ, защищена от разбиения на лексемы и пробелы: "кафедра информатики".

 

Примеры выделения лексем:

предложение языка результат лексического анализа
for (int i=1; i <=10; i++) ; for ( int i = 1 ; i <= 10 ; i ++ ) ;
char name[] = "кафедра информатики" ; char name [ ] = "кафедра информатики" ;
int i; float f; int i ; float f ;
int /*описание*/ i /* счетчика*/ ; int i ;

 

После лексического анализа текста программы, компилятор выполняет синтаксический анализи затем – семантический анализ.

Синтаксис языка программированиясистема правил написания различных языковых конструкций. В процессе синтаксического анализа компилятор проверяет соответствие смысловых конструкций языка, построенных из лексем, синтаксису языка программирования. Нарушение этих правил приводит к синтаксическим ошибкам, выявляемым на этапе компиляции программы. Например:

int i, //error!!! определение переменной должен завершать символ ‘;’

float f;

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

int i;

for (i=1; i <=10; i++)

cout << i; //вывод значения переменной i в цикле

for (i=1; i <=10; i++);

cout << i; //вывод последнего значения переменной i!!!

Особенности внутреннего представления программы и ее исполнения [9]*

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