Доклады и публикации

Доклады на конференциях и лекции

Nobody Can Program Correctly. A Practical and Interactive Guide to Debugging C++ Code
Себастьян Теофил

Мы были рады познакомиться со всеми участниками и надеемся, что в следующем году снова посетим конференцию! Наша программа будет содержать ошибки. Иногда мы пишем не то, что хотели написать, иногда не понимаем какой-то аспект языка программирования, а иногда не учитываем какую-то важную информацию о системной среде нашей программы. В результате наша программа будет работать некорректно. Что будем делать сейчас? В этом докладе я хотел бы провести вас через весь процесс отладки, начиная с программы, в которой произошел сбой. Что мы будем делать дальше? Какие вопросы мы можем задать? Какая информация нам нужна? Что мы можем сделать, чтобы найти причину сбоя? Какие инструменты помогут нам в этом? И, наконец, что мы можем сделать, чтобы эта ошибка никогда больше не возникала? Благодаря реальным примерам, с которыми мы сталкивались и отлаживали в think-cell на протяжении многих лет, вы научитесь воспроизводить, находить, понимать и исправлять даже самые сложные ошибки.


Typescripten — Generating type-safe JavaScript bindings for emscripten
Себастьян Теофил

WebAssembly стала очень популярной целевой платформой для разработчиков на C++. Благодаря emscripten портировать нативные приложения на WebAssembly очень просто — при условии, что приложение использует браузер только в качестве устройства отображения и ввода. Однако emscripten не предоставляет типобезопасные оболочки для стандартных JavaScript API, таких как DOM API для манипулирования, не говоря уже о любом другом JavaScript API, предоставляемом существующими веб-приложениями. Наш инструмент с открытым исходным кодом «typescripten» построен на базе трех мощных технологий, позволяющих устранить этот пробел. Он использует файлы определения интерфейсов TypeScript и API компилятора TypeScript для создания безопасных с точки зрения типов оболочек C++ на основе emscripten. В TypeScript уже имеются файлы определения интерфейсов для более чем 7000 библиотек JavaScript, которые теперь можно смело использовать из C++. Мы стремимся разрабатывать наши оболочки C++ таким образом, чтобы использующий их код на C++ выглядел аналогично эквивалентному коду на TypeScript или JavaScript. Однако своеобразную семантику прототипов Javascript и Typescript зачастую трудно перевести на язык, основанный на типах, такой как C++. Я расскажу о проблемах, с которыми мы столкнулись, и о выборе, который мы сделали при разработке этой структуры.


«Windows, macOS and the Web: Lessons from cross-platform development at think-cell
Себастьян Теофил

В течение двенадцати лет компания think-cell занималась разработкой программного обеспечения только для Windows, и в нашей кодовой базе, насчитывающей около 700 тыс. строк кода, накопилось множество непреднамеренных зависимостей от платформы. Шесть лет назад мы решили перенести наше приложение на Mac. Это изменение повлияло на все составляющие нашего процесса разработки: организацию проекта, систему сборки и то, как мы сегодня программируем на C++. Широко используемые межплатформенные библиотеки, такие как Qt и boost, были хорошими инструментами для сборки, но сами по себе были недостаточны. Для многих концепций, таких как мьютексы, семафоры или совместно используемая память, они предлагают лишь общий интерфейс к специфическим для платформы объектам с очень разными семантиками и временем жизни. Нам нужны были легкие, платформонезависимые абстракции C++ с идентичной семантикой для рендеринга, интернационализации, файлового ввода/вывода, обработки событий по нажатию кнопки мыши, удаленного вызова процедур и отчетах об ошибках. Их разработка была сложной, во-первых, потому, что мы должны были определить, какие семантики нужны нашему приложению, и, во-вторых, реализовать их на каждой платформе. Это был непростой процесс, но я хочу отметить, что он значительно улучшил качество нашего кода. К этому моменту мы уже перешли к следующей задаче и начали переносить часть функционала в веб-приложения. Конечно, мы хотели использовать имеющуюся базу кодов, а это означало написание веб-приложений на выразительном, безопасном для типов языке C++. Для нас это определенно преимущество! Мы создаем наши веб-приложения с использованием emscripten, но генерируем безопасные с точки зрения типов привязки к C++ из любого определения интерфейса TypeScript. В своем докладе я кратко расскажу о реализованных нами абстракциях в C++ с упором на кроссплатформенных проблемах, в которых трудно определить общую семантику в связи с ограничениями операционной системы, и, конечно, покажу наши инструменты, позволившие нам написать веб-приложение на C++.


