Конструирование программного обеспечения. Лекция 1. Введение

Содержание

Слайд 2

Обо мне

AI Research Engineer / Scientist @ Intel Corp.
C++, Python, DL/ML

Также работал

Обо мне AI Research Engineer / Scientist @ Intel Corp. C++, Python,
в:
HARMAN (a Samsung company)
ИФМ РАН
ИПФ РАН

Конструирование программного обеспечения • С++ Programming

Контакты:
+79107917732 (phone, Telegram)

Слайд 3

Организационная структура курса

Длительность

3 модуля: сентябрь -> март

Введение

Конструирование программного обеспечения • С++

Организационная структура курса Длительность 3 модуля: сентябрь -> март Введение Конструирование программного
Programming

Частота

1 пара лекций в неделю
1 пара практики в неделю

Отчетность

Устный экзамен в конце курса (последняя неделя 3-го модуля)

Слайд 4

Тематическая структура курса

Классы

Введение

Конструирование программного обеспечения • С++ Programming

Standard Template Library (STL)

Ключевые

Тематическая структура курса Классы Введение Конструирование программного обеспечения • С++ Programming Standard
классы, позволяющие решать задачи без изобретения велосипеда

Особенности новых стандартов С++ и продвинутые темы

Базовый синтаксис и понятия

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

Паттерны ООП

Общепризнанная парадигма эффективной разработки ПО на уровне исходного кода

Наиболее часто встречающиеся приёмы в ООП

move-семантика, правые ссылки, coroutines, ranges, modules, concepts, ...

Слайд 5

Рекомендованная литература

The C++ Programming Language (4th Edition)

Bjarne Stroustrup

Введение

Конструирование программного обеспечения • С++

Рекомендованная литература The C++ Programming Language (4th Edition) Bjarne Stroustrup Введение Конструирование
Programming

Слайд 6

Рекомендованная литература

C++ Concurrency In Action (2nd edition, 2019)

Anthony Williams

Введение

Конструирование программного обеспечения •

Рекомендованная литература C++ Concurrency In Action (2nd edition, 2019) Anthony Williams Введение
С++ Programming

Слайд 7

Рекомендованная литература

Введение

Конструирование программного обеспечения • С++ Programming

https://en.cppreference.com

Рекомендованная литература Введение Конструирование программного обеспечения • С++ Programming https://en.cppreference.com

Слайд 8

История С++

Введение

Конструирование программного обеспечения • С++ Programming

1979 - появление нового языка под

История С++ Введение Конструирование программного обеспечения • С++ Programming 1979 - появление
названием “C с классами”
1983 - языку дают название “C++”, бОльшая часть функционала современного С++ уже реализована
1987 - впервые выпущен GNU C++ компилятор как часть GCC
1990-1993 - поддержка шаблонов, исключений, пространств имен
1998 - опубликоан первый стандарт C++ (C++98)
2011 - опубликован стандарт C++11 published (серьезные улучшения в качестве жизни разработчиков С++)
2014 - опубликован стандарт C++14
2017 - опубликован стандарт C++17
2020 - опубликован стандарт C++20

Слайд 9

Стандарты С++

Введение

Конструирование программного обеспечения • С++ Programming

C++ - стандартизованный язык

Существуют конкретные документы,

Стандарты С++ Введение Конструирование программного обеспечения • С++ Programming C++ - стандартизованный
описывающие ключевую функциональность языка, которую должны поддерживать имеющиеся компиляторы и стандартные библиотеки С++

https://isocpp.org/std/the-standard

Слайд 10

Стандарты С++

Введение

Конструирование программного обеспечения • С++ Programming

C++98

C++03

C++11

C++14

C++17

C++20

Новые ревизии стандартов добавлюят новый функционал

Стандарты С++ Введение Конструирование программного обеспечения • С++ Programming C++98 C++03 C++11
и ключевые слова (и иногда меняют имеющееся поведение)

Слайд 11

Базовый процесс программирования на С++

Введение

Конструирование программного обеспечения • С++ Programming

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

Базовый процесс программирования на С++ Введение Конструирование программного обеспечения • С++ Programming
со служебной информацией

Текстовые файлы
Человеко-читаемые
Человеко-модифицируемые

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

.obj/.o

Слайд 12

С++ и С

Введение

Конструирование программного обеспечения • С++ Programming

C++ - «надмножество» языка С

Работающий

С++ и С Введение Конструирование программного обеспечения • С++ Programming C++ -
код на С почти всегда будет работающим, будучи скомпилированным С++-компилятором, и выдавать тот же самый результат

#include
int main(int argc, char* argv[]) {
printf("Hello, World!\n");
int foo;
scanf("%d", &foo);
printf("%d", foo + 2);
return 0;
}

Слайд 13

С++ и С

Введение

Конструирование программного обеспечения • С++ Programming

Встроенные типы данных

С++ и С Введение Конструирование программного обеспечения • С++ Programming Встроенные типы данных

Слайд 14

С++ и С

Введение

Конструирование программного обеспечения • С++ Programming

C - ~32 ключевых слова

С++ и С Введение Конструирование программного обеспечения • С++ Programming C - ~32 ключевых слова

Слайд 15

С++ и С

Введение

Конструирование программного обеспечения • С++ Programming

C++ - >60 ключевых слов

С++ и С Введение Конструирование программного обеспечения • С++ Programming C++ - >60 ключевых слов

Слайд 16

С++ и С

Введение

Конструирование программного обеспечения • С++ Programming

C++ отличается от С добавлением

С++ и С Введение Конструирование программного обеспечения • С++ Programming C++ отличается
функционала, упрощающего написание программ в разных парадигмах («стилях» программирования)

