Как стать автором
Обновить
113.88
Рейтинг

Ненормальное программирование *

Извращения с кодом

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

Кастомный аллокатор для закрытого 3rd

Ненормальное программирование *C++ *Отладка *Реверс-инжиниринг *Разработка под Windows *

Существует ряд ситуаций, когда это имеет смысл. От полного контроля памяти, до вынужденной необходимости. К примеру, одна из возможных ситуаций:
1. Мы используем alignment аллокаторы.
2. Мы перегружаем какой-то класс и данные от нашей 3rd зависимости.
3. 3rd зависимость не использует alignment аллокаторы.

Читать далее
Всего голосов 4: ↑3 и ↓1 +2
Просмотры 1K
Комментарии 3

Новости

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

Высокая производительность *Ненормальное программирование *Open source *Программирование *C++ *

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

Читать далее
Всего голосов 13: ↑12 и ↓1 +11
Просмотры 3.7K
Комментарии 45

Превью профессии «говорящий с нейросетями»

Ненормальное программирование *C++ *C *Data Engineering *

Все уже слышали, что openAI выпустили в свет свою новую нейросеть-ассистента, так что я решил попробовать на что она способна и описать свой опыт взаимодействия с этим.. Этой... Сущностью.

Разговор будет вестись как с человеком в вежливой форме, так как оказалось, что нейросеть очень хорошо запоминает = )

Начнём с чего-то простого, попросим сгенерировать на языке CMake простую программу

Читать далее
Всего голосов 90: ↑87 и ↓3 +84
Просмотры 25K
Комментарии 111

Мысли о разумном Maintainability в этом несовершенном мире

Блог компании Киберпротект Ненормальное программирование *Программирование *Совершенный код *Управление разработкой *

Привет, Хабр! Сегодня мне хотелось бы поговорить о такой интересной метрике, как Maintainability - возможность вести доработки и улучшения при создании сложных систем. Ведь при развитии любого программного продукта возникает вопрос, сколько будет стоить его поддержка и развитие. Мы в Киберпротекте разрабатываем линейку продуктов для защиты данных и сегодня это — миллионы строк кода, требующие ощутимых затрат как на поддержку, так и на расширение возможностей или исправление найденных ошибок. В этой статье я делюсь своими мыслями о том, как оценить Maintainability, из чего она состоит, можно ли ее измерить, и как принимать правильные решения при работе с кодом.

Читать далее
Всего голосов 12: ↑10 и ↓2 +8
Просмотры 654
Комментарии 3

VAOP как low code инструмент для разработки telegram BOT и не только

Ненормальное программирование *Совершенный код *Алгоритмы *Визуальное программирование *
Recovery mode

Contact us: [t.me/evaclick]

Когда в апреле 2021 года я опубликовал статью на хабре: Введение в v-agent ориентированное программирование, в которой сформулировал идеологию и заложил основной понятийный аппарат новой методологии программирования: v-agent, va-script, va-box, action, direction и т.п., то напомнил себе изобретателя радио - Сделал Маркони радио, включил, а слушать то нечего. Наверное подобное происходит со всеми пионерами новых методологий программирования.

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

Читать далее
Всего голосов 6: ↑4 и ↓2 +2
Просмотры 1K
Комментарии 14

Как устроена работа thread_local переменных: разбираемся и добавляем поддержку в учебную ОС

Ненормальное программирование *C++ *Assembler *Системное программирование *Компиляторы *

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

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

Код расположен в двух репозиториях.

Читать далее
Всего голосов 7: ↑6 и ↓1 +5
Просмотры 2.2K
Комментарии 4

Пишем на С++ вектор, умеющий расширяться без копирования элементов

Ненормальное программирование *C++ *Системное программирование **nix *

В языке С есть функции malloc, free и realloc. При использовании последней вы можете написать этакий расширяющийся массив из примитивных типов или структур (классов-то нет), который, можно надеяться, не будет копировать все данные при каждом расширении. В С++ есть встроенный класс vector, который представляет из себя расщиряющийся массив, но он так не умеет: при каждом расширении вектора выделяется новый участок памяти и все элементы перемещаются на него (по возможности, с использованием move-семантики). Но ведь, если можно каждый раз не копировать все старые элементы на новое место, вектор должен работать быстрее? В этой статье я попробую написать вектор, который умеет расширяться без копирования элементов.

