Обновить
278.48

C++ *

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

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

Суперклей ABI, или Как применять C++ где угодно

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

Привет, Хабр! Меня зовут Михаил, я backend-разработчик в SimbirSoft. Время от времени я сталкиваюсь с понятием «двоичный», он же «бинарный» интерфейс приложений, или просто ABI (application binary interface). Все найденные мной материалы на эту тему были либо очень скудны, либо вели к многостраничным эпопеям, которые напоминали сборную солянку из описания, например, архитектуры процессора x86, сдобренную стандартом С++.

Но потом я наткнулся на перевод публикации Тита Винтерса в рабочей группе 21 (WG21) — комитета по стандартизации языка C++. В ней он поднимает вопрос поддержки обратной бинарной совместимости. Значит, вопрос актуальный — это и стало мотивацией для написания этой статьи. В ней я сфокусируюсь на примерах и практике использования С++ в других языках программирования. Материал будет полезен middle+ и senior-разработчикам, а также всем, кто хочет сделать гибкий, долгоживущий, легко настраиваемый под заказчика продукт.

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

Читать далее

Обучение C++, UTF-8 с первой программы

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

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

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

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

Читать далее

Сборка docker image под windows

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

Тем кто собирает что-то под windows и задумался о версионировании сборочного окружения.

Как ведь бывает, прилетает баг, нужно пересобрать старый релиз, а сборочный агент уже с другим окружением. И даже если вы каким-то образом сохраните нужное окружение, как защитить от его от самих сборок? Делать снапшоты, откатываться, или разворачивать агенты с некого золотого образа и прочее.

Версии окружения поднимаются, само окружение усложняется, требование команд к окружению растут и расходятся. Как тут всем угодить?

Исторически так сложилось, что в linux docker заехал как родной, а вот в windows вроде бы есть, но про него не слышно, на Хабре так уж точно. Поэтому если вы решили это попробовать, то эта статья для вас.

Читать далее

Сборка AppImage: Пошаговое руководство с готовыми скриптами

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

В этой статье мы рассмотрим процесс создания AppImage — универсального формата для распространения Linux-приложений. Ниже представлена ссылка на набор скриптов, который автоматизирует сборку AppImage, включая поиск зависимостей, копирование библиотек и упаковку приложения.

Читать далее

Демистификация unaligned access undefined behavior в C

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

Неопределённое поведение (Undefined Behavior, UB) в C и C++ — одна из причин, по которым разработчики всё чаще ищут языки с полностью определённой семантикой. Одним из самых коварных UB является unaligned access, с точки зрения стандарта C это, например, когда происходит попытка разыменовать указатель как uint32_t, а значение указателя (адрес) не кратно четырём. Один из частых сценариев использования, приводящих к такому UB - получение данных по сети и их интерпретация как чисел.

Читать далее

QapDSL — декларативное описание AST и парсеров для C++

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



QapDSL — декларативное описание AST и парсеров для C++


QapDSL — это специализированный язык (DSL), который позволяет описывать абстрактные синтаксические деревья (AST) и правила их разбора для языков программирования, прежде всего C++. Такая формализация помогает автоматизировать построение парсеров, генерацию кода, анализ исходников и даже рефакторинг.



Зачем нужен QapDSL?


  • Компактно и наглядно описывать структуру и грамматику языка.
  • Автоматически генерировать C++-структуры, парсеры, сериализаторы и визиторы.
  • Ускорять эксперименты с языками, создавая прототипы компиляторов и анализаторов.
  • Упрощать анализ и рефакторинг сложных языков, в т.ч. C++.


Пример QapDSL-описания


Рассмотрим, как описывается объявление класса C++ на QapDSL:


t_class{
  string keyword;
  t_sep sep0;
  string name;
  t_sep sep1;
  TAutoPtr<t_parents> parents;
  t_sep sep2;
  TAutoPtr<t_class_body> body;
  t_sep sep3;
  {
    M+=go_any_str_from_vec(keyword,split("struct,class,union",","));
    O+=go_auto(sep0);
    M+=go_str<t_name>(name);
    O+=go_auto(sep1);
    O+=go_auto(parents);
    O+=go_auto(sep2);
    O+=go_auto(body);
    O+=go_auto(sep3);
    M+=go_const(";");
  }
}

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

