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

Пользователь

Отправить сообщение

Вариантность в программировании

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

До сих пор не можете спать, пытаясь осмыслить понятия ковариантности и контравариантности? Чувствуете, как они дышат вам в спину, но когда оборачиваетесь ничего не находите? Есть решение!


Меня зовут Никита, и сегодня мы попытаемся заставить механизм в голове работать корректно. Вас ожидает максимально доступное рассмотрение темы вариантности в примерах. Добро пожаловать под кат.

Читать дальше →

Stack Trace в C++ или велосипедирование, уровень «Быдлокод»

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

DISCLAMER


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

Вступление


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

Основы управления ресурсами в C

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

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

Управлении ресурсами включает в себя распределение, использование и освобождение различных типов ресурсов. В языке программирования C автоматическое управление памятью отсутствует, эта задача ложится на плечи разработчиков.

В этой статьи рассмотрим основные возможности для работы с ресурсами в C.

Читать далее

Правило трех и пяти в C++: что это такое и зачем они нужны?

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

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

Сегодня я хочу поговорить о двух правилах С++: правиле трех и правиле пяти.

Правильное понимание этих правил способно уберечь код от утечек и неопределенных поведений.

Читать далее

Анатомия эффективного собеседования. Что делать и чего не делать на собеседовании

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

Я провел много собеседований за свою карьеру, возможно, несколько сотен в общей сложности. Мы отбирали и подготавливали людей для собеседований в компаниях вроде Microsoft и Google, так что это были весьма сложные собеседования. В начале я был не очень хорош в этом и делал всяческие ошибки. Надеюсь, за годы я стал лучше понимать на что обращать внимание и теперь смотрю на это под другим углом. Когда я начинал много лет назад, в нашей компании не было формального обучения навыкам проведения собеседований; считалось, что если ты хороший разработчик - ты можешь проводить собеседования. Очевидно, это не так; много отличных инженеров не могут и, что самое важное, не должны проводить собеседования без подготовки.

Читать далее

Создание своего UEFI приложения

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

Привет, Хабр! Мне 16 лет, я студент, учусь на первом курсе колледжа на программиста. Начал увлекаться низкоуровневым программированием на Ассемблере и C/C++

Я заметил что на Хабре есть множество статей о написании своих простых "загрузчиков" для BIOS-MBR, которые выводят на экран "Hello World!". И при этом практически нет ни одной статьи о создании того же самого, но только для UEFI, хотя будущее именно за ним, ведь BIOS уже давно устарел! Это я и хочу исправить в этой статье.

Читать далее

Это слишком опасно для C++

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

Некоторые паттерны стало возможно использовать на практике только благодаря безопасности Rust по памяти, а на C++ они слишком опасны. В статье приведён один такой пример.

Работая над внутренней библиотекой, написанной на Rust, я создал тип ошибок для парсера, у которых должна быть возможность сделать Clone без дублирования внутренних данных. В Rust для этого требуется указатель с подсчётом ссылок (reference-counted pointer) наподобие Rc.

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

Читать далее

Каков C++ в gamedev'e?

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

Хотел написать продолжение к статье Что почитать игровому программисту? про использование С++ в игровых движках, но размышления свернули куда-то не туда.

Завороженно смотрю как и какими темпами идет развитие языка в последние годы, и понимаю, что получить и особенно применить возможности С++20/3 в разработке игр и движков получится хорошо, если с опозданием лет эдак в пять, как раз на следующее поколение консолей, если вообще получится. Сейчас плюсы в игрострое зависли где-то между 14 и 17 стандартом, Сони только-только выкатила свою версию компилятора с полной поддержкой 17 стандарта, а учитывая реактивность игровых студий в изменении кор пайплайнов, что-то новое начнут только в новых проектах. Менять коня, т.е. компилятор посреди разработки игры равносильно стрельбе не только по ногам себе, но и соседям программистам: работает - не чини.

Если смена компилятора и стандарта не даст гарантированного прироста скорости работы больше 5%, то бюджет и людей я не одобрю. (с)

Знакомство с кодовой базой больших движков дает понимание уровня и объёмов кода в продакшене и в тулзах, и ситуация вырисовывается такая, что эти объемы стали в индустрии, что называется "too big to fall", т.е. написать что-то новое, уровня движков вроде Unity/Unreal/Dagor на другом языке, будь он хоть в тысячу раз безопаснее и в десять раз быстрее не получится, но попытки конечно делаются. И чем дальше продолжается поддержка существующих проектов на плюсах, тем меньше возможности выбора остается.

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