Код приведён здесь.

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

Читать далее
Всего голосов 17: ↑13 и ↓4 +9
Просмотры 12K
Комментарии 69

Пишем try-catch в C не привлекая внимания санитаров

Ненормальное программирование *C *
Из песочницы

Конструкция try-catch есть во всех широко используемых сегодня языках, кроме C. Не в силах мириться с вопиющей несправедливостью, попробуем написать свою реализацию этой конструкции

Читать далее
Всего голосов 52: ↑52 и ↓0 +52
Просмотры 11K
Комментарии 24

Пишем свой ROM BIOS

Блог компании Timeweb Cloud Ненормальное программирование *Assembler *Старое железо
Tutorial

Со стародавних времён хотел попробовать создать собственный ROM BIOS, который будет записан в отдельную микросхему и будет выполнять какие-то полезные действия. Например, ROM BIOS установлен в видеокартах (по крайне мере старых), контроллерах дисков и много где ещё — это фактически расширения обычного BIOS. Понимаю, что это всё старьё и тягаться с возможностями современного UEFI бессмысленно, но мне очень хотелось создать свой собственный образ, который находится физически в отдельной микросхеме и работает при старте системы. Поэтому пришлось даже для этих целей найти старый комп.

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

В этой статье мы с вами разберём создание своего ROM BIOS, дальше я расскажу про тонкости и нюансы, напишу низкоуровневый «Hello world», сделаю настоящий интерпретатор BASIC ROM, который стартует при включении компьютера, как в первых IBM PC.
Читать дальше →
Всего голосов 138: ↑137 и ↓1 +136
Просмотры 13K
Комментарии 67

Игры наших бабушек

Ненормальное программирование *Программирование микроконтроллеров *Разработка под Arduino *История IT Игры и игровые консоли

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

Читать далее
Всего голосов 31: ↑31 и ↓0 +31
Просмотры 8K
Комментарии 14

Непредсказуемые инвестиции с Python

Ненормальное программирование *Python *Программирование *API *Венчурные инвестиции
Из песочницы

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

Кому не важна реализация то вот готовый код с минимальными инструкциями по запуску. Ну или можно воспользоваться телеграмм ботом для всего-того же самого, но в удобном формате (если он не работает, то скорее всего я перестал платить за админку 😞). А в самом низу есть небольшое подведение итогов.

Читать далее
Всего голосов 12: ↑12 и ↓0 +12
Просмотры 4.1K
Комментарии 6

Продолжение серии статей про работу исключений в С++ «под капотом»

Ненормальное программирование *C++ **nix *

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

Читать далее
Всего голосов 5: ↑4 и ↓1 +3
Просмотры 3K
Комментарии 3

Голосовое программирование: обзор популярных платформ

Блог компании RUVDS.com Ненормальное программирование *Python *Лайфхаки для гиков Голосовые интерфейсы *
Картинка pvproductions, Freepik

В последние годы широко распространились разнообразные голосовые помощники и ассистенты, которые облегчили нашу жизнь и ускорили рутинные операции. Но до сих пор программирование — одна из самых рутинных областей человеческой деятельности — в основной массе остаётся не охваченной подобными технологиями. Тем не менее уже начинают появляться разработки, вносящие интересные изменения и в эту сферу.
Читать дальше →
Всего голосов 47: ↑47 и ↓0 +47
Просмотры 4.4K
Комментарии 5

Истории

Найти и уничтожить: как Clickhouse удаляет собственный код из памяти и переключается на использование Huge Pages

Ненормальное программирование *Open source *C++ **nix *Разработка под Linux *

В Clickhouse есть интересный код: при вызове одной функции происходит перевод области памяти исполняемого кода программы на использование Huge Pages. В процессе весь код программы копируется на новое место, память, использовавшаяся изначально для кода программы возвращается ОС, а потом запрашивается снова. Эта статья основана на соответствующей части доклада с Я.Субботника.

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

Читать далее
Всего голосов 18: ↑18 и ↓0 +18
Просмотры 7.7K
Комментарии 31

Релиз языка программирования NewLang 0.3

Ненормальное программирование *Программирование *C++ *Компиляторы *Машинное обучение *
image

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


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

