Как стать автором
Поиск
Написать публикацию
Обновить
132.33

C *

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

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

Синтаксис, синглтон и смертельный ромб в С++: взгляд опытного разработчика на C

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

Давайте знакомиться: меня зовут Анатолий Семятнёв, я и моя команда разрабатываем ПО для опорных сетей 5G в YADRO. В IT-сфере работаю давно, и мой опыт в основном связан с языком С: занимался Board Support Package (BSP) и драйверами, много работал с операционной системой QNX. 

До того, как начал полноценно работать на С++, сталкивался с языком в нулевые, писал на С++98. Тем не менее все это время я краем глаза поглядывал, что происходит в С++, и хотел вернуться к программированию на этом языке. Читал книги, делал пет-проекты, смотрел записи конференций и митапов по С++. А когда пришел в YADRO, стал писать на С++.

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

• Ключевые концепции — explicit, final, default, string — и как их использовать.

• Инициализацию мемберов с помощью пустого брейс-листа.

• Синглтон Майерса в корутинах.

• «Смертельный ромб» и все, что связано с виртуальным наследованием.

Читать далее

Два лагеря C++

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

Сейчас ведётся много споров и дискуссий о будущем C++.

Не только на Reddit и одном оранжевом веб-сайте, но и совершенно точно на официальных заседаниях комитета по стандарту C++.

Абсолютное состояние (языка C++)

Похоже, мы находимся в следующей ситуации:

Evolution Working Group (EWG) языка C++ как раз достигла консенсуса по внедрению P3466 R0 - (Re)affirm design principles for future C++ evolution:

Это означает отсутствие поломок ABI, сохранение совместимости компоновки с кодом на C и предыдущими версиями C++.

Также это означает отсутствие «виральных аннотаций» (например, аннотаций времени жизни).

Удвоение усилий по множеству несовместимых задач, например, отсутствия поломок ABI и принципа zero overhead.

Плохо это или хорошо, но это (в буквальном смысле) удвоение усилий по развитию текущей траектории языка C++.

Читать далее

Реализация паттерна Bridge в чистом C

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

Привет, коллеги! Сегодня будем говорить о паттерне «Мост» (Bridge).

Простыми словами, «Мост» позволяет разделить две иерархии: одну — абстракций, другую — реализаций. Паттерн становится полезен, когда есть несколько способов реализации функционала, и хочется сохранить возможность гибкой замены одной реализации на другую.

Читать далее

TrapC: безопасный «наследник» C и C++. Что за язык?

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

Стартап Trasec разрабатывает новый язык программирования, который называется TrapC. Авторы проекта провозглашают его «наследником» C и C++. ЯП обещает устранить главные проблемы «предков», включая небезопасное управление памятью. Для этого в TrapC внедрены автоматические проверки и защита программ от типичных ошибок. Это делает невозможным выход за границы буфера или обращение к несуществующей памяти и значительно усложняет жизнь хакерам. Давайте оценим новинку.

Читать далее

Самые быстрые страусы: выбираем способ организовать обмен прерываниями между машинами QEMU c KVM и без

Уровень сложностиСложный
Время на прочтение21 мин
Количество просмотров4.3K

QEMU позволяет эмулировать работу не только одной отдельной машины, но и связывать несколько независимых машин между собой. Для организации такой связи их обычно объединяют в одну сеть, например с использованием virio-net-pci. Но виртуальный ethernet — не единственный способ, связь может быть и более близкой и плотной: общая память и mailbox, линии gpio и даже NTB.

Быстрая работа связанных QEMU машин приятна при разработке/отладке и очень важна при массовом прогоне автотестов в CI: нужна как высокая пропускная способность, так и низкая задержка передачи сообщения. Для одной из задач с коллегами из отдела системного программирования YADRO я оптимизировал часть такой связки, а именно — обмен прерываниями. В статье расскажу о дизайне нескольких подходов организации IQI, разберу внутреннее устройство QEMU и поделюсь, как оправдались наши ожидания. 

Читать далее

Как работает bytearray в Python? Смотрим реализацию на C

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

Привет! Меня зовут Никита Соболев, я core-разработчик языка программирования CPython, а так же автор серии видео про его устройство.

Сегодня я хочу рассказать, как bytearray устроен внутри.

Под катом будет про: интересные оптимизации, разные аллокаторы в CPython, C pointer math, детали устройства данной структуры данных.

Если вам такое интересно или целиком незнакомо – добро пожаловать!

Читать далее

