• С++ Concept-Based Polymorphism в продуктовом коде: PassManager в LLVM

      Сегодня речь пойдет про одну интересную идиому, которую ввел Шон Парент (Adobe) — известный деятель в C++-сообществе. Он часто выступает с докладами и публикует цикл статей Better Code. Одна из его идей, которую используют в Photoshop — это Concept-Based Polymorphism. Это когда мы реализуем полиморфизм не через явное наследование, а с помощью техники, включающей обобщенное программирование, и по итогам получаем некоторые дополнительные преимущества.

      Статья устроена следующим образом:

      1. Что вообще такое Concept-Based Polymorphism и зачем он нужен
      2. Немного про LLVM и ее устройство
      3. Пример Concept-Based Polymorphism в LLVM PassManager
      4. Преимущества подхода



      Картинка, иллюстрирующая тезис «Наследование — это зло». Источник
      Читать дальше →
    • Делись, рыбка, быстро и нацело

      • Tutorial
      image

      Деление — одна из самых дорогих операций в современных процессорах. За доказательством далеко ходить не нужно: Agner Fog[1] вещает, что на процессорах Intel / AMD мы легко можем получить Latency в 25-119 clock cycles, а reciprocal throughput — 25-120. В переводе на Русский — МЕДЛЕННО! Тем не менее, возможность избежать инструкции деления в вашем коде — есть. И в этой статье, я расскажу как это работает, в частности в современных компиляторах(они то, умеют так уже лет 20 как), а также, расскажу как полученное знание можно использовать для того чтобы сделать код лучше, быстрее, мощнее.
      Читать дальше →
    • C++20 укомплектован, C++23 начат. Итоги встречи в Кёльне

        На днях прошла встреча международного комитета по стандартизации C++ в Кёльне. В прошлый раз был принят feature freeze на C++20, так что комитет должен был обсуждать только исправления уже принятых вещей, а добавлять новинки уже в C++23…

        … но всё было не так!



        Что сделали с std::flat_map; останутся ли страшные ключевые слова co_return, co_await и co_yield; успели ли доделать std::format; в каком виде будут контракты в C++20? Всё это вас ждёт под катом.
        Читать дальше →
      • Пробуем контрактное программирование С++20 уже сейчас

        • Tutorial


        В С++20 появилось контрактное программирование. На текущий момент ни один компилятор ещё не реализовал поддержку этой возможности.


        Но есть способ уже сейчас попробовать использовать контракты из C++20, так как это описано в стандарте.

        Заинтересовавшихся прошу под кат
      • 256 строчек голого C++: пишем трассировщик лучей с нуля за несколько часов

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

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

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

        Итак, сегодня я покажу, как отрисовывать подобные картинки:


        Читать дальше →
      • C++ велосипедостроение для профессионалов

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

          • Некоторые делают это для самообучения: берут класс стандартной библиотеки, пишут его сами с нуля, сравнивают то, что получилось, с тем, что есть в стандартной библиотеке — в процессе узнают для себя что-то новое.
          • Некоторые проекты имеют особое требования к коду. В embedded-разработке принято работать без RTTI и без exception, поэтому части стандартной библиотеки, которые используют RTTI и exception, необходимо переписать без них.
          • Редко, но бывает, когда велосипед пишут, потому что могут написать лучше, чем в стандартной библиотеке. Как правило, такие нововведения рано или поздно попадают в стандартную библиотеку.
          • Другим только кажется, что они могут написать лучше, и таких людей больше. Но в процессе они обучаются, выясняют для себя что-то новое и что-то интересное открывают.
          • Могут быть другие причины.

          Сегодня мы не будем говорить о том, что велосипеды — это плохо, это не обязательно так. Мы поговорим о том, что действительно плохо:

          • бездумно переносить устаревшие технологии 20-30-летней давности в современные проекты;
          • пользоваться «вредными» бенчмарками и оптимизациями.

          А также затронем «вредные» советы, обсудим новейшие практики программирования (C++ 11 и позднее), подумаем, что делать с «идеальным» велосипедом.

          Читать дальше →
        • C++ конференции в апреле

            Всем привет!
            Сегодня я хотел бы рассказать сразу о двух предстоящих конференциях. Обе конференции организованны C++ сообществами: C++ Russia в Санкт-Петербурге и CoreHard Spring в Минске.

            Санкт-Петербург



            Читать дальше →
          • Конференция C++ Russia 2018

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

              Конференция состоится 19-21 апреля в Санкт-Петербурге. 19 апреля — день мастер-классов, 20-21 — основная программа. Jon Kalb открывает первый день конференции. Темы докладов конференции: память, краш-репорты, асинхронность, software transactional memory, reflective metaprogramming, ranges, акторы, Herb Sutter.

              Подробности под катом.
              Читать дальше →
              • +42
              • 5,5k
              • 8
            • Рефлексия в C++14

              Данная статья является расшифровкой (с небольшими правками) доклада Антона antoshkka Полухина — “Немного магии для C++14”.

              Я тут недавно ковырялся с C++ и случайно открыл пару новых приемов метапрограммирования, которые позволяют делать рефлексию в C++14. Пара мотивационных примеров. Вот у вас есть какая-то POD структура, в ней какие-то поля:

              struct complicated_struct {
                  int i;
                  short s;
                  double d;
                  unsigned u;
              };
              

              Количество полей и их имена не имеют значение, важно то, что с этой структуры мы можем написать следующий кусочек кода:

              #include <iostream>
              #include "magic_get.hpp"
              
              struct complicated_struct { /* … */ };
              
              int main() {
                  using namespace pod_ops;
                  complicated_struct s {1, 2, 3.0, 4};
                  std::cout << "s == " << s << std::endl; // Compile time error?
              }
              

              Функция main, в ней создаем переменную нашей структуры, как-то ее инициализируем через aggregate инициализацию, а потом эту переменную пытаемся вывести в std::cout. И в этот момент у нас, по идее, должна быть ошибка компиляции: мы не определили оператор вывода в поток для нашей структуры, компилятор не знает как все это скомпилировать и вывести. Однако, оно скомпилируется и выведет содержимое структуры:

              antoshkka@home:~$ ./test
              s == {1, 2, 3.0, 4}

              Читать дальше →
            • Как Яндекс создавал курс по C++, или Почему нам всё пришлось переписать

                В Яндексе C++ — один из основных языков, на нём написан наш поиск. Его развитие нам настолько важно, что больше года назад по инициативе Яндекса была создана российская рабочая группа по стандартизации «плюсов». Через неё у всех разработчиков русскоязычного пространства есть возможность влиять на развитие языка.



                Недавно Физтех, Яндекс и ШАД запустили ещё один курс на платформе Coursera — «Основы разработки на C++: белый пояс». Он посвящён знакомству с С++. Я расскажу, для кого этот курс, как мы его готовили, что получилось в итоге и каковы наши дальнейшие планы.

                Как всё началось, было выброшено и началось снова


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

                Читать дальше →
              • Как я писал предложение к стандарту С++

                  Это будет история младшего разработчика из Яндекс.Паспорта о появлении предложения в стандарт С++, разработанного в соавторстве с Антоном antoshkka Полухиным. Как часто бывает в жизни, что-то новое началось с боли, а точнее — с желания её прекратить.


                  Жила-была библиотека у меня на поддержке. Всё у неё было хорошо: собиралась под Linux, работала, не падала. Однажды пришли люди с просьбой (требованием) собрать её под Windows. Почему бы и нет? Но с первого раза не получилось. Корнем зла оказалась рукописная криптография, которая в какой-то момент умножала два 64-битных целых числа. Для сохранения результата такого умножения потребуется число на 128 бит, и в библиотеке использовался тип __int128. Он прекрасен: имеет естественный интерфейс, поддерживается несколькими компиляторами (gcc, clang), работает без аллокации памяти, но главное — он есть.

                  Читать дальше →
                • С++17 и С++2a: новости со встречи ISO в Иссакуа

                    В начале ноября в американском городе Иссакуа завершилась встреча международной рабочей группы WG21 по стандартизации C++ в которой участвовали сотрудники Яндекса. На встрече «полировали» C++17, обсуждали Ranges, Coroutines, Reflections, контракты и многое другое.

                    Заседания, как обычно, занимали целый день + решено было сократить обеденный перерыв на полчаса, чтобы успеть побольше поработать над C++17.

                    Несмотря на то, что основное время было посвящено разбору недочётов черновика C++17, несколько интересных и свежих идей успели обсудить, и даже привнести в стандарт то, о чём нас просили на cpp-proposals@yandex-team.ru.
                    Подробности
                  • Онлайн-компиляция на статическом сайте, рецепт для начинающих

                    • Tutorial

                    Вы несколько лет писали свой проект и теперь хотите привлечь пользователей? У меня есть простой, как холостяцкая яичница с беконом, рецепт специально для вас.

                    Для приготовления простого сайта вам понадобится:
                    • репозиторий на GitHub — 1 штука
                    • готовый html шаблон, для придания приятного вида — 1 штука
                    • кусочек свежего компилирущегося C++ кода — минимум 1 строка кода
                    • готовые javascript соусы из магазина — ~500Kb
                    • картинки и анимашки по вкусу

                    Меняйте любые компоненты, экспериментируйте и готовьте свои сайты для любимого языка!
                    Приступить
                  • Автоматизация OpenOffice: Начало

                      По работе мне необходимо было разработать механизм загрузки и выгрузки данных из Excel используя свободные механизмы работающие под разными ОС.
                      Т.к. необходимо было, чтобы сервис работал под Linux, то механизм взаимодействия через OLE не подходил.
                      Для реализации был выбран OpenOffice с прямым доступом к API через C++.

                      Open Office api на Linux

                      Документация оказалась весьма скудная, а примеров работы не через OLE почти не было. Так что я решил объединить все мои исследования в одной статье на хабре.

                      Примерный план статьи:
                      1. Начало работы с API OpenOffice через C++
                        1.1. Генерация заголовочных файлов
                        1.2. Генерация файла типов RDB
                        1.3. Настройка Visual Studiо 2008
                        1.4. Собираем динамическую DLL
                      2. Повторное использование DLL в своей программе
                        2.1. Пример небольшой программы по выгрузке данных

                      В принципе, если возможностей DLL достаточно, то повторять действия п. 1 не обязательно.

                      Читать дальше →
                    • Потрясающая коллекция бесплатных шрифтов за 2014 год

                        Привет, Хабр! Многие уже знают о моей страсти к попытке собрать самое лучше, что может быть полезно для веб-разработчиков или веб дизайнеров. И шрифты — не исключение. Программное обеспечение для работы со шрифтами постоянно развивается. Количество дизайнеров желающих опробовать себя в типографике растет с каждый днем. А сегодня я хочу представить вам их наработки — 30 потрясающих бесплатных шрифтов, которые мне удалось собрать за последний год.

                        Polar



                        Polar

                        Читать дальше →
                      • Опыт создания бюджетной школьной информационной системы

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

                        Школа у нас обычная, на 1300 школьников + примерно 100 сотрудников (педагогический коллектив и технический персонал). Из компьютерного оборудования в школе 118 компьютеров, пару серверов, 18 интерактивных досок и куча другой компьютерной периферии (и все это железо далеко не новое). В общем, финансированием на ИКТ школа не избалована (в отличии от столичных).

                        И вот в 2011 году школа получает грант на развитие — целых 400 тысяч рублей. Руководство решило рискнуть — и на часть этих денег решили создать школьную информационную систему. Общий бюджет системы составил 140 тысяч рублей, совсем не густо, но что поделать. Зато название системе дали гордое — Интерактивная Информационная Система (ИИС).

                        image

                        Подробности
                      • Вероятное будущее производства микроэлектроники: безмасочная многолучевая электронная литография от Mapper Lithography

                          Кто-то вероятно уже слышал о том, что Роснано в конце 2012-го года инвестировала в компанию-разработчика оборудования электронной литографии Mapper Lithography. Что и как они делают, спасет ли это отечественную микроэлектронную промышленность — узнаем в этой статье.

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

                          Этот подход имеет ряд недостатков: необходимость изготовления фотошаблонов для каждой новой микросхемы (опустим тут возможность группового производства) — приводит к тому, что продукты обязаны быть крупносерийными, миллионы штук, чтобы окупать стоимость фотошаблонов (до нескольких миллионов $ на каждый тип микросхемы). И с другой стороны — длина волны света ограничивает минимальные размер рисуемых элементов. Сейчас мировая промышленность уже вплотную подошла к теоретическому пределу разрешения оптической литографии: ~35nm для сканеров NA=1.35 с ArF лазерами на длине волны 193нм и ~18нм для литографии на жестком ультрафиолете EUV (однако в серийном производстве это пока не используется).

                          Есть и альтернатива: экспонировать фоторезист не светом, а электронным пучком — получается электронная литография. Электронный пучок можно фокусировать в точку гораздо меньшего размера, даже 1нм не проблема, но появляются и новые проблемы.

                          На фотографии — симуляция попадания электрона в электронрезист, демонстрирующая проблему с разрешением электронрезиста из-за рассеяния электронов.
                          Читать дальше →
                        • Пользователь пьян

                            Австралийский дизайнер Уилл Дэйбл предлагает интересную метафору, помогающую разрабатывать простые и удобные интерфейсы. Разработчику, который знает свою систему вдоль и поперек, и отдаёт работе над ней значительную часть своей жизни, очень трудно представить, как будет работать с ней обычный пользователь, чья голова забита другими вещами. Особенно, если он пробует его продукт первый раз в жизни и ещё не уверен в его полезности. Чтобы представить, что творится в голове у пользователя, Уилл Дэйбл предлагает вообразить, что пользователь пьян. Его внимание рассеянно, он легко выходит из себя, он не слишком отчётливо видит и не очень уверенно двигается — если постоянно помнить об этом, интерфейс получится чище и проще. Суть метода Дэйбл рассказывает в этом пятиминутном ролике:


                            Ключевые моменты метода:
                          • Отладка Android CMake проекта по-взрослому


                              После перевода наших проектов на CMake, встал вопрос об отладке нативной части Android. Так как инструменты NDK стали неактуальны, пришлось залезть в дебри и научить Eclipse запускать удалённую отладку CDT-проекта, что называется, вручную. В идеале, чтобы это выполнялось в один клик.

                              Если вам не чужда разработка с использованием Android NDK, и вы хотите познать некоторые тонкости отладки, велкам под кат.
                              Читать дальше →
                              • +26
                              • 12,7k
                              • 6