Обновить
325.93

C++ *

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

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

Я добавил трейты и указатели в свой язык

Время на прочтение30 мин
Охват и читатели8.7K

Язык активно улучшается, осталось недолго до bootstrapping'а! Также уменя есть планы писать LSP и загрузить язык на github linguist. Для последнего нужны репозитории (>200). Для тех, кому нечего делать, или кому просто не лень, попробуйте пописать программки на моем языке. Пока мало что можно будет написать, но, думаю, хотя бы что-то можно.

Читать далее

Своя байт-код VM, шейдеры и 3 килобайта на всё: как я создавал игру за 7 дней

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели12K

Как уместить полноценный Shoot ’em up в 3 КБ? Когда иконка на вашем раб столе весит в несколько раз больше. Однако в эпоху терабайтных дистрибутивов всё еще жива магия сайз-кодинга — искусства втиснуть максимум смысла в минимум байт.

Этот проект родился в рамках одного геймджема, где по правилам: «Вначале нужно придумать свой язык программирования, а потом написать на нём игру». У меня было 7 дней, чтобы пройти путь от проектирования архитектуры байт-кода до финальной оптимизации исполняемого файла под Windows.

Читать далее

Немного об операторах New и Delete | C++

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.6K

Углубленный взгляд на устройство работы New | Delete

Переопределение, new_handler, типы new, внутренняя реализация

Читать далее

Маски, Каскады, использование масок вместо циклов(В некоторых случаях) + Атомарные инструкции

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

Привет Хабр!

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

Читать далее

Vulkan API. От нуля до первого треугольника

Уровень сложностиСредний
Время на прочтение35 мин
Охват и читатели12K

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

Читать далее

OpenCL, SYCL и матрицы

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели9K

В данной статье я описываю свой опыт разработки приложений с OpenCL/SYCL.

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

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

Самый краткий ввод в гетерогенное программирование: у нас есть две роли — хост и девайс, задача хоста – формировать задачи и отдавать их на девайс, в то время как задача девайса обработать их и вернуть результат. При этом хост и девайс могут быть одним вычислительным устройством (это не обязательно CPU + GPU, так как CPU может отдавать задачи сам себе).

Читать далее

Используем паттерны C++ в ML: пишем тензор с factory, выделяем память и управляем динамическими типами

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

Привет, Хабр! Я Кирилл Колодяжный, разработчик систем хранения данных в YADRO, ML-энтузиаст и автор книги "Hands-on Machine Learning with C++". В своих материалах я развеиваю миф о том, что машинное обучение — это сплошной Python. На самом деле под капотом моделей часто работает C++.

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

Читать далее

Солнечный трекер на Arduino

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели10K

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

Данная реализация является моделью для прототипа. Описание полной сборки и настройки, как и сборки многих других занимательных устройств я описал в своей книге "Умная робототехника для начинающих. Разработка на Arduino".

Для создания работающей модели нам понадобяться прочный, но лёгкий материал, на котором будет производиться монтаж электрокомпонентов и сам он будет использоваться в качестве несущей конструкции. Можно выбрать вспенённый пвх лист 3 мм или листовой прозрачный пластик 1,5-3 мм. Так же подойдёт корпус из под лазерных дисков.

Нам нужны электрокомпоненты. Я возьму: arduino uno, два сервопривода- четыре фоторезистора, четыре резистора на 1 кОм, соединительные провода, плата для монтажа (можно беспаечную).

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

Фоторезисторы в этом устройстве будут работать, как датчики света. Располагаться они должны по краям подвижной платформу. С какой стороны более яркий свет – в ту сторону и поворачивается устройство.

Читать далее

SIMDe, дополнение к DOD архитектуре

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

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

Для начала хочу сказать огромное спасибо всем, кто прочитал и прокомментировал мою прошлую статью про Data-Oriented Design.

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

Я внимательно изучил все ваши аргументы — от «компилятор сам всё сделает» до «это невозможно поддерживать в реальных проектах». И вместо того, чтобы отвечать каждому в ветке комментариев, я решил подготовить этот материал.

Многие из вас совершенно справедливо заметили: DOD — это круто, но какой в нем смысл, если мы упираемся в зоопарк архитектур? Мы раскладываем данные в памяти идеально ровно, но как только пытаемся применить к ним SIMD-инструкции (чтобы получить тот самый 10-кратный буст), мы попадаем в ловушку вендор-лока. Написал под Intel — не работает на ARM. Написал под ARM — не заведется в браузере.

Сегодня я хочу показать инструмент, который снимает этот вопрос и делает «низкоуровневую магию» действительно универсальной.

Речь пойдет о SIMDe (SIMD Everywhere).

Читать далее

Система частиц в The 13th Sign

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

Доброго дня всем!

Мыс друзьями делаем инди‑игру The 13th Sign, и недавно выпустили первый трейлер, он же — техническое демо. После чего в узких кругах возник широкий круг вопросов формата «как это работает». Ниже — все детали реализации.

Читать далее

Инвертирование равенства. Как реже стрелять себе в ногу в C-подобных языках

Время на прочтение7 мин
Охват и читатели7.3K

Встав утром и посмотрев в профиль, отметил: на Хабре много лет, писал статьи, писал код. И ни разу не писал о коде на Хабре. А вообще‑то разработчик. Поззорище! Пора исправляться.

Поговорим о классической (и болезненной) проблеме кодирования «присваивание вместо равенства» которая в любой момент может создать очень много проблем. О логическом источнике этой ошибке, и о способах решения.

Ну и ещё слегка вспомним «Звездные войны»:-)

Силу инверсии равенства познай на себе :)

Игра Сапёр на Unreal Engine > UMG > только C++ > Никаких Блупринтов

Время на прочтение5 мин
Охват и читатели11K

Захотелось мне как-то написать что-нибудь на UMG в Unreal Engine 5 и исключительно на С++ (без использования блупринтов). Заодно было любопытно краем глаза взглянуть на QT. “Пахнет небольшим проектом”, - подумал я и избрал для вдохновения игру “Сапёр” из сего репозитория -> https://github.com/Bollos00/LibreMines. Моё почтение автору той репы!

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

А ну-ка...

Cистема визуально-инерциальной навигации для дрона на C++

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

Дроны, которые работают на GPS, глушатся и это большая проблема для летательных аппаратов. Сигнал от спутников GPS проходит около 20 000 км и достигает антенны дрона с минимальной мощностью. Любая наземная глушилка, излучающая шум на частотах L1/L2/L5, для приемника дрона оказывается в тысячи раз громче спутников. Приемник слепнет, дрон теряет координаты, переходит в аварийный режим и сносится ветром.

И поэтому нам нужна MVIO (Monocular Visual Inertial Odometry).

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

Читать далее

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

Как я пытался внедрить IOCP в libcoro, выгорел на полгода, но вернулся с планом «Б»

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели6.1K

Что делать, если в твоём очередном самописном движке внезапно понадобилась сеть, да ещё и на корутинах из C++ 20, а подходящая библиотека не поддерживает Windows? Правильно - лезть под капот, разбираться что такое epoll, почему он несовместим с IOCP, затем вкатиться в Open Source, сделав огромный PR, выгореть на полгода, чтобы потом вернуться и начать делать нормально.

Небольшая история о том, почему первый PR не должен быть огромным и как (не) нужно переписывать сетевую библиотеку.

Читать далее

far2l и буфер обмена: ускоряем bracketed paste

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

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

Поговорим о скорости. А точнее — о том, как мы заставили far2l мгновенно «проглатывать» большие объемы текста из буфера обмена терминала, даже если вы сидите через медленный SSH на сервере, где нет иксов.

Читать далее

TinyAgent.exe: ИИ берет мышь и клавиатуру

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

Представьте: вы скидываете нейросети скриншот сложной программы (будь то Cinema 4D, Excel или 1С) и говорите: «Сделай мне вот это». И через секунду мышка на вашем экране начинает сама летать по кнопкам, выполняя работу за вас.

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

Читать далее

Так как же всё-таки быстро конкатенировать строки в C++?

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.4K

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

return "The answer is " + str_answer + ", count is " + count;

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

Читать далее

Маленький веб

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

Компактная и портабельная программа, четко выполняющая свое предназначение — редкая для современного мира красота и услада для глаз опытного разработчика.

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

Читать далее

Сравнение методов решения систем линейных алгебраических уравнений

Время на прочтение26 мин
Охват и читатели6.8K

Цель данной статьи - предоставить сравнение методов решения СЛАУ и их эффективности в разрезе времени решения и нормы невязки, характеризующей точность решения. В статье приводятся результаты решения для числа уравнений от 50 до 3000. Приводится сравнение результатов решения для методов: Гаусса, LU декомпозиции, компактной схемы исключения, QR декомпозиции, LL^T декомпозиции, методов вращений, релаксации и градиентного спуска.

Читать далее

muRPC: Реализация протокола JSON-RPC на C++

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

Данная статья описывает библиотеку muRPC для создания сервера и клиента для протокола JSON-RPC. Режим работы предполагает, что один из клиентов JSON-RPC предоставляет какие-то методы и сообщает об этом серверу. Тогда другие клиенты JSON-RPC могут эти методы вызывать и получать ответ. Сервер предоставляет маршрутизацию и валидацию сообщений между клиентами.

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

Читать далее