Читать дальше →
Всего голосов 11: ↑8 и ↓3 +5
Просмотры 6.6K
Комментарии 50

Имя enum'a C++ в рантайме

Ненормальное программирование *Open source *C++ *

Получение имени типа, не важно это структура или перечисление, в C++ — проблема. То, что тривиально известно компилятору на этапе парсинга исходников, не получится перевести в человеко-читаемый вид в рантайме. Можно использовать std::type_info::name, который не является переносимым решением, потому что зависит от реализации манглинга в компиляторе. Некоторые компиляторы (например, MSVC, IBM, Oracle) создают "удобное" имя типа, а вот gcc и clang, возвращают искаженное имя, котороe можно преобразовать в удобочитаемую форму с помощью дополнительных функций, например abi::__cxa_demangle. Чтобы вся эта магия работала нужно подключить RTTI, который тоже не всегда доступен, а иногда и вообще-то вреден, потому что сжирает драгоценную производительность, но можно сделать по другому.

follow the white rabbit
Всего голосов 7: ↑7 и ↓0 +7
Просмотры 2.2K
Комментарии 11

Пишущая машинка из телетайпа и Arduino

Ненормальное программирование *Реверс-инжиниринг *Разработка под Arduino *Старое железо DIY или Сделай сам

Consul 254 похож на принтер, но это не принтер. Ещё у него есть клавиатура, но при этом печатающая часть никак не связана со вводом, поэтому так просто получить что-то на бумаге не выйдет. Эту проблему мы и будем сегодня решать с помощью Ардуино и цветных проводочков. Конечно всё уже украдено до нас, и такую вещь уже описывали в журнале Моделист-Конструктор в 1989 году. Правда при этом использовался компьютер "Специалист", а не Ардуино.

Читать далее
Всего голосов 57: ↑56 и ↓1 +55
Просмотры 6.5K
Комментарии 14

Почему массивы начинаются с нуля

Ненормальное программирование *Программирование *C *Математика *История IT
Самое очевидное объяснение: индекс — это смещение относительно начала массива. Так элементы массива легче адресовать в памяти.

Проверим это на C.

#include <stdio.h>
int main()
{
    int data[3] = {1, 2, 3};
    int i = 0;
    printf("Array address: %p\n", data);
    do {
        printf("Array[%u] = %p\n", i, (void *)(&data[i]));
        i++;
    } while(i < 3);
}

Получим результат:

Array address: 0x7ffd7c514a6c
Array[0] = 0x7ffd7c514a6c
Array[1] = 0x7ffd7c514a70
Array[2] = 0x7ffd7c514a74


Как первый (нулевой) элемент, так и сам массив находятся по одному и тому же адресу, поскольку 0-й элемент удалён на 0 элементов от начала. Эта связь между указателями и массивами в C настолько тесная, что их даже можно рассматривать вместе.

Однако это ответ на вопрос «зачем», а не «почему». Нумеровать массивы с нуля стали не сразу. Удивительно, но развитие такого простого вопроса не умещается в предложении или абзаце.
Читать дальше →
Всего голосов 122: ↑121 и ↓1 +120
Просмотры 45K
Комментарии 199

Prolog in Prolog: зачем и как

Ненормальное программирование *Prolog *

Язык Prolog создавался для задач иссуственного интеллекта, который сейчас обычно называют "классическим", чтобы не путать с задачами машинного обучения путем подбора большого числа числовых параметров. Важным классом таких задач является моделирование "мира", в котором можно совершать какие-либо действия. Игрушечным примером такого мира является Nani Search. И решают их часто в таком стиле: состояние мира помещается в прологовскую базу данных и все изменения производятся путем удаления и добавления фактов в это хранилище. Но это получается уже не логическое программирование, а самое настоящее императивное! При этом используются худшие практики программирование - глобальное состояние! Мимо этого я пройти не могу!

Но самое плохое в таком подходе не стиль, в конце концов большая часть современного кода императивна, и даже частенько использует, явно или неявно, глобальные переменные. Важно что состоятние мира перестает быть first-order value и пропадает возможность решать задачи в моделируемом мире, для чего и создавался язык Prolog.

Читать далее
Всего голосов 16: ↑16 и ↓0 +16
Просмотры 1.9K
Комментарии 11

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