C++ Academy
15.7K subscribers
801 photos
142 videos
1 file
739 links
По всем вопросам- @workakkk

РКН: clck.ru/3FmxJF

#VRHSZ
Download Telegram
⚡️ Хочешь собрать GPU с нуля - вот настоящий появился симулятор Mvidia

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

Начинаешь с базы
движение электронов, транзисторы, логика

• Дальше собираешь уровни выше
логические схемы, ALU, простой процессор

До GPU ещё не дошли
блоки про шейдеры и графику пока в разработке, но фундамент уже есть

На Hacker News проект активно хвалят, особенно за подачу и понятную прогрессию

Хороший способ наконец понять, как всё это реально устроено под капотом, а не на уровне абстракций

Сначала проходишь симулятор потом уже думаешь, как построить Nvidia 2.0

https://jaso1024.com/mvidia/
🔥146👍4
10🤣8💯4😁2🌚2
Data-Parallel Types: алгоритмы (C++26)

Библиотека «data-parallel types» для SIMD-векторов (пространство имён std::experimental, алиас stdx) предоставляет четыре специальных алгоритма: `min, max, minmax и clamp.

min, max, minmax

- min(a, b) и max(a, b) принимают два SIMD-вектора и возвращают вектор покомпонентных минимумов/максимумов.
- minmax(a, b) возвращает пару SIMD-векторов: первый — покомпонентные минимумы, второй — максимумы.
- Автор отмечает, что строка stdx::minmax(a, b) у него не компилировалась ни в GCC, ни в Clang (на момент публикации).

clamp

- stdx::clamp(v, lo, hi) применяет std::clamp к каждому элементу SIMD-вектора: значения ниже lo поднимаются до нижней границы, выше hi — опускаются до верхней.
- Показаны два примера: ограничение к диапазону INT8_MIN..INT8_MAX и к 0..UINT8_MAX; на выводах видно, как выходящие за пределы элементы прижимаются к границам.

Итог

- Для SIMD-векторов доступны привычные «минимумы/максимумы» и покомпонентный clamp.
- minmax задуман как удобный возврат пары (min/max), но в текущих компиляторах может не собираться.
- Дальше автор планирует разбирать новые возможности C++26 (в частности, контракты).

https://www.modernescpp.com/index.php/data-parallel-types-algorithms/

#cpp #programming
👍73🔥1
oneDNN

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

https://github.com/oneapi-src/oneDNN
👍3
C породил всё: как один язык стал отцом C++, Java, Rust, Go, Swift и Zig

Daniel Lemire, эксперт по производительности софта из топ-2% ученых мира (по рейтингу Stanford/Elsevier 2025) и топ-1000 разработчиков на GitHub, опубликовал статью про эволюцию языков программирования семейства C. Разбираем ключевые тезисы.

Всё началось с трех языков: Fortran (1957), Pascal (1970) и C (1972). Fortran создавался для числодробилки и научных расчетов. Pascal намеренно ограничивал низкоуровневый доступ, потому что задумывался как учебный язык для структурного программирования. А вот C победил именно потому, что позволял работать с указателями, прямым доступом к памяти и при этом оставался достаточно универсальным для системной разработки вроде Unix.

В 80-е и 90-е объектно-ориентированное программирование стало чем-то вроде религии. Lemire прямо пишет: это превратилось в секту. Но C не был объектно-ориентированным. Так появился C++, который начинался как «C with Classes». C++ принес шаблоны, обобщенное программирование и метапрограммирование на этапе компиляции. Это сделало язык мощным, но и сложным для освоения (с безумными сообщениями об ошибках).

Показываю как профессионально работать с Claude и другими ИИ у себя в телеге! И зеркало Max, если тг не работает(

C и C++ стали дико успешными, но писать кроссплатформенные приложения было больно. Приходилось целиться в Windows или конкретный Unix. Это было проблемой для Sun Microsystems, которая продавала Unix-машины и хотела конкурировать с Microsoft.

Так в 1995 году появилась Java. Безопасная, портативная альтернатива C++: без арифметики указателей, с обязательной сборкой мусора, проверкой границ массивов и виртуальной машиной (JVM) с JIT-компиляцией для производительности. Обещание «write once, run anywhere» напрямую закрывало боль портируемости C/C++. До сих пор Java остается сильным решением для enterprise и серверного кода.

В том же 1995-м появился JavaScript, который, несмотря на название, семантически почти ничего общего с Java не имеет. Lemire считает, что его лучше рассматривать отдельно от ветки C/C++. Python тоже стоит особняком.

Microsoft в 2000 году выкатила C#. Синтаксически он из того же семейства, что C++ и Java, но с поддержкой AOT-компиляции в современном .NET и возможностью работать с указателями в явно помеченных unsafe-блоках. По сути, C# можно назвать «C++ со сборкой мусора». Он даже конкурирует с C++ в геймдеве благодаря Unity.

Google создал Go как упрощенный современный C: со сборкой мусора, встроенной проверкой границ для слайсов и массивов, с указателями, но без произвольной арифметики в безопасном коде (пакет unsafe существует для низкоуровневых нужд).

Apple ответила Swift. Производительность и цели синтаксиса как у C++, но с современными фичами безопасности (проверка границ по умолчанию, паника при переполнении целых чисел в debug-режиме) и автоматическим подсчетом ссылок (ARC) для управления памятью. Swift заменил Objective-C, но Lemire рассматривает его как наследника C++.

Примерно тогда же появились Rust и Zig. Rust, как и Swift, отказался от поколенческой сборки мусора из Java, C# и Go. Вместо этого он полагается на систему владения и заимствования на этапе компиляции, с компромиссом: через циклические ссылки можно допустить утечку памяти. Zig делает работу с памятью полностью явной.

Интересный тезис Lemire: Rust и Zig правильнее считать потомками C, а не C++. Оба, конечно, намного мощнее C, но по духу они именно C-подобные языки.

Доминирующими языками для перформанс-критичных, системных, enterprise- и инфраструктурных задач до сих пор остаются C, C++, Java и C#. По эффекту Линди (чем дольше что-то существует, тем дольше оно, вероятно, просуществует), эти языки, особенно C, которому уже больше 50 лет, будут с нами еще очень долго.

https://vc.ru/dev/2860450-yazyk-c-i-vliyanie-na-c-java-rust-go-swift-i-zig
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍8🔥2👏1😐1
🧩 C++ обертка для PCRE2

pcre2cpp - это объектно-ориентированная обертка для библиотеки PCRE2, обеспечивающая удобный интерфейс для работы с регулярными выражениями. Поддерживает C++17 и C++20, упрощая процесс сопоставления и захвата результатов.

🚀 Основные моменты:
- Объектно-ориентированный интерфейс для PCRE2 10.47
- Совместимость с C++17 и C++20
- Удобное сопоставление регулярных выражений
- Встроенное захватывание результатов

📌 GitHub: https://github.com/MAIPA01/pcre2cpp

#cpp
👍3🔥32
This media is not supported in your browser
VIEW IN TELEGRAM
DOOM ЧЕРЕЗ CURL. ДА, ПРОСТО HTTP ЗАПРОС

Разработчик запустил Doom прямо в терминале без установки и GUI.

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

По сути это полноценная игра поверх HTTP, без клиента, без зависимостей. Только bash и сеть.

Сюрреализм в том, что это не демка, а реально играбельная штука.

Хочешь попробовать - открываешь терминал и играешь.

https://github.com/xsawyerx/curl-doom
👍13🔥74😁2
24😁9👍7🔥4💯2
⚡️ Вы слышали про Rust. Знаете, что он быстрый, безопасный и что за ним будущее.

Осталось одно: сесть и выучить.

Этот курс со Stepik- кратчайший путь от «знаю что такое Rust» до «пишу на нём».

6 модулей, 50 уроков, 143 теста. Ownership, borrowing, traits, async, Tokio, Axum, макросы, WASM — всё разложено по полочкам и закреплено практикой.
Никакого видео на 40 минут ради одной мысли. Подробный текст, много кода, реальные задачи после каждого урока. На выходе — портфолио из 10+ проектов: от CLI-утилит до REST API с базой данных.

48 часов действует скидка 55 процентов: stepik.org/course/269250
3🥴3💊2👍1🔥1🌭1
Media is too big
VIEW IN TELEGRAM
Веселье с type erasure: делаем обертку с семантикой значения для полиморфных типов
Павел Новиков

Цель доклада — познакомить с подноготной базовой реализации type erasure (т.н. «стирание типов») в C++, а также придать уверенности при возможном взаимодействии с подобным кодом.

Используя реализацию обертки с семантикой значения в качестве примера, мы посмотрели на то, как работает type erasure, похожий на std::any.

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

источник

#cpp #programming
2🔥2😁1
#вопросы_с_собеседований
Бывает такое, что оператор new не выделяет память?

Ответ:
Да, бывает, когда new передаётся указатель на уже выделенную память (например, с помощью malloc). Это называется placement new. И оператор new без изменения возвращает второй параметр - указатель (void* operator new(std::size_t, void*)). Это используется для создания объектов в выделенном "хранилище" или после malloc.

Важно! В этом случае деструктор нужно вызывать самостоятельно!
🔥15
Своя виртуальная машина на C за 200 строк⁠⁠

Каждый раз, когда мы запускаем inference LLM, мы на самом деле гоняем программу в виртуальной машине. PyTorch крутит граф вычислений, llama.cpp интерпретирует GGUF, vLLM гоняет свой движок поверх CUDA. Мы живём в мире абстракций настолько глубоких, что уже забыли, как это всё работает на уровне байтов.

Ребята, рекомендую статью от Scarlett. Она показывает, как написать полноценную виртуальную машину на чистом C меньше чем за 200 строк. Без фреймворков, без зависимостей, без магии. Только память, регистры и опкоды. И это самая освежающая вещь, которую я читал на этой неделе.

Почему AI-специалисту стоит уделить этому вечер. Мы постоянно работаем с абстракциями поверх абстракций. Python вызывает CUDA-ядра, которые транслируются в PTX, который превращается в SASS, который исполняется на SM. Когда что-то падает с out of memory или внезапно становится в десять раз медленнее, мы открываем Nsight и видим непонятные буквы. Понимание того, как вообще работает машина, отдельная суперсила, которая окупается на каждом продакшен-инциденте.

Если кратко, что там внутри. Автор строит VM по образу LC-3, это учебная архитектура фон-Неймана. 65 536 ячеек памяти по 16 бит, 10 регистров, включая программный счётчик и регистр условных флагов. Вся инструкция это 16 бит, где первые 4 бита опкод, остальные параметры. Поддерживается 14 команд: арифметика, загрузка и сохранение памяти, переходы, вызовы подпрограмм и trap для ввода-вывода.

Самое интересное это цикл fetch decode execute. Три строки кода. Читаем инструкцию по адресу из RPC, увеличиваем RPC, вызываем обработчик по индексу опкода из таблицы указателей на функции. Всё. Вот так работает любой процессор в мире, только сложнее и с миллиардами транзисторов. Когда вы понимаете это на уровне C, архитектурные особенности Transformer runtime перестают казаться чёрной магией.

Ещё из приятного. Есть подробный разбор битовых полей инструкций, объяснение sign extension, работа с условными флагами N, Z, P и аккуратная реализация trap-таблицы через массив указателей на функции вместо гигантского switch. Этот приём напрямую переиспользуется, когда вы пишете свой интерпретатор графа или custom kernel dispatcher.

Что из этого вытаскивает AI-инженер. Во-первых, интуицию по поводу того, как устроен любой runtime, от TensorRT до ONNX. Во-вторых, понимание, почему arena-аллокаторы и заранее выделенная память бьют malloc в цикле. В-третьих, это лучший антидот от выученной беспомощности на фоне LLM-ассистентов. Пока Cursor пишет вам код на TypeScript, вы садитесь и руками собираете VM на C, которая исполняет машинный код. Мозг перезагружается, руки помнят, что такое настоящая инженерия.

Совет. Не просто читайте. Откройте файл, начните с main memory и регистров, добавляйте по одной инструкции. Сверяйтесь с постом, когда застряли. К концу вечера у вас будет рабочая VM, в которую можно загрузить свой собственный hex-файл и выполнить сложение двух чисел с клавиатуры. Это тот самый момент, ради которого мы когда-то пошли в инженерию.

Источник и полный разбор: https://x.com/Zyara_1ot/status/2045916052559900725
👍8🔥74
This media is not supported in your browser
VIEW IN TELEGRAM
🐦 Flappy Bird на Си: Вес APK < 100 Килобайт! 🚀

В сентябре 2024 года, увидев Flappy Bird на C# в дискорд-канале Raylib, я решил попробовать реализовать эту игру на Си для Android с весом APK менее 100 КБ. 🚀

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

https://github.com/VadimBoev/FlappyBird

#cpp #programming
👍75🔥3
❤️ Backend Talks от Яндекс 360 — конференция о разработке, технологиях и будущем

Инженеры Яндекс 360 каждый день строят высоконагруженные отказоустойчивые и масштабируемые системы, которые выдерживают больше 1 000 000 RPS: Диск, Телемост, Почту и другие цифровые сервисы.


16 мая они собирают единомышленников — опытных специалистов, для которых работа с высокими нагрузками давно стала повседневной практикой. Будет живая среда для обмена опытом — с обсуждениями, спорами, настолками и разговорами о рабочих задачах.

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

🚀 Подробнее о программе — в карточках и на сайте мероприятия
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍2🔥1