The C++ rvalue lifetime disaster
Арно Шёдль

Ссылки Rvalue появились еще в C++11. Изначально они были введены для повышения эффективности перемещения объектов: предполагается, что объект, на который ссылается rvalue, скоро выйдет из области видимости, и поэтому его ресурсы могут быть очищены без ущерба. В стандартной библиотеке C++, например, в std::cref или std::ranges, используется еще один аспект ссылок на rvalue: поскольку они быстро выходят из области видимости, считается, что держать их за пределами области видимости текущей функции небезопасно, в то время как ссылки на lvalue считаются безопасными. Мы также обнаружили, что это предположение очень полезно для интеллектуального управления памятью, в частности, в обобщенном коде.
К сожалению, сам язык C++ нарушает это предположение. Значения R (Rvalue) привязываются к const&. Это означает, что невинные с виду функции молча преобразуют значения rvalue в ссылки lvalue, скрывая любое ограничение срока действия rvalue. Увеличение срока временных объектов предназначено для того, чтобы сделать привязку временного объекта к безопасной ссылке за счет увеличения времени жизни временного объекта. Но это работает только до тех пор, пока временный объект является prvalue, и уже разрывается со ссылками rvalue, не говоря уже о ложно сгенерированных lvalue. Эти проблемы не просто теоретические. Из-за этих проблем в нашем коде возникало труднообнаруживаемое нарушение целостности памяти. Во время своего выступления я подробно опишу проблему, расскажет о подходе к устранению проблемы с использованием нашей библиотеки и сделаю предложение, позволяющее решить проблему, которое вряд ли попадет в стандарт.


Better C++ Ranges
Арно Шедль

Диапазоны уже давно присутствуют в стандарте C++ и находят свое место в современных базах кодов. В компании think-cell мы уже 20 лет разрабатываем и используем собственную библиотеку диапазонов, которая построена поверх стандарта, совместима с ним, но во многих аспектах выходит за его рамки. Адаптеры диапазона часто расположены друг над другом, фильтр поверх преобразования и т. д. Чтобы сделать такой стек эффективным, итераторов недостаточно. Мы используем новую концепцию, более эффективную и в то же время совместимую с итераторами, так что пользователи библиотек могут продолжать использовать итераторы, как и раньше. В стандартной библиотеке очень строго разграничиваются контейнеры и представления, и адаптеры диапазонов являются представлениями, которые должны поддерживать ссылку на адаптируемые данные. Вместо этого мы позволяем адаптерам диапазонов самим хранить данные, чтобы сделать их самодостаточными и в то же время неспешно оцениваемыми. Стандартная модель итератора допускает только внешнюю итерацию. Однако внутреннюю итерацию зачастую реализовать гораздо проще, чем внешнюю. Для многих приложений внутренняя итерация вполне адекватна и более эффективна, чем внешняя. Таким образом, мы вводим внутреннюю итерацию в семейство диапазонов, причем пользователь библиотеки может не знать и не заботиться о том, какой вид итерации используется. Стандартные алгоритмы возвращают итерации и используют конечный итератор для оповещения о некотором состоянии синглтона. Настраивая возвращаемые значения, мы можем сделать наш код более кратким и выразительным, например, устранить эти ужасные проверки конечного итератора. Все эти компоненты в совокупности делают диапазоны отличным инструментом для форматирования текста. Эти диапазоны можно использовать для представления форматируемых значений, концептуально преобразовывая их в медленно оцениваемые строки, которые, в свою очередь, можно использовать как регулярные строки: в возврате из функций, для ввода стандартного алгоритма, встроенных в другие, такие же медленно оцениваемые строки и так далее. А потом уже развернуть для отображения. Выбрав правильные интерфейсы, мы можем оптимизировать это расширение во время компиляции, обеспечивая как красивый синтаксис, так и производительность, очень близкую к оптимизированному в ручном режиме коду.


