Как стать автором
Обновить
1
0

Пользователь

Отправить сообщение

Дизайн и эволюция constexpr в C++

Время на прочтение29 мин
Количество просмотров34K

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

У constexpr с каждым годом становится больше возможностей. Сейчас использовать в compile-time вычислениях можно почти всю стандартную библиотеку. Пример вычисления числа до 1000 с наибольшим количеством делителей: ссылка на код.

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

Эта статья подходит как тем, кто еще не знает, что такое constexpr, так и тем, кто уже долгое время его использует.

Назад в будущее
Всего голосов 47: ↑47 и ↓0+47
Комментарии17

Анатомия каналов в Go

Время на прочтение34 мин
Количество просмотров173K

Привет, Хабр! Представляю вашему вниманию перевод статьи "Anatomy of Channels in Go" автора Uday Hiwarale.


Что такое каналы?


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


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


Go для создания канала предоставляет ключевое слово chan. Канал может передавать данные только одного типа, данные других типов через это канал передавать невозможно.

Читать дальше →
Всего голосов 22: ↑22 и ↓0+22
Комментарии7

Как написать FizzBuzz на собеседовании

Время на прочтение31 мин
Количество просмотров57K

Здравствуй, Хабр.


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

Читать дальше →
Всего голосов 139: ↑121 и ↓18+141
Комментарии224

Осваиваем новую базу кода: анализируем программу nginx

Время на прочтение10 мин
Количество просмотров11K
В разработке nginxучастия я никогда не принимал, так как мой навык работы в Си находится где-то на уровне 1/10. Однако меня не страшит идея скачать исходный код, разобрать его, скомпилировать и запустить. Цель этой статьи помочь и вам преодолеть собственный страх проделать то же самое.
Читать дальше →
Всего голосов 43: ↑27 и ↓16+28
Комментарии11

Изучаем процессы в Linux

Время на прочтение7 мин
Количество просмотров162K

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

Данная статья в большей мере рассчитана на новичков в системном программировании и тех, кто просто хочет узнать немного больше о том, как работают процессы в Linux.
Читать дальше →
Всего голосов 64: ↑62 и ↓2+60
Комментарии60

Физическая и математическая реальности

Время на прочтение17 мин
Количество просмотров20K

Эта статья является второй частью конспекта книги «Наша математическая вселенная. В поисках фундаментальной природы реальности» (автор Макс Тегмарк).

Идея, что Вселенная в некотором смысле является математической, восходит по меньшей мере к пифагорейцам и породила многовековую дискуссию физиков и философов. Галилей утверждал, что Вселенная – это «величественная книга», написанная на языке математики. Лауреат Нобелевской премии по физике Юджин Вигнер в 60-х годах XX века настаивал, что «невероятная эффективность математики в естественных науках» нуждается в объяснении.

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

Читать далее
Всего голосов 12: ↑12 и ↓0+12
Комментарии122

Динамическая JIT компиляция С/С++ в LLVM с помощью Clang

Время на прочтение10 мин
Количество просмотров9.2K


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

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

Оказывается, интерфейс Clang меняется от версии к версии и все найденные мной примеры были старыми и не запускались в актуальной версии (Сlang 12), а стабильный C-style интерфейс предназначен для парсинга и анализа исходников и с помощью которого сгенерировать исполняемые файлы не получится*.

Дополнительная проблемой оказалось, что Clang не может анализировать файл из памяти, даже если для этого есть соответствующие классы. Из объяснений выходило, что в экземпляре компилятора проверяется, является ли ввод файлом**.

А теперь публикую результат своих изысканий в виде рабочего примера динамической компиляции С++ кода с последующей его загрузкой и выполнением скомпилированных функций. Исходники адаптированны под актуальную версию Clang 12. Пояснения к коду я перевел и дополнил перед публикацией, а ссылки на исходные материалы приведены в конце статьи.

  • *) Кажется в 14 версии планируется реализовать C интерфейс для генерации исполняемых файлов.
  • **) На самом деле, Clang может (или теперь может) компилировать файлы из оперативной памяти, поэтому в исходники я добавил и эту возможность.
Читать дальше →
Всего голосов 10: ↑9 и ↓1+14
Комментарии12

Как сделать ОС для микроконтроллера

Время на прочтение33 мин
Количество просмотров24K

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

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

Читать далее
Всего голосов 35: ↑31 и ↓4+37
Комментарии45

Как развитие алгоритмов сжатия остановилось 20 лет назад, или о новом конкурсе на 200 тысяч евро

Время на прочтение18 мин
Количество просмотров72K

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

Пост набрал 206 «плюсов», вышел на 2 место топа недели и вызвал оживленную дискуссию, в которой мне больше всего понравился комментарий: «Коммерческого интереса эффективность по сжатию алгоритмов сжатия без потерь сегодня не представляет, в силу отсутствия принципиально более эффективных алгоритмов. Деньги сегодня — в сжатии аудио-видео. И там и алгоритмы другие. Тема сжатия без потерь удобна именно лёгкостью верификации алгоритма, и не слегка устарела. Лет на 20.» 

Поскольку я сам уже 20 лет в области сжатия видео, с ее бурным развитием мне спорить сложно. А вот что сжатие без потерь развиваться перестало… Хотя логика тут понятна каждому. Я до сих пор пользуюсь ZIP, все мои друзья пользуются ZIP с 1989 года — значит, ничего нового не появляется. Так ведь? Похоже рассуждают сторонники плоской земли. ))) Я не видел, знакомые не видели, и даже некоторые авторитеты утверждают, значит, это так! 

О том, как Intel просили меня не прекращать читать курс по сжатию, ибо людей нет новые алгоритмы делать, я в прошлый раз писал. Но тут и Huawei в ту же дуду дует! Вместо того, чтобы раздать призы и должности победителям, а затем успокоиться, поскольку развитие давно встало, эти эксцентричные люди посчитали конкурс крайне успешным и запустили новый с призовым фондом 200 тысяч EUR.

Развивались ли алгоритмы сжатия без потерь в последние 20 лет? Чем закончился прошлый конкурс и на сколько опередили baseline? Сколько денег получили русские таланты, а сколько зарубежные? И есть ли вообще жизнь на Марсе в сжатии без потерь? 

Кому интересно — добро пожаловать под кат! 
Читать дальше →
Всего голосов 198: ↑197 и ↓1+255
Комментарии134

Vulkan-tutorial. Урок 1.1 — Вступление

Время на прочтение5 мин
Количество просмотров47K

В связи с тем, что у меня не так много времени для ресерча каких-то новых штук и написания статей о них, я решил перевести серию уроков по Vulkan. Надеюсь, что мои переводы будут кому-то полезны и не очень плохого качества. Для начала обучения — прошу под кат.


Автор оригинала дал свое согласие на перевод. Также, когда я доперевожу все статьи и у меня будет время отформатировать их для github, он добавит русский перевод на свой сайт.

Читать дальше →
Всего голосов 20: ↑20 и ↓0+20
Комментарии50

Дрон-Рыбак. Размышления на тему

Время на прочтение10 мин
Количество просмотров11K

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

Дело в том, что на данном озере мне удалось неплохо порыбачить, но хотелось бы чего-то большего (инженеры мы или кто!), что позволило бы расширить возможности рыбалки — и пытливый ум принялся за работу.
Всего голосов 34: ↑31 и ↓3+51
Комментарии36

Что, если не Intel и не AMD? Альтернативные архитектуры центральных процессоров

Время на прочтение8 мин
Количество просмотров44K

Когда речь заходит о процессорах, какие марки вам сразу приходят на ум? Конечно, в первую очередь Intel и вновь набирающая популярность AMD. В разрезе потребительских ЦП борьба обычно происходит именно между ними, хотя и ARM-чипы в последнее время пытаются не отставать. Но это вовсе не значит, ими пространство ЦП и ограничивается.

От высокопроизводительных ARM для ПК до специализированных правительственных чипов — в мире существует еще множество производителей ЦП, о которых обычно мы редко слышим. Кто они? Какими характеристиками обладают их процессоры? Для чего предназначены? Сейчас и разберемся.