Editor Scripting в Unreal Engine: создание утилит для генерации Actor и Data Asset

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

Привет, Хабр! В этой статье я поделюсь своим опытом создания утилит в Unreal Engine, которые автоматизируют процесс генерации Actor Blueprint и Data Asset. Эти утилиты значительно упрощают работу дизайнерам уровней, помогая сократить время на рутинные задачи и минимизировать ошибки, а также могут быть полезны в широком спектре задач, связанных с разработкой.

Мы рассмотрим, как использовать Editor Utility Widgets на практике, чтобы упростить работу в редакторе. Основная часть будет выполнена в Blueprint, но для решения отдельных задач нам также понадобятся функции на C++. Помимо этого, я расскажу о важных аспектах работы с Asset Registry, фабриками ассетов и Subobject Data Subsystem.

Читать далее

Можно ли собрать в одном большом гайде всё, что полезно знать о языке C и его применениях

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

Мне показалась очень интересной тема открытая в недавней статье

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

 Во вступлении там написано:

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

Мне кажется полезно все таки обозначить в каком смысле язык C — это основа, и чем он обеспечивает фундамент. Я рад что имею возможность сформулировать что-то в данном направлении не со слов иностранного авторитета, а не базе собственного опыта который, тем не менее, формировался на основе анализа-применения действующих решений-теорий сформулированных во многом иностранными специалистами, но надеюсь с примесью собственной креативности в какой-то степени. Ну и хочется озвучить свой ответ на вопрос: "Когда C — идеальный выбор?", может в интерпретации: "А бывает ли язык Си идеальным выбором?"

По моему, тема очень полезная, хотелось бы увидеть и поддержать ее развитие.

Читать далее

Дебажим баги в дебаггере x64dbg. «Шаг с выходом» в GUI

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

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

Сделать шаг с выходом

Алгоритмическое мышление для дата-сайентистов: как писать код, который экономит время и место

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

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

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

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

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

Дебажим баги в дебаггере x64dbg. Без дебаггера

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

Ни один процесс разработки программы не проходит без отладки. Современные IDE обеспечивают программиста встроенным отладчиком. Однако бывают ситуации, когда использование IDE для отладки избыточно или невозможно, и тогда на помощь приходят автономные отладчики, один из которых — x64dbg.

Сделать шаг с заходом

Игрушечная имплементация чисел с фиксированной точкой в C++

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

В C++ нет базового типа чисел с фиксированной точкой, в стандартной библиотеке также нет классов для них. В тоже время работа с числами с плавающей точкой (double, float) часто может быть неочевидна (например, ответьте на вопрос: ассоциативна ли операция сложения над ними?), вдобавок язык предоставляет (часто критикуемую) возможность перегрузки арифмитических операторов, подталкивая нас к созданию собственного типа данных.

Прежде чем писать код, давайте повторим мат. часть, а именно о представление чисел в типах uint8_t, int8_t и особенностях арифмитических операциях над ними. Итак, сложенение двух uint8_t происходит по модулю 256, то есть 1+2 = 3, но 1 + 255 = 0, для int8_t отрицательные значения можно ввести следущим образом: отрицательные числа соответсвуют тем безнаковым числам из uint8_t которые складываясь по модулю 256 дадут ноль, то есть -1 будем в памяти выглядить как 255 (FF). Границы типа int8_t -128...+127, для отрицательных чисел старший бит всегда равен 1. При умножении двух int8_t получаем результат типа int16_t, частное от деления int16_t на uint8_t будет иметь тип uint8_t. Все эти сведения носят аболютно тривиальный характер, но, они необходимы для дальнейшего понимания статьи.

Итак, перейдём к основной идее: что если мы мысленно возьмем значение типа int8_t и скажем, что теперь это не число единиц, а скажем, число 1/4 (проговорим словами: это число показывает сколько четвертых частей в исходном числе)? После чего инкапсулируем эту перменную в поле класса и перегрузим для него основные арифмитичекие операторы и напишем свой operator string() для правильного вывода таких чисел. Ниже, можно посмотреть, что получается из этой идеи.

