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

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Блеск и нищета WebAssembly

Уровень сложностиСложный
Время на прочтение20 мин
Количество просмотров1.4K

Всем привет! Сейчас за окном осенние деньки 2024 года. Вещает Пройдаков Евгений. Сейчас я руковожу группой разработки среды исполнения языка eXtraction and Processing в R&D департаменте Positive Technologies.

Доменно специфичный язык eXtraction and Processing является важной частью движка поведенческого анализа, используемого в таких продуктах Positive Technologies, как MaxPatrol SIEM и PT ISIM. Сегодня хотелось представить вашему вниманию выжимку нашего R&D процесса в экспериментах с WebAssembly. Узнаем, что такое WebAssembly. Поймём, как его можно встроить в программный продукт. Коснёмся инструментов разработки и сред исполнения WebAssembly. А также в рамках одной статьи пройдём путь от постановки задачи до результатов по разработке среды исполнения для доменно специфичного языка программирования. Кроме того, мы разберем некоторые проблемы, которые могут появиться у вас при попытке собрать и отладить большой С++ проект под WebAssembly. Материал может быть особенно полезен тем, кто хочет использовать WebAssembly за пределами веб‑браузера.

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

На старт, внимание, поехали!
Всего голосов 16: ↑16 и ↓0+20
Комментарии2

Новости

Создаем свою простую (C++) библиотеку с документацией, CMake и блекджеком

Уровень сложностиСредний
Время на прочтение33 мин
Количество просмотров936

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

Если вы ловили себя на мысли: ‭«А почему мне бы не создать свою полноценную библиотеку?‭», то я рекомендую прочитать вам мою статью.

Эту статью вы можете использовать как шпаргалку для создания проектов, и не только библиотек.

Некоторые из вас могут подумать что мы изобретаем велосипед. А я в ответ скажу — сможете ли вы прямо сейчас, без подсказок, только по памяти, нарисовать велосипед без ошибок?

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

Простая нейронная сеть на C++

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров8.9K

Всем привет!

При помощи нейронной сети решил проблему классификации фигур на изображениях размера 7 на 7 пикселей. Задача решалась в рамках студенческой лабораторной работы. Статья приводится в качестве руководства для решения подобных академических задач.

Читать далее
Всего голосов 16: ↑14 и ↓2+17
Комментарии19

Небольшая хитрость для простого взаимодействия Rust и C++

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров2.1K

На работе я переписываю запутанный C++ код на Rust.

Из‑за активного использования коллбеков (вздох), Rust иногда вызывает C++, а C++ иногда вызывает Rust. Все это благодаря тому, что оба языка предоставляют C API для функций, которые можно вызывать со стороны противоположного языка.

Это касается функций; но как быть с методами C++? Представляю вам небольшую хитрость, благодаря которой можно переписать, без головной боли, один метод C++ за раз. И, кстати, это работает независимо от языка, на который вы переписываете проект, это не обязательно должен быть Rust!

Читать далее
Всего голосов 9: ↑8 и ↓1+7
Комментарии11

Истории

Реализация подписчиков в c++ — пляшем от печки, но уже совсем далеко

Уровень сложностиСложный
Время на прочтение12 мин
Количество просмотров1.6K

В прошлой статье мы написали вполне себе разумный оповещатель (notifier) для рассылки уведомлений подписчикам (subscribers). Он достаточно удобен, там нет ничего лишнего - всего 130 строчек кода. Моменты, важные для клиентов этого кода, продуманы. Как например, многопоточный вызов доставки оповещений с минимальными взаимными блокировками и возможность отписывать прямо из обработчика подписчика.

На этом бы и остановиться, но мы шагнём дальше, добавив немного шаблонной магии и сделав код "академичнее".

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

Чистый код: инверсия зависимостей (DIP)

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров2.9K

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

Вот такое сложное определение. Где, «Проще говоря», только больше запутывает чем поясняет, хотя все передает верно. Этот принцип пожалуй самый сложный для объяснений, хотя его суть очевидна.

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

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

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

Читать далее
Всего голосов 9: ↑5 и ↓4+5
Комментарии4

C++ с точки зрения Rust-разработчика: достоинства и недостатки

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

Я профессионально программирую на Rust и, признаться, немного этот язык продвигаю. Поэтому можете себе представить глубину моего расстройства, когда моя младшая сестрёнка, почти не умеющая программировать, обратилась ко мне и попросила научить её C++. Я попытался её отговорить, сказав, что однажды она будет сидеть за отладкой ошибок сегментирования, вооружившись Valgrind и вспоминать этот наш разговор, размышляя, а где же она свернула не туда. Но она оказалась ещё упрямее меня и настаивала: хочу выучить язык программирования, которым действительно пользуются люди.

Я не притрагивался к C++ с тех пор, как ещё в старших классах разрабатывал игры на Cocos2D-X, но решил, что сохранившихся у меня туманных воспоминаний о «правиле трёх» (или сколько там было? Пять? Ноль?) и прочих подобных материях будет более чем достаточно, чтобы решить такую задачу. Оказалось, что и мне требуется кое-что подучить, но я с удовольствием узнал, что существует большая аудитория, с которой можно поделиться этими знаниями. Почти любую концепцию из C++ легко понять, если объяснить её в ключе «о, эта как та штука из Rust».

Притом, что C++ местами несимпатичен, этот язык по-своему красив. Я и так это знал, но, когда взялся заново учиться C++, мне стало только яснее: если Rust в какой-то степени и превосходит C++ (допустим, вы верите, что это так), то лишь потому, что сам Rust стоял на плечах такого гиганта как C++.

Так что мы потратили пару недель, проштудировав серию руководств по OpenGL от ютубера под ником TheCherno (кстати, сама серия отличная). Две недели спустя нам удалось на экране единственный статичный голубой квадратик. Я уже стал опасаться, а не начнёт ли моя сестра сомневаться, стоило ли таким образом изучать разработку игр и пытаться изобразить что-нибудь на C++. Так что тогда я решил, что следует отбросить руководства господина Черно и взяться за разработку игры всерьёз.

Читать далее
Всего голосов 27: ↑21 и ↓6+27
Комментарии65

Реализация подписчиков в c++ — пляшем от печки чуть дальше

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров2.1K

В прошлой статье, отбросив всё, что нам было известно из мира «кровавого энтерпрайз IT», и опустошив чашу, мы «написали на коленке» простейший оповещатель (notifier). Объект, вызывающий по цепочке заранее зарегистрировавшихся клиентов (подписчиков) при наступлении какого-то события.

Настало время сделать его чуть удобнее для пользователей — добавить поддержку аргументов и позволить отписываться от событий прямо из кода подписчика.

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

Телеграм бот на С++ сложно? Давайте развеем этот миф

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров1.3K

Небольшая статья по настройке серверной части для телеграм бота, на базе языка программирования С++ и библиотек TgBot и sqlite3.

Продолжить чтение...
Всего голосов 5: ↑5 и ↓0+10
Комментарии7

Реализация подписчиков в c++ — пляшем от печки

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров3.1K

За время долгой работы в IT непосредственно с кодом, подмечаю одну особенность, что писать приходится всё меньше (в последнее время практически не писать), а ревьювить всё больше. И всё чаще видны нагромождения тонн кода, которые по факту не нужны, не вносят никакой дополнительной пользы. Но создают раз за разом головную боль для следующего читающего этот код программиста, который вынужден что-то поправить или дописать в этом коде. По итогу, программист махает рукой на эту чудную "архитектуру"... и пишет ещё один wrapper / adapter над ним. И, таким образом, передаёт пламенный привет последующим коллегам в будущее ;).

Попробуем взять и переписать с минимумом кода одну из очень часто встречающихся задач - рассылку уведомлений объектам в коде при возникновении какого-то события. На первый взгляд кажется, что в c++ уже есть все инструменты, чтобы написать этот код в несколько строк: функтор std::function<...> - чтобы сохранить отложенный вызов, контейнер std::vector<std::function...> - чтобы сохранить цепочку отложенных вызовов. По которым нужно просто пробежаться при возникновении события и вызвать сохранённые функторы...

Читать далее
Всего голосов 15: ↑14 и ↓1+20
Комментарии18

CodeChecker: анализируем большой проект на С++ быстро, эффективно и бесплатно

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

Привет, Хабр! Меня зовут Давид, еще недавно я был стажером YADRO, а сейчас работаю в отделе разработки ПО поддержки сетевой аппаратной части. У нас в команде есть большой проект на более 100 000 строк, написан на C++ (и частично на С). Код переписывался много раз, а за самим проектом на правах легаси особо никто не следил: работает — не трогай. Когда я пришел в команду, у меня была задача: привести код в порядок и отловить ошибки, которые пропускает компилятор — например, возможное разыменование нулевого указателя, неинициализированные переменные или простые опечатки. 

Одним из очевидных решений было использование статического анализатора. Выбрали довольно известное коммерческое решение, но долгие прогоны не привели ни к чему дельному. Решили поэкспериментировать с другими вариантами статических анализаторов, сделав ставку на open source. Поиски привели к инфраструктуре CodeCheсker, которая предоставляет удобный интерфейс запуска и настройки статических анализаторов через аргументы командной строки. С помощью инструмента удалось достичь результатов, которые значительно превысили значения, полученные на коммерческом решении.  

Под катом расскажу, что же такое CodeCheсker, как с ним работать и почему его точно стоит попробовать на большом проекте.

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

Чистый код: Принцип разделения интерфейса (ISP)

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров5.5K

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

Этот принцип пожалуй самый простой для понимания, но важный при реализации. С разделением интерфейсов мы встречаемся постоянно, правительство любой страны имеет интерфейсы, которые называются министерствами, компании - интерфейсы в виде отделов, материнская плата - интерфейсы для подключения памяти, процессоров и другой периферии. Тоже самое логично делать и в программировании.

В чем суть принципа разделения интерфейсов. Если перефразировать простыми словами, не нужно делать два дела сразу. Сознание человека так и построено, вспомните детскую задачку, когда просят одновременной дотянуться пальцем до кончика носа и гладить живот по часовой стрелке.

Прежде чем создавать свой пример, давайте рассмотрим пару участков кода из интернета. Из кода удалены приватные части классов, а так же конструкторы и параметры методов. Исключительно для экономии места.

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

Читать далее
Всего голосов 7: ↑3 и ↓4+2
Комментарии2

Взаимодействие Unreal Insights c Unreal Engine 5 с точки зрения исходного кода

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров1.5K

Читая исходный код Unreal Engine 5 я частенько стал натыкаться на загадочный макрос UE_TRACE_LOG (например, использование этого макроса можно заметить в коде UE_LOG). В этой статье я хотел бы рассказать, зачем нужен макрос UE_TRACE_LOG и как он связан с Unreal Insights.

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

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн

Дорогая, я уменьшил {fmt}: уменьшил размер до 14kB и избавился от рантайма C++

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров13K

Библиотека форматирования {fmt} известна своим небольшим влиянием на размер бинарников. Чаще всего её код в несколько раз меньше по сравнению с такими библиотеками, как IOStreams, Boost Format или, что иронично, tinyformat.

Давайте разберем, как можно уменьшить размер бинарников еще больше!

Читать далее
Всего голосов 40: ↑38 и ↓2+47
Комментарии25

std::execution принят в C++26 — пора знакомиться

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров15K

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

В конце июня стандартный комитет одобрил включение std::execution (P2300) в C++26. Это пропозал, который призван решить вышеуказанные проблемы. Давайте разбираться!

Читать далее
Всего голосов 27: ↑24 и ↓3+27
Комментарии28

Реализация мечт (нечеткая логика)! Пошаговый рецепт

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров3K

Есть задача, а для кого-то почти мечта - реализовать нечеткую математику в ВКПа. И здесь отдельное спасибо Вячеславу Петухову за материал, ставший основой похода в нечеткую логику на базе автоматов. Правда, сам Вячеслав высказался отрицательно о реальности подобного "блицкрига", но, ведь, когда есть цель и неистребимое желание ее достичь, то, порой, даже невозможное становится возможным. Мне же, что там скрывать, очень захотелось в ВКПа создавать объекты на основе нечеткой логики, аналогичные объектам в SimInTech. Тем более, что когда-то теория нечетких множеств привлекала мое внимание, а понятие нечеткого регулятора и сейчас, если честно, бередит мои мысли...

Чтобы от чего-то оттолкнуться, был выбран проект из каталога демо-примеров платформы SimInTech из подкаталога "Автоматика и математика\Нечёткая Логика\Система поддержания уровня воды в баке". И на момент начала написания данной статьи мною уже были успешно реализованы некоторые из типовых блоков библиотеки "Нечеткая логика" платформы SimInTech (см. рис. 1). Заметим, что дополнительную информацию о нечеткой логике можно почерпнуть из справки платформы SimInTech, зайдя в раздел "Лабораторные работы по ВУЗам", затем в "Московский Политех" и в завершение - "Разработка системы нечеткого вывода".

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

C++ Дайджест №8 (2 сентября – 8 сентября 2024)

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров2.1K

Привет, Хабр! Сегодня я хочу вам представить подборку интересных новостей и материалов по C++ за последнюю неделю.

Приятного чтения!

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

Кратко про библиотеку Range в C++

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров2.2K

Привет, Хабр!

С выходом C++20 библиотека Range получила свое официальное место в языке, что ознаменовало некоторый важный шаг в развитии работы с контейнерами и итераторами. Это обновление ввело новый подход к манипуляциям с данными.

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

Читать далее
Всего голосов 9: ↑8 и ↓1+12
Комментарии5

Чистый код: Принцип подстановки Барбары Лисков (LSP)

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров7.4K

Принцип подстановки Лисков гласит, что если метод использует базовый класс, то он должен иметь возможность использовать любой из его производных классов без необходимости иметь информацию о производном классе.

Трудно предоставить разумный пример иллюстрирующий этот принцип, так как соблюдение элементарной логики и правил чистого кода по именованию методов и переменных, не позволяет его нарушить. Если в базовом классе есть метод save(), отвечающий за сохранение информации, а вы не пытаетесь его переделать для загрузки данных, у вас все в порядке.

Рассмотрим тонкости соблюдения этого принципа, на довольно сложном примере. Начнем с класса хранения данных.

Читать далее
Всего голосов 6: ↑3 и ↓30
Комментарии7

Ultimatum — очередной форк chromium-а или сказ о том как я кеши приручал

Уровень сложностиСредний
Время на прочтение29 мин
Количество просмотров2.7K

image


Добрый день! Меня зовут Тимур и я программист.


Сегодня я предлагаю рассмотреть очередную мою работу. Я пробросил в js прямой доступ к кешам chromium-a и теперь ими можно манипулировать из расширений браузера (при наличии соотв. permissions). Если вас не интересуют кресты а хочется халяльного js кода — переходите сразу в конец статьи, там описано реализованное api и как им пользоваться.


Итак, о чем речь и зачем это нужно?

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

Вклад авторов

Работа

Программист C++
155 вакансий
QT разработчик
12 вакансий