Читать далее
Всего голосов 64: ↑63 и ↓1+84
Комментарии63
«Библиотеки для C++ нередко похожи на русскую классику: страдает либо их автор, либо пользователь, либо архитектура». Автор этой цитаты, Сергей Садовников из «Лаборатории Касперского», прошел свой путь от страданий к просветлению и узнал о метапрограммировании в С++ нечто важное и нужное. Сочувствующих приглашаем в волшебный мир макросов, шаблонов, boost и прочих loki.
Подробности – под катом
Всего голосов 65: ↑64 и ↓1+63
Комментарии39

Юникод: необходимый практический минимум для каждого разработчика

Время на прочтение8 мин
Количество просмотров115K
Юникод — это очень большой и сложный мир, ведь стандарт позволяет ни много ни мало представлять и работать в компьютере со всеми основными письменностями мира. Некоторые системы письма существуют уже более тысячи лет, причём многие из них развивались почти независимо друг от друга в разных уголках мира. Люди так много всего придумали и оно зачастую настолько непохоже друг на друга, что объединить всё это в единый стандарт было крайне непростой и амбициозной задачей.

Чтобы по-настоящему разобраться с Юникодом нужно хотя бы поверхностно представлять себе особенности всех письменностей, с которыми позволяет работать стандарт. Но так ли это нужно каждому разработчику? Мы скажем, что нет. Для использования Юникода в большинстве повседневных задач, достаточно владеть разумным минимумом сведений, а дальше углубляться в стандарт по мере необходимости.

В статье мы расскажем об основных принципах Юникода и осветим те важные практические вопросы, с которыми разработчики непременно столкнутся в своей повседневной работе.
Читать дальше →
Всего голосов 47: ↑45 и ↓2+43
Комментарии52

Нумерация аргументов variadic template, или что скрывает скромный pair

Время на прочтение5 мин
Количество просмотров19K


Освоение стандарта C++11 — процесс, который не может происходить скачкообразно. Изучение новой языковой конструкции требует не только заучивания синтаксиса, но и осмысления её предназначения и типичных способов применения. Важным подспорьем в обучении является похорошевшая STL, которая зачастую может открыть глаза на существование весьма интересных и нужных возможностей. А уж зная, что какая-то вещь возможна и реализована в STL, докопаться до способа реализации нетрудно.

Об одном из любопытных примеров, связанном с обновлённым и улучшенным классом pair, и пойдёт речь в статье.
Новый стандарт добавил такой, казалось бы, простой вещи, как pair, удобства и универсальности. Если раньше к типам, входящим в состав пары, предъявлялись достаточно суровые требования, то сейчас слепить в пару можно практически что угодно. В частности, снято ограничение на конструирование таких типов. Теперь необязательно применять операции копирования или даже перемещения, возможно создание пары непосредственным конструированием членов (такая операция называется emplace, «размещение», и в C++11 поддерживается контейнерами STL), с применением нетривиальных конструкторов.
Читать дальше →
Всего голосов 20: ↑20 и ↓0+20
Комментарии14

Указатели, ссылки и массивы в C и C++: точки над i

Время на прочтение10 мин
Количество просмотров616K
В этом посте я постараюсь окончательно разобрать такие тонкие понятия в C и C++, как указатели, ссылки и массивы. В частности, я отвечу на вопрос, так являются массивы C указателями или нет.

Обозначения и предположения


  • Я буду предполагать, что читатель понимает, что, например, в C++ есть ссылки, а в C — нет, поэтому я не буду постоянно напоминать, о каком именно языке (C/C++ или именно C++) я сейчас говорю, читатель поймёт это из контекста;
  • Также, я предполагаю, что читатель уже знает C и C++ на базовом уровне и знает, к примеру, синтаксис объявления ссылки. В этом посте я буду заниматься именно дотошным разбором мелочей;
  • Буду обозначать типы так, как выглядело бы объявление переменной TYPE соответствующего типа. Например, тип «массив длины 2 int'ов» я буду обозначать как int TYPE[2];
  • Я буду предполагать, что мы в основном имеем дело с обычными типами данных, такими как int TYPE, int *TYPE и т. д., для которых операции =, &, * и другие не переопределены и обозначают обычные вещи;
  • «Объект» всегда будет означать «всё, что не ссылка», а не «экземпляр класса»;
  • Везде, за исключением специально оговоренных случаев, подразумеваются C89 и C++98.