Создаём простой копирующий сборщик мусора

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

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

Я подумал, что это будет здорово, ведь в коде из статьи уже имелся крошечный, но функциональный мутатор, а набор тестов был призван это подчеркнуть; это значит, что мы можем сравнивать производительность и реализацию копирующего сборщика и обычного сборщика.
Читать дальше →

Синтезатор ФАПЧ (ADF4113)

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

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

В статье рассматриваются тонкости создания синтезаторов с функцией фазовой автоподстройки частоты (ФАПЧ, или PLL) на основе чипа ADF4113.

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

Кроме того, описана измерительная схема и результаты измерений. В завершение, предлагаются альтернативные технические решения для разных условий и ТЗ.

Читать далее

12 канальный ШИМ на STM8. А также альтернативная библиотека и make в linux

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

В среде профессионалов, которые измеряют партии своих устройств в килоюнитах и считают контроллеры, меньше чем на 100 выводов, ерундой, часто всплывает одна парадоксальная тема. А какой контроллер сейчас стоит рублей 20-30, и подойдет для бомж DIY? AVR после продажи компании ATMEL подорожали, STM8 после кризиса полупроводников подорожали тоже, но не так сильно. Я купил свои 15 портовые STM8S003 по 25 рублей за штуку. Конечно, CH32V003 дышат им в спину, но о них позже.

код, схема, видео

Создание XDP eBPF программы с использованием C и Golang: пошаговое руководство

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

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

В этом пошаговом руководстве мы рассмотрим процесс создания XDP eBPF программы с использованием языков C и Golang.

Читать далее

История C и C++. Часть первая: появление и стандартизация C, C with Classes становится C++

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

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

Читать далее

Небезопасный Rust сложнее C

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

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

В прошлом году я написал программу Photohash для индексации своего NAS и поиска дубликатов фото без использования хэширования, независимого от поворота изображения, и перцептивного хэширования. Чтобы полноценно задействовать все ядра процессора и диски, эта программа распределяет работу между воркерами, отвечающими за вычисления и ввод-вывод. Происходит это распределение по каналам, представляющим синхронизированные очереди задач.
Читать дальше →

UART-терминал из LCD-дисплея, PS/2 клавиатуры и любого МК

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

Совсем коротенький рассказ — о довольно бесполезной но забавной штуковине, извините :)

Как-тораз я написал интерпретатор BASIC, который можно использовать на контроллере хоть с 1кб памяти (в частности AVR / Arduino). В основном мы им пользовались через Bluetooth‑модуль с телефона (я уж рассказывал). Но у меня руки чесались сделать своеобразный «терминальчик» — ну я и сделал.

Как видите — в качестве экрана тут дисплей 4 строки по 20 символов. А клавиатура полноценная — обычная c PS/2 разъёмом. Между ними и UART‑ом воткнут контроллер (младший STM32). Вообще‑то можно было без него, реализовать общение с клавиатурой и дисплеем в том же контроллере где интерпретатор крутится — но тогда это не был бы терминал, его нельзя было бы использовать с любым другим UART‑интерфейсом.

Покажу картинки, код — и немножко расскажу про устройство. А если сами строили что‑то похожее — расскажите и вы :)

Что ж, посмотрим!

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

DPDK: 100 больших и маленьких багов

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

100 багов в DPDK


В своей обители в Р'лайхе мёртвый Ктулху спит в ожидании своего часа. А в C коде проекта DPDK спит множество ошибок, и тоже в ожидании своего часа. Давайте посмотрим, какие из них может выявить анализатор PVS-Studio.

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

Как мы обнаружили потенциальные атаки при помощи штрих-кодов

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

Фаззинг — одна из самых успешных методик для поиска багов безопасности, о нём постоянно говорят в статьях и на отраслевых конференциях. Он стал настолько популярным, что большинство важного ПО, казалось бы, должно подвергаться тщательному фаззингу. Но это не всегда так. В этом посте мы покажем, как фаззили библиотеку сканирования штрих-кодов ZBar, и почему, несмотря на ограниченность по времени, обнаружили в ней серьёзные баги: запись в буфер стека out-of-bounds, которая может привести к произвольному выполнению кода при помощи зловредного штрих-кода, и утечку памяти, которую можно использовать для выполнения атаки «отказ в обслуживании» (denial-of-service).

ZBar — это опенсорсная библиотека для считывания штрих-кодов, написанная на C. Она поддерживает впечатляющий набор форматов штрих-кодов, в том числе и QR-коды. Её использовал один из наших клиентов, поэтому мы решили вкратце проверить её безопасность. Учитывая огромный объём кода, вручную тестировать его мы не могли. Так как мы не нашли упоминаний о фаззинге этой библиотеки, то решили попробовать его.
Читать дальше →

Ответ на статью о «Наиболее быстром интерпретаторе»

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

Недавно была опубликована статья под заголовком "Глобально оптимальный, восьмой и наиболее быстрый вид интерпретаторов байткода". Несколько тезисов из статьи вызвали у меня сомнения в их справедливости. Об этом я попробовал написать ряд комментариев тире вопросов к указанной статье. Но основной лейтмотив всех ответов сводился к тому - "а ты напиши свою статью". Подход не столько инженерно-научный, сколько детсадовский. Мне бы хватило и содержательных ответов в формате комментариев, но как говорится - уговорили :).

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

Читать далее

Конечный Aвтомат Аппаратного I2C-Трансивера

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

В этом тексте я показал как конечный автомат может работать ядром для драйвера аппаратного I2C трансивера.

Меня удивляет, что в оригинальном коде от вендоров микроконтроллеров программисты прошли мимо конечных автоматов при написании I2C кода внутри своих официальных uHAL. Непорядок...

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

Читать далее

Забытая повесть «Машины, пишущие код»

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

Патрик через минуту вернулся с небольшой пыльной коробкой. Мы с Дейвом смотрели, как Патрик ее открывает и достает сетевой свитч — такой староватый из тех времен, когда им еще делали железные корпуса. Он воткнул блок питания в розетку и аккуратно выпрямил шнур CAT-5, чтобы подключить этот свитч к нашей сети. Я хотел наорать на него за всю излишнюю осторожность в такой момент. Дейв сидел рядом со мной, нехарактерно тихо.

Я замер, пока у Патрика не получалось попасть шнуром в нужный порт. Я глядел на передние огоньки — Дейв, наверное, тоже. Мои глаза намокли. Патрик впихнул шнур. Сразу же огоньки загорелись и быстро замигали. Я почувствовал, как мои руки и лецо покраснели, а в углу глаза увидел как Дейв встал и открыл рот, будто пытаясь что-то сказать. Затем он нырнул лицом в сложенные руки, затем его вырвало.

Читать повесть

Глобально оптимальный, восьмой и наиболее быстрый вид интерпретаторов байткода

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

Совершать невозможное и раздавать пинки здравому смыслу — в этом и состоит жизнь членов Гуррен-Дана! (C) Камина

Эта статья вступает в техническую полемику со статьей 2015 года за авторством Atakua, подходы из которой я и атакую. Atakua исследует 7 видов интерпретаторов байткода, но делает это без уважения - быстрейшей оказывается двоичная трансляция, которая, по сути, уже не интерпретатор байткода, а форма Ahead-Of-Time компилятора. Эта двоичная трансляция транслирует байткод в машинный код, представляющий собой цепочку вызовов скомпилированных сервисных процедур. Тех самых, что в интерпретаторе байткода отвечают за выполнение каждого опкода.

Но Atakua не выжал из интерпретаторов байткода всю скорость которая возможна. Так что эта статья - туториал: как написать интерпретатор байткода, который может обгонять JIT/AOT-компиляцию по скорости. Интересно? Читайте дальше!

Бенчмарк прилагается. Будет немного хардкора и ни одной сгенерированной нейросетью картинки!

Читать далее

Невероятно быстрый подсчёт байтов

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

Оказалось, что тема суммирования целых чисел в кодировке ASCII в Haswell со скоростью memcpy гораздо популярнее, чем я мог ожидать. Именно поэтому я решил поучаствовать и в другом челлендже в жанре HighLoad: подсчёт uint8. В настоящее время я занимаю всего лишь 13 место в списке лидеров, проигрываю первому месту около 7%, но уже узнал немало интересного. В этом посте я полностью опишу моё решение, в том числе, удивительный паттерн считывания из памяти. Используя его, можно примерно до 30% (по сравнению с обычным последовательным доступом) повысить скорость передачи в контексте одноядерных рабочих нагрузок, ограниченных размером кэша. По-видимому, этот метод малоизвестен.

Как и в других постах автора, программа настроена для следующих входных характеристик высоконагруженной системы: Intel Xeon E3-1271 v3 @ 3,60 ГГц, ОЗУ 512 МБ, Ubuntu 20.04. В ней используется только AVX2, а AVX512 не используется.

Читать далее

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