Range-Based Text Formatting - For a Future Range-Based Standard Library
Арно Шёдль

Форматирование текстов — давняя проблема для авторов библиотек C++. В своем докладе я хочу убедить вас в том, что диапазоны в сочетании с метапрограммированием позволяют составить очень элегантное решение для проблемы форматирования текста. Мы представляем форму диапазонов с внутренней итерацией, которые генерируют элементы по одному без предоставления внешних итераторов. Эти диапазоны генератора можно использовать для представления форматируемых значений, концептуально преобразовывая их в медленно оцениваемые строки, которые, в свою очередь, можно использовать как регулярные строки: в возврате из функций, для ввода стандартного алгоритма, встроенных в другие, такие же медленно оцениваемые строки и так далее. А потом уже развернуть в хранилище. Правильно выбрав интерфейсы, можно оптимизировать такое разворачивание до тех пор, пока оно не будет всего на 15 % медленнее создания эквивалентных строк с помощью оптимизированного вручную частного кода.


Why Iterators Got It All Wrong — and what we should use instead
Арно Шёдль

Вы ведь понимаете итераторы? Как бы вы их описали? "Итераторы предоставляют доступ к последовательностям элементов." Хорошо звучит? Недавно была введена концепция диапазонов, которые предоставляют те же возможности, что и итераторы. В частности, диапазоны включают адаптеры для медленно преобразующихся или фильтрующих последовательностей элементов. И у них тоже есть итераторы.
Так все хорошо? К сожалению, нет. Концепция итераторов, используемая со времени изобретения C++, имеет существенные недостатки. В частности, некоторые итераторы должны вести себя по-разному в зависимости от предоставляемого элемента или границы между элементами. Поэтому элементы и границы — две абсолютно разные концепции. Этот доклад призван убедить вас в том, что проблема является реальной и имеет практические последствия. Я предложу варианты решения проблемы и покажу, как это решение не только устраняет проблему, но и позволяет сделать код чище и предотвращать ошибки.


From Iterators To Ranges — The Upcoming Evolution Of the Standard Library
Арно Шёдль

Пары итераторов встречаются в библиотеке C++ повсюду. Общепринято, что объединение такой пары в единый объект, «диапазон», позволяет писать более краткий и читаемый код. Но определить точную семантику такой концепции диапазона оказалось очень непросто. Теоретические данные противоречат практике. Некоторые цели проектирования являются взаимоисключающими.


A Practical Approach to Error Handling
Арно Шёдль

В любой программе возможны ошибки: некоторые являются следствием внутренних недочетов программы, другие являются внешними и связаны со средой использования программы. Если все ошибки игнорировать, программа будет ненадежной, а исправление каждой мыслимой и немыслимой ошибки очень усложняет процесс и не прибавляет никакой ценности. В think-cell мы применяем и дорабатываем наш собственный, уникальный подход к обработке ошибок. В докладе идет речь о нашем методе, и при реализации следующего своего проекта вам не составит труда написать более надежный программный код.


Еженедельная серия фильмов по C++ — интервью на CppCast
Арно Шёдль

В CppCast Роба Ирвинга и Джейсона Тёрнера от 2 января 2018 г. — интервью с Арно Шёдлем о библиотеке диапазонов think-cell и о разработке C++ в компании в целом.


Developing a simple PowerPoint Add-in, how hard can it be?
Валентин Зиглер

Разработка офисных приложений у многих ассоциируется со скучными макросами VBA или дилетантским JavaScript. Многие разработчики, с которыми общался Валентин, были удивлены, узнав, что база кодов think-cell насчитывает миллион строк кода на языке C++, и что нам пришлось создать несколько общих библиотек, чтобы сохранить ее такой короткой. Мы стремимся реализовать на базе PowerPoint максимально простой пользовательский интерфейс, позволяющий пользователям создавать великолепные слайды за короткое время, и для этого нам необходимо использовать очень мощные инструменты. Мы покажем, как мы применяем самые современные алгоритмы для решения задач компоновки и размещения, и какие трудности нам пришлось преодолеть для беспроблемной интеграции с основным приложением.


Industrial Strength Software Hacking
Саймон МакПартлин

Внесение в программное обеспечение «заплат» — крайне эффективный, но потенциально рискованный метод устранения ошибок, добавления функциональности и улучшения пригодности и эффективности ПО. В этой лекции рассматривается модифицирующее и исправляющее ошибки программное обеспечение, когда исходный код не доступен, что, как правило, называется взломом. Мы рассматриваем почему и когда нужны такие действия, а затем подробно рассматриваем проектирование и внедрение надежных патчей. В конце лекции описываются различные инструменты и техники, которые можно использовать для поиска подходящего места установки «патча».


std::cout is out — Why iostreams must go
Себастьян Теофил

Мы недавно начали размещать наше программное обеспечение на других платформах. И обнаружили кучу проблем с потоковым вводом/выводом и вводами/выводами в стиле C++. В этом докладе кратко описывается, почему мы исключили потоковые вводы/выводы из нашей базы кодов и чем мы их заменили.


C++ Memory Model
Валентин Зиглер и Фабио Фракасси

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


C++ vs. Java
Валентин Зиглер и Фабио Фракасси

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


Научные публикации

An Efficient Algorithm for Scatter Chart Labeling
Себастьян Теофил и Арно Шёдль
Материалы конференции AAAI 2006

В материалах представлен эффективный алгоритм для новой вариации задачи расстановки меток точечных объектов. Цель — разместить как можно больше меток точек таким образом, чтобы они не пересекались друг с другом или со своими точками. Во-первых, мы представляем алгоритм на основе жадного алгоритма с ограниченным предварительным просмотром. Мы также представляем алгоритм, который итеративно перегруппирует метки, применяя к каждой группе первый алгоритм и выявляя таким образом близкий к оптимальному порядок расстановки меток. Представленный алгоритм используется в коммерческом продукте для расстановки меток на диаграммы. Наши оценки показывают, что результаты его применения намного лучше, чем у других используемых с этой целью алгоритмов.


A Smart Algorithm for Column Chart Labeling
Себастьян Мюллер и Арно Шёдль
Материалы конференции SMART GRAPHICS 2005

В докладе представлен «умный» алгоритм расстановки меток гистограмм и их производных. Для эффективного решения проблемы мы выделили две подпроблемы. Сначала мы представили геометрический алгоритм для решения проблемы поиска метода эффективной расстановки меток одного столбца при условии, что другие столбцы уже имеют метки. Затем мы представили стратегию поиска эффективного порядка присвоения столбцам меток, в рамках которого постоянно используется первый алгоритм для ограниченного предварительного просмотра. Представленный алгоритм используется в коммерческом продукте для присвоения меток диаграммам. Результаты его применения являются удовлетворительными.


«Графические разрезанные текстуры: Image and Video Synthesis Using Graph Cuts
Вивек Кватра, Арно Шёдл, Ирфан Эсса, Грег Тёрк и Аарон Бобик
Материалы конференции SIGGRAPH 2003

В этом докладе мы представляем новый алгоритм синтеза текстур изображений и видео. Наш подход подразумевает преобразование и копирование областей патчей из образца видео или изображения в выход с оптимальным совмещением для создания нового (и как правило большего) продукта. В отличие от других техник размер патча не выбирают априори. Применяется техника graph cut с целью определения области оптимального патча для заданного смещения текстуры на входе и на выходе. В отличие от динамического программирования наша техника оптимизации швов применима в любом измерении. Мы, в частности, изучаем ее в 2D и 3D для синтеза видотекстур дополнительно к синтезу обычных изображений.


Controlled Animation of Video Sprites
Арно Шёдль и Ирфан Эсса
Материалы конференции SCA 2002

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


Video Textures
Арно Шёдль, Ричард Желиски, Давид Х. Салезин и Ирфан Эсса
Материалы конференции SIGGRAPH 2000

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

Хочешь знать больше?

Есть вопросы о работе в think-cell, открытых вакансиях или мероприятиях? Обращайся к Юлии Жачук.

hr@think-cell.com
+49 30 6664731-81

Сотрудник отдела по работе с персоналом в think-cell.


Поделиться