Указатели и ссылки


Указатели. Что такое указатели, я рассказывать не буду. :) Будем считать, что вы это знаете. Напомню лишь следующие вещи (все примеры кода предполагаются находящимися внутри какой-нибудь функции, например, main):

int x;
int *y = &x; // От любой переменной можно взять адрес при помощи операции взятия адреса "&". Эта операция возвращает указатель
int z = *y; // Указатель можно разыменовать при помощи операции разыменовывания "*". Это операция возвращает тот объект, на который указывает указатель

Читать дальше →
Всего голосов 70: ↑48 и ↓22+26
Комментарии73

Паттерн Visitor. Продвинутое использование

Время на прочтение7 мин
Количество просмотров48K
Здравствуйте, дорогие хабравчане!

Я хочу поделиться с вами своим опытом использования паттерна проектирования visitor и его интересной модификацией, которую я назвал upcast visitor. К сожалению, непросто придумать простой короткий пример и описать как все работает, также эта статья может показаться сложной для начинающих, тем не менее я постараюсь максимально упростить задачу. Примеры кода приведены на языке С++ и обязательны к прочтению. Без понимания кода вникнуть в суть статьи будет затруднительно.

Предыстория


Представьте, что мы проектируем 2D игру, в которой фрукты падают с дерева, по пути ударяясь о ветки. Цель игры — поймать все фрукты, двигая корзину под деревом.
Строим следующую диаграмму классов:
Читать дальше →
Всего голосов 62: ↑57 и ↓5+52
Комментарии45

Слушаем 15 лучших ИТ-подкастов

Время на прочтение5 мин
Количество просмотров43K


Один из признаков настоящего профи — интерес к выбранному делу и готовность узнавать новое, расширяя границы выбранной профессии. Это утверждение на 100% подходит к ИТ-индустрии, которая продолжает стремительно развиваться. Мы выбрали для вас 15 интересных подкастов на эту тему.
Читать дальше →
Всего голосов 41: ↑39 и ↓2+45
Комментарии26

Стандарт C++20: обзор новых возможностей C++. Часть 3 «Концепты»

Время на прочтение11 мин
Количество просмотров40K


25 февраля автор курса «Разработчик C++» в Яндекс.Практикуме Георгий Осипов рассказал о новом этапе языка C++ — Стандарте C++20. В лекции сделан обзор всех основных нововведений Стандарта, рассказывается, как их применять уже сейчас и чем они могут быть полезны.

При подготовке вебинара стояла цель сделать обзор всех ключевых возможностей C++20. Поэтому вебинар получился насыщенным и растянулся на почти 2,5 часа. Для вашего удобства текст мы разбили на шесть частей:

  1. Модули и краткая история C++.
  2. Операция «космический корабль».
  3. Концепты.
  4. Ranges.
  5. Корутины.
  6. Другие фичи ядра и стандартной библиотеки. Заключение.

Это третья часть, рассказывающая о концептах и ограничениях в современном C++.
Читать дальше →
Всего голосов 25: ↑23 и ↓2+32
Комментарии14

Тренды для разработчиков игр: зачем добавлять режим Among Us в свой проект

Время на прочтение9 мин
Количество просмотров8.7K

В прошлом году мы добавили в мобильный PvP-шутер режим Imposter по мотивам игры Among Us — переработанную и переосмысленную в 3D мини-игру с новыми механиками и фичами. Она стала популярным местом входа в игру даже среди тех, кто раньше не слышал про Pixel Gun. Другой пример: когда зарелизился Fortnite, мы за один день потеряли треть онлайна, и чтобы вернуть игроков, сделали свою реализацию батлрояля. Решение сработало — оказалось, им просто не хватало королевской битвы. То есть тренды, это не просто желание хайпануть — это возможность разговаривать с аудиторией на их языке.

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

Читать далее
Всего голосов 35: ↑34 и ↓1+36
Комментарии18

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность