Лекция 1. Вводная

Предисловие

Визитка

Штанюк Антон Александрович

Материалы данного курса находятся по адресу: <http://shtanyuk.tk/edu/nniit/courses.html>

Информация

Информация о курсе

  • Лекции - 12 по 4 ак. часа
  • Лабораторные занятия (по подгруппам) - 15 по 4 ак. часа
  • Экзамен (письменное тестирование)
  • Небольшие проекты (около 40)
  • Финальный проект (файловый компрессор по методу Хаффмана)

Суммарная продолжительность: около 4 месяцев.

Материалы

Информация:

Программное обеспечение:

  • Visual Studio (2012-2019), Community Edition
  • Git

Дополнительно:

  • Google test - для модульного тестирования.
  • Непрерывная интеграция <https://travis-ci.org>

Сделать в ближайшее время

  • Раздобыть компьютер (лучше быстрый ноутбук).
  • Установить Visual Studio и настроить работу с пустыми (empty) проектами verb!C++!
  • Установить Git (читать введение: <https://github.com/ashtanyuk/Git-intro>).
  • Завести аккаунт на <https://github.com>.
  • Выделить время для самостоятельной работы (чем больше, тем лучше, не менее 2-х часов в день).
  • Познакомиться с коллегами по курсу и наладить взаимодействие.

О чем курс?

  • Немного о программировании вообще.
  • Немного о разработке ПО.
  • Немного об алгоритмах и структурах данных.
  • Много о языке программирования С.

Почему язык С?

  • Один из самых популярных языков более 40 лет.
  • Синтаксическая ‘’латынь’‘.
  • Идеальный способ изучить алгоритмы и структуры данных.
  • Идеальный способ понять ‘’механику’’ выполнения программ.
  • По-прежнему востребован у работодателей.

Области применения:

  • Системное программное обеспечение (ОС, утилиты, антивирусы и т.п.)
  • Реализация протоколов (TCP/IP, UDP, и т.д.)
  • Графика (сложные игры, графические модели)
  • Встраиваемые системы (микроконтроллеры, АСУ)
  • Высокопроизводительные вычисления на суперкомпьютерах

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

Программирование vs Разработка ПО

Программирование и разработка ПО - связанные, но разные понятия.

Программированием может заниматься кто угодно.

Разработкой обычно занимаются профессионалы.

Разработка ПО обычно включает в себя:

  • Проектирование
  • Программирование
  • Тестирование
  • Документирование

Специализации в разработке

Профессиональные специализации:

  • Кодер
  • Тестировщик
  • Архитектор
  • Технический писатель
  • Переговорщик
  • Менеджер
  • Маркетолог
  • Сервисный инженер
  • Специалист службы поддержки
  • Переводчик
  • ...

Аспекты и подходы

Аспекты и подходы к разработке

Написание хороших программ требует ума, вкуса и терпения

_static/01/bjarne.png

Б.Страуструп

  • Теоретический.
  • Технологический.
  • Творческий.
  • Любительский.
  • Профессиональный.

Признаки любительского подхода

  • Пренебрежение этапами разработки (упрощённое проектирование, отсутствие тестирования, документирования, анализа результатов).
  • Пренебрежение технологиями разработки (решение ‘’в лоб’‘, изобретение ‘’велосипедов’‘).
  • Небрежное кодирование.

Результат:

Часто появляются велосипеды с квадратными колёсами

_static/01/bike.png

Профессиональный подход к программированию

Как профессионал решает вычислительные задачи:

  • Разбивает задачи на более мелкие и легко решаемые подзадачи.
  • Распознаёт и применяет известные решения к новым задачам.
  • Распознаёт нерешаемые задачи.
  • Находит и использует правильные инструменты для работы.

Профессионал предлагает хорошие решения:

  • Надёжные, корректные и защищённые.
  • Эффективные с точки зрения расхода ресурсов.
  • Масштабируемые: адаптивные, децентрализованные.
  • Элегантные.

С другой стороны, нужно всегда помнить мудрую фразу:

Ноев ковчег был построен любителем, а Титаник - профессионалами...

Жизненный цикл ПО

  1. Формулировка задачи (определение требований).
  2. Спецификация системы в соответствии с требованиями.
  3. Проектирование.
  4. Реализация (кодирование).
  5. Тестирование и отладка.
  6. Эксплуатация и сопровождение.

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

Итерационная модель жизненного цикла привела к появлению гибких методологий разработки ПО:

  • Экстремальное программирование (ХР)
  • Scrum
  • RAD
  • и др.

Основные идеи:

  • люди и взаимодействие важнее процессов и инструментов;
  • работающий продукт важнее исчерпывающей документации;
  • сотрудничество с заказчиком важнее согласования условий контракта;
  • готовность к изменениям важнее следования первоначальному плану.

Качели

Этап Значение
_static/01/Pr01.png Как объяснил клиент чего он хочет
_static/01/Pr02.png Как понял клиента руководитель проекта
_static/01/Pr03.png Как было описано в ТЗ
_static/01/Pr04.png Как написали программисты
_static/01/Pr05.png Как планировалось внедрить
_static/01/Pr06.png Что удалось внедрить
_static/01/Pr07.png Как представил проект бизнес-консультант
_static/01/Pr08.png Как задокументировали проект
_static/01/Pr09.png Как заплатил клиент
_static/01/Pr10.png Как сработала тех-поддержка
_static/01/Pr11.png Что на самом деле хотел клиент

Язык С

Краткая история языка С

  • 1969 - Кеном Томпсоном разработана ОС Unix для PDP-7 (Bell Lab).
  • 1972 - Язык Си создан Денисом Ритчи (Bell Lab).
  • 1973 - Исходный код Unix переписан с ассемблера на Си.
  • 1978 - Вышло первое издание “The C programming language”.
  • Начало 80-х - Бъярном Страуструпом разработан С++ (‘’С с классами’‘)
  • 1987 - Появление IDE Turbo C.
  • 1989 - публикация первого стандарта ANSI C (ANSI X3.159-1989).
  • 1999 - публикация второго стандарта ISO 9899:1999 (C99).
_static/01/Ken_n_dennis.png _static/01/bookC.png

Краткая история языка C

Языки программирования, возникшие в результате влияния С:

  • C++
  • Objective-C
  • Perl
  • Java
  • C#
  • PHP

Популярность Си за 10 лет

_static/01/tpci_trends.png

Лидеры

_static/01/tpci_trends2.png

Положения стандарта языка С

Стандарты официальные и неофициальные:

  • K&R - 1978, неофициальный
  • C89,C90 - 1990, официальный
  • C99 - 1999, официальный
  • C11 - 2011, официальный

Положения стандартов:

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

Достоинства и недостатки

Достоинства

  1. Компактность (минимум базовых средств).
  2. Лаконичность и выразительность.
  3. Переносимость.
  4. Эффективность компилятора.
  5. “Средний уровень”.
  6. Универсальность.
  7. Мощность (наличие огромного числа библиотек).

Недостатки

  1. Трудность в освоении.
  2. Слабая типизация.
  3. Отсутствие автоматического управления памятью.
  4. Незащищенность от ошибок.

Создание программы

Инструментальные средства

  1. Текстовый редактор
  2. Препроцессор
  3. Компилятор
  4. Компоновщик
  5. Отладчик
  6. Профайлер

Схема построения программы

_static/01/scheme_new.png

Первая программа

int main()
{
    printf("Hello, world!\n");
    return 0;
}
Hello, world!
_

Правила оформления

  • Наличие отступов в блоках
  • Положение скобок
{
   {
      {
      }
   }
}
  • Одна строка - одно выражение
  • Комментарий к месту
  • Комментарии и сообщения на английском

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

void hello(char *name)
{
    printf("Hello, %s!\n",name);
}
int main(void)
{
    hello("all");
    return 0;
}
void
hello(  char    *     name
){printf("Hello, %s!\n",name )
        ;    } int
main(void){ hello("all")
;return       0
;}

Паровоз

_static/01/parovoz.png

Дополнительная информация

Наиболее широко распространенный компилятор С называется gcc. После того, как набран текст программы и сохранен в файле (например main.c, можно давать следующие команды:

gcc -c main.c

gcc -o myprog main.o

или

gcc -o myprog main.c

После этого можно запускать программу на выполнение с помощью команды:

./myprog

Важнейшие опции gcc

  • -o имя - имя выходного файла (программы)
  • -std=c89,c99 - использование стандарта
  • -g - включение в программу отладочной информации для отладчика gdb
  • -On - включение n-ого уровня оптимизации
  • -Idir - добавляет каталог dir для поиска в них заголовочных файлов
  • -llib - добавляет имя библиотеки **lib**для компоновки
  • -Ldir - добавляет каталог с библиотеками для компоновки

Пользовательские интерфейсы

Виды интерфейсов

Традиционно выделяют два вида пользовательских интерфейсов:

  1. CLI (Command Line Interface) - интерфейс командной строки
  2. GUI (Graphical User Interface) - графический интерфейс пользователя

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

GUI создаётся с помощью средств сторонних библиотек.

Достоинства командного интерфейса:

  1. Кроссплатформенность
  2. Простота реализации
  3. Гибкость
  4. Автоматизируемость (скрипты)

Достоинства графического интерфейса:

  1. Наглядность
  2. Информативность
  3. Привлекательность
  4. Обучаемость

Графические интерфейсы

Графические интерфейсы создаются с помощью специальных приложений и библиотек

Наиболее известные библиотеки:

  • QT (C++) - cross
  • GTK (C) - unix
  • CLR (Managed C++) - windows
  • wxWidgets (C++) - cross
  • BCL (C++) - windows

Особенности стандартов

С99

Новые возможности языка:

  • встраиваемые функции (объявленные с ключевым словом inline);
  • место, в котором возможно объявление переменных, больше не ограничено глобальной областью видимости и началом составного оператора (блока);
  • несколько новых типов данных, включая long long int, дополнительные расширенные целые типы, явный логический тип данных, а также комплексный тип complex для представления комплексных чисел
  • массивы переменной длины (variable-length arrays);
  • поддержка однострочных комментариев, начинающихся с //, как в BCPL или C++
  • новые библиотечные функции, как, например, snprintf;
  • новые заголовочные файлы, такие как stdbool.h и inttypes.h;
  • типовые математические функции (tgmath.h);
  • улучшена поддержка стандарта IEEE 754-2008 (формат представления чисел с плавающей запятой);
  • проектируемые инициализаторы;
  • составные константы;
  • поддержка вариативных макросов (макросов переменной арности);
  • смягчение (restrict) ограничений для более агрессивной оптимизации кода;

С11

Новые возможности стандарта C11 (2011):

  • поддержка многопоточности;
  • улучшенная поддержка юникода;
  • обобщенные макросы (type-generic expressions, позволяют статичную перегрузку);
  • анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);
  • управление выравниванием объектов;
  • статичные утверждения (static assertions);
  • удаление опасной функции gets (в пользу безопасной gets_s);
  • функция quick_exit;
  • спецификатор функции _Noreturn;
  • новый режим эксклюзивного открытия файла.

Вопросы для самоконтроля

  • Какие существуют аспекты разработки? Подходы?
  • Какие признаки характеризуют любительский подход?
  • Какие этапы входят в жизненный цикл ПО?
  • Как называется самая известная серия рисунков, посвященная ошибкам проектирования?
  • Какие события повлияли на возникновение и распространение языка С?
  • Кто является автором языка С?
  • Как называлась первая книга о языке С?
  • Как можно отследить динамику интереса к языкам программирования?
  • Что можно сказать о стандартах языка С?
  • Какие принципы характеризуют язык С?
  • Какие достоинства у языка С?
  • Какие недостатки свойственны С?
  • Что входит в инструментальные средства С?
  • Как происходит процесс построения программы?
  • Как традиционно называется первая программа? Что она делает?
  • Как влияет неправильное форматирование на восприятие текста программы?
  • К чему может привести неправильное форматирование текста программы?
  • Как построить и запустить программу в ОС Unix?
  • С какими параметрами вызывается gcc?
  • Какие существуют виды интерфейсов?
  • В чём достоинства командного интерфейса?
  • В чём достоинства графического интерфейса?
  • Какие существуют известные библиотеки для построения графических интерфейсов?
  • Что предлагает стандарт C99?
  • Что появилось в стандарте C11?