Яп
.pdf
|
Пример ООП для С++ |
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