Как стать автором
Обновить
18
25.3
Sergey Miryanov @zzzzzzerg

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

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

Глубина кроличьей норы: бинарная граница и ABI C++

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

Вопрос ABI (Application Binary Interface), бинарной границы и бинарной совместимости в C++, раскрыт на просторах интернета не так хорошо как хотелось бы. Особенно сложно в его изучении приходится новичкам, потому что эта тема связана со множеством деталей нарочно скрытой от глаз программиста имплементации языка.

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

Подробнее о статье:

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

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

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

В рамках всей статьи будут рассмотрены темы: системный стек, системные регистры, динамическая память, детали механизма виртуальных функций, стандарт С++ и реальная имплементация, детали механизма исключений, copy elision при линковке библиотек, шаблоны, POD-типы и ODR violation.

Break -in- ABI
Всего голосов 12: ↑10 и ↓2+12
Комментарии40

Голый Линукс — запуск ядра-одиночки

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

Итак, Linux - не операционная система, а только ядро для неё. Всё остальное приходит от проекта GNU (и других). И вот интересно - на что годится ядро само по себе?

Эта статья - очень "начального" уровня. Устроим маленький эксперимент - создадим чистую виртуальную машину и попробуем запустить ядро Linux "без всего". Или почти "без", т.к. нам понадобится загрузчик ОС - и какая-нибудь "пользовательская программа" (её мы сотворим сами). Конечно, продвинутые пользователи Linux такой "эксперимент" могут провести просто отредактировав параметры запуска при включении - но наш рассказ всё же для тех кто почти (или совсем) не в теме :)

Бонусом чуть-чуть коснёмся системных вызовов и пару слов скажем о других ядрах.

Загружаемся... Погружаемся...
Всего голосов 55: ↑55 и ↓0+67
Комментарии19

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

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

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

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

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

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

Читать далее
Всего голосов 71: ↑70 и ↓1+84
Комментарии48

Записываем PNG без мам, пап и внешних библиотек

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

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

Формат изображения PNG известен с 1996 года, а на Хабре опубликовано несколько статей о декодировании этого формата. И ни одной — о кодировании. Я расскажу, как сохранить PNG своими руками на случай, если вам тоже придется это делать. Например, в академических целях.

Под катом вас ждет подробный разбор каждого байта на множестве иллюстраций.
Читать дальше →
Всего голосов 89: ↑89 и ↓0+113
Комментарии17

13 млрд счётчиков и 220 000 RPS на запись: проектируем Key-Value-хранилище для Спамообороны

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

Привет! Меня зовут Тимур Нургалиев, я тимлид в команде Спамообороны. Яндекс Почта обрабатывает миллиарды писем, из них около 20–30% — спам. Технологии, которые мы создаём в команде, блокируют массовые рассылки и отправляют вредоносные письма в соответствующую папку.

В статье я расскажу про архитектуру нашего высоконагруженного сервиса, немного погружу в контекст и расскажу, как мы спроектировали Key‑Value‑хранилище, которое в режиме реального времени хранит и отдаёт признаки массовости письма.

Читать далее
Всего голосов 20: ↑20 и ↓0+25
Комментарии9

Тернистый путь к единому хранилищу метрик

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

Метрики — один из трёх базовых типов телеметрии и основа мониторинга любого приложения. Но что, если необходимо собирать их в рамках крупной и высоконагруженной экосистемы? Как собрать метрики с десятков тысяч хостов разных ЦОДов и сотен типов приложений? И как упростить инженерам настройку правил алертинга и создание дашбордов?

Привет, Хабр! Я Филипп Бочаров, руководитель стрима мониторинга и наблюдаемости в МТС Digital. Мы занимаемся всеми типами телеметрии: логами, трассировкой и, конечно, метриками. Единое хранилище метрик экосистемы — часть нашей платформы наблюдаемости. Для этих целей мы используем агент Telegraf и большой кластер VictoriaMetrics, принимающий 10+ миллионов сэмплов в секунду.

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