Объектно-ориентированное программирование
Обобщенное программирование
Оперирование абстрактными контейнерами данных

Слайд 17

С++ и С

Введение

Конструирование программного обеспечения • С++ Programming

C++

#include
int main(int argc, char*

С++ и С Введение Конструирование программного обеспечения • С++ Programming C++ #include
argv[]) {
printf("Hello, World!\n");
int foo;
scanf("%d", &foo);
printf("%d", foo + 2);
return 0;
}

#include 
int main(int argc, char* argv[]) {
    std::cout << "Hello, World!\n";
    int foo;
    std::cin >> foo;
    std::cout << (foo + 2);
    return 0;
}

C

В С++ «принят» отличный от С стиль взаимодействия с вводом/выводом программы

Слайд 18

С++ и С

Введение

Конструирование программного обеспечения • С++ Programming

C++

C

С++ использует иные ключевые слова

С++ и С Введение Конструирование программного обеспечения • С++ Programming C++ C
для работы с динамической памятью

#include 
int main(int argc, char* argv[]) {
    char* my_dyn_arr = NULL;
    my_dyn_arr = (char*) malloc(6 * sizeof(char));
    my_dyn_arr[0] = 'H'; my_dyn_arr[1] = 'e';
    my_dyn_arr[2] = 'l'; my_dyn_arr[3] = 'l';
    my_dyn_arr[4] = 'o'; my_dyn_arr[5] = 0;
    printf(my_dyn_arr);
    free(my_dyn_arr);
    return 0;
}

#include 
int main(int argc, char* argv[]) {
    char* my_dyn_arr = nullptr;
    my_dyn_arr = new char[6];
    my_dyn_arr[0] = 'H'; my_dyn_arr[1] = 'e';
    my_dyn_arr[2] = 'l'; my_dyn_arr[3] = 'l';
    my_dyn_arr[4] = 'o'; my_dyn_arr[5] = 0;
    std::cout << my_dyn_arr;
    delete[] my_dyn_arr;
    return 0;
}

Слайд 19

Базовый процесс программирования на С++

Введение

Конструирование программного обеспечения • С++ Programming

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

Базовый процесс программирования на С++ Введение Конструирование программного обеспечения • С++ Programming
со служебной информацией

Текстовые файлы
Человеко-читаемые
Человеко-модифицируемые

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

.obj/.o

Слайд 20

Компиляторы и линковщики

Введение

Windows - cl.exe/link.exe

Microsoft Visual C++ Compiler (MSVC) - обычно входит

Компиляторы и линковщики Введение Windows - cl.exe/link.exe Microsoft Visual C++ Compiler (MSVC)
в состав Visual Studio

C:\ cl.exe /c hello_world.cpp
C:\ dir
2021-09-01 15:43 332 hello_world.cpp
2021-09-01 15:45 52,471 hello_world.obj
C:\ link.exe /c hello_world.cpp
C:\ dir
2021-09-01 15:43 332 hello_world.cpp
2021-09-01 15:45 185,856 hello_world.exe
2021-09-01 15:45 52,471 hello_world.obj

компиляция

линковка

Слайд 21

Компиляторы и линковщики

Введение

Linux - g++

GNU Compiler Collection - доступно в качестве пакета

Компиляторы и линковщики Введение Linux - g++ GNU Compiler Collection - доступно
во всех версиях Linux, зачастую предустановлена

компиляция

линковка

Слайд 22

Компиляторы и линковщики

Введение

Кросс-платформенный - clang

Фронт-энд (т.е. приложение, взаимодействующее с пользователем) для компиляции

Компиляторы и линковщики Введение Кросс-платформенный - clang Фронт-энд (т.е. приложение, взаимодействующее с
C/C++ с помощью фреймворка компиляторов LLVM; устанавливается дополнительно

компиляция

линковка

Слайд 23

Интегрированные среды разработки (IDE) для С++

Введение

Windows:

MS Visual Studio
Visual Studio Code
Qt Creator
Code::Blocks
Notepad++

Linux:

Eclipse
CLion
Qt Creator
Code::Blocks
Vim

Интегрированные среды разработки (IDE) для С++ Введение Windows: MS Visual Studio Visual

Слайд 24

Отладка

Введение

Компиляторы для С++ - оптимизирующие

Компиляторы обязаны преобразовать исходный код в машинный корректным

Отладка Введение Компиляторы для С++ - оптимизирующие Компиляторы обязаны преобразовать исходный код
образом, но не обязаны, например, сохранять порядок машинных операций относительно порядка соответствующих строк в коде, или сохранять неиспользуемые куски кода

Программа скомпилировалась, но работает неправильно - что делать?

С++ поддерживает построчную отладку, точки останова и т. д.
Отладчик (debugger) - дополнительная программа, с помощью которого производится отладка
Отладчик естественным образом дополняет компилятор и линковщик; часто всё вместе называют “tool chain”
GDB - отладчик из GCC, LLDB - отладчик clang/LLVM, Microsoft Visual Studio Debugger - отладчик MSBuild/Visual Studio

Слайд 25

Отладка

Введение

Такими же флагами контролируются и применяемые оптимизации:

Для того, чтобы отладить программу, необходимо

Отладка Введение Такими же флагами контролируются и применяемые оптимизации: Для того, чтобы
скомпилировать ее специальным образом - обычно это указывается с помощью флага для компилятора

$ g++ -g hello_world.cpp -o hello_world_for_debug

$ g++ hello_world.cpp -O3 -o hello_world_for_release

$ g++ hello_world.cpp -O1 -o hello_world_with_less_opts