Search
Write a publication
Pull to refresh
4
0

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

Send message

Как я писал свою первую игру для Dendy

Level of difficultyMedium
Reading time18 min
Views15K

Что такое Dendy? Что так любит детвора? Это электронная игра! Ооо, дендиии...

В этой статье я вам расскажу о своем первом опыте разработки игры для NES/Famicom консоли. Постараюсь рассказать о инструментах, которые использовал и о интересных особенностях разработки игр для Dendy с которыми столкнулся во время создания игры.

Погрузиться в мир Dendy

Когда Zig круче Rust — массивы перечислений, позволяющие сэкономить память

Reading time9 min
Views8.5K

Перечисления (или размеченные объединения), отличающиеся вариативностью и, следовательно, размером, провоцируют в Rust серьёзную фрагментацию памяти. Дело в том, что нам приходится выделять достаточно данных, чтобы их хватило на самый крупный вариант.

Читать далее

Сборка мусора: как это делается в системном программировании

Level of difficultyMedium
Reading time9 min
Views10K
image

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

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

Объединим две эти цели – и обнаружим, сколько же существует странных и магических методов для неблокирующего совместного использования данных в разных потоках. Давайте поговорим об одном из этих методов – «чтение-копирование-запись» (RCU).
Читать дальше →

C++ и космические технологии

Level of difficultyEasy
Reading time5 min
Views9.7K

В сегодняшней публикации мы поговорим о новом новшестве в мире C++ - операторе "спейсшип" (spaceship), он же тройное сравнение.

По катом много нудных подробностей.

Устраивайтесь поудобнее, взлетаем.

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

Reading time12 min
Views9K

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

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

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

Читать далее

Compile Time Dependency Injection в С++: как обуздать зависимости не прибегая к позднему связыванию

Level of difficultyMedium
Reading time26 min
Views9.4K

Начав свою карьеру в качестве C# разработчика, я постоянно сталкивался с использованием техники внедрения зависимостей (Dependency Injection). За то время, что я работаю с C++, я не заметил здесь такого же широкого распространения этой идеи.

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

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

Читать далее

Поговорим об оптимизирующих компиляторах. Сказ шестой: цикловые инварианты

Level of difficultyMedium
Reading time12 min
Views7K

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

Читать далее

Как хакнуть себе голову? Эффективно переключаем состояния на примере IT-специалистов

Level of difficultyMedium
Reading time23 min
Views53K

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

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

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

Читать далее

Самый суровый магнитный ключ

Level of difficultyMedium
Reading time6 min
Views26K
Приветствую всех!

Думаю, многим из нас хорошо известно, что в ныне применяемых домофонных ключах, хоть их иногда называют магнитными, никаких магнитов на деле нет.

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

image

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

Создаем свой собственный язык программирования с использованием LLVM. Часть 1: Лексический и синтаксический анализ

Reading time36 min
Views32K

Это первая статья из цикла о том, как создать свой собственный ООП язык программирования с использованием LLVM.

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

Читать далее

Чудовищное уравнение 45-ой степени, которое Франсуа Виет решил в 16 веке

Level of difficultyEasy
Reading time4 min
Views88K
О Франсуа Виете не слышал только ленивый: в школе все любили, обладающий особым шармом, его метод решения квадратных уравнений, а чуть позже, интересуясь историей математики, понимали, что он — отец современной системы буквенных обозначений в математике.
image

Одна из страниц его биографии известна чуть менее широко. Связана она с решением поистине чудовищно сложного для тех времен алгебраического уравнения 45-ой степени!
Читать дальше →

Создаём свое собственное ZigBee устройство на чипах от Espressif ( ESP32-C6/H2)

Level of difficultyMedium
Reading time9 min
Views63K
Первые упоминания про новые чипы от Espressif были еще два года назад. Но тогда про них мало что было известно, и они были не доступны в свободной продаже, и SDK был на самом начальном этапе. И вот наконец их анонсировали, и можно купить, так давайте же сделаем на них что нибудь хорошее.

Я давно хотел себе домой СО2 сенсор, но то денег не хватает, то жаба квакает… А тут мне пришла заказанная плата на базе ESP32-C6 и я решил попробовать собрать сам, благо различных Ардуино модулей был целый ящик. Если Вам интересно что у меня получилось добро пожаловать под кат. (длинная портянка и много картинок)
Читать дальше →

Постмодерн в криптографии или как в книгах плодятся симулякры третьего порядка

Level of difficultyEasy
Reading time12 min
Views4.9K

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

Читать далее

Гипотеза Пойи — один из самых ярких примеров того, что в математике «верить на слово» нельзя

Level of difficultyEasy
Reading time5 min
Views65K

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

Читать далее

Альтернативы Compute Module 4 от Raspberry Pi: Orange Pi CM4 и Banana Pi BPI-CM2

Reading time4 min
Views9.4K
Fotoram-io-37

Три года назад Raspberry Pi Foundation представила Compute Module 4. Новый модуль был шагом вперед по сравнению с предыдущими моделями. Он более быстрый, у него больше возможностей, включая сетевые функции. Например, у модуля есть опция Wi-Fi 802.11b/g/n/ac, Bluetooth 5.0.

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

Проектируем самодельный 16-битный CPU в 2023 году

Level of difficultyMedium
Reading time14 min
Views26K

Для создания самодельного CPU требуется большое количество чипов логики. И в самом деле разумно, что для реализации регистров, счётчика команд, АЛУ и других компонентов CPU на логике TTL или CMOS действительно необходимо существенное число чипов. Но сколько конкретно?

Я попытался оптимизировать свой самодельный CPU, минимизировав количество чипов логики, чтобы ответить на вопрос: какое минимальное число интегральных схем требуется для полного по Тьюрингу CPU без CPU?

Мой ответ: для создания 16-битного последовательного CPU нужно всего 8 интегральных схем, включая память и тактовый генератор. Он имеет 128 КБ SRAM, 768 КБ FLASH и его можно разгонять до 10 МГц. Он содержит только 1-битное АЛУ, однако большинство из его 52 команд работает с 16-битными значениями (последовательно). На своей максимальной скорости он исполняет примерно 12 тысяч команд в секунду (0,012 MIPS) и, среди прочего, способен выполнять потоковую передачу видео на ЖК-дисплей на основе PCD8544 (Nokia 5110) с частотой примерно 10 FPS.
Читать дальше →

Идиоматический код на Rust для тех, кто перешел с других языков программирования

Level of difficultyMedium
Reading time6 min
Views22K

Привет, дорогие читатели! В предыдущей моей статье "Как легко перейти с Java на Rust" я делился с вами советами по переходу на Rust и уменьшению количества "потерянной крови" на этом пути. Но что делать дальше, когда вы уже перешли на Rust, и ваш код хотя бы компилируется и работает? Сегодня я хочу поделиться с вами некоторыми идеями о том, как писать идиоматический код на Rust, особенно если вы привыкли к другим языкам программирования.

Читать далее

Ква! Как писали код во времена Quake

Level of difficultyMedium
Reading time14 min
Views38K

Как говорил Джон Кармак: "Фокус — это умение определить, на что вы не будете тратить время". Так давайте не будем тратить время на аннотацию и приступим к анализу кода легендарной Quake World.

Погнали!

Пять продвинутых техник инициализации в C++: От reserve() до piecewise_construct

Reading time9 min
Views14K

От операций с динамическими контейнерами до констант времени компиляции — C++ предлагает много интересных техник (как в этом знаменитом меме :)). В этой статье мы рассмотрим несколько продвинутых методов инициализации: от reserve() и emplace_back для контейнеров, до piecewise_construct и forward_as_tuple для кортежей. Благодаря этим техникам мы можем уменьшить количество временных объектов и более эффективно создавать переменные.

Давайте приступим!

Читать далее

Архитектура и программирование Sony Playstation 1

Reading time16 min
Views20K

По сравнению с другими, ранее описанными мной архитектурами, архитектура Sony Playstation 1 (PSX) - сравнительно современная. И дело даже не в годе выпуска (1994) - скорее это общее ощущение сочетания новых возможностей и исчезновения привычных старых, которые были типичными для компьютеров и приставок предыдущей эпохи.

PSX (это сокращение пошло от первоначального названия проекта - Playstation X) имеет в качестве центрального процессора MIPS R3000, работающий на частоте 33МГц. Причём, Sony отказалось от сопроцессора для вычислений с плавающей точкой и вместо него сопроцессором в PSX является так называемый GTE (Geometry Transformation Engine), выполняющий различные операции с фиксированной точкой над векторами и матрицами.

Читать далее

Information

Rating
7,329-th
Registered
Activity