Тема 2. Аспекты языков на примере...

28
Тема 2. Аспекты языков на примере C Автор: А. С. Власовских Лицензия: Creative Commons Attribution-Noncommercial-Share Alike 3.0 Тема 2. Аспекты языков на примере C 1

Transcript of Тема 2. Аспекты языков на примере...

Тема 2. Аспекты языков на примере C

Автор:

А. С. Власовских

Лицензия:

Creative Commons Attribution-Noncommercial-Share Alike 3.0

Тема 2. Аспекты языков на примере C 1

Модели языка

Модель — представление реальности, соответствующее ей в

некоторой степени

Обычно является упрощением, абстракцией

Позволяет делать предсказания о поведении моделируемого объекта

В рамках применимости существует гомоморфизм объекта и модели

Гомоморфизм объекта и модели

M ( f w1) = f (Dw1)

Например, произведение целых чисел и исключающее «или» их знаков

Тема 2. Аспекты языков на примере C 2

Изучение языка как набор моделей

Изучение объекта — последовательность построения всё более

точных его моделей

Метод последовательной формализации

Расширяет область применимости модели, стремится к изоморфизму модели и

объекта

Изучение языка — освоение набора его моделей, аспектов языка

Позволяет делать всё более точные выводы о свойствах программ на языке,

результатах выполнения

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

Тема 2. Аспекты языков на примере C 3

План описания языка

Общие сведения

Класс языка и парадигмы

История и области применения

Основные концепции

Простой пример

Синтаксис и семантика

Примитивы, композиция и абстракция

Неформальная семантика основных конструкций

Конкретный и абстрактный синтаксис

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

Статические свойства

Практика использования

Идиомы языка

Примеры фрагментов кода

Среды выполнения и библиотеки

Использование языка

Тема 2. Аспекты языков на примере C 4

Язык программирования C

Рассмотрим в качестве примера уже знакомый язык

На этом примере нужно понять:

Что даёт каждый аспект для уточнения модели языка?

Как можно изучать незнакомый язык?

Тема 2. Аспекты языков на примере C 5

Класс языка и парадигмы

Тьюринг-полный

Может выполнить любое вычисление машины Тьюринга

Конечный управляющий автомат и бесконечная память для чтения/записи

Проблема останова в общем случае алгоритмически неразрешима

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

Процедурное, элементы ООП

Стиль программирования напоминает Fortran, Pascal, Java, Bash

Тема 2. Аспекты языков на примере C 6

История и области применения

История

Создан в 1972 Д. Ритчи и Б. Керниганом в Bell Labs

Под влиянием ALGOL 68, BCPL, B

Оказал влияние на C++, Objective C, Java, C#

«Родной» язык для Unix

Современный стандарт ISO/IEC 9899:1999 (C99)

Свойства

Переносимый код

Близок к ассемблеру

Быстрый код

Применение

Язык общего назначения

Широко распространён (по данным TIOBE 2-ое место среди языков)

ОС, драйверы, системные инструменты, БД, сетевое ПО, встраиваемое ПО

Тема 2. Аспекты языков на примере C 7

Основные концепции (1)

Переменная

Указатель

Инструкция

Выражение

Процедура

Тип данных

Имя

Тема 2. Аспекты языков на примере C 8

Основные концепции (2)

Переменная

Имеет значение и адрес (а также имя и тип)

Ячейка памяти, изменяет значение во времени (присваивание)

Выделение памяти: статическое, стековое, динамическое

Указатель

Адрес ячейки

Операции * и &

Массивы переменных, рекурсивные структуры

Адресная арифметика — небезопасная

Lvalue и rvalue — значения с адресом и без

Инструкция («оператор»)

Имеет побочные эффекты, иногда имеет значение

Вычисление программы — выполнение последовательности инструкций

Блочные инструкции: if, while, for (итерация), switch

Выражение

Имеет значение, иногда имеет побочные эффекты

Тема 2. Аспекты языков на примере C 9

Основные концепции (3)

Процедура («функция»)

Абстракция инструкций

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

Рекурсия

Тип данных

Переменные и процедуры имеют тип, указываемый в объявлении

Задаваемые пользователем типы: псевдонимы, структуры, объединения

Приведение типов, в т. ч. небезопасное

Имя

Именуются переменные, процедуры, типы (все могут быть безымянными)

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

Области видимости: локальная, «статическая», глобальная

Тема 2. Аспекты языков на примере C 10

Простой пример (1)

Считывает с stdin целое число и выводит в stdout его

факториал

#include <stdio.h>#include <errno.h>

/* Итеративный факториал */int fact(int x) { int res = 1; for (int i = 1; i <= x; i++) { res *= i; } return res;}

Тема 2. Аспекты языков на примере C 11

Простой пример (2)

int main(void) { int x, ret; if ((ret = scanf("%d", &x)) != 1) { if (errno != 0) { perror("scanf"); } else { printf("no matching characters\n"); } } printf("%d\n", fact(x)); return 0;}

Тема 2. Аспекты языков на примере C 12

Примитивы, композиция и абстракция

Позволяют понять:

О каких элементах говорит язык

Что можно с ними делать

Примитивы

С чем идёт язык, что в нём базовое, атомарное

Композиция

Как объединять элементы в более сложные элементы

Абстракция

Как игнорировать детали сложных элементов, обращаться с ними как с

примитивами

Тема 2. Аспекты языков на примере C 13

Примитивы, композиция и абстракция. Данные

Примитивы

char, short int, int, unsigned int...

Указатели

Композиция

Массивы, структуры, объединения

Абстракция

Псевдонимы типов, теги структур

Процедуры для работы с АТД

Сокрытие деталей через void *, численные идентификаторы и т. д.

Тема 2. Аспекты языков на примере C 14

Примитивы, композиция и абстракция. Процедуры

Примитивы

Операторы (+, &&, & и др.)

Стандартная библиотека (fopen, printf и др.)

Композиция

Последовательность инструкций, блочные инструкции

Составное выражение

Абстракция

Пользовательские процедуры

Прототипы процедур, связывание с библиотеками объектного кода

Тема 2. Аспекты языков на примере C 15

Неформальная семантика основных конструкций

Уже обсудили:

Выражения, присваивания, переменные, указатели, массивы, структуры

Процедуры, параметры, выделение памяти

Имена, типы, преобразование типов, видимость

Известно из практики:

Значения-литералы

Блочные инструкции if, for, while, do, switch, {}

Инструкция goto и метки

Инициализаторы примитивных переменных, структур

Спецификаторы класса хранения

Объявления переменных и процедур

Тема 2. Аспекты языков на примере C 16

Конкретный и абстрактный синтаксис

Помним, что перед синтаксическим — лексичекий анализ

Используются на последовательных стадиях компиляции

Дерево разбора — конкретный

Абстрактное синтаксическое дерево — абстрактный

Конкретный синтаксис включает артефакты грамматики языка

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

избегания левой рекурсии и пр.

Абстрактный синтаксис отражает «суть» формы языка

Но часто не похож на сам язык из-за отсутствия терминалов

C99 описывает только конкретный синтаксис в BNF-подобной

нотации

Абстрактный синтаксис C придумывается разработчиками компиляторов

Тема 2. Аспекты языков на примере C 17

Пример абстрактного синтаксиса (1)

1. FunctionDecl: name: fact type: FunctionType: args: 1. int return: int args: 1. VarDecl: {name: x, type: int} vars: 1. VarDecl: {name: res, type: int} 2. VarDecl: {name: i, type: int} ...

Тема 2. Аспекты языков на примере C 18

Пример абстрактного синтаксиса (2)

