31
Лекция 1. Языки C и C++ Лекция 1. Языки C и C++ Александр Смаль CS центр 8 сентября 2016 Санкт-Петербург http://compscicenter.ru 1/31

Программирование на C++, часть 1, autumn 2016: Языки С и С++

Embed Size (px)

Citation preview

Page 1: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Лекция 1. Языки C и C++

Александр Смаль

CS центр8 сентября 2016Санкт-Петербург

http://compscicenter.ru 1/31

Page 2: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Язык C

∙ Язык программирования C++ создан на основе языка C.∙ Язык программирования C разработан в начале 1973 года в

компании Bell Labs Кеном Томпсоном и Деннисом Ритчи.∙ Язык C был создан для использования в операционной

системе UNIX.∙ В связи с успехом UNIX язык C получил широкое

распространение.∙ На данный момент C является одним из самых

распространённых языков программирования(доступен на большинстве платформ).

∙ C — основной язык для низкоуровневой разработки.

http://compscicenter.ru 2/31

Page 3: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Особенности C

∙ Эффективность.Язык С позволяет писать программы, которые напрямуюработают с железом.

∙ Стандартизированность.Спецификация языка C является международнымстандартом.

∙ Относительная простота.Стандарт языка C занимает 230 страниц(против 670 для Java и 1340 для C++).

http://compscicenter.ru 3/31

Page 4: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Создание C++

∙ Разрабатывается с начала 1980-х годов.∙ Создатель — сотрудник Bell Labs Бьёрн Страуструп.∙ Изначально это было расширение языка C для поддержки

работы с классами и объектами.∙ Это позволило проектировать программы на более

высоком уровне абстракции.∙ Ранние версии языка назывались “C with classes”.∙ Первый компилятор cfront перерабатывающий исходный

код “C с классами” в исходный код на C.

http://compscicenter.ru 4/31

Page 5: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Развитие C++∙ К 1983 году в язык были добавленно много новых

возможностей (виртуальные функции, перегрузка функцийи операторов, ссылки, константы, . . . )

∙ Получившийся язык перестал быть просто дополненнойверсией классического C и был переименован из “C склассами” в C++.

∙ Имя языка, получившееся в итоге, происходит отоператора унарного постфиксного инкремента C ’++’(увеличение значения переменной на единицу).

∙ Язык также не был назван D, поскольку “являетсярасширением C и не пытается устранять проблемы путёмудаления элементов C”.

∙ Язык начинает активно развиваться. Появляются новыекомпиляторы и среды разработки.

http://compscicenter.ru 5/31

Page 6: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Стандартизация C++∙ Лишь в 1998 году был ратифицирован международный

стандарт языка C++: ISO/IEC 14882:1998 “Standard for theC++ Programming Language”.

∙ В 2003 году был опубликован стандарт языка ISO/IEC14882:2003, где были исправлены выявленные ошибки инедочёты предыдущей версии стандарта.

∙ В 2005 году был выпущен Library Technical Report 1 (TR1).∙ С 2005 года началась работа над новой версией стандарта,

которая получила кодовое название C++0x.∙ В конце концов в 2011 году стандарт был принят и

получил название C++11 ISO/IEC 14882:2011.∙ В данный момент ведётся одновременная работа над

двумя версиями стандарта: C++14 и C++17.http://compscicenter.ru 6/31

Page 7: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Совместимость C и C++

∙ Один из принципов разработки стандарта C++ — этоcохранение совместимости с C.

∙ Синтаксис C++ унаследован от языка C.∙ C++ не является в строгом смысле надмножеством C.∙ Можно писать программы на C так, чтобы они успешно

компилировались на C++.∙ C и C++ сильно отличаются как по сложности, так и по

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

http://compscicenter.ru 7/31

Page 8: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Характеристики языка C++

Характеристики C++:∙ сложный,∙ мультипарадигмальный,∙ эффективный,∙ низкоуровневый,∙ компилируемый,∙ статически типизированный.

http://compscicenter.ru 8/31

Page 9: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Сложность

∙ Описание стандарта занимает более 1300 страниц текста.∙ Нет никакой возможности рассказать “весь C++” в рамках

одного, пусть даже очень большого курса.∙ В C++ программисту позволено очень многое, и это влeчёт

за собой большую ответственность.∙ На плечи программиста ложится много дополнительной

работы:∙ проверка корректности данных,∙ управление памятью,∙ обработка низкоуровневых ошибок.

http://compscicenter.ru 9/31

Page 10: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

МультипарадигмальныйНа C++ можно писать программы в рамках несколькихпарадигм программирования:

∙ процедурное программирование(код “в стиле C”),

∙ объектно-ориентированное программирование(классы, наследование, виртуальные функции, . . . ).

∙ обобщённое программирование(шаблоны функций и классов),

∙ функциональное программирование(функторы, безымянные функции, замыкания),

∙ генеративное программирование(метапрограммирование на шаблонах).

http://compscicenter.ru 10/31

Page 11: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Эффективный

Одна из фундаментальных идей языков C и C++ — отсутствиенеявных накладных расходов, которые присутствуют в другихболее высокоуровневых языках программирования.

∙ Программист сам выбирает уровень абстракции, накотором писать каждую отдельную часть программы.

∙ Можно реализовывать критические по производительностиучастки программы максимально эффективно.

∙ Эффективность делает C++ основным языком дляразработки приложений с компьютерной графикой (кпримеру, игры).

http://compscicenter.ru 11/31

Page 12: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Низкоуровневый

Язык C++, как и C, позволяет работать напрямую с ресурсамикомпьютера.

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

∙ Неаккуратное обращение с системными ресурсами можетпривести к падению программы.

В C++ отсутствует автоматическое управление памятью.∙ Позволяет программисту получить полный контроль над

программой.∙ Необходимость заботиться об освобождении памяти.

http://compscicenter.ru 12/31

Page 13: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Компилируемый

C++ является компилируемым языком программирования.

Для того, чтобы запустить программу на C++, её нужно сначаласкомпилировать.

Компиляция — преобразование текста программы на языкепрограммирования в машинный код.

∙ Нет накладных расходов при исполнении программы.∙ При компиляции можно отловить некоторые ошибки.∙ Требуется компилировать для каждой платформы

отдельно.

http://compscicenter.ru 13/31

Page 14: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Статическая типизацияC++ является статически типизированным языком.

1. Каждая сущность в программе (переменная, функция ипр.) имеет свой тип,

2. и этот тип определяется на момент компиляции.

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

каждая переменная в программе,2. определить, какая функция будет вызываться в каждом

конкретном месте.Всё это определяется на момент компиляции и “зашивается” вскомпилированную программу.В машинном коде никаких типов уже нет — там идёт работа споследовательностями байт.

http://compscicenter.ru 14/31

Page 15: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Что такое компиляция?

Архитектураприложения Код на C++

Машинный код

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

Исполнение

Компиляция

Идея

0101

http://compscicenter.ru 15/31

Page 16: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Что такое компиляция?

Архитектураприложения Код на Java

Байт код

JVM

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

Компиляция

Исполнение Трансляция команд

Идея

0101

http://compscicenter.ru 16/31

Page 17: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Что такое интерпретация?

Архитектураприложения Код на Perl

Perl

Интерпретатор

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

Трансляция команд

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

Идея

0101

http://compscicenter.ru 17/31

Page 18: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Плюсы и минусы компилируемости вмашинный код

Плюсы:∙ эффективность: программа компилируется и

оптимизируется для конкретного процессора,∙ нет необходимости устанавливать сторонние приложения

(такие как интерпретатор или виртуальная машина).Минусы:

∙ нужно компилировать для каждой платформы,∙ сложность внесения изменения в программу — нужно

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

http://compscicenter.ru 18/31

Page 19: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Разбиение программы на файлы

Зачем разбивать программу на файлы?∙ С небольшими файлами удобнее работать.∙ Разбиение на файлы структурирует код.∙ Позволяет нескольким программистам разрабатывать

приложение одновременно.∙ Ускорение повторной компиляции при небольших

изменениях в отдельных частях программы.Файлы с кодом на C++ бывают двух типов:

1. файлы с исходным кодом (расширение .cpp, иногда .C),2. заголовочные файлы (расширение .hpp или .h).

http://compscicenter.ru 19/31

Page 20: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Заголовочные файлы

∙ Файл foo.cpp:

// определение (definition) функции foovoid foo(){

bar ();}

∙ Файл bar.cpp:

// определение (definition) функции barvoid bar() { }

Компиляция этих файлов выдаст ошибку.

http://compscicenter.ru 20/31

Page 21: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Заголовочные файлы∙ Файл foo.cpp:

// объявление (declaration) функции barvoid bar();

// определение (definition) функции foovoid foo(){

bar ();}

∙ Файл bar.cpp:

// определение (definition) функции barvoid bar() { }

http://compscicenter.ru 21/31

Page 22: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Заголовочные файлыПредположим, что мы изменили функцию bar.

∙ Файл foo.cpp:

void bar();

void foo(){

bar ();}

∙ Файл bar.cpp:

int bar() { return 1; }

Данный код некорректен — объявление отличается отопределения. (Неопределённое поведение.)

http://compscicenter.ru 22/31

Page 23: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Заголовочные файлыДобавим заголовочный файл bar.hpp.

∙ Файл foo.cpp:

#include "bar.hpp"

void foo(){

bar ();}

∙ Файл bar.cpp:

int bar() { return 1; }

∙ Файл bar.hpp:

int bar ();

http://compscicenter.ru 23/31

Page 24: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Двойное включениеМожет случиться двойное включение заголовочного файла.

∙ Файл foo.cpp:

#include "foo.hpp"#include "bar.hpp"

void foo(){

bar ();}

∙ Файл foo.hpp:

#include "bar.hpp"

void foo();

http://compscicenter.ru 24/31

Page 25: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Стражи включенияЭто можно исправить двумя способами:

∙ (наиболее переносимо) Файл bar.hpp:

#ifndef BAR_HPP#define BAR_HPP

int bar ();#endif

∙ (наиболее просто) Файл bar.hpp:

#pragma once

int bar ();

Резюме: .cpp — для определений, .hpp — для объявлений.http://compscicenter.ru 25/31

Page 26: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Этап №1: препроцессор

∙ Язык препроцессора – это специальный языкпрограммирования, встроенный в C++.

∙ Препроцессор работает с кодом на C++ как с текстом.∙ Команды языка препроцессор называют директивами, все

директивы начинаются со знака #.∙ Директива #include позволяет подключать заголовочные

файлы к файлам кода.1. #include <foo.h> — библиотечный заголовочный файл,2. #include "bar.h" — локальный заголовочный файл.

∙ Препроцессор заменяет директиву #include "bar.h" насодержимое файла bar.h.

http://compscicenter.ru 26/31

Page 27: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Этап 2: компиляция

∙ На вход компилятору поступает код на C++ послеобработки препроцессором.

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

∙ Компилируется только файлы с кодом (т.е. *.cpp).∙ Заголовочные файлы сами по себе ни во что не

компилируются, только в составе файлов с кодом.∙ На выходе компилятора из каждого файла с кодом

получается “объектный файл” — бинарный файл соскомпилированным кодом (с расширением .o или .obj).

http://compscicenter.ru 27/31

Page 28: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Этап 3: линковка (компоновка)

∙ На этом этапе все объектные файлы объединяются в одинисполняемый (или библиотечный) файл.

∙ При этом происходит подстановка адресов функций вместа их вызова.

void foo(){

bar ();}

void bar() { }

∙ По каждому объектному файлу строится таблица всехфункций, которые в нём определены.

http://compscicenter.ru 28/31

Page 29: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Этап 3: линковка (компоновка)

∙ На этапе компоновки важно, что каждая функция имеетуникальное имя.

∙ В C++ может быть две функции с одним именем, норазными параметрами.

∙ Имена функций искажаются (mangle) таким образом, чтов их имени кодируются их параметры.Например, компилятор GCC превратит имя функции foo

void foo(int , double) {}

в _Z3fooid.∙ Аналогично функциям в линковке нуждаются глобальные

переменные.

http://compscicenter.ru 29/31

Page 30: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Этап 3: линковка (компоновка)

∙ Точка входа — функция, вызываемая при запускепрограммы. По умолчанию — это функция main:

int main(){

return 0;}

или

int main(int argc , char ** argv){

return 0;}

http://compscicenter.ru 30/31

Page 31: Программирование на C++, часть 1, autumn 2016: Языки С и С++

Лекция 1. Языки C и C++

Общая схема

file1.cpp

file2.cpp

.

.

.

filen.cpp

file1.o

file2.o

.

.

.

filen.o

program

Компиляция

Линковка

http://compscicenter.ru 31/31