C++ 1MIT осень 1 2021 — различия между версиями

Материал из CSC Wiki
Перейти к:навигация, поиск
(Проверка 4: Краско)
(Проверка 4: Краско)
Строка 263: Строка 263:
 
Краско Евгений Сергеевич.
 
Краско Евгений Сергеевич.
  
Почта: [mailto:krasko.evgeniy@gmail.com?subject=%5bhse%5d%20%5bcpp%5d%20Вопрос '''krasko.evgeniy@gmail.com'''], в теме письма обязательно указывать <code>[hse] [cpp]</code> и слово "вопрос", если там вопрос.
+
Почта: [mailto:krasko.evgeniy@gmail.com?subject=%5bhse%5d%20%5bcpp%5d%20Вопрос '''krasko.evgeniy@gmail.com'''], в теме письма обязательно укажите <code>[hse] [cpp]</code> и слово "вопрос", если там вопрос.
  
 
Telegram: [https://t.me/kraskoes kraskoes]
 
Telegram: [https://t.me/kraskoes kraskoes]

Версия 17:00, 20 сентября 2021

Общее

На курсе используется C++17 или C17 в зависимости от ситуации. Нестандартные расширения, как правило, запрещены.

Честность в домашках

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

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

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

Можно и нужно обсуждать друг с другом и преподавателем:

  • Содержимое лекций
  • Не связанные с домашкой куски кода, вроде "нет ли UB в этой программе?" или "за сколько работает vector::push_back в каких случаях?"
  • Настройку среды разработки, запуск компиляторов
  • Вопросы на StackOverflow
  • Чисто алгоритмическую часть заданий, вообще не зависящую от языка программирования, вроде "какую структуру данных надо использовать, чтобы работало за линию вместо квадрата"

Следует спрашивать напрямую у своего практика (лектора, проверяющего — если практик недоступен), чтобы получить надёжную информацию:

  • Вопросы по условию
  • Подсказки

Нельзя обсуждать ни с кем, кроме лектора, практиков или проверяющих:

  • Проблемы в своём конкретном коде
  • Детали реализации алгоритмов, вроде "как лучше назвать эту переменную" или "какой инвариант тут лучше сделать"

Софт

Общее

Список

Независимо от ОС и среды разработки обязательно требуется работать с консолью, можете посмотреть вводную лекцию или часть курса на Stepik (от раздела 1.4 "Terminal: основы" до раздела 1.6 "Ввод / вывод" включительно): ОС много, сред разработки много, настроек много, а консоль очень похожа.

Рекомендуется ставить всё сразу на английском языке. Вся актуальная документация и форумы в основном только на английском. Преподаватели в основном работают с англоязычным софтом.

Рекомендуется ставить 64-битные версии.

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

  1. Компилятор и стандартную библиотеку языка C++ (обычно идёт с компилятором). Один из: gcc, clang (проект LLVM), Visual C++ (ставится только в составе Visual Studio только под Windows), а лучше сразу все доступные.
  2. Консольный клиент для системы контроля версий git и интерпретатор bash (sh и zsh не подойдут).
  3. Систему сборки CMake.
  4. Среду разработки (Integrated Development Environment, IDE) или хотя бы редактор с подсветкой синтаксиса.
    • Самая мощная IDE — CLion, под все ОС. Студенты могут получить полную версию бесплатно при помощи почты на @edu.hse.ru.
    • Другая самая мощная IDE — Visual Studio. Только под Windows, только вместе с компилятором Visual C++.
    • Популярные редакторы: Visual Studio Code (кроссплатформенный, не путать с Visual Studio), Sublime Text (платный), vim (сложный). У каждого свои приколы.
  5. Инструменты от проекта LLVM: clang-format, clang-tidy.
  6. Статический анализатор cppcheck.
  7. Если у вас не Ubuntu 20.04 — виртуальную машину с Ubuntu 20.04 или, на Windows, Windows Subsystem for Linux (WSL). Чтобы можно было поставить ровно такую же среду, как в тестирующей системе.
  8. Если вы хотите, можете бесплатно поставить Windows 10 в виртуальной машине с официального сайта внутрь VirtualBox. Она живёт месяц-другой и дальше её надо скачать заново и переустановить.

Версии в тестирующей системе

Мы ориентируемся на последние стабильные версии софта, доступные в стандартных репозиториях Ubuntu 20.04 и Windows 10.

Запуск команды с ключом --version должен выводить:

  • GCC 10 (g++): g++-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
  • Clang 12 (clang++): Ubuntu clang version 12.0.0-3ubuntu1~20.04.3
  • CMake 3.15 или более новый (cmake): cmake version 3.16.3
  • clang-format 12 (clang-format): Ubuntu clang-format version 12.0.0-3ubuntu1~20.04.3
  • clang-tidy 12.0.0 (clang-tidy): LLVM version 12.0.0
  • Cppcheck 1.90 (cppcheck): Cppcheck 1.90
  • Только под Linux: Valgrind 3.15.0 или около того (valgrind): valgrind-3.15.0
  • Только под Windows: Visual Studio Community 2019 v16.11.2 (версия компилятора Visual C++ 19.29.30133)

Если версия не сошлась или команда отсутствует — попробуйте добавить в конце команды номер версии через дефис, например: clang++-12.

Особенно важны точные версии для clang-format, clang-tidy, cppcheck. У остальных инструментов поведение между минорными версиями сильно не меняется.

Следующая программа в скомпилированном виде выводит версию компилятора и стандартной библиотеки:

#include <iostream>

int main() {
    std::cout << "C++ " << __cplusplus << "\n";

    std::cout << "Detecting compiler...\n";
#if defined(__GNUC__) && !defined(__clang__)
    std::cout << "GNU C " << __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__ << "\n";
#endif
#ifdef __clang__
    std::cout << "LLVM clang " << __clang_version__ << "\n";
#endif
#ifdef _MSC_VER
    std::cout << "Microsoft Visual C++ " << _MSC_VER << "\n";
#endif

    std::cout << "Detecting standard library...\n";
#ifdef __GLIBCXX__
    std::cout << "GNU libstdc++: " << __GLIBCXX__ << "\n";
#endif
#ifdef _LIBCPP_VERSION
    std::cout << "LLVM libc++: " << _LIBCPP_VERSION << "\n";
#endif
#ifdef _MSVC_STL_VERSION
    std::cout << "Microsoft STL: " << _MSVC_STL_VERSION << " at " << _MSVC_STL_UPDATE << "\n";
#endif
}

Всегда должно выводиться C++ 201703. Дальше:

  • Для GCC: GNU C 10.3.0 и GNU libstdc++ 20210408
  • Для Clang: LLVM clang 12.0.0 и GNU libstdc++ 20210408
  • Для Clang с ключом -stdlib=libc++: LLVM clang 12.0.0 и LLVM libc++ 12000
  • Для Visual Studio: C++ 199711 даже при включённом C++17 (потому что нужна совместимость со старым кодом, но это можно настроить, нам не потребуется), Microsoft Visual C++ 1929 и Microsoft STL 142 at 202104

Проверка установки

Проверьте версии софта по списку выше. Также убедитесь, что консольный клиент git у вас версии хотя бы 2.25

Если вы ставили виртуальную машину с Ubuntu 20.04 — повторите команды в ней, внутри виртуальной машины версии могут отличаться от версий в вашей основной ОС.

Linux

Ubuntu

Проверьте, что у вас действительно Ubuntu 20.04: команда cat /etc/lsb-release должна вывести Ubuntu 20.04.3 LTS, цифра 3 может быть поменьше.

Обновите всю систему до последней версии: sudo apt update && sudo apt upgrade. Теперь версия должны быть Ubuntu 20.04.3 LTS.

Дальше установите нужные пакеты:

sudo apt install g++-10 clang-12  # Компиляторы
sudo apt install git  # Консольный клиент для git; bash уже стоит
sudo apt install cmake  # CMake
# CLion можно поставить [https://www.jetbrains.com/ru-ru/clion/ с официального сайта]
sudo apt install clang-format-12 clang-tidy-12  # Инструменты от LLVM
sudo apt install cppcheck  # Cppcheck

Также поставьте стандартную библиотеку libc++:

sudo apt install libc++-12-dev libc++abi-12-dev

При работе из консоли всегда команды с суффиксом версии: g++-10, clang++-12, clang-format-12, clang-tidy-12. Пакеты и команды без суффикса, вроде g++, могут относиться к старым версиям.

В частности, вам нужно корректно настроить вашу среду разработки (SDKs в CLion) и консольный CMake (при помощи параметра вроде -DCMAKE_CXX_COMPILER=g++-10).

В качестве виртуальной машины для Windows рекомендуется поставить VirtualBox: sudo apt install virtualbox.

Другие дистрибутивы Linux

Вы можете либо поставить виртуальную машину с Ubuntu, либо сделать Docker-контейнер на основе образа Ubuntu 20.04.

Для установки Windows без вариантов: только виртуальная машина, рекомендуется VirtualBox.

Windows

  1. В качестве компилятора вы можете поставить на выбор:
    • GCC/Clang. Есть несколько сборок, рекомендуется msys2: установите msys2, после чего из консоли msys запустите команду pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-make. Для Clang поставьте pacman -S mingw-w64-x86_64-clang, для libc++ поставьте pacman -S mingw-w64-x86_64-libc++.
    • Visual Studio Community 2019 с Workload ("Рабочая нагрузка") "Desktop development with C++" ("Разработка классических приложений на C++"). В ней достаточно компонентов "MSVC v142 ... x86/64" ("MSVC версии 142 ... x86/64"), "Windows 10 SDK" ("Пакет SDK для Windows 10 ") и "C++ Address Sanitizer", но вы можете также добавить "C++ profiling tools" ("Средства профилирования C++", может помочь при поиске тормозов в программе), "IntelliCode". Также обязательно поставьте английский язык, а вот русский лучше удалить.
    • Если поставили Visual Studio, то можно поставить ещё и Clang к нему по ссылкам с официального сайта, он будет использовать стандартную библиотеку от Visual Studio. Но тогда не получится компилировать с libc++.
  2. Консольный клиент git ставится с официального сайта. В качестве редактора рекомендуется оставить блокнот или Nano. Не выбирайте Vim, если не знаете, что это.
  3. CMake ставится с официального сайта
  4. В качестве среды разработки рекомендуется либо CLion, либо Visual Studio.
  5. Инструменты от LLVM 12.0.0 ставятся по-разному, потому что им нужно понять, какую стандартную библиотеку использовать:
  6. Cppcheck 1.90 по ссылкам с официального сайта
  7. В качестве виртуальной машины установите Windows Subsystem for Linux (вам достаточно шагов 1-3 "ручная установка") с Ubuntu 20.04, чтобы можно было запускать Valgrind: wsl --install -d Ubuntu-20.04. Потом внутри Ubuntu 20.04 поставьте софт по инструкции выше.

Добавьте все инструменты в переменную среды PATH. Например, для msys2 наверняка будет нужна папка вроде C:\msys239\mingw64\bin\ — именно в ней лежит g++.exe (проверьте!). После этого перезапустите консоль/CLion, чтобы они прочитали новую версию PATH.

Компилятор Clang будет поставлен вместе с инструментам для LLVM и должен начать автоматически использовать соответствующую стандартную библиотеку: GNU libstdc++, если вы ставили через msys2 (можно доставить LLVM libc++), и Microsoft STL, если вы ставили с официального сайта рядом с Visual Studio.

macOS

Будьте осторожны: обычно на macOS используется Apple Clang, который скрывается за командой gcc и ставится вместе с Xcode. Скорее всего, будет не та версия, что надо.

Установите пакетный менеджер Homebrew: запустите команду с домашней страницы и внимательно прочитайте, когда оно скажет Run these two commands in your terminal, эти команды необходимо выполнить.

После чего выполните команды (после # идёт комментарий):

brew update  # Обновление списка доступных пакетов
brew install gcc@10 llvm@12 git cmake cppcheck  # Установка gcc, clang и инструментов LLVM, git, cmake, cppcheck

Теперь у вас должны появиться команды cmake и cppcheck. Если они не появились — у вас не добавлен в переменную PATH путь до папки с программами, поставленными через Brew. Вам нужно дописать в файл $HOME/.bash_profile (для Bash) или $HOME/.zprofile (для Zsh) строчки, которые выводит команда brew shellenv. После этого переоткройте консоль/CLion, чтобы они увидели изменения.

Чтобы появились команды clang++, g++ (которые конфликтуют со стандартными командами Xcode) и команды вроде clang-format (они связаны с первыми), надо добавить в этот же файл в конце строчку export PATH="$(brew --prefix llvm)/bin":$PATH. После этого переоткройте консоль/CLion, чтобы они увидели изменения.

Будет использоваться стандартная библиотека libc++, не stdlibc++. Из-за этого и говорят, что "на маках компилируется, а под другими ОС нет", виновата другая стандартная библиотека.

В качестве виртуальной машины, если у вас процессор Intel, проще всего поставить Oracle VirtualBox и скачать в него готовый образ с Ubuntu 20.04 от проекта OSboxes. Дальше следуйте шагам по настройке Ubuntu 20.04.

Для процессора M1 можно поставить виртуальную машину UTM и Windows for ARM, после чего поставить в неё Visual Studio по инструкции для Windows. Но это будет дико тормозить, так как Visual Studio есть только для x86, а на ARM будет эмуляция.

Сайты

  • Pastebin — сюда можно скидывать длинные логи и файлы, всегда ставьте "Paste Exposure: Private"
  • Godbolt — исследование различных версий компиляторов
  • Wandbox — онлайн-компилятор, поддерживающий некоторые библиотеки и несколько файлов
  • Cpp Insights — десахаризатор синтаксиса C++

Лекции

Лектор: Суворов Егор Федорович (egor_suvorov@mail.ru]), в теме письма обязательно указывать [hse] [cpp] и слово "вопрос", если там вопрос.

Также есть Telegram: yeputons

Базовые материалы

Материалы с лекций: https://github.com/hse-spb-2021-cpp/lectures

Просто хорошие учебники

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

Общее развитие

Обращайте внимание, для какого стандарта вы читаете рекомендации. Минимальный — C++11, C++03 — это совсем другой язык. Следующие огромные изменения ожидаются в C++20.

Дополнительные материалы

C++20 и метапрограммирование

Практика 1: Суворов

Практика 2: Головчанская

Головчанская Юлия Игоревна
gol.ju@yandex.ru
Telegram: @golju

Проверка 2: Рухлов

Рухлов Никита Николаевич

Telegram: @squallo23

Практика 3: Кравченко

Практика 4: Соснин

Соснин Антон Алексеевич
antsosnin@yandex.ru
Telegram: @antonso

Проверка 4: Краско

Краско Евгений Сергеевич.

Почта: krasko.evgeniy@gmail.com, в теме письма обязательно укажите [hse] [cpp] и слово "вопрос", если там вопрос.

Telegram: kraskoes

GitHub: krasko

Правила приема лаб:

  • Исправлять можно любой балл, кроме нуля.
  • За отлично сделанное со второй попытки задание всё равно можно получить полный балл.
  • Гарантируется одна попытка на исправления после первого ревью; дальше - по ситуации (скорее всего, вторую попытку буду давать только в редких случаях).
  • Если есть вопросы по замечаниям - отвечайте на гитхабе; если я после этого не отвечаю вам 24 часа - можно написать в телеграм.

Практика 5: Данковский

Данковский Даниил Андреевич alh45011@gmail.com Telegram: @alh45011

Проверка 5: Гулецкий

Практика 6: Алфёров

Алфёров Василий Викторович

Телега: @vasiliyalferov

Почта: teaching@vasalf.net

Материалы практики: тык