... tree: StatementList: 1. Decl: res 2. ModifyExpr: {variable: res, value: 1} 3. StatementList: 1. Decl: i 2. ForStmt: expr1: ModifyExpr: {variable: i, value: 0} expr2: LeExpr: {op1: i, op2: x} expr3: PostIncrementExpr: {op: i} body: ModifyExpr: variable: res value: MultExpr: {op1: res, op2: i} 4. ReturnStmt: {value: res}

Тема 2. Аспекты языков на примере C 19

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

Для языка C пропустим

Рассмотрим позже на несложных примерах

В стандарте C99 не определена

Но есть исследовательские работы

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

Может добавить однозначности и строгости при реализации

языка

Нужна для понимания тонкостей вычислений, анализа свойств языка, поиска

ошибок и пр.

Тема 2. Аспекты языков на примере C 20

Статические свойства. Система типов

Типизация

Статическая (проверяется при компиляции, вычислимая)

Слабая (расширяющие приведения типов)

Небезопасная (эффект ручных приведений типов не определён)

Система типов

Базовые типы: void, char, unsigned char, int, ...

Операции:

Указат ель на x

Массив x размерност ей n, m, ...

Процедура из x, y, ... в z

Ст рукт ура или объединение x, y, ...

Квалификаторы: const, volatile

Псевдонимы: typedef, enum

Типы замкнуты относительно набора операций

Тема 2. Аспекты языков на примере C 21

Статические свойства. Обзор имён

Статическая область видимости

Можно статически назвать видимые имена во областях видимости

«Лексический» обзор

Определения имён ищутся по синтаксическому дереву, а не по дереву вызовов

Тема 2. Аспекты языков на примере C 22

Практика использования

Парадигмы

Совокупности концепций и приёмов, подходы

Шаблоны

Известные решения проблем в определённом контексте

Идиомы

Способы написания, распространённые приёмы

Тема 2. Аспекты языков на примере C 23

Парадигмы

Процедурное программирование

bdiff.c

Объектно-ориентированное программирование

libixp.h, libiconv.h

Тема 2. Аспекты языков на примере C 24

Иерархия в больших программах

Объектные модули

Часть символов скрыта

Общий интерфейс через заголовочные файлы

Библиотеки объектных модулей

Статические, динамические

Отдельные программы

Решают малосвязанные части задачи

Взаимодействуют через IPC или внешнюю память

Тема 2. Аспекты языков на примере C 25

Идиомы (1)

Стиль кодирования

Выравнивание, циклы for, бесконечные циклы и пр.

Главное в стиле то, что он есть

Захват и освобождение ресурсов

bdiff.c

Размер массива как дополнительный параметр

client.c

Линейный список через struct с полем next

ixp.h: IxpConn

Макросы для совместимости

Тема 2. Аспекты языков на примере C 26

Идиомы (2)

Борьба с глобальным состоянием

Части программы менее связаны

Проще понимать и контролировать обмен данными

Проще создавать многопоточные программы

Обработка ошибок

Завершать программу по assert

Завершать программу как emalloc

Вернуть int < 0 или a * == NULL, м. б. хранить код в errno

Возвращать детальное описание ошибки

Делать что-то подобное исключениям на longjmp

Тема 2. Аспекты языков на примере C 27

Литература

Себеста Р. У. Основные концепции языков программирования. —

Вильямс, 2001. — urn:isbn:5-8459-0192-8

Гл. 6. Выражения и операторы присваивания

Гл. 7. Структуры управления на уровне операторов

Реймонд Э. Искусство программирования для Unix = The Art of

Unix Programming. — Вильямс, 2005. — urn:isbn:5-8459-00791-8,

http://www.faqs.org/docs/artu/

Гл. 14. Языки программирования: C или не C?

Керниган Б., Пайк Р. Практика программирования. — Невский

Диалект, 2001. — urn:isbn:5-7940-0058-9

Гл. 1. Стиль

Гл. 4. Интерфейсы

Гл. 8. Переносимость

Тема 2. Аспекты языков на примере C 28