Изучаем c++. часть 1. что такое программа и языки программирования

Пишем чат-бота

Теперь пора перейти к практике. Сегодня мы будем работать в онлайн-среде ideone. Серьезные программы в онлайн-средах не пишутся, но для обучения и практики это самое то!


Итак, откроем сайт ideone. Слева будет окошко для кода. Возможно, что по умолчанию там будет выбран другой язык — тогда просто нажмите на его название и выберите C#.

Самые первые слова любого программиста — «Привет, мир!» (Hello, World!), поэтому и мы начнём с них. Хотя не совсем: мы позволили себе заменить «мир» на «Скиллбокс» 😉 Чтобы отобразить наше сообщение, используем команду Console.WriteLine (). Свой текст напишем в скобках и не забудем поставить кавычки. Вот так:

Чтобы запустить свой код и протестировать, работает ли он, нажмём зелёную кнопку RUN в углу.

Чтобы общаться с нашим будущим чат-ботом, нам надо научить его читать — то есть сделать так, чтобы мы могли задавать информацию, с которой он будет работать. Для этого мы используем команду Console.ReadLine (). Она прочитает текст, который написал пользователь.

Давайте уже напишем начало: пусть чат-бот здоровается, а потом читает наше сообщение:

Прочитать-то он прочитает, но память у бота короткая — надо, чтобы он это сообщение запомнил. Для этого сохраним его в переменную — назовём её, например, text. Вместо Console.ReadLine () напишем вот так:

Console.ReadLine () — команда, читающая сообщение пользователя;var — команда, которая отмечает, что мы создаём новую переменную. После неё мы пишем название переменной.

Пусть бот уточняет, что именно мы ему сказали, — вдруг мы забудем. Сделаем мы это той же командой Console.WriteLine (), только в этот раз мы не знаем заранее, что надо будет написать, поэтому используем переменную. Чтобы вставить переменную в текст, обозначим её фигурными скобками, а перед кавычками напишем знак доллара, вот так:

$ позволяет вставить переменную в текст. Пишем его перед кавычками, а саму переменную в тексте обозначаем фигурными скобками.

Важно! Не забывайте ставить точку с запятой в конце каждой строчки!

Чтобы задать свой input, запустите программу, а потом нажмите кнопку edit слева вверху над кодом.

Снизу откроется окошко с надписью input над ним. То, что вы там напишете, программа использует при следующем запуске.

Сейчас наш чат-бот умеет здороваться и может повторить, что мы ему написали. Давайте научим его реагировать на то, что мы пишем. Для этого нам понадобится конструкция if — она проверяет, соблюдено ли условие, и решает, что делать дальше. На новой строке напишем if и в круглых скобках напишем условие. Пусть в ответ на «Привет» бот отвечает «Здарова!». Мы можем написать вот так:

Для сравнения пишется двойной знак =. Обычный мы используем, если надо сохранить значение в переменную. Не путайте!

У нашего решения есть несколько проблем. Первая: если мы напишем весь свой текст маленькими или большими буквами, программа его не опознает. Что с этим делать? Добавим команду ToLower (), которая заменит все буквы на маленькие, и текст, с которым мы сравниваем сообщение пользователя, тоже перепишем маленькими буквами, вот так:

А что, если мы напишем «Привет, как дела?»? Наш бот никак не отреагирует. Чтобы это исправить, используем функцию Contains (), которая проверит, есть ли нужная строка в нашем вводе.

Можем разнообразить словарный запас нашего бота, добавив ещё условий:

Теперь, если мы напишем «Привет! Как тебя зовут? Как дела?», наш бот напишет ответ на все фразы по очереди.

Важно! Если бы вы писали более сложного «настоящего» бота или другую программу, вы бы не копировали один и тот же код много раз, а использовали файл, базу данных или что-то другое. Когда одна и та же часть повторяется много раз, код неудобно читать и тяжело исправлять

А что, если мы хотим получать не только такие ответы, но и меняющуюся информацию? Например, нам интересно, какой сегодня день. Если бы мы написали сегодняшнюю дату в такую же конструкцию, как выше, то или нам пришлось бы переписывать код каждый день, или наша программа сразу бы устарела. Нам поможет функция DateTime. Спросим у неё, какая сейчас (Now) дата, переведём это в строку нужного формата (ToString («dd.MM.yyyy»)) и всё это сохраним в переменную date. Вот так это выглядит:

И напоследок ещё одна важная тема.

Конструкция if часто идет в паре с else. Else описывает, что сделать в том случае, если условие из if не выполнится.


Используется else после if — но мы уже не пишем условие, а только действие в фигурных скобках. Вот пример этой конструкции:

Теперь, если мы напишем сообщение боту без слова «привет», он обидится и будет ругаться.

Среда разработки от компании Майкрософт

С точки зрения разработчика, MSVC — это среда разработки кода для Microsoft .NET Framework, Windows API, DirectX API и для стандартной среды Windows, идущая с Microsoft Visual Studio. Бесплатно скачать Microsoft Visual C++ Redistributable Package на русском языке можно и отдельно от VS.

Соответственно, конечный пользователь многих программных продуктов должен бесплатный Microsoft Visual C++ скачать для Windows 7 SP 1, 8, 8.1, 10, а также Vista SP 2 и XP SP 3 (32-bit и 64-bit), поскольку программное обеспечение, требующее наличия данных системных компонентов Windows, запускаться не будет. Последняя версия 2019 заменяет компоненты 2017 и 2015. Остальные пакеты имеют уникальные компоненты, и последующие не заменяют предыдущие, так как функционируют независимо друг от друга. Для работы в среде Windows 7 и XP, пакеты MS Visual C++ Redistributable Package 2012, 2013, и 2015 устанавливаются на Windows 7 SP 1 и Windows XP SP 3, соответственно.

Лексический анализатор / лексер

Строка исходного кода проходит через лексер и превращается в список токенов.

Первый шаг в большинстве ЯП — это лексический анализ. Говоря по-простому, он представляет собой разбиение текста на токены, то есть единицы языка: переменные, названия функций (идентификаторы), операторы, числа. Таким образом, подав лексеру на вход строку с исходным кодом, мы получим на выходе список всех токенов, которые в ней содержатся.

Обращения к исходному коду уже не будет происходить на следующих этапах, поэтому лексер должен выдать всю необходимую для них информацию.

Flex

При создании языка первым делом я написал лексер. Позже я изучил инструменты, которые могли бы сделать лексический анализ проще и уменьшить количество возникающих багов.

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

Моё решение

Я решил оставить написанный мной анализатор. Особых преимуществ у Flex я в итоге не увидел, а его использование только создало бы дополнительные зависимости, усложняющие процесс сборки. К тому же, мой выбор обеспечивает больше гибкости — например, можно добавить к языку оператор без необходимости редактировать несколько файлов.

Командная разработка с помощью C

Язык С изначально создавался для разработки больших программных комплексов, поэтому в язык уже встроены средства организации командной работы. Это функционал заголовочных файлов (.h).

Если к разработке приступает команда разработчиков, то необходимо с самого начала дать каждому программисту фронт работ. Но возникает серьезная проблема: если функция, которую пишет Иванов, требуется Петрову, то Петров будет сидеть и ждать, пока Иванов ее напишет.

Тут на помощь приходит изоляция кода. Для начала работы Иванову нужно только записать интерфейс будущей функции в заголовочном файле. А реализацию функции сделать пока пустой. Это называется «поставить заглушку».

Так как в С имеет значение только вход и выход, то Петров может тут же приступать к работе и вызывать функцию Иванова. Таким образом вся команда может приступать к работе незамедлительно.

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

Особенности PVS-Studio

  • Автоматический анализ отдельных файлов после их перекомпиляции.
  • Удобная и простая интеграция с Visual Studio 2010-2019.
  • Удобная online-справка по всем диагностикам, которая доступна и из программы, и на сайте, а также документация в .pdf одним файлом. Более 700 печатных страниц документации!
  • Сохранение и загрузка результатов анализа: можно ночью проверить код, сохранить результаты, а утром загрузить их и смотреть.
  • Возможность сохранить результаты анализа в формате HTML с полной навигацией по коду.
  • Запуск из командной строки для проверки всего решения: позволяет интегрировать PVS-Studio в ночные сборки, чтобы утром у всех был свежий лог.
  • Отличная масштабируемость! Поддержка многоядерных и многопроцессорных систем с настройкой количества используемых ядер; поддержка IncrediBuild.
  • Mark as False Alarm – разметка в коде, чтобы не ругаться конкретной диагностикой в конкретном фрагменте файла.
  • Интерактивная фильтрация результатов анализа (лога) в окне PVS-Studio: по коду диагностики, по имени файла, по включению слова в текст диагностики.
  • Утилита blame-notifier. Инструмент позволяет рассылать письма разработчикам об ошибках, которые PVS-Studio нашел во время ночного прогона.
  • Проверка коммитов, merge и pull request’ов — можно настроить анализатор на проверку только изменённых файлов. Это позволит быстро и автоматически проверять каждый коммит в систему контроля версий.
  • Интеграция с SonarQube. Это открытая платформа для обеспечения непрерывного контроля качества исходного кода.
  • Большое количество вариантов интеграции в проекты, разрабатываемые под Linux и macOS.
  • Mass Suppression – позволяет подавить все старые сообщения, чтобы анализатор выдавал 0 срабатываний. К подавленным сообщениям всегда можно вернуться позже. Возможность безболезненно внедрить PVS-Studio в существующий процесс разработки и сфокусироваться на ошибках только в новом коде.
  • Статистика ошибок в Excel – можно посмотреть темпы правки ошибок, количество ошибок во времени и т.п.
  • Автоматическая проверка на наличие новых версий PVS-Studio (как при работе в IDE, так и при ночных сборках).
  • Использование относительных путей в файлах отчета для возможности переноса отчета на другую машину.
  • Отслеживание компиляции (Compiler Monitoring) – проверка проектов, у которых нет файлов Visual Studio (.sln/.vcxproj), без необходимости проводить интеграцию со сборочной системой; при необходимости, можно провести прямую интеграцию анализатора в любую сборочную систему.
  • pvs-studio-analyzer – утилита для отслеживания компиляции (Compiler Monitoring) на Linux.
  • Возможность исключить из анализа файлы по имени, папке или маске; возможность проверять файлы, модифицированные за последние N дней.

Поддерживаемые языки и компиляторы

  • Windows. Visual Studio, C, C++, C++/CLI, C++/CX (WinRT)
  • Windows. IAR Embedded Workbench, C/C++ Compiler for ARM C, C++
  • Windows. QNX Momentics, QCC C, C++
  • Windows/Linux. Keil µVision, DS-MDK, ARM Compiler 5/6 C, C++
  • Windows/Linux. Texas Instruments Code Composer Studio, ARM Code Generation Tools C, C++
  • Windows/Linux/macOS. GNU Arm Embedded Toolchain, Arm Embedded GCC compiler, C, C++
  • Windows/Linux/macOS. Qt Creator, Eclipse, GCC, Clang, C, C++
  • Windows. MinGW C, C++
  • Windows/Linux/macOS. IntelliJ IDEA, Android Studio, Java
  • Windows/Linux/macOS. Visual Studio, JetBrains Rider, C#, .NET Framework, .NET Core

Абстрактный семантический граф

Переход от синтаксического дерева к семантическому графу

В этой части я реализовал структуру, по своей сути наиболее близкую к «промежуточному представлению» (intermediate representation) в LLVM. Существует небольшая, но важная разница между абстрактным синтаксическим деревом (АСД) и абстрактным семантическим графом (АСГ).

АСГ vs АСД

Грубо говоря, семантический граф — это синтаксическое дерево с контекстом. То есть, он содержит информацию наподобие какой тип возвращает функция или в каких местах используется одна и та же переменная. Из-за того, что графу нужно распознать и запомнить весь этот контекст, коду, который его генерирует, необходима поддержка в виде множества различных поясняющих таблиц.

Запуск

После того, как граф составлен, запуск программы становится довольно простой задачей. Каждый узел содержит реализацию функции, которая получает некоторые данные на вход, делает то, что запрограммировано (включая возможный вызов вспомогательных функций), и возвращает результат. Это — интерпретатор в действии.

Цель создания языка C

Деннис Ритчи разработал язык C для решения двух задач:

  1. Язык должен как можно более эффективно транслироваться в машинные коды, для обеспечения максимальной производительности.
  2. Язык должен быть максимально переносимым на любые платформы.

Обе поставленные задачи были полностью решены. В 1972 году появился первый вариант языка C.

В настоящее время язык С является языком, который обеспечивает максимальную производительность программы. При необходимости программист может использовать в теле программы язык ассемблера, что позволяет добиться максимально возможной производительности в критических местах программы.

Также язык С в настоящее время реализован практических на всех компьютерных платформах и операционных системах.

Какую же модель языка выбрал Деннис Ритчи?

Избыточность языка С

Популярность языка С привела к тому, что все больше разработчиков стали использовать этот язык. В язык стали добавляться все новые конструкции. Язык распухал и становился все более и более громоздким.

В конце концов в язык было добавлено также программирование с классами, но к счастью, это уже было выделено в самостоятельный диалект языка C, который получил название C++.


В языке C++ другая модель языка и другой подход к программированию, который получил название объектно-ориентированное программирование (ООП).

Но все равно в язык С добавили столько возможностей, что это привело к тому, что в настоящее время язык С — это один из наиболее больших и громоздких языков. Это сильно повышает порог вхождения для начинающих.

К счастью, 90% возможностей языка Си избыточны и вам никогда не понадобятся.

Например, есть громадная таблица приоритетов операторов C.

Но нет никакого смысла ни знать про эту таблицу, ни в разбираться в ней. Я специально сделал ее очень маленькой, потому что вся информация в этой таблице абсолютно лишняя.

Для правильного использования приоритетов нужно всего лишь расставить скобки. И все!

Компилятор будет следовать вашим скобкам, а не этой таблице.

Хотя во многих учебниках рекомендуется выучить эту таблицу наизусть, чтобы сократить число скобок.

А теперь представьте ситуацию: вы вызубрили эту таблицу, написали выражение без единой скобки, а потом смотрите на это выражение через пару лет и пытаетесь в нем разобраться.

Вам захочется сказать: «Зачем я вообще этим занимался?!»

Большинство возможностей языка С похожи на эту таблицу: большие, страшные и бесполезные.

Когда и зачем используются C и C++ ?

1. Операционные системы

Язык C первоначально создавался для системного программирования, поэтому не удивительно, что его так активно применяют при создании операционных систем и программного обеспечения. 

Быстрый и энергоэффективный, он достаточно близок к аппаратному слою, что позволяет работать с кодом низкого уровня.

Вот почему он идеален для разработки операционных систем.

Любая операционная система в первую очередь должна быстро запускаться и эффективно управлять системными ресурсами. Например, Linux, Microsoft Windows, Mac OS полностью написаны на языке C, а Android и iOS — частично.

Разработчик на языке C может реализовывать все структуры данных самостоятельно, производя тонкую настройку мельчайших деталей операционной системы. Такая высокая гибкость — весомый аргумент в пользу языка.

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

2. Программирование встроенных систем

Язык программирования C просто необходим при проектировании встроенных систем.

Почему?

Главным образом из-за высокой производительности и простоты использования. Язык C очень экономичен в потреблении ресурсов системы, благодаря чему программа выполняется быстро. В результате встроенные системы работают в реальном времени без замедления.

Ещё важнее здесь — код на C, будучи платформенно-независимым, не связан с каким-либо конкретным микропроцессором или системой. Так что встроенную программу можно скомпилировать в разных устройствах и платформах с незначительными изменениями или вовсе без них.

Вот почему беспилотные автомобили, умные часы, сенсоры и устройства, использующие технологию Интернета вещей (например, кофемашины), имеют встроенное ПО, целиком написанное на C или C++. В связанных системах C позволяет работать непосредственно с ресурсами памяти и править любую часть кода. 

3. Разработка игр и игрового движка

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

Являясь самым быстрым на сегодняшний день языком программирования, С++ оказывается одним из лучших для игр в 3D, многопользовательских и других.

Например, Counter-Strike, StarCraft: Brood War, Diablo I, World of Warcraft — все эти игры написаны на C++. Не говоря уже о консолях Xbox и PlayStation, в основе которых лежит программирование C++.


В ядре игрового движка Unity — самого популярного движка для создания видеоигр под несколько операционных систем одновременно — также использовался C++.

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

4. Разработка настольных и кроссплатформенных приложений

C++ также можно использовать для создания настольных приложений. Всё благодаря превосходным кроссплатформенным средствам разработки (иногда называемым фреймворками), таким как Qt. Оно позволяет нацелиться на Windows, Linux, macOS, Android и встроенные системы — все c единой кодовой базой. Так что разработка приложений с помощью Qt оказывается отличным решением для тех, кто хочет сэкономить на времени и стоимости программирования.

Стоит упомянуть и о библиотеке SDL, нашпигованной функциями, позволяющими создавать приложения одновременно для Windows, Linux, Android, MacOS и iOS.

Кстати, Photoshop, Illustrator и Adobe Premiere целиком написаны на C++.

Какие ещё есть приложения?

В Facebook перевели часть кода из PHP на язык C++, чтобы сократить затраты электроэнергии в расчёте на одного пользователя. Возможно, облачные системы хранения, базы данных, драйверы устройств и другие виды ПО тоже используют C++.

Сюда также можно отнести банковские и другие приложения, обладающие высокой степенью многопоточности и низким периодом ожидания. Словом —  всё, что должно работать быстро и без проблем. 

Организация электронного обучения

У Moodle непростая организация обучения. Для вашего удобства мы поделили этот раздел на три части: создание, поддержка и организация курсов.

Создание контента

У Moodle есть встроенный редактор, позволяющий создавать лекции, опросы, задания и тесты. Эти виды контента формируются из текстов, изображений, видео и аудиофайлов, которые администратор загружает на платформу.

Вот так выглядит вопрос теста, созданного в редакторе Moodle:

Главное в Moodle — это лекция. В лекции вы рассказываете ученику теорию по нужному предмету. Например, объясняете, как продать клиенту новый продукт вашей компании. В конце лекции можно разметить тест, чтобы ученик закрепил изученный материал. В Moodle лекция считается полноценным учебным курсом.

Лекцию вы создаете во вкладке Администрирование. Затем надо перейти к курсу, включить режим редактирования и начать настраивать темы. В темы нужно добавить элементы — формы контента для курса, и каждый элемент настраивается отдельно. Элементов много, и если у вас нет опыта работы с Moodle, не всегда понятно, какой элемент лучше использовать.

Неопытный пользователь может потратить на создание одной лекции день. Сократить время работы и упрастить задачу можно при помощи конструктора электронных курсов (Authoring Tool). С его помощью вы за час упакуете текст, видео, картинки и музыку в электронный курс. Например, iSpring Suite — комплексный набор, позволяющий создавать полноценные уроки: презентации, тесты, диалоговые тренажеры и скринкасты. Это может быть урок по пожарной безопасности или тренажер по продажам в салоне. Так выглядит тренажер, созданный в iSpring Suite:

Поддержка контента

В хранилище Moodle можно загрузить файлы в следующих форматах:

  • Текст — doc, pdf, xls, csv
  • Изображения — jpeg, png, gif
  • Видео — flv, f4v, f4p, mp4, m4v, m4a, 3gp, mov
  • Аудио — mp3, aac, flac, m4a, oga, ogg, wav

Из этих файлов и будут формироваться задания, созданные во встроенном редакторе.

Созданный же в стороннем конструкторе курс обычно выгружают как SCORM-архив. Это стандарт упаковки файлов, позволяющий опубликовать урок в системе обучения или на сайте в готовом для прохождения виде.

SCORM 1.2 — самый новый из таких стандартов, но Moodle поддерживает и более старые. Полный список:

  • SCORM 2004, 1.2
  • IMS
  • LTI 1.1, 1.3, 2.0
  • AICC
  • xAPI и cmi5. Поддерживаются через плагин Logstore API

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

Контент в Moodle собирается в курсы, которые могут включать в себя любую последовательность единиц контента, доступных на платформе. Это может быть курс по продажам, онбордингу или даже полноценная программа обучения.

Курс в Moodle состоит из отдельных единиц учебного контента — лекция, тест или SCORM-пакет

Любой курс состоит из тем, которые наполняются готовым контентом: лекциями, тестами, SCORM-курсами и т.д. Темы выполняют роль разграничительных этапов, и с их помощью можно создать гибкую траекторию обучения. Например, такой курс, где последняя тема не покажется, если студент не наберет нужное количество баллов.

Организация учебного курса в Moodle

Итог:

  • Курсы состоят из тем
  • Темы состоят из готовых единиц контента: лекция, тест, SCORM-пакет
  • Контент создается во внутреннем редакторе или загружается на платформу

С этим читают