Читать далее
Всего голосов 17: ↑16 и ↓1+22
Комментарии0

Бложим как фрики

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

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

Будет обмазан Markdown, Hugo, GitHub (в качестве CD и халявного хостинга) и Obsidian

Страдать далее
Всего голосов 15: ↑12 и ↓3+15
Комментарии8

Настройка VSCode для разработки в Tauri

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

Как настроить VSCode для удобной работы с проектом Tauri. Установим пару плагинов и настроим launch.json и tasks.json.

Настроить
Всего голосов 5: ↑5 и ↓0+11
Комментарии2

Как устроены серийники для Windows, и как восстановить стёршийся COA

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

Эта история начинается с того, что я попытался переустановить Windows на ноутбуке, доставшемся мне вот с такой наклейкой Certificate of Authenticity (COA): часть символов серийника видны хорошо, остальные – в большей или меньшей степени угадываются; но несколько попыток ввести серийник «на глаз» успехом не увенчались. Пришлось углубляться в вопрос подробнее.

Читать далее
Всего голосов 128: ↑127 и ↓1+165
Комментарии29

Псевдотонирование изображений: одиннадцать алгоритмов и исходники

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

Псевдотонирование: обзор



Про сегодняшнюю тему для программирования графики — псевдотонирование (дизеринг, псевдосмешение цветов) — я получаю много писем, что может показаться удивительным. Вы можете подумать, что псевдотонирование — это не то, чем программисты должны заниматься в 2012 году. Разве псевдосмешение — не артефакт история технологий, архаизм времён, когда дисплей с 16 миллионами цветов программистам и пользователям мог только сниться? Почему я пишу статью о псевдотонировании в эпоху, когда дешевые мобильные телефоны работают с великолепием 32-битной графики?

На самом деле псевдотонирование по-прежнему остаётся уникальным методом не только по практическим соображениям (например, подготовка полноцветного изображения для печати на чёрно-белом принтере), но и по художественным. Дизеринг также находит применение в веб-дизайне, где этот полезный метод используется для сокращения числа цветов изображения, что уменьшает размер файла (и трафик) без ущерба для качества. Он также используется при уменьшении цифровых фотографий в формате RAW в 48 или 64 бита на пиксель до RGB в 24 бита на пиксель для редактирования.

И это — применения лишь в области изображений. В звуке дизеринг тоже играет ключевую роль, но боюсь, обсуждать здесь дизеринг аудио я не буду. Только псевдотонирование изображений.
Читать дальше →
Всего голосов 66: ↑64 и ↓2+62
Комментарии23

Type Loopholes: решая нерешаемое. Рефлексия времени компиляции

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

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

Эта техника позволяет решать многие задачи, некоторые из которых будут рассмотрены в статье:

Узнать, какие параметры принимает конструктор типа.

Узнать, с какими шаблонными параметрами вызывался метод/функция с ADL.

Как сделать метапрограммирование с типами более похожим на обычный код, где есть состояние.

Читать далее
Всего голосов 14: ↑13 и ↓1+14
Комментарии3

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

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

С релизом .NET 8 в арсенале C# разработчиков появилась новая коллекция – FrozenDictionary. Особенность этого словаря в том, что он неизменяемый, но при этом обеспечивает более быстрое чтение по сравнению с обычным Dictionary. Я неспроста разбил результаты на обложке по типам – используемые во FrozenDictionary алгоритмы сильно зависят от типа ключа, размера словаря или даже, например, количества строковых ключей одинаковой длины. В этой статье подробно разберем, насколько FrozenDictionary быстрее и почему.

Заглянуть под капот
Всего голосов 44: ↑43 и ↓1+55
Комментарии11

Продираемся сквозь сети в Kubernetes: Load-Balance, BGP, IPVS и все такое прочее

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

Привет, Хабр! Мы в команде Nova Container Platform сделали перевод статьи для тех, кто хочет разобраться, как строить сети в Kubernetes. Делюсь им, надеюсь, вам будет полезно.

В мире Kubernetes мы каждый день слышим, как ipvs сравнивают с iptables, или, скажем, pureLB с metalLB, или же виртуальную топологию (overlay) с физической (underlay), или Nodeport с Loadbalance, и т.д. Сейчас я вам все растолкую.

Читать далее
Всего голосов 10: ↑10 и ↓0+14
Комментарии0

Как мы написали конкурентные структуры данных на C++ и научились их верифицировать

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

Привет! В команде ВКонтакте мы переписываем рантайм движков баз данных — они становятся быстрее, надёжнее, а ещё с новым рантаймом проще писать код. Однако есть нюанс: в новом рантайме много конкурентных структур данных, в том числе нужных для работы с корутинами из С++20. Появляется интересная задача — проверять корректность этих конкурентных структур данных до выхода кода в продакшен.

Для решения этой задачи команда ВКонтакте вместе со студентами из университетов ИТМО и СПбГУ работала над научно-исследовательским проектом — верификацией конкурентных структур данных на языке C++. В этой статье подробно расскажем, как мы в рамках проекта проверяли корректность наших конкурентных структур данных и заодно исправили найденную в нашем новом рантайме ошибку.

Читать далее
Всего голосов 31: ↑31 и ↓0+37
Комментарии32

Погружение в матрицу: расширение RISC-V от T-Head

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

Продолжим нашу «антологию матричных расширений» текстом про независимое матричное расширение RISC-V от компании T-Head. 

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

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

Начать погружение
Всего голосов 24: ↑24 и ↓0+31
Комментарии3

Представлена языковая модель Mistral Large 2 размером 123B. Как запускать. Локальный Сopilot. Открытый конкурент GPT-4o

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

MistralAI, вслед за LLaMA 3.1 405B, представила свою флагманскую модель с открытыми весами Mistral Large 2 (Mistral-Large-Instruct-2407). Mistral всегда отличалась очень качественными открытыми моделями, и, судя по всему, эта будет не исключением.

Веса открыты, размер контекста составляет 128k, размер модели 123B, модель была обучена на 80 языках программирования и десятках естественных языков, включая русский. Модель хорошо себя показывает как в рассуждениях, так и в математике и программировании.

Читать далее
Всего голосов 22: ↑22 и ↓0+28
Комментарии12

Как подружить DynamoRIO и LibFuzzer

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

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

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

Надеюсь, кому-нибудь это да пригодится ;-)

Читать далее
Всего голосов 1: ↑1 и ↓0+3
Комментарии3

SARIMAX vs Экспоненциальное сглаживание: Когда простота побеждает

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

Продолжаю рассказывать про первые шаги в моделировании временных рядов. В этой статье разбираю модели SARIMAX и Экспоненциальное сглаживание, с примерами картинок и кода.

Читать далее
Всего голосов 10: ↑10 и ↓0+16
Комментарии12

Рисуем фракталы на Rust и CUDA

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

Фракталы — это бесконечные самоподобные фигуры. Они определяются простыми математическими формулами, которые создают удивительную красоту!

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

Читать далее
Всего голосов 31: ↑31 и ↓0+36
Комментарии71

Как пересобрать ядро для WSL2 и остаться в живых

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

Мы активно пользуемся WSL2 для того, чтобы открывать линуксовые коры в Visual Studio. Для обеспечения консистентности символов и коры мы монтируем squashfs образ, созданный в целевой системе. После очередного апдейта целевого дистрибутива, у нас всё сломалось - squash монтировался, но мог посередине файла выдать ошибку чтения, записав в dmesg что-то типа

SQUASHFS error: xz decompression failed
Всего голосов 29: ↑29 и ↓0+39
Комментарии2
1
23 ...

Информация

В рейтинге
306-й
Зарегистрирован
Активность