По техдолгам будут платить наши джуны

Краткий обзор развития лямбда-выражений в C++11, C++14, C++17 и C++20

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

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

Сегодня рассмотрим лямбда-выражения в C++ и их эволюцию с момента появления в стандарте C++11 и до последних обновлений в C++20.

Лямбда-выражения в C++ — это анонимные функции, которые позволяют писать инлайн-выражения прямо там, где они используются. С их помощью можно легко определять функции обратного вызова, передавать их в функции высшего порядка или использовать для инициализации функциональных объектов.

Читать далее

C++23: четыре новых ассоциативных контейнера

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

В C++23 появились четыре новых ассоциативных контейнера: std::flat_map, std::flat_multimap, std::flat_set и std::flat_multiset, которые являются полноценной заменой упорядоченных ассоциативных контейнеров std::map, std::multimap, std::set и std::multiset. Они были добавлены в C++23 по двум причинам: расход памяти и производительность.

Читать далее

Как Rust меняет мышление разработчика

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров50K
Я страшно ненавижу C++. Обычно я люблю программирование, но каждый проект, с которым я имел дело на C++, ощущался как монотонная рутина. В январе 2023 года я пошёл по пути изучения Rust, поэтому теперь могу сказать, что знаю язык системного программирования, который действительно люблю использовать.

Первый стабильный релиз Rust появился в 2015 году, и каждый год, начиная с 2016, он признаётся в Stack Overflow’s Annual Developer Survey самым любимым языком (в 2023 году эта категория называется «обожаемый»). Почему же разработчики, ощутившие вкус Rust, не могут отказаться от его использования? Похоже, в мире прогремевших наследников C/C++ репутация растёт только у Rust. Как же этот язык, появившийся на сцене меньше десятка лет назад, стал настолько популярным?

Ржавый красный краб Феррис по версии Midjourney

Кривая обучения оказалась крутой. Я нашёл многое, что мне нравится в Rust, но постоянно попадал в его ловушки. Однако в конечном счёте именно препятствия и проблемы, с которыми столкнулся, я научился любить больше всего.

Я начну историю с разговора о том, что легко полюбить — со среды Rust, управления пакетами и документации. Затем я расскажу о системе типов и типажах (trait). Далее я поведаю о тех возможностях тестирования и test driven development, которые становятся возможными благодаря Rust. Наконец, мы обсудим самую запутанную и сбивающую с толку часть — одержимость Rust тем, кто какой переменной владеет.
Читать дальше →

Опечатки, нулевые указатели и коварный таб: 33 фрагмента в библиотеке GTK

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

Использование TAB в строковом литерале


GTK – популярный фреймворк с открытым исходным кодом для создания графических интерфейсов, который интересно проверять с помощью анализатора PVS-Studio. Тем более, что предыдущую проверку мы делали около 3 лет назад, а значит, наверняка найдём в нём новые ошибки.


Очень не хотелось частично повторять введение из прошлой статьи "Выявляем опечатки в проекте GTK 4 с помощью PVS-Studio", но подозреваю, что далеко не все читатели знакомы с GTK. Поэтому вкратце: библиотека позволяет кроссплатформенно реализовывать графический пользовательский интерфейс. Полностью бесплатна и имеет открытый исходный код, лицензированный под GNU GPL, что позволяет использовать её в любых проектах (даже коммерческих).

Читать дальше →

Показываем видео в терминале

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

Приветствую, сегодня я опробую OpenCV, библиотеку для работы с видео, на примере простой задачи - символами ASCII вывести видеоролик в терминал.

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

Читать далее

Учёные заявили об открытии «недостающего закона природы», объясняющего эволюцию всего во Вселенной, включая нас с вами

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

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

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

Читать далее

Алгоритм поиска ключевых словосочетаний «на пальцах». Анализируем новости

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

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

Чтобы упростить себе задачу поиска и обобщения информации IT-энтузиасты применяют технологии генеративно обученных чат-ботов. Наиболее широкое распространение получил  ChatGPT. Яндекс, в свою очередь, добавил в браузер YandexGPT, который позволяет тезисно ознакомиться с содержанием страницы. Всё чаще вакансия Prompt-инженера начинает встречаться на hh и Хабр Карьере. Специалисты и чат-боты помогают конечному пользователю экономить время для поиска необходимой информации. 

Но что делать, если возможности обратиться за помощью к подобным технологиям нет? Указанные выше языковые модели нельзя интегрировать в собственные проекты, сценариев их использования много, но они всё равно ограничены. 

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

Читать далее

Чтение на выходные: «Идеальный программист» Роберта Мартина

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

Роберт Мартин — инженер, программист, консультант в области разработки ПО. Известен как автор книг о чистом коде, архитектуре и Agile. Пока что мы прочитали одну из его книг — «Идеальный программист», и уже хотим продолжить чтение по теме. Поговорим о том, чем зацепила эта работа и даже немного поспорим с рандомными отзывами в интернете (в том числе на Хабре) о ней.

Читать далее

Параллелизм без потоков: очевидно и вероятно

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

"Зацепила" крайняя статья про многопоточность [1]. Но, с другой стороны, - а что ожидал автор, предложив исходное решение без синхронизации? Получил то, что и должен был получить. На другое рассчитывать было бы достаточно наивно. Во-первых, потому, что используется весьма  проблемная модель параллелизма. Во-вторых, расплывчатое представление о решаемой проблеме (по крайней мере, если судить по описанию). Но это уже мое личное мнение и хотелось бы его пояснить. И не просто так, а подкрепив решением.

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

Но, может, автор достиг чего-то нового? Да, вроде, нет. То, что нужно синхронизировать - не новость. Нов ли предложенный механизм синхронизации? Не знаю, поскольку не специалист в  Python. Надеюсь такие найдутся и ответят на этот вопрос.

Покажу, как подобные проблемы решаю я. Причем совсем не прибегая ни к многопоточности, ни к всему тому, что нынче на волне успеха в так называемом параллельном программировании. И, как сказал автор статьи, "не спешите закрывать вкладку", а посмотрите, что будет дальше. А вдруг вам понравится?

Но для начала...

Краткая история вопроса

Использование переменной-счетчика в качестве общего ресурса - отнюдь не новость. Это элементарный и естественный подход к демонстрации проблем множества параллельных процессов. Насколько я припоминаю, впервые с подобным примером в серьезной литературе я столкнулся в книге [2].Предлагаемые там решения не вызвали восторга, а потому были задвинуты. И, кстати, об этом я не испытываю сожаления.

Читать далее

Неограниченный доступ к знаниям: библиотека Стандартных Шаблонных Конструкций

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

Есть много причин почему доступ научным статьям и книгам должен быть свободным:

Во-первых, это прекрасно

Во-вторых...

Как написать идеальный запрос для ChatGPT

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

Управление промтами – важный навык для работы с нейросетями. Однако иногда не знаешь, как лучше их прописать. В результате ответы, генерируемые чат-ботами, оказываются очень общими и неточными.

Я потратил много часов на различные курсы по промт-инжинирингу и постоянно тестировал различные структуры запросов, чтобы построить формулу, которая могла бы приблизить меня к качественным ответам.

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

ChatGPT я пользовался через русифицированный сервис MashaGPT, который работает без VPN и виртуальных сим-карт. Все примеры взяты из него.

Читать далее

Выделение регионов памяти в C++: советы и приёмы

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

Эта статья обсуждалась на Hacker News.

В течение минувшего года я шлифовал мой подход к выделению регионов. Практика показывает, что это эффективный, простой и быстрый подход; обычно его используют в качестве средства для сборки мусора без издержек. В зависимости от того, что нам требуется, в аллокаторе может быть всего 7–25 строк кода — идеально для случаев, когда мы работаем без среды исполнения. Теперь, когда я окончательно сформулировал ключевые аспекты моего подхода, самое время их задокументировать и рассказать вам о том, что мне удалось выучить. Определённо, это не единственный возможный подход к выделению регионов. Я просто расскажу вам о приёмах, которые сам выработал для упрощения программ и искоренения ошибок.

Регион (арена) — это буфер памяти и смещение до этого буфера. Изначально это смещение равно нулю. Чтобы выделить объект, нужно взять указатель на него с заданным смещением, увеличить смещение на размер объекта, а затем вернуть указатель. Этим дело не ограничивается — например, нужно обеспечить выравнивание и доступность. До этого мы ещё дойдём. Объекты не высвобождаются каждый по отдельности. Напротив, сразу высвобождаются целые группы ранее выделенных объектов, и смещение откатывается к более раннему значению. Когда не предусмотрены собственные времена жизни для отдельных объектов, деструкторы писать также не требуется, а вашим программам не приходится прямо во время выполнения обходить структуры данных и убирать ненужные. Кроме того, больше можно не беспокоиться об утечках памяти.

Читать далее

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность