Библиотека C/C++ разработчика
6.8K subscribers
652 photos
690 videos
8 files
938 links
Полезные материалы по всему, что может быть полезно плюсовику/сишнику. По всем вопросам @evgenycarter
Download Telegram
Шутер «Проект Кощей», разработка игр на SFML C++

Шутеры — это один из самых популярных жанров видеоигр, который появился в начале 90-х годов. Первые шутеры были созданы для персональных компьютеров и имели простейшую графику и управление. Однако, они были невероятно популярны, и в скором времени стали самыми продаваемыми играми.

Первая игра, которую можно отнести к жанру шутеров, была Wolfenstein 3D, созданная компанией id Software в 1992 году. Она является первой игрой, в которой игрок управляет персонажем от первого лица, противостоящим врагам на экране. Wolfenstein 3D также стала первой игрой, которая использовала 3D‑графику в реальном времени. Она была невероятно популярна и стала основой для многих последующих шутеров.

В 1993 году id Software выпустила игру Doom, которая стала еще более популярной, чем Wolfenstein 3D. Doom была первой игрой, которая использовала сетевой мультиплеер, что позволило игрокам из разных частей мира сражаться друг с другом через интернет.

В 1996 году компания Valve выпустила игру Half‑Life, которая стала новой эволюцией жанра. Она представила новые элементы, такие как непрерывный геймплей, сюжет и персонажи, а также новую графику и физический движок.

https://habr.com/ru/articles/739584/

#cpp #programming

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

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

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

https://habr.com/ru/articles/843530/

#cpp #programming

👉 @cpp_lib
Как вывести форматированный текст на экран в C++

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

Но как сделать это оптимально и кроссплатформенно?

https://habr.com/ru/articles/748336/

#cpp #programming

👉 @cpp_lib
22 общие задачи работы с файловыми системами на C++20

Работа с файловой системой может показаться сложной задачей, но это не обязательно так. В этом посте я проведу вас через некоторые из самых распространенных операций с файловой системой, используя мощные функции, введенные в C++17, а также некоторые новые улучшения в C++20/23. Независимо от того, создаете ли вы каталоги, копируете файлы или управляете разрешениями, эти примеры помогут вам понять и эффективно использовать библиотеку std::filesystem.

https://www.cppstories.com/2024/common-filesystem-cpp20/

#cpp #programming

👉 @cpp_lib
Просто не копируй это

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


bool LoadAnimation(str::string filename);
void DrawLines(std::vector<Points> path);
Matrix RotateObject(Matrix m, Angle angle);
int DrawSprite(Sprite sprite);


https://habr.com/ru/articles/847178/

#cpp #programming

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

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

https://habr.com/ru/articles/844988/

#cpp #programming

👉 @cpp_lib
Memory Allocators 101 - пишем простой аллокатор памяти

Эта статья посвящена написанию простого аллокатора памяти на языке C.
Мы реализуем malloc(), calloc(), realloc() и free().

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

https://arjunsreedharan.org/post/148675821737/memory-allocators-101-write-a-simple-memory

#cpp #programming

👉 @cpp_lib
Написание минимального JIT-компилятора для x86-64 на C++

В этой статье я покажу, как написать минимальный, базовый JIT-компилятор для x86-64 на C++, который работает на macOS, Linux и потенциально может работать на Windows через WSL.

Для наших целей JIT-компиляция — это техника, с помощью которой программа генерирует машинный код во время выполнения, основываясь на вводе пользователя. Программа на C++ компилируется заранее (AOT, ahead of time), что обычно означает, что после того, как исходный код был скомпилирован для конкретной машины, его нельзя изменить во время выполнения (и с точки зрения безопасности это желаемая функция). Простое и полезное применение JIT-компилятора на C++ — это компиляция новой функции на лету, основанной на других функциях, уже определенных в исходном коде.


1 // hello_0.cpp
2 #include <iostream>
3 #include <string>
4
5 int main() {
6 // Get the user name
7 std::string name;
8 std::cout << "What is your name?\n";
9 std::getline(std::cin, name);
10 std::string hello_name = "Hello, " + name + "!\n";
11
12 // Greet the user
13 std::cout << hello_name;
14 }


https://solarianprogrammer.com/2018/01/10/writing-minimal-x86-64-jit-compiler-cpp/

#cpp #programming

👉 @cpp_lib
Написание минимального JIT-компилятора для x86-64 на C++. Часть 2

В моей предыдущей статье я показал, как сгенерировать машинный код для функции во время выполнения, скопировать этот код в часть памяти, помеченную как исполняемую, и вызвать её из C++. Теперь мы пойдём в обратную сторону — вызовем функцию на C++ из функции, сгенерированной во время выполнения. Как и раньше, я предполагаю, что вы пробуете код на Linux или macOS.

Если помните из первой части, мы начали с добавления инструкций машинного кода в std::vector и копирования этого кода на страницу исполняемой памяти. Хотя этот подход был хорош с дидактической точки зрения, на практике, вероятно, вы захотите записывать код напрямую в исполняемую память. Вот пример, как я предлагаю это сделать:


1 MemoryPages mp;
2 mp.push(0x48); mp.push(0xb8);


https://solarianprogrammer.com/2018/01/12/writing-minimal-x86-64-jit-compiler-cpp-part-2/

#cpp #programming

👉 @cpp_lib
Шеф, всё пропало

Ошибки программистов C++ — это отдельный вид искусства, вроде бы простой язык, но стоит отвлечься на чашечку кофе, как компилятор начинает вываливать простыню ворнингов пополам с ошибками, и иногда это больше похоже на древнеегипетские письмена, чем на нормальный выхлоп. Вы наверное и сами не раз сталкивались с разыменованием nullptr или перепутали (= и ==) по недосмотру. Часто причиной ошибкой является лень или невнимательность, или усталость - не зря появились суеверия "не комитить в пятницу вечером", "не кодить в состоянии изменного сознания" или "избегать кода под кофейным угаром", ну это когда три-четыре кружечки кофе навернул и пошел нести добрый код направо и налево.

https://habr.com/ru/articles/848662/

#cpp #programming

👉 @cpp_lib
Подборка Telegram каналов для программистов

Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин

https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux

1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах

Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus

Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах

GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin

Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано

Разработка игр 📌
https://t.me/game_devv Все о разработке игр

Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов

БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning

Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста

QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика

Шутки программистов 📌
https://t.me/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"

Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров

Английский 📌
https://t.me/UchuEnglish Английский с нуля

Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике

Excel лайфхак📌
https://t.me/Excel_lifehack

https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)

Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Туториал - Пишем оболочку на C

Легко считать себя "не настоящим программистом". Существуют программы, которые используют все, и легко возвести их разработчиков на пьедестал. Хотя разработка крупных программных проектов непроста, зачастую основная идея такого ПО довольно проста. Реализовать ее самому — это увлекательный способ доказать, что у тебя есть всё необходимое, чтобы быть настоящим программистом. Поэтому это руководство о том, как я написал свою упрощенную Unix-оболочку на C, в надежде, что это заставит других почувствовать то же самое.

Код описанной здесь, получившей название lsh, доступен на GitHub.



#define LSH_RL_BUFSIZE 1024
char *lsh_read_line(void)
{
int bufsize = LSH_RL_BUFSIZE;
int position = 0;
char *buffer = malloc(sizeof(char) * bufsize);
int c;

if (!buffer) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}

while (1) {
// Read a character
c = getchar();

// If we hit EOF, replace it with a null character and return.
if (c == EOF || c == '\n') {
buffer[position] = '\0';
return buffer;
} else {
buffer[position] = c;
}
position++;

// If we have exceeded the buffer, reallocate.
if (position >= bufsize) {
bufsize += LSH_RL_BUFSIZE;
buffer = realloc(buffer, bufsize);
if (!buffer) {
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}
}
}
}


https://brennan.io/2015/01/16/write-a-shell-in-c/

#cpp #programming

👉 @cpp_lib
Самые быстрые мьютексы

Cosmopolitan Libc хорошо известна своим «полиглотным жирным бинарным» хаком, который позволяем исполняемым файлам запускаться на шести операционных системах для AMD64/ARM64. Вас может удивить, что при этом она может быть лучшей С‑библиотекой для вашего продакшена. Чтобы продемонстрировать это, давайте сравним библиотеку мьютексов Cosmo с другими платформами.

Мы напишем простой тест, который создает 30 потоков, увеличивающих одно и то же число 100 000 раз. Это поможет проверить, насколько хорошо реализация мьютексов справляется с задачей при интенсивном использовании. По сути он будет следующим (см. сегмент внизу статьи для полного исходного кода).


int g_chores;
pthread_mutex_t g_locker = PTHREAD_MUTEX_INITIALIZER;

void *worker(void *arg) {
for (int i = 0; i < ITERATIONS; ++i) {
pthread_mutex_lock(&g_locker);
++g_chores;
pthread_mutex_unlock(&g_locker);
}
return 0;
}


https://habr.com/ru/companies/beget/articles/848318/

#cpp #programming

👉 @cpp_lib
This media is not supported in your browser
VIEW IN TELEGRAM
Создаём эмулятор CHIP-8 [C++]

Я всегда любил эмуляторы, потому что они позволяют мне играть в старые игры, которые нравились мне в детстве, поэтому я подумал, что было бы интересно узнать, как они работают, и как собрать такой эмулятор. Моя настоящая цель - создать эмулятор NES, но после некоторых исследований я решил прислушаться к советам интернета и начать с создания эмулятора для гораздо менее сложной CHIP-8. Это хорошая ступенька для перехода к NES.

https://austinmorlan.com/posts/chip8_emulator/

#cpp #programming

👉 @cpp_lib
Контейнеры Linux в 500 строках кода

Я уже много лет прямо или косвенно использую контейнеры Linux, но мне хотелось познакомиться с ними поближе. Поэтому я написал немного кода. Раньше это было 500 строк кода, клянусь, но я немного изменил его с момента публикации; в итоге получилось примерно на 70 строк больше.

Статья объясняет, как работают Linux-контейнеры, показывая минимальную реализацию на 500 строках кода. Она рассматривает ключевые концепции, такие как namespaces, cgroups и монтирование файловых систем, и даёт простое, но функциональное представление о механике, которая лежит в основе контейнеров, например, Docker. Основная цель — дать читателю ясное и практическое введение в то, как работают контейнеры на базовом уровне.

https://blog.lizzie.io/linux-containers-in-500-loc.html

#cpp #programming

👉 @cpp_lib
Создаем свой собственный Lisp

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

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

По пути мы узнаем о странной и удивительной природе Lisp, как развивать реальный проект, лаконично решать задачи и писать красивый код!

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

https://www.buildyourownlisp.com/contents

#cpp #programming

👉 @cpp_lib
This media is not supported in your browser
VIEW IN TELEGRAM
Бесплатное IT-образование в 2024

Отобрали для вас полезные телеграм-каналы, которые помогут освоить программирование и другие IT-направления

Выбирайте нужное и подписывайтесь:

👩‍💻 С/С++: @Cpportal
📱 GitHub: @git_developer
🤓 Книги айти: @portalToIT
⚙️ Backend: @BackendPortal
👩‍💻 Frontend: @FrontendPortal
👩‍💻 Python: @PythonPortal
👩‍💻 Java: @Java_Iibrary
👩‍💻 C#: @KodBlog
🖥 Базы Данных & SQL: @SQL
👩‍💻 Golang: @juniorGolang
👩‍💻 PHP: @PHPortal
👩‍💻 Моб. разработка: @MobDev
👩‍💻 Разработка игр: @GameDevgx
👩‍💻 DevOps: @loose_code
🖥 Data Science: @DataSciencegx
🤔 Хакинг & ИБ: @cybersecinform
🐞 Тестирование: @QAPortal
📱 Маркетинг: @MarketingPortal
🖥 Дизайн: @PortalToDesign

➡️ Сохраняйте себе, чтобы не потерять
Please open Telegram to view this post
VIEW IN TELEGRAM
Самый быстрый и безопасный PNG декодер в мире

TL;DR: декодер изображений PNG из стандартной библиотеки языка программирования Wuffs работает в 1.22–2.75 раза быстрее, чем libpng (широко используемая реализация PNG декодера на C с открытым исходным кодом), C-библиотеки libspng, lodepng и stb_image, а также самые популярные библиотеки для работы с PNG на Go и Rust.

Декодирование PNG с помощью Wuffs обсуждалось на Hacker News №1, Hacker News №2, /r/programming, /r/rust и lobste.rs.

https://habr.com/ru/articles/751462/

#cpp #programming

👉 @cpp_lib