Компиляция большого C++ проекта разрастается до неприличных времён, но можно написать замену Clang/GCC/CL.EXE, начав с парсера.
• Парсер не пишется руками: грамматика на своём языке QapDSLv2
• На выходе CST, а не AST — с пробелами и комментариями
• Покрыто почти всё: 16 уровней приоритетов операторов, шаблоны, лямбды, структурное связывание.
• Неоднозначности решены грубо:
T<1>(2) всегда шаблон, struct S {...};🔥 Статья
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
В прошлом посте
stride_view отдавал из end() пустую stride_sentinel{}, а итератор сам таскал внутри end_ и сравнивался с ним. Это уже был sentinel — просто самый скромный его вид. Сегодня посмотрим, на что sentinel способен, когда условие конца живёт в нём самом.Обычный
end() в STL — это итератор на позицию за последним элементом. Чтобы его получить, позицию надо знать заранее.Sentinel ломает это правило. Он не хранит позицию — он хранит условие остановки. Итератор шагает вперёд и на каждом шаге как бы спрашивает: «мы уже приехали?». Sentinel отвечает, глядя не на свой адрес, а на то, куда сейчас показывает итератор.
У C-строки нет заранее известного конца: он определяется на лету — идём, пока не встретим
'\0'. Идеальный кейс для sentinel:struct null_sentinel_t {
// 🔴 Сравниваем не адреса, а СОДЕРЖИМОЕ:
// итератор == концу, если он смотрит на '\0'
bool operator==(const char* ptr) const { return *ptr == '\0'; }
};
inline constexpr null_sentinel_t null_sentinel{};
struct cstring_range {
const char* ptr;
const char* begin() const { return ptr; } // обычный итератор
null_sentinel_t end() const { return null_sentinel; } // sentinel другого типа!
};
// Использование
const char* str = "hello";
for (char c : cstring_range{str}) {
std::cout << c; // hello
}begin() возвращает const char*, а end() — null_sentinel_t. Разные типы! Range-based for это разрешает ещё с C++17, а C++20 добавляет it != null_sentinel сам разворачивается в !null_sentinel.operator==(it). Пишешь один operator== — и обе стороны, и != работают бесплатно.🥝 Ленивый конец. Не нужно звать
strlen и проходить строку дважды — конец «находится» прямо во время итерации.♾️ Бесконечные диапазоны. У генераторов, потоков,
views::iota без верхней границы конца-позиции просто нет. Sentinel — единственный способ вообще описать такой диапазон.⚡️ Дешёвое сравнение. Проверить условие (
== '\0', счётчик дошёл до нуля) часто быстрее, чем сравнивать два итератора.Свой sentinel писать нужно не всегда. В STL живёт
std::default_sentinel_t (объект std::default_sentinel) — та самая пустая заглушка, которой пользуются counted_iterator, istream_view и куча вьюх. А для честно бесконечных диапазонов есть std::unreachable_sentinel — «мы не доедем никогда», и компилятор с чистой совестью выкидывает проверки границ.🫰
std::ranges поддерживает нестандартные sentinel-ы из коробки: достаточно, чтобы для пары <итератор, sentinel> выполнялся концепт std::sentinel_for — и твой тип поедет во все алгоритмы ranges наравне с обычными итераторами.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1
Forwarded from Proglib.academy | IT-курсы
Самое интересное, что разница здесь не столько в модели
На живом демо покажем, как один и тот же запрос работает без агентной системы и с ней
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4
Во многом его ценность определяет опыт тех, кто его разрабатывает и ведёт.
Об этом как раз новый пост Proglib Academy
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
Forwarded from Proglib.academy | IT-курсы
Курс «ИИ для разработчиков» ведут практики из ведущих российских IT-компаний
В ближайшее время познакомим вас с каждым преподавателем. Программа курса — по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1😁1
Forwarded from Азбука айтишника
🔀 Как айтишнику оформить отношения с работодателем: разбираем ТД, ГПХ, самозанятость и ИП
Подробный гайд по видам трудоустройства в IT-сфере. Разбираем особенности, налоговые ставки, социальные гарантии и подводные камни каждого из популярных форматов сотрудничества.
👉 Статья
Азбука айтишника
#свежак
Подробный гайд по видам трудоустройства в IT-сфере. Разбираем особенности, налоговые ставки, социальные гарантии и подводные камни каждого из популярных форматов сотрудничества.
👉 Статья
Азбука айтишника
#свежак
👍1😁1
Разберут, как превратить AI из инструмента для отдельных задач в часть инженерного процесса
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Proglib.academy | IT-курсы
Для человека это естественная часть работы. У Claude Code этого контекста по умолчанию нет — только задача и инструкции, которые ему дали.
Поэтому в большой команде недостаточно просто выбрать хорошую модель.❗️ Нужно ещё объяснить ей, как у вас устроена разработка: какие подходы приняты, что обязательно проверять и по каким правилам принимать решения.
GenAI Data Platform, и с этой проблемой сталкивался не раз
Покажет живое демо, разберём, как встроить AI в процесс разработки так, чтобы он реально помогал, а не добавлял ещё один повод для споров на ревью.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека задач по C++ | тесты, код, задания
Forwarded from Библиотека задач по C++ | тесты, код, задания
Что такое loop unrolling (развёртывание цикла)?
Anonymous Quiz
22%
Полное удаление цикла и замена его вызовом функции
7%
Перенос всех вычислений цикла в отдельный поток
7%
Автоматическое кэширование результатов каждой итерации
53%
Дублирование тела цикла ради уменьшения накладных расходов
11%
Замена цикла рекурсией для лучшей читаемости кода
❤5😁2
Ниже — бесплатный вебинар о том, как этого избежать 📍
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Forwarded from Proglib.academy | IT-курсы
Где-то есть тесты, где-то их забыли. Где-то агент следует архитектуре проекта, где-то предлагает решение, которое с ней не сочетается.
Завтра покажем, как передать AI инженерный контекст команды и не превратить его внедрение в ещё один источник хаоса.
Бесплатно. 60 минут доклада + 30 минут вопросов.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Forwarded from Библиотека Go-разработчика | Golang
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
C++23 значительно расширил библиотеку Ranges. Рассмотрим важнейшие добавления.
Раньше преобразование view в контейнер было неудобным:
// C++20: нужно было делать так
std::vector<int> v = {1, 2, 3, 4, 5};
auto view = v | views::filter([](int x) { return x > 2; });
std::vector<int> result(view.begin(), view.end()); // громоздко!
C++23 добавляет
std::ranges::to:// C++23: красиво и лаконично
auto result = v
| views::filter([](int x) { return x > 2; })
| std::ranges::to<std::vector>();
// result = {3, 4, 5}
// Можно указать тип элементов явно
auto strs = views::iota(1, 6)
| views::transform([](int x){ return std::to_string(x); })
| std::ranges::to<std::vector<std::string>>();
// strs = {"1", "2", "3", "4", "5"}
// Работает и с другими контейнерами
auto s = some_range | std::ranges::to<std::set>();
auto m = pairs_range | std::ranges::to<std::map>();
views::zip_transform — zip + transform в одномstd::vector<int> a = {1, 2, 3};
std::vector<int> b = {10, 20, 30};
// Попарная сумма
auto sums = views::zip_transform(std::plus{}, a, b);
// 11, 22, 33views::adjacent — соседние N-киstd::vector<int> v = {1, 2, 3, 4, 5};
// Пары соседних элементов
for (auto [a, b] : v | views::adjacent<2>) {
std::cout << "(" << a << "," << b << ") "; // (1,2) (2,3) (3,4) (4,5)
}
// Тройки
for (auto [a, b, c] : v | views::adjacent<3>) {
std::cout << a+b+c << " "; // 6 9 12
}views::adjacent_transform — скользящая функцияstd::vector<int> v = {1, 2, 3, 4, 5};
// Скользящий максимум из двух соседних элементов
auto sliding_max = v | views::adjacent_transform<2>(
[](int a, int b) { return std::max(a, b); }
);
// 2, 3, 4, 5views::slide — скользящее окноstd::vector<int> v = {1, 2, 3, 4, 5};
// Скользящее окно размером 3
for (auto window : v | views::slide(3)) {
for (int x : window) std::cout << x << " ";
std::cout << "| ";
}
// 1 2 3 | 2 3 4 | 3 4 5 |views::cartesian_product — декартово произведениеstd::vector<int> xs = {1, 2};
std::vector<char> ys = {'a', 'b', 'c'};
for (auto [x, y] : views::cartesian_product(xs, ys)) {
std::cout << "(" << x << "," << y << ") ";
}
// (1,a) (1,b) (1,c) (2,a) (2,b) (2,c)C++23 добавляет
std::generator<T> — корутину, которая является диапазоном:#include <generator> // C++23
std::generator<int> fibonacci() {
int a = 0, b = 1;
while (true) {
co_yield a;
auto next = a + b;
a = b;
b = next;
}
}
// Использование как обычного диапазона!
for (int f : fibonacci() | views::take(10)) {
std::cout << f << " "; // 0 1 1 2 3 5 8 13 21 34
}
// Можно комбинировать с другими адаптерами
auto big_fibs = fibonacci()
| views::filter([](int x) { return x > 100; })
| views::take(5);
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3
Кажется, безобидная замена
< на <=. Но теперь в сет уникальных чисел попадают дубликаты, а find иногда не находит существующий элемент.struct Cmp {
bool operator()(int a, int b) const { return a <= b; }
};
std::set<int, Cmp> s;
s.insert(5);
s.insert(5);
// s.size() == ? find(5) работает?📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Forwarded from Proglib.academy | IT-курсы
Агент работает только с тем контекстом, который ему дали. Если документация неполная или устарела, он начинает додумывать — отсюда появляется неверный код.
Также разберём, как выбирать модель под задачу: Claude, DeepSeek, Qwen и другие
Впереди 7 недель работы со своим репозиторием. Вебинары проходят вживую и остаются в записи.
Стартуем 31 августа. До конца июля можно присоединиться по ранней цене, а доступ к материалам останется бессрочным
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
🐸 Подборка вакансий для C++-разработчиков за неделю
C++ Developer (Chromium) — Sigma Browser — Офис (Санкт-Петербург)
Разработчик C++ — от 100 000 ₽ Офис (Новосибирск)
Разработчик С++ — Удалёнка
Разработчик С++/QT — от 160 000 и до 300 000 ₽ Удалёнка
Руководитель / Начальник отдела разработки ПО (C++) — Доход по договоренности, Офис (Санкт-Петербург)
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#вакансии
C++ Developer (Chromium) — Sigma Browser — Офис (Санкт-Петербург)
Разработчик C++ — от 100 000 ₽ Офис (Новосибирск)
Разработчик С++ — Удалёнка
Разработчик С++/QT — от 160 000 и до 300 000 ₽ Удалёнка
Руководитель / Начальник отдела разработки ПО (C++) — Доход по договоренности, Офис (Санкт-Петербург)
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#вакансии
👍2