В докладе речь пойдёт о такой операции, как раскрутка стека вызовов, для чего она нужна и когда происходит. Будет рассказано, что такое стек вызовов и стековый кадр, что такое соглашение вызова. Далее, используя эти знания, на примере операционной системы Linux будут в деталях описаны два алгоритма раскрутки стека, в том числе с использованием отладочной информации в формате DWARF.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
ЛЕКЦИЯ 1. Основные понятия стандарта MPI. Дифференцированные обмены
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
ЛЕКЦИЯ 2. POSIX Threads. Жизненный цикл потоков. Планирование. Синхронизация
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
ЛЕКЦИЯ 1. Основные понятия стандарта MPI. Дифференцированные обмены
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
ЛЕКЦИЯ 2. POSIX Threads. Жизненный цикл потоков. Планирование. Синхронизация
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019corehard_by
Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Когда мы работаем с БД, мы зачастую получаем сырые буферы, в то время как хочется получать данные в виде структур, классов и контейнеров C++. Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Описанный в докладе подход можно адаптировать практически к любому протоколу уровня приложений.
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
В докладе будет рассмотрена генерация кода при компиляции различных языковых конструкций, как простых, так и сложных, на различных платформах, как общераспространённых x86/x64, так и тех, которым уделяется меньше внимания: ARM, AVR. Также будут встречаться примеры для совсем экзотических процессоров вроде PowerPC и даже MicroBlaze. Основной упор будет делаться не на обработку данных, а именно на сопоставление различных конструкций кода с инструкциями целевых платформ.
ЛЕКЦИЯ 3. Стандарт POSIX Threads
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 3. Реентерабельность. Сигналы. Локальные данные потоков. Принудительное завершение потоков
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
SECON'2016. Кочков Антон, Рютин Борис, Radare2 - от A до ZSECON
В ходе мастер-класса мы продемонстрируем основы владения фреймворком radare2, а так же разберем с помощью него несколько практических примеров. В частности проанализируем простую вредоносную программу и ПО для ARM-устройств (Android / iOS)
ЛЕКЦИЯ 1. Актуальность параллельных вычислений. Анализ параллельных алгоритмов. Многоядерные вычислительные систем с общей памятью
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
ЛЕКЦИЯ 6. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения. Модель памяти C++
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
ЛЕКЦИЯ 6. Разработка параллельных структур данных на основе блокировок
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/LinuxDefconRussia
Руткиты в мире основанных на ядре Linux операционных систем уже не являются редкостью. Рассказ будет о том, как попытки в современных реалиях определить то, скомпрометирована ли система, привели к неожиданному результату.
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
ЛЕКЦИЯ 5. Многопоточное программирование в языке С++. Работа с потоками. Защита данных. Синхронизация. Будущие результаты
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019corehard_by
Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Когда мы работаем с БД, мы зачастую получаем сырые буферы, в то время как хочется получать данные в виде структур, классов и контейнеров C++. Рассказ о проектировании и реализации драйвера PostgreSQL с человеческим интерфейсом с применением почти всех доступных на данный момент языковых средств C++17. Описанный в докладе подход можно адаптировать практически к любому протоколу уровня приложений.
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
В докладе будет рассмотрена генерация кода при компиляции различных языковых конструкций, как простых, так и сложных, на различных платформах, как общераспространённых x86/x64, так и тех, которым уделяется меньше внимания: ARM, AVR. Также будут встречаться примеры для совсем экзотических процессоров вроде PowerPC и даже MicroBlaze. Основной упор будет делаться не на обработку данных, а именно на сопоставление различных конструкций кода с инструкциями целевых платформ.
ЛЕКЦИЯ 3. Стандарт POSIX Threads
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 3. Реентерабельность. Сигналы. Локальные данные потоков. Принудительное завершение потоков
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
SECON'2016. Кочков Антон, Рютин Борис, Radare2 - от A до ZSECON
В ходе мастер-класса мы продемонстрируем основы владения фреймворком radare2, а так же разберем с помощью него несколько практических примеров. В частности проанализируем простую вредоносную программу и ПО для ARM-устройств (Android / iOS)
ЛЕКЦИЯ 1. Актуальность параллельных вычислений. Анализ параллельных алгоритмов. Многоядерные вычислительные систем с общей памятью
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
ЛЕКЦИЯ 6. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения. Модель памяти C++
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
ЛЕКЦИЯ 6. Разработка параллельных структур данных на основе блокировок
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/LinuxDefconRussia
Руткиты в мире основанных на ядре Linux операционных систем уже не являются редкостью. Рассказ будет о том, как попытки в современных реалиях определить то, скомпрометирована ли система, привели к неожиданному результату.
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
ЛЕКЦИЯ 5. Многопоточное программирование в языке С++. Работа с потоками. Защита данных. Синхронизация. Будущие результаты
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...Ontico
РИТ++ 2017, HighLoad Junior
Зал Сингапур, 5 июня, 11:00
Тезисы:
http://junior.highload.ru/2017/abstracts/2683.html
Наш доклад описывает способ использования больших объемов памяти, которые стали доступны в последние годы. К сожалению, эта память обычно остается незадействованной в управляемых средах исполнения в связи с принудительной сборкой мусора. Разработчики прибегают к внешним хранилищам данных ( i.e Memcached), что несет дополнительные расходы.
...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...corehard_by
За 40 минут мы вместе построим асинхронный мини-фреймворк потоковой обработки запросов. Без asio, без мьютексов, без future/promise и прочих новомодных штучек. "Без" не значит совсем без, - мы реализуем их по-другому, очень просто и, надеюсь, эффективно. Постараемся забыть о потоках, изобретем почти неблокируемый аллокатор, приправим все это планировщиком, - в результате получим апартаменты комфорт-класса.
Обзор современных микроконтроллеров и их архитектурIoT Community
2-ая часть From Zero to IoT Hero: доклад - Обзор современных микроконтроллеров и их архитектур, Обзор архитектуры ARM.
1-ая часть доклада
Хотя ARM контроллеры можно встретить везде и повсюду, существует и достаточно активно используются и другие типы микроконтроллеров - например экосистема Arduino с контроллерами Atmel. Обзор и небольшое сравнение современных типов микроконтроллеров.
2-ая часть доклада
ARM - самая распространенная архитектура контроллеров для встраиваемых устройств. Почему так? Потому что они простые и очень эффективные. В докладе подробно разобрано, как они устроены.
Спикер: Александр Сурков
Метод анализа C/C++ программ. Использование LLVM и декомпиляции в таком анализе. Проблемы декомпиляции и возможные способы применения анализа. Примеры.
The method of analysis of C/C++ programms. The usage of LLVM and decompilation in this analysis. Problems of decompilation. Possible ways of usage of analysis. Examples.
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Tanya Denisyuk
Тезисы:
За последние 2 года экосистема tarantool пополнилась огромным количеством батареек: дисковое хранение, lua-шардинг, работа со схемами данных и версиями, nginx upstream модуль. Используя эти компоненты, можно создавать высокопроизводительные приложения без использования дополнительных технологий.
В докладе будет описан опыт использования Tarantool для разработки performance-critical restful api: расскажу в чем плюсы и минусы текущей реализации lua-шардинга, как создать restful api прямо в базе данных и почему это быстрее многих популярных решений на примере реальных данных. Кроме того, будет рассмотрен подход использования avro схем для валидации, версионирования и хранения json документов в Tarantool. Для наглядности во время доклада будет разработан микросервис и проведено нагрузочное тестирование.
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...corehard_by
Использование сторонних библиотек в языке C++ никогда не было простым - необходимо было правильно собрать их, имея дело с различными системами сборки, но с появлением пакетного менеджера conan.io процесс стал намного проще, так что теперь осталось только сделать пакеты для нужным библиотек, и в этом поможет команда bincrafter-ов.
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
На предыдущих конференциях C++ CoreHard автор доклада рассказывал про Модель Акторов и опыт ее использования в C++. Но Модель Акторов -- это далеко не единственный способ борьбы со сложностью при работе с многопоточностью. Давайте попробуем поговорить о том, что еще можно применить и как это может выглядеть в C++.
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титовcorehard_by
Если вам важна скорость работы ваших программ, то вы обязаны понимать, как работает ваше "железо". Современный процессор -- это сложное устройство, многие механизмы которого могут неочевидным образом влиять на скорость исполнения вашего кода. В докладе дается обзорное представление основных структур современного процессора и подробно рассматривается работа иерархии памяти. Будут освещены следующие темы: организация кэш-памяти, принцип локальности, предподкачка данных, нежелательное общее владение данными, а также программные техники для эффективной работы с памятью.
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
Информационная безопасность все больше из отдельной сферы плавно перетекает в разработку ПО. А значит «обычным» программистам приходится понимать те требования и терминологию, которые специалисты по безопасности уже давно знают и используют. CWE, CERT, MISRA, SAST– для «обычных» программистов это непонятные аббревиатуры. Поэтому в обзорном докладе мы попробуем рассказать простым языком об этих понятиях так, чтобы все разработчики начали уверенно ориентироваться в этой теме.
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
Вот уже более двух лет мы создаём онлайн-специализацию по С++ на платформе Coursera. Её цель — обучить языку C++ с нуля до уровня, достаточного для решения практических задач, с которыми приходилось сталкиваться авторам в своей практике. В своём докладе я расскажу, как мы создаём наши онлайн-курсы, и уделю особое внимание техническим проблемам, которые нам пришлось решить в процессе создания автоматической системы проверки программ студентов.
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
В докладе обсуждаются способы улучшения времени сборки C++ проектов, опыт полученный в ходе ускорения сборки клиента и тулов World Of Tanks. Также описывается эффект, который они оказывают на организацию кодобазы (как позитивный, так и негативный) и затраты, которые необходимы для поддержки этих решений, т.к. не все они бесплатны. Методики, описываемые в докладе: ускорение линковки (Incremental Linking, Fastlink), ускорение компиляции(Include what you use, использование precompiled headers).
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
Доклад посвящён вопросам реализации пропозала Герба Саттера PR0707 (метаклассы в С++) за пределами компилятор - в виде отдельной утилиты. Будет продемонстрированы варианты использования метаклассов в реальной жизни, затронуты вопросы их реализации на базе Clang Frontend, а также возможные перспективы развития технологии и методики.
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
Все мы знаем, что компиляторы в настоящее время достаточно умные. И нам как программистам зачастую не нужно думать о каких-то незначительных оптимизациях - мы полагаемся на оптимизации компилятора. Что ж, настало время выяснить, действительно ли настолько компиляторы умны и узнать, в каких местах программист всё же (может быть) умнее.
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...corehard_by
What do threads, atomic variables, mutexes, and conditional variables have in common? They are the basic building blocks of any concurrent application in C++, which are even for the experienced C++ programmers a big challenge. This massively changed with C++17 and change even more with C++20/23. What did we get with C++17, what can we hope for with C++20/23? With C++17, most of the standard template library algorithms are available in sequential, parallel, and vectorised variants. With the upcoming standards, we can look forward to executors, transactional memory, significantly improved futures and coroutines. To make it short. These are just the highlights from the concurrent and parallel perspective. Thus there is the hope that in the future C++ abstractions such as executors, transactional memory, futures and coroutines are used and that threads, atomic variables, mutexes and condition variables are just implementation details.
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
Язык C++, претерпев долгую эволюцию, обрёл ряд черт, характерных для функциональной парадигмы: функции стали полноправными объектами, над которыми могут выполняться операции, а аппарат шаблонов позволяет проводить вычисления на типах на этапе компиляции. Математический фундамент этих двух главных аспектов составляют, соответственно, ламбда-исчисление и теория категорий. Расширение языка этими средствами способствовало реализации на языке C++ ряда инструментов, известных из функционального программирования. Некоторые из этих реализаций вошли в стандартную библиотеку (std::function, std::bind), другие - в сторонние библиотеки, в том числе в коллекцию библиотек Boost (functional, hana). Важную роль в арсенале функционального программирования играют операции свёртки и развёртки, которые очевиднее всего определяются для списков, но также естественным образом обобщаются на другие индуктивные и коиндуктивные структуры данных. Например, суммирование списка чисел можно представить себе как свёртку списка по операции сложения, а построение списка простых множителей заданного целого числа - как развёртку. Обобщения свёртки и развёртки известны как анаморфизмы и катаморфизмы. Также в функциональном программировании находит применение понятие гиломорфизма - композиция развёртки некоторого объекта в коллекцию с последующей свёрткой её в новый объект. В докладе продемонстрировано, что свёртки, развёртки и их композиции допускают довольно простую реализацию на языке C++.
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филоновcorehard_by
Доклад посвящен часто используемому шаблону в моих проектах по анализу данных, когда обучение и настройка моделей происходят с использованием python, а вот их запуск в промышленное использование на языке C++. Предлагается рассмотреть несколько учебных примеров реализации такого подхода, от простой линейной регрессии до обработки изображений с помощью нейронных сетей.
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
This talk will be about the design and implementation of a reactive programming model inspired by ranges that allows easy implementation of asynchronous and distributed software systems by writing code that looks like a sequence of ordinary range transformations like filter, transform, etc. This programming model will be demonstrated along with the implementation of a simple asynchronous web service where the whole system logic is defined as a chain of range transformations.
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
The document discusses how an IDE can help debug tricky C++ code without running it by leveraging tools to understand macros, types, templates, and overloads. It describes how an IDE could show the step-by-step substitution of macros, substitute typedefs one step at a time, debug template instantiations and constant expressions, explain overload resolution, and profile includes to optimize header usage. The presenter argues that tools are needed to make powerful C++ abstractions more accessible.
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
В C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
This document discusses range-based text formatting and proposes replacing existing approaches with a range-based solution. It suggests representing text as ranges and using range algorithms and functions for concatenation and formatting. This would allow treating different string types uniformly and flexibly while avoiding issues with current formatting methods like iostream manipulation and format strings. The document provides examples of formatting numbers and dates as ranges and constructing containers like std::string from multiple ranges.
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
Память в компьютере - это не только гигабайты оперативной памяти в слоте, но и занятная абстракция. В докладе мы рассмотрим, как можно эту абстракцию использовать необычным образом для моделирования других абстракций - регистровых файлов периферийных устройств. Доклад будет полезен не только embedded-разработчикам, но и, возможно, заставит переосмыслить свой взгляд на память.
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
Как правило, можно положиться на то, что компилятор оптимизирует результирующий бинарный файл так, чтобы она работала максимально быстро. Но компилятор не знает на каких данных и на каком железе программа будет запущена. Плюс хотелось бы, чтобы компиляция занимала приемлемое время. Из-за этого результат может оказаться субоптимальным. Предлагаю на примерах для LLVM посмотреть как можно подсказать компилятору как оптимизировать программу и сделать результат лучше или хуже.
Мы напишем простейший веб-сервис из клиента и сервера на C++. На этом C++ часть закончится, и пойдет настройка окружения и инфраструктуры. Мы обеспечим детерминируемость сборки и прогона тестов. Облегчим последующее обновление зависимых библиотек. Автоматизируем статические проверки, верификацию кода, прогон тестов. Обеспечим доступность сервиса, настроим инфраструктуру, сбалансируем нагрузку, добавим автоматическое и ручное масштабирование. И под конец мы настроим continious delivery таким образом, что код будет на продакшене через 5 минут после реквеста, при этом даже невалидные изменения и ошибки программиста не смогут повлиять на его работу.
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019corehard_by
Xочу рассказать про разработку библиотеки ORM для SQLite3 на С++14 (https://github.com/fnc12/sqlite_orm). В докладе хочется поделиться своим опытом в попытке создать ORM с которой можно забыть про текстовые запросы и как это адаптируется в С++ при помощи шаблонов.
4. Как работает стек вызовов
● Стек - область памяти, уникальная для каждого потока (thread)
4
5. Как работает стек вызовов
● Стек - область памяти, уникальная для каждого потока (thread)
● Выделяется:
○ Ядром ОС (для главного потока)
○ Внутри процесса при создании потока (pthread)
5
6. Как работает стек вызовов
● Стек - область памяти, уникальная для каждого потока (thread)
● Выделяется:
○ Ядром ОС (для главного потока)
○ Внутри процесса при создании потока (pthread)
● Вершина стека - регистр Stack Pointer (SP, ESP, RSP)
6
7. Как работает стек вызовов
● Стек - область памяти, уникальная для каждого потока (thread)
● Выделяется:
○ Ядром ОС (для главного потока)
○ Внутри процесса при создании потока (pthread)
● Вершина стека - регистр Stack Pointer (SP, ESP, RSP)
● Размер элемента - машинное слово
7
8. Как работает стек вызовов
● Стек - область памяти, уникальная для каждого потока (thread)
● Выделяется:
○ Ядром ОС (для главного потока)
○ Внутри процесса при создании потока (pthread)
● Вершина стека - регистр Stack Pointer (SP, ESP, RSP)
● Размер элемента - машинное слово
● Наиболее популярен Full Descending стек
○ Stack Pointer указывает на элемент, находящийся на вершине стека
○ Стек растёт вниз (в сторону уменьшения адресов)
8
9. Как работает стек вызовов
● Стек - область памяти, уникальная для каждого потока (thread)
● Выделяется:
○ Ядром ОС (для главного потока)
○ Внутри процесса при создании потока (pthread)
● Вершина стека - регистр Stack Pointer (SP, ESP, RSP)
● Размер элемента - машинное слово
● Наиболее популярен Full Descending стек
○ Stack Pointer указывает на элемент, находящийся на вершине стека
○ Стек растёт вниз (в сторону уменьшения адресов)
● Операции над стеком:
○ Push = сдвиг SP + запись в память
○ Pop = сдвиг SP в обратную сторону
○ Выделение памяти = сдвиг SP 9
10. void func3() {
// Мы здесь
}
void func2() {
func3();
}
void func1() {
func2();
}
void func0() {
func1();
}
Простейший стек вызовов
Адрес возврата в func2()
Адрес возврата в func1()
Адрес возврата в func0()
...
Stack Pointer
10
11. Стековый кадр
● Адреса возврата
● Сохранённые регистры
● Локальные переменные
● Аргументы функции
Локальные переменные func3()
Сохранённые регистры func3()
Адрес возврата в func2()
Аргументы для func3()
Локальные переменные func2()
Сохранённые регистры func2()
Адрес возврата в func1()
Аргументы для func3()
...
Stack Pointer
func3()
func2()
11
12. Соглашение вызова (calling convention)
● Как передаются аргументы?
○ Регистры?
○ Стек?
○ В каком порядке?
● Кто очищает стек от аргументов?
○ Вызывающая функция? (caller)
○ Вызываемая функция? (callee)
● Как возвращается результат?
○ Регистры?
○ Стек?
● Какие регистры необходимо сохранить в стек?
12
13. ● Проход по содержимому стека
● Перебор стековых кадров в порядке, обратном вызову функций
● Логика над полученными данными
Раскрутка стека вызовов (call stack unwinding)
13
14. Раскрутка стека вызовов (call stack unwinding)
● Проход по содержимому стека
● Перебор стековых кадров в порядке, обратном вызову функций
● Логика над полученными данными
Применение:
● Обработка C++ исключений
● Получение backtrace (stack trace)
○ Отладчики
○ Системы крэш репортов
○ Профилировщики
14
15. Сложности раскрутки стека
● Разный формат стековых кадров для разных функций:
○ Различное количество аргументов, передаваемых по-разному
○ Различное число локальных переменных
○ Разные регистры сохраняются в стек
15
16. Сложности раскрутки стека
● Разный формат стековых кадров для разных функций:
○ Различное количество аргументов, передаваемых по-разному
○ Различное число локальных переменных
○ Разные регистры сохраняются в стек
● Зависимость от архитектуры и ABI
○ Разные соглашения вызова для разных функций
16
17. Сложности раскрутки стека
● Разный формат стековых кадров для разных функций:
○ Различное количество аргументов, передаваемых по-разному
○ Различное число локальных переменных
○ Разные регистры сохраняются в стек
● Зависимость от архитектуры и ABI
○ Разные соглашения вызова для разных функций
● Оптимизации компилятора
17
18. Способы применения раскрутки стека
● Для текущего запущенного процесса
○ Получение backtrace (boost stacktrace)
○ Создание crash report (signal handler)
18
19. Способы применения раскрутки стека
● Для текущего запущенного процесса
○ Получение backtrace (boost stacktrace)
○ Создание crash report (signal handler)
● Для другого запущенного процесса (ptrace, process_vm_readv)
○ Отладчики (gdb, lldb)
○ Профилировщики (perf)
19
20. Способы применения раскрутки стека
● Для текущего запущенного процесса
○ Получение backtrace (boost stacktrace)
○ Создание crash report (signal handler)
● Для другого запущенного процесса (ptrace, process_vm_readv)
○ Отладчики (gdb, lldb)
○ Профилировщики (perf)
● Для завершенного процесса (postmortem)
○ Отладчик + core dump
○ Google breakpad / crashpad
20
22. ● Stack pointer (SP, ESP, RSP)
○ Вершина стека.
○ Может меняться во время исполнения функции
Регистры
22
23. Регистры
● Stack pointer (SP, ESP, RSP)
○ Вершина стека.
○ Может меняться во время исполнения функции
● Frame pointer, Base pointer (FP, EBP, RBP):
○ Используется для адресации локальных переменных
○ Указывает на начало стекового кадра текущей функции
○ Не меняется во время исполнения функции
○ Может не использоваться (-fomit-frame-pointer)
23
24. ● Stack pointer (SP, ESP, RSP)
○ Вершина стека.
○ Может меняться во время исполнения функции
● Frame pointer, Base pointer (FP, EBP, RBP):
○ Используется для адресации локальных переменных
○ Указывает на начало стекового кадра текущей функции
○ Не меняется во время исполнения функции
○ Может не использоваться (-fomit-frame-pointer)
● Instruction pointer, program counter (PC, IP, EIP, RIP)
○ Указывает на исполняемую инструкцию.
Регистры
24
25. ● Stack pointer (SP, ESP, RSP)
○ Вершина стека.
○ Может меняться во время исполнения функции
● Frame pointer, Base pointer (FP, EBP, RBP):
○ Используется для адресации локальных переменных
○ Указывает на начало стекового кадра текущей функции
○ Не меняется во время исполнения функции
○ Может не использоваться (-fomit-frame-pointer)
● Instruction pointer, program counter (PC, IP, EIP, RIP)
○ Указывает на исполняемую инструкцию.
● Другие регистры в зависимости от архитектуры
○ Link Register (LR) - адрес возврата (ARM 32-bit)
Регистры
25
26. Виртуальная раскрутка стека (Virtual Unwinding)
26
● Виртуальные регистры (VRs):
○ Копия (snapshot) значений регистров в памяти
○ Все манипуляции происходят с копией
○ Значения извлекаются из стека
27. Виртуальная раскрутка стека (Virtual Unwinding)
27
● Виртуальные регистры (VRs):
○ Копия (snapshot) значений регистров в памяти
○ Все манипуляции происходят с копией
○ Значения извлекаются из стека
● Доступ к памяти стека:
○ Стековые регистры (SP, FP) содержат адреса элементов стека
○ Чтение - разыменование указателей
28. Виртуальная раскрутка стека (Virtual Unwinding)
28
● Виртуальные регистры (VRs):
○ Копия (snapshot) значений регистров в памяти
○ Все манипуляции происходят с копией
○ Значения извлекаются из стека
● Доступ к памяти стека:
○ Стековые регистры (SP, FP) содержат адреса элементов стека
○ Чтение - разыменование указателей
● Стек “заморожен”, пока выполняется раскрутка
○ Не можем выйти из функции, пока продолжается раскрутка (текущий поток)
○ Выполнение потока приостановлено (другой поток / процесс)
29. 1. Получаем исходные данные - значения регистров (ip, sp, fp)
2. Выполняем логику над значениями регистров
3. Считываем предыдущий стековый кадр и восстанавливаем
значения регистров для предыдущего стекового кадра
4. Зацикливаем пункт 2
Общий алгоритм раскрутки стека
29
32. ABI с Frame Pointer
Локальные переменные func3()
Frame Pointer func2()
Адрес возврата в func2()
Аргументы func3()
Локальные переменные func2()
Frame Pointer func1()
Адрес возврата в func1()
Аргументы func2()
Локальные переменные func0()
Frame Pointer func0()
Адрес возврата
Stack Pointer
Frame Pointer
● Пролог функции сохраняет
предыдущее значение frame
pointer в стеке после адреса
возврата
● Раскрутка стека - проход по
односвязному списку
● Флаг -fno-omit-frame-pointer
● Используется на платформах
Apple
32
33. ABI с Frame Pointer
Алгоритм раскрутки стека
1. Получаем исходные данные - значения регистров (ip, sp, fp)
2. Выполняем логику над значениями регистров
3. Считываем адрес возврата, Instruction Pointer = *(FP - 2)
4. Считываем предыдущее значение Frame Pointer = *(FP - 1)
5. Зацикливаем пункт 2
33
34. ABI с Frame Pointer
Преимущества:
● Простота реализации
● Скорость раскрутки стека
Недостатки:
● Дополнительные накладные расходы на вызов функций
● Ограничение возможности оптимизации кода
34
37. Таблицы раскрутки стека
● Секции с дополнительной информацией
● Содержат инструкции раскрутки стека
Форматы:
● DWARF
● ARM EXIDX (32-bit)
● Windows x64 .pdata
○ RUNTIME_FUNCTION
○ UNWIND_INFO
37
38. Недостатки:
● Необходимость в дополнительных данных
● Скорость раскрутки стека ниже
Преимущества:
● Свобода выбора ABI и соглашения вызова
● Нет ограничений по оптимизации кода
Таблицы раскрутки стека
38
40. Canonical Frame Address (CFA)
An area of memory that is allocated on a stack called a “call frame.” The call
frame is identified by an address on the stack. We refer to this address as
the Canonical Frame Address or CFA. Typically, the CFA is defined to be the
value of the stack pointer at the call site in the previous frame (which may be
different from its value on entry to the current frame).
http://www.dwarfstd.org/doc/DWARF5.pdf § 6.4
40
41. Canonical Frame Address (CFA)
41
● Значение Stack Pointer на момент исполнения
инструкции call
● Canonical Frame Address ≈ Frame Pointer
42. DWARF, § 6.4.1
Abstractly, this mechanism describes a very large table that has the following
structure:
The first column indicates an address for every location that contains code in a
program. (In shared object files, this is an object-relative offset.) The remaining
columns contain virtual unwinding rules that are associated with the indicated location.
LOC CFA R0 R1 ... RN
L0
L1
...
LN
42
45. DWARF
● Компактный бинарный формат
● 2 типа записей
● Frame Description Entry (FDE)
○ Одна запись на функцию
○ Содержит инструкции добавления строк в таблицу и заполнения ячеек
○ Может содержать указатель на LSDA (запись в секции .gcc_except_table) для
обработки C++ исключений
45
46. DWARF
● Компактный бинарный формат
● 2 типа записей
● Frame Description Entry (FDE)
○ Одна запись на функцию
○ Содержит инструкции добавления строк в таблицу и заполнения ячеек
○ Может содержать указатель на LSDA (запись в секции .gcc_except_table) для
обработки C++ исключений
● Common Information Entry (CIE)
○ Общая для нескольких FDE
○ Содержит общие параметры для всех связанных FDE
○ Может содержать указатель на personality routine для обработки C++
исключений
46
52. DWARF
Алгоритм раскрутки стека
1. Получаем исходные данные - значения регистров (ip, sp, fp)
2. Выполняем логику над значениями регистров
3. Ищем запись (FDE) по значению регистра Instruction pointer
(Program counter) в .eh_frame (.debug_frame)
4. Восстанавливаем значения регистров для предыдущего стекового
кадра по инструкциям из FDE
5. Зацикливаем пункт 2
52