Смотреть код

Возможности С++: от стандартных алгоритмов до диапазонов (Ranges)

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

Привет, Хабр! Меня зовут Николай, я разработчик С++ в SimbirSoft. В предыдущей статье мы с вами рассмотрели применение стандартных алгоритмов в повседневном коде и их преимущества над обычными циклами. В продолжение этой темы мне хотелось бы рассказать о недостатках стандартных алгоритмов и способах их решения с помощью библиотеки Ranges. Практические примеры я разбил на три части: в первой показаны обычные циклы, во второй — вариант написания с помощью алгоритмов (но не всегда можно это сделать), в третьей – с использованием Ranges. Этот материал будет полезен тем разработчикам, которые хотят применять новые стандарты и подходы у себя на проектах.

Читать далее

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

SCARA-Laser. Часть 2. Переизобретаем велосипед

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

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

https://howtomechatronics.com/projects/laser-engraving-with-diy-arduino-scara-robot-complete-guide/ - лазерный гравер на SCARA-кинематике с контроллером Arduino Mega. Ровно то, что я хотел. Но этой статьи бы не было, если бы я просто скачал модельки, распечатал и собрал по инструкции.

Читать далее

Адаптация алгоритма Дейкстры для расчёта кратчайших путей в IP-сетях

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

Адаптация алгоритма Дейкстры для расчёта кратчайших путей в IP-сетях.

Для сетевиков, программистов и интересующихся.

Читать далее

Connection pool для pqxx

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

В процессе изучения бекэнда, как нового для меня направления в программировании, я столкнулся с необходимостью оптимизации управления соединениями. Поискав в интернете существующие решения для библиотеки pqxx (C++ API для PostgreSQL), я обнаружил, что хотя они и выполняют свою задачу, ни одно из них не соответствовало моим требованиям.

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

В данной статье я хочу поделиться процессом разработки и обсудить некоторые моменты реализации.

Читать далее

На грани между exceptions и std::expected

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

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

Читать далее

Как выжать 1,5 терафлопса производительности для 32-битных чисел с плавающей точкой на одном процессоре M1

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

Если вы занимаетесь обучением крупных современных нейросетей, эта статья будет вам не совсем в тему, ведь у A100 скорость в сто раз выше (156 терафлопсов).


Так что же интересного в этих полутора терафлопсах?


  • работа на одном ядре MacBook Air 2020 года с питанием от батареи;
  • выполнение с задержкой ~0,5 наносекунды на инструкцию.

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

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

Опыт портирования Eclipse 4diac на KasperskyOS CE

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

В настоящий момент в промышленности активно внедряется высокотехнологичная стратегия развития, называемая индустрией 4.0, которая предполагает активное внедрение информационных технологий в промышленное производство, а также масштабную автоматизацию бизнес процессов и использование систем искусственного интеллекта. Перспективным подходом к построению гибких систем управления для автоматизированных систем, разрабатываемых для индустрии 4.0, является использование языков программирования стандарта IEC 61499.

Автоматизация производственных процессов помимо очевидных преимуществ имеет и ряд сложностей. Одной из проблем является риск подвергнуться кибератакам. Возможным решением является разработка защищенной реализации для среды исполнения IEC 61499 для KasperskyOS. Для этого требуется реализовать киберимунную систему управления путем портирования среды исполнения IEC 61499 Eclipse 4diac forte на операционную систему KasperskyOS.

Читать далее

Как Я: стажировался бекенд-разработчиком (C++) в Яндексе по программе Deep Dive (в формате буткемпа)

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

Продолжаю свою мини-серию статей "Как Я", созданную поддержать начинающих соискателей. Сегодня расскажу как проходила стажировка и немного о внутренней кухне Яндекса. Много информации не будет (NDA), но все равно попытаюсь рассказать исчерпывающе. Итак, погнали.

Вперед к рассказу

Вклад авторов