Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Яп

.pdf
Скачиваний:
28
Добавлен:
15.03.2023
Размер:
6.44 Mб
Скачать

 

Пример ООП для С++

class Figure{

class Circle : public Figure{

...

...

void Draw() const;

void Draw()const;

...};

...};

class Square : public Figure{

...

void Draw() const;

...};

Какая именно из функций будет вызвана — Figure::Draw(), Square::Draw() или Circle::Draw() — определяется во время компиляции.

Circle *c = new Circle(0,0,5);

Figure *f = c; // Всё ok: Figure — базовый классдля Circle c->Draw();

f->Draw();// Указатели друг другу равны, но для f будет вызвана другая

функция, чем для c

41

 

Язык описания интерфейсов

Языкописанияинтерфейсов (англ. Interface Description Language или Interface DefinitionLanguage) - язык спецификаций для описанияинтерфейсов, синтаксически похожий на C++.

CORBA IDLРазработан OMG для описания интерфейсов распределенныхобъектов, названий методови типов переменных-аргументов.Создан в рамках обобщенной архитектуры CORBA.

COM IDL Аналогичная CORBA IDL разработка Microsoft,

созданная для описания интерфейсовмежду модулями

COM.

43

2/27/2023

Прототипное программирование

Прототипноепрограммированиестиль объектно-

ориентированногопрограммирования,при котором отсутствует понятие класса, а повторноеиспользование (наследование) производится путёмклонирования существующего экземпляраобъекта прототипа.

Примеры: Self, JavaScript, Cecil, NewtonScript, Slate, REBOL, Kevo

42

Логическое программирование

Логическое программирование - парадигма программирования, а

также раздел математической логики, изучающий методы и возможности этой парадигмы, основанная на выводе новых фактов из данных фактов согласно заданным логическим правилам.

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

Используется в экспертных системах и системах принятия решений.

Высокий уровень машинной независимости, возможность отката к предыдущей подцели при отрицательном результате анализа одного из вариантов.

Языки: Prolog, Mercury, Visual Prolog, Oz, Fril, Planner, QA-4, Popler, Conniver, QLISP

Специфичностьрешаемыхзадач.

Нелинейностьструктуры программы

Сложность эффективнойреализации в системах реального времени

44

11

Пример программы Prolog

% это факты

% это тоже факты:

высокоуровневый_язык(php).

программист(вася, php).

высокоуровневый_язык(java).

программист(петя, assembler).

системный_язык(assembler).

программист(коля, visual_basic).

системный_язык(pure_c).

программист(женя, pure_c).

 

программист(адольф, brainfuck).

%правило вывода - "системный программист - это программист, знающий системный язык"

системный_программист(Некто):- программист(Некто, Язык), системный_язык(Язык).

Вводимзапрос:

?- системный_программист(А).

A= петя;

A= женя;

false.

45

Языки сценариев (скриптовые)

Скриптовыйязык - языкпрограммирования, разработанный для записи «сценариев», последовательностейопераций, которые пользователь можетвыполнятьна компьютереили которые могут инициироваться операционнойсистемой.

Простые скриптовыеязыки раньше часто называли языками пакетной обработки (batchlanguages или job controllanguages).

Сценарии обычноинтерпретируются, а не компилируются.

Примеры: bat файлы команднойстроки ОС Windows,

язык bash в ОС Unix.

47

2/27/2023

Языки параллельного программирования

Программы – совокупность описаний процессов, которые могут выполняться как в действительности одновременно, так и в псевдопараллельном режиме.

Позволяют достичь заметного выигрыша при обработке больших объемов данных, поступающих от одновременно работающих пользователей, либо имеющих высокую интенсивность.

Часто применяются в системах реального времени.

Недостаток – высокие накладные расходы на разработку программ.

Примеры языков: Ada, Modula-2, Oz, MC#, Си.

46

48

12

Классификация по типам задач

Задачи искусственного интеллекта (Lisp, Prolog, Multilisp, Commonlisp, Рефал, Planner, QA4, FRL, KRL, QLisp)

Параллельные вычисления (Fun, Apl, Alfl, PARAlfl, ML, SML, PPL/1, Hope, Miranda, Occam, PFOR, Glypnir, Actus, Cobol, ОВС, PA)

Задачи вычислительной математики и физики (Occam, PFOR, Glypnir, Actus,параллельный Cobol, ОВС, PA(1), PA(G))

Разработка интерфейса (Forth, c, C++, Ассемблер, Simula-67, OAK, Smalltalk, Java, РПГ)

Разработка программ-оболочек, разработка систем (Forth, Java, C/C++, Ассемблер, Макроассемблер, Simula-67, OAK, Smalltalk)

Задачи вычислительного характера (Algol, Fortran, Cobol, Ada, PL/1, Фокал, Basic, Pascal)

Оформление документов, обработка больших текстовых файлов, организация виртуальных трехмерных интерфейсов в Интернете, разработка баз данных (Perl, Tcl/Tk, VRML, SQL,

PL/SCL, Informix 4GL, Natural, DDL, DSDL, SEQUEL, QBE, ISBL)

49

Основные элементы ЯП

Синтаксис

Семантика

Данные и типы данных

Операторы

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

Подпрограммы

Модули

51

2/27/2023

ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА ПРОГРАММИРОВАНИЯ

50

Синтаксис

Синтаксис языка программирования – это набор правил,

которые определяют, какие последовательности символов являются допустимыми.

Синтаксис задается с помощью формальной нотации. Самая распространенная нотация – расширенная форма Бекуса-Наура (РБНФ).

Описание грамматики в РБНФ представляет собой набор правил, определяющих отношения между терминальными символами (терминалами) и нетерминальными символами (нетерминалами).

Терминальные символы – это минимальные элементы грамматики, не имеющие собственной грамматической структуры. Обозначение <>

Нетерминальные символы – это элементы, имеющие собственные имена и структуру. Каждый нетерминал состоит из

одного или более терминалов и/или нетерминалов, сочетание которых определяется правилами грамматики. Обозначение ()52

13

Синтаксис

Правила - имеют вид

идентификатор ::= выражение.

Где идентификатор - имя нетерминального символа, а выражение - комбинация терминальных и нетерминальных символов и специальных знаков. Правило завершается специальным символом - точкой.

Набор таких правил называют грамматикой.

В качестве выражения могут выступать:

1. Конкатенация. Правило вида A ::= BC.

Обозначает, что нетерминал A состоит из двух символов - B и C.

B и C называют ещё синтаксическими факторами.

2. Выбор. Правило вида A ::= B|C.

Обозначает, что нетерминал A может состоять либо из B, либо из C. Элементы выбора называют ещё синтаксическими термами.

53

Синтаксис

7.Комментарий. Правило вида (* … *)

8.Специальная последовательность символов. Правило вида

?...?

Общую форму грамматики РБНФ-описания можно описать в виде РБНФ следующим образом:

Синтаксис ::= {СинтОператор} .

СинтОператор ::= идентификатор "=" СинтВыражение ".". СинтВыражение ::= СинТерм {"|" СинТерм}.

СинТерм ::= СинтФактор { СинтФактор }. СинтФактор ::= идентификатор | цепочка

| "(" СинтВыражение ")" | "[" СинтВыражение "]" | "{" СинтВыражение "}".

55

2/27/2023

Синтаксис

3. Условное вхождение - Правило вида A ::= [B].

Выделяет необязательный элемент выражения, который может присутствовать, а может и отсутствовать.

обозначает, что нетерминал A либо является пустым, либо состоит из символа B. Условное вхождение.

4. Повторение - Правило вида A ::= {B}.

обозначает конкатенацию любого числа (включая ноль) записанных в ней элементов. A - либо пустой, либо представляет собой конкатенацию любого числа символов B (A это либо пустой элемент, либо B, либо BB, либо BBB и т.д.).

5.

Группировка - Правило вида A ::= (B|C)(D|E).

 

• группировки элементов при формировании сложных

 

 

выражений. обозначает, что A состоит из двух символов,

 

 

первый - либо B, либо C, второй - либо D, либо E.

 

6.

Текстовый элемент. Правило вида '…'

 

• обозначает символ или группу символов.

54

Синтаксические диаграммы

Круги и овалы – терминальные символы

Прямоугольники – нетерминальные символы, имеющие собственные диаграммы

56

14

Пример РФБН

Синтаксис языка программирования, подобного языку Pascal.

program ::= 'PROGRAM', white space, identifier, white space, 'BEGIN', white space,

{ assignment, ";", white space}, 'END.' .

identifier ::= alphabetic character, { alphabetic character | digit } . number ::= [ "-" ], digit, { digit } .

string ::= '"' , { all characters - '"' }, '"' .

assignment :: = identifier , ":=" , ( number | identifier | string ) .

alphabetic character ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" .

digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" . white space ::= ? white space characters ? .

all characters ::= ? all visible characters ? .

57

Синтаксические ошибки

• Наиболее распространенные ошибки, связанные с синтаксисом:

1.Ограничение на длину идентификатора. Например в BASIC значимыми являлись только первые 8 символов.

2.Чувствительность к регистру символов в идентификаторах. Pascal – нечувствительный, а C++ - чувствителен.

3.Использование одинаковых символов для обозначения различных действий (“=”, “:=”).

4.Ошибки в синтаксисе служебных идентификаторов.

5.Ошибки символов комментариев.

59

2/27/2023

Синтаксис

Синтаксис ЯП является наиболее ярким свойством, отличающим один язык от другого.

Общие требования к описанию языков программирования:

1.Полнота – синтаксис и семантика всех допустимых конструкций должны быть описаны без пропусков существенных аспектов

2.Ясность – удобочитаемость, легкость и результативность поиска ответов на вопросы, возникающие в процессе программирования

3.Естественность – интуитивная близость языка к терминологии разработчика, использование стандартных унифицированных обозначений.

4.Реализм – учет ограничений на объем оперативной памяти, время реакции.

58

Семантика

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

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

Семантика связана не только с особенностями ЯП, но и с концепциями программирования, принятыми в ЯП или среде программирования (например, ООП, реляционная алгебра).

inta = 10;

string b = “asdf”;

b = a;

60

15

Основные подходы к семантике

1.Ориентированные на компиляцию (семантика – множество преобразований над синтаксической моделью).

2.Ориентированные на интерпретацию (семантика – множество описанных на метаязыке преобразований синтаксически правильных языковых конструкций)

2.1.Операционные – смысл конструкций языка в терминах переходов абстрактной машины из одного состояния в другое

2.2.Пропозиционные - смысл конструкций языка в терминах множества формул, описывающих состояния объектов программы

2.3.Денотационные - смысл конструкций языка в терминах абстракции функций на состояниях программы

61

Среда программирования

Среда программирования – набор инструментов, используемых для преобразования символов в выполняемые вычисления.

Элементы:

1.Редактор – инструментальное средство для создания и изменения исходных файлов (текст), содержащих написанную на ЯП программу.

2.Транслятор – переводит синтаксические конструкции исходного кода в т.н. объектный модуль, который содержит команды в машинном коде конкретного вычислительного устройства.

3.Библиотекарь – поддерживает совокупность объектных файлов, называемых библиотеками.

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

63

2/27/2023

Формальное описание семантики

Формально семантику можно описать следующим образом:

Выполнение программы заключается в изменении значений, хранящихся в ячейках памяти. Обозначим через s состояние памяти в определенный момент времени. Тогда после выполнения следующей команды (обозначим её S) состояние изменится на другое, обозначим его s’. Это воздействие опишем формулой:

s’=p(S,s),

где p – “воздействие оператора насостояние”.

Формальное описание семантики оператора S заключается в чёткой формулировке (перечислении различных вариантов) перехода различных исходных s в соответствующие s’.

Формализованный подход к семантике языка дает возможность автоматизированного анализа программы – появляется возможность определять конечное состояние на выходе программы, зная ее состояние на входе, и т.о. доказать правильность всей программы, т.е. верифицировать её.

62

Среда программирования

5.Загрузчик– копирует исполняемыйфайл с дискав память и инициализируеткомпьютерперед выполнением программы.

6.Отладчик – инструментальноесредство,котороедает возможностьпрограммистууправлять выполнением программына уровне отдельных операторов.

Используетсядля диагностикиошибок.

Три функции:

1.Трассировка– пошаговоевыполнение программы.

2.Контрольныеточки– прерывание программына заранее определенной программистоминструкции.

3.Проверкаи изменение данных – отображениесостояния регистров, флагов,переменных и возможность

изменения. 64

16

Среда программирования

Профилировщик– измеряет трудоемкость отдельных частей программы.

Средства тестирования – автоматизируют процесс тестирования программ,создавая и выполняя тесты и анализируя результатытестирования.

Средства конфигурирования– автоматизируют поддержку версий программногопродукта.

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

Средства автоматизированнойгенерациикода и средства визуальнойразработки– позволяют на основе некоторых

шаблонови визуальных инструментов автоматически

 

генерировать исходный код.

65

Сравнение компиляции и интерпретации

• Компиляция:

Многие ошибки выявляются еще до запуска программы

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

Высокая защита исходного кода

Переносимость на уровне процессора (ОС)

• Интерпретация:

Не требуются дополнительные преобразования (компиляция), более простая технология создания программ

Запуск программы происходит быстрее

Не требуется наличие всех компонентов программы

Переносимость на уровне абстрактной машины67

2/27/2023

Трансляторы

• Делят на два типа:

1.Компилятор – переводитвесь исходныйкод в объектный (исполняемый),который затем выполняется операционнойсистемой. Примеры: C, Pascal, Assembler…

2.Интерпретатор– выполняетперевод командыв объектный код непосредственноперед ее выполнением,а выполнениемкоманд занимается специальная программа

– имитатор абстрактной машины. Примеры: Basic, Java, PHP, Python, Perl…

Нельзя сказать, что язык L1 эффективнее языка L2. Правильно то, что компилятор C1 может сгенерировать более эффективныйкод, чем C2.

Сейчас наблюдается смешение подходов: хранимые

процедуры SQL-серверов, JIT-компиляция в .NET

Framework

66

Процесс трансляции

 

ИСХОДНАЯ ПРОГРАММА

Выделяет лексемы из

 

входной строки.

 

 

 

Лексический анализатор

Преобразует

 

последовательности

 

 

 

Синтаксический анализатор

символов в

 

синтаксические

 

 

инструкции

Диспетчер

Семантический анализатор

 

 

Обработчик

таблицы

 

символов

Генератор промежуточного

ошибок

 

кода

 

 

Оптимизатор кода

 

 

Генератор кода

 

 

ЦЕЛЕВАЯ ПРОГРАММА

 

 

 

68

17

Процесс трансляции

 

 

Разбирает программу,

 

ИСХОДНАЯ ПРОГРАММА

строит из лексических

 

единиц иерархические

 

 

 

Лексический анализатор

структуры. Строит дере-

 

во, соответствующее

 

 

 

Синтаксический анализатор

разбору в контекстно-

 

свободной грамматике

 

 

ЯП

Диспетчер

Семантический анализатор

 

 

Обработчик

таблицы

 

символов

Генератор промежуточного

ошибок

 

кода

 

 

Оптимизатор кода

 

Генератор кода

ЦЕЛЕВАЯ ПРОГРАММА

Если A, B – выражения, то A+B - выражение

69

Этапы семантического анализа

Этап 1. Проверка соблюдения во входной программе семантических соглашений входного языка.

Этап 2. Дополнение внутреннего представления программы в компиляторе операторами и действиями

Этап 3. Проверка элементарных семантических (смысловых) норм языков программирования

71

2/27/2023

Процесс трансляции

 

ИСХОДНАЯ ПРОГРАММА

Проверяется наличие

 

семантических

 

 

(смысловых) ошибок в

 

Лексический анализатор

исходной программе и

 

 

накапливается

 

Синтаксический анализатор

информацияо типах

 

данных

 

 

Диспетчер

Семантический анализатор

 

 

Обработчик

таблицы

 

символов

Генератор промежуточного

ошибок

 

кода

 

 

Оптимизатор кода

 

Генератор кода

ЦЕЛЕВАЯ ПРОГРАММА

Если A, B – выражения, то A+B - выражение

70

Этап 1

Проверка соблюдения семантических соглашений - заключается в сопоставлении входных цепочек исходной программы с требованиями семантики входного ЯП.

Примеры соглашений:

1.Каждая метка, на которую есть ссылка, должна один раз присутствовать в программе.

2.Каждый идентификатор должен быть описан один раз и ни один идентификатор не может быть описан более одного раза.

3.Все операнды в выражениях и операциях должны иметь типы, допустимые для данного выражения или операции.

4.Типы переменных в выражениях должны быть согласованы между собой.

5.При вызове процедур и функций число и типы фактических параметров должны быть согласованы с числом и типом формальных параметров.

A = B + C;// надо знать типы B,C 72

18

Этап 2

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

var

 

a: double;

// вещественная переменная с двойной точностью

b: integer;

// целочисленная переменная

c: real;

// вещественная переменная

a:=b+c; // сложение (конкатенация) и присваивание

//Семантика языка предусматривает неявные преобр.: a:= double(real(b) + c);

73

Этап 3 - Пример

int f_test(int a);

{

intb, c; b = 0; c = 0;

if (b=1) { return a; } c = a + b;

}

75

2/27/2023

Этап 3

Проверка элементарных смысловых норм – сервисная функция,

обеспечивает проверку компилятором соглашений, выполнение которых связано со смыслом как всей программы в целом, так и отдельных ее фрагментов. Зависит от качества компилятора!

Примеры соглашений:

1.Каждая переменная или константа должна хотя бы один раз использоваться в программе.

2.Каждая переменная должна быть определена до первого ее использования.

3.Результат функции должен быть определен при любом ходе ее выполнения.

4.Каждый оператор в исходной программе должен иметь возможность хотя бы один раз выполниться.

5.Операторы условия и выбора должны предусматриваться возможность хода выполнения программы по каждой из ветвей.

6.Операторы цикла должны предусматривать возможность завершения цикла.

74

Этап 3 - Пример

int f_test(int a);

{

intb, c; b = 0; c = 0;

if (b=1) { return a; } c = a + b;

}

условиевсегдаверно

c = a + b; - никогдане выполнится

с – объявлена но нигде не используется

b = 0; нигде не используется

if (b=1) – присвоениевместо сравнения

76

19

Процесс трансляции

Структура данных ,

 

 

содержащая записи о

ИСХОДНАЯ ПРОГРАММА

 

каждом идентификаторес

 

 

 

полями для его атрибутов.

Лексический анализатор

 

Позволяет быстро найти,

 

 

 

изменить или добавить

Синтаксический анализатор

 

информациюо

 

идентификаторе

 

 

Диспетчер

Семантический анализатор

 

 

Обработчик

таблицы

 

Генератор промежуточного

ошибок

символов

 

кода

 

 

Оптимизатор кода

 

 

Генератор кода

 

 

ЦЕЛЕВАЯ ПРОГРАММА

 

 

 

77

Процесс трансляции

 

ИСХОДНАЯ ПРОГРАММА

 

 

Лексический анализатор

 

 

Синтаксический анализатор

 

Диспетчер

Семантический анализатор

 

 

Обработчик

таблицы

 

символов

Генератор промежуточного

ошибок

 

кода

 

 

Оптимизатор кода

Генерация промежуточного

 

 

представления исходной

 

Генератор кода

программы, котороеможно

 

рассматривать как

 

 

 

 

программу для абстрактной

 

ЦЕЛЕВАЯ ПРОГРАММА

машины

 

 

79

2/27/2023

Процесс трансляции

 

ИСХОДНАЯ ПРОГРАММА

 

Лексический анализатор

 

Синтаксический анализатор

Диспетчер

Семантический анализатор

 

таблицы

 

символов

Генератор промежуточного

 

кода

 

Оптимизатор кода

 

Генератор кода

 

ЦЕЛЕВАЯ ПРОГРАММА

На каждойфазе могут встретиться ошибки.Но после их обнаружения надо предпринять какие-то действия, чтобы продолжить

компиляцию и выявить остальные ошибки

Обработчик

ошибок

78

Процесс трансляции

ИСХОДНАЯ ПРОГРАММА

Лексический анализатор

Синтаксический анализатор

Диспетчер

Семантический анализатор

 

 

Обработчик

таблицы

 

символов

Генератор промежуточного

ошибок

 

кода

 

 

Оптимизатор кода

При оптимизациипро-

 

 

 

 

изводитсяпопытка улучшить

 

Генератор кода

промежуточный код, чтобы

 

 

получить более эффектив-

 

ЦЕЛЕВАЯ ПРОГРАММА

ный машинный код

 

 

 

 

80

20