С/С++ Portal | Программирование
C/C++ Portal | Программирование
Интересуетесь C и C++? Наш канал — место, где вы найдёте полезные материалы, советы и обсуждения для разработчиков. Присоединяйтесь и развивайтесь в мире C/C++! 🐞🐛🔧
Публикации канала
Исходный код самой первой версии Linux 0.01, выпущенной в 1991 году, представляет немалый интерес. В Makefile Линус Торвальдс использовал инструменты для работы с 16-битным ассемблером наряду с компилятором GCC, чтобы собрать загрузочный образ ядра. А теперь взгляните, как он обрабатывал критическую ошибку ядра (kernel panic): 👉 @Cpportal
В 1998 году Брайан Керниган захотел создать движок регулярных выражений, настолько компактный, чтобы его исходный код целиком поместился на одной странице книги по программированию. Роб Пайк отправился к себе в кабинет и спустя час или два вернулся с реализацией примерно на 30 строках кода на языке C. Движок поддерживал метасимволы ^, $, . и *, а его реализация практически целиком основывалась на указателях и рекурсии. Позднее Керниган включил этот код в книгу «Beautiful Code» («Совершенный код»). 👉 @Cpportal
Forwarded From 🚀 29 октября Arenadata проведёт техническую онлайн-конференцию ArenaTech На ArenaTech инженеры Arenadata расскажут, как устроены продукты компании изнутри, поделятся опытом решения сложных инженерных задач и представят ключевые направления технологического развития. 🟢Основные темы конференции: 🔜СУБД: архитектура, развитие и эксплуатация. Обсудим планы развития Arenadata DB (ADB) и Greengage DB, новые возможности MPP-СУБД, включая hot standby, вопросы безопасности и устранения уязвимостей. Отдельное внимание уделим утилите ggrebalance, которая позволяет сокращать число сегментов кластера и заменять хосты с сохранением равномерного распределения данных. 🔜Платформа данных: безопасность и Kubernetes. Расскажем об управлении секретами и доступом в Arenadata Hyperwave (ADH) с использованием OpenBao. Разберём особенности переноса Impala, Trino и Spark в Kubernetes: интеграцию с Kerberos, разработку операторов, адаптацию Spark и использование Celeborn и YuniKorn. 🔜Инструменты: кластерный менеджер, документация, ИИ-поиск. Поделимся опытом организации процессов разработки технической документации и расскажем, как создавались интеллектуальный поиск и ИИ-ассистент, упрощающие поиск информации в документации многокомпонентной платформы данных. Также расскажем про развитие нашего кластерного менеджера ADCM. После каждого доклада участники смогут задать вопросы спикерам в рамках Q&A-сессии. Конференция будет интересна разработчикам, дата-инженерам, администраторам СУБД, архитекторам, DevOps-инженерам и техническим руководителям. 🗓 29 октября, 12:00 МСК Формат: онлайн 🔛 Программа и регистрация
В сентябре 1992 года разработчики Unix столкнулись с серьёзной проблемой при работе с Unicode. Хранение символов в 16-битном представлении могло приводить к появлению нулевых байтов, которые программы на C воспринимали как признак окончания строки. Более ранние кодировки также имели свои недостатки совместимости. Однажды вечером Кен Томпсон и Роб Пайк отправились в небольшую закусочную в Нью-Джерси. Там Томпсон набросал схему новой кодировки прямо на бумажной подложке для тарелки. Её устройство позволяло полностью сохранить совместимость с ASCII. Остальные символы представлялись последовательностями из нескольких байтов, причём такое представление исключало случайное появление нулевых байтов и разделителей путей Unix. Вернувшись в Bell Labs, разработчики приступили к реализации своего замысла. Уже к пятнице их операционная система Plan 9 целиком работала с новой кодировкой. Так появилась UTF-8. Сегодня, спустя более тридцати лет, эта кодировка используется более чем на 99% веб-сайтов, для которых известно представление символов. 👉 @Cpportal
В Unix V7 (1979 года) команда file могла определять, написан ли текст на английском языке, анализируя частоту встречаемости букв. Она учитывала гласные, часто встречающиеся и редкие буквы. Простая эвристика, которая в некоторой степени работает до сих пор. 👉 @Cpportal
Оказывается, memcpy вполне неплохо подходит для сериализации. Звучит очевидно, но я уже собирался писать для этого отдельную функцию, пока не заметил, что по сути просто изобретаю слегка приукрашенный memcpy. 👉 @Cpportal
Безопасная и простая реализация mkdir на C. 👉 @Cpportal
До стандартизации операторов присваивания в языке C использовались операторы с обратным порядком символов, например =+ вместо +=. Знаменитый фрагмент кода с комментарием «Вы не должны этого понимать» в те времена выглядел ещё более странно. 👉 @Cpportal
Оптимизация кода — невероятно увлекательная тема. Когда вы умножаете число на константу (например, на 24), LLVM заменяет инструкцию умножения (imul) комбинацией побитового сдвига влево (shl) и вычисления эффективного адреса (lea). Сдвиг влево на 3 бита эквивалентен умножению на 8, а инструкция lea выполняет арифметические операции над выражением вида [base + index] и сохраняет полученный результат. И всё это буквально ради экономии одного такта процессора! Ведь imul выполняется за 3 такта, а shl и lea — за 1 такт каждая. Для множества других констант существуют таблицы с аналогичными эвристиками оптимизации. Разработчики оптимизирующих бэкендов компиляторов прилагают огромные усилия, чтобы сэкономить даже одну инструкцию, поэтому не сводите всю их работу на нет! 👉 @Cpportal
В оригинальном исходном коде Doom 1993 года кто-то оставил это в главном заголовочном файле. У id Software явно было своё мнение о языках программирования. 👉 @Cpportal
В своей лекции по случаю вручения премии Тьюринга Кен Томпсон показал, как компилятор C может внедрить бэкдор в программу login и скрыть атаку даже от собственного исходного кода. Сам компилятор становится бэкдором, не оставляя никаких следов в исходном коде. 👉 @Cpportal
Посмотрите, как раньше традиционно реализовывали макрос offsetof() в <stddef.h> на чистом C, ещё до появления встроенных функций компилятора. Он приводит 0 (NULL) к указателю на структуру, получает адрес её поля через & и ->member, а затем преобразует полученный адрес в тип size_t. Это не приводит к сбою, поскольку оператор & лишь вычисляет адрес на этапе компиляции, не обращаясь к памяти по нулевому адресу. 👉 @Cpportal
Когда ядро Linux удаляет элемент из связного списка с помощью list_del(), оно не устанавливает указатели next и prev в NULL. В типичных 64-битных системах вместо этого им присваиваются значения 0xdead000000000100 и 0xdead000000000122 (LIST_POISON1 и LIST_POISON2). Эти заведомо некорректные адреса помогают обнаруживать ошибки, при которых код случайно обращается к удалённому элементу списка. Вместо того чтобы незаметно перейти по устаревшему указателю, ядро может вызвать исключение при обращении к легко распознаваемому адресу. Этот механизм называется отравлением указателей (pointer poisoning). 👉 @Cpportal
Forwarded From Удалёнка — топ для работодателя Удалёнку почему-то до сих пор обсуждают так, будто это подарок сотруднику. Якобы, работодатель разрешил работать из дома — радуйся. Однако бизнесу удалёнка тоже очень выгодна 💸 Меньше денег уходит на офис Аренда, ремонт, мебель, электричество, уборка, охрана, кофе, техника — офис стоит денег. И немаленьких. Чем меньше людей нужно каждый день усаживать за столы, тем меньше компания тратит просто на то, чтобы эти столы существовали. 🌍 Нанимать можно везде Не нужно искать человека среди тех, кто живёт рядом с офисом, готов ездить туда каждый день или вообще согласен переехать. Можно нанять хорошего специалиста из Петербурга, Казани, Новосибирска, Калининграда — откуда угодно. Я сейчас работаю в Т1, и люди в разных городах и часовых поясах для нас — обычное дело. 🎯 Удалёнка сама по себе продаёт вакансию Допустим, у кандидата два похожих оффера. В одном — три дня в неделю надо тащиться в офис. В другом — работаешь откуда удобно. При прочих равных какой он выберет? Вот и получается, что за сильных людей можно конкурировать не только деньгами. 🔕 Меньше болтовни, больше дела В офисе очень легко подойти к человеку: — Есть минутка? И через 40 минут вы всё ещё треплетесь, а потом ещё вспоминай, что ты делал до этого. На удалёнке между мыслью и человеком появляется фильтр: сначала сформулируй, потом напиши, потом дождись ответа, а лучше сделай сам. Итого удалёнка: 💸 снижает расходы 🌍 расширяет рынок найма 🎯 делает вакансии привлекательнее 🔕 уменьшает количество случайных отвлечений И вот тут у меня вопрос: если бизнесу от удалёнки есть выгода — почему компании так упорно тащат людей в офис? А чем удалёнка выгодна уже самому сотруднику — расскажу в следующем посте у себя в канале Лайк, репост, подписка ⤵️ Реклама: ООО «Буду», ИНН 9703001100, erid: 2W5zFHhU3v1
Если заглянуть в исходный код ядра Linux, можно заметить, что проверки ошибок повсеместно обёрнуты в макросы likely() и unlikely(). Они используют __builtin_expect, чтобы подсказать компилятору переместить редко выполняемые инструкции обработки ошибок в конец функции. Благодаря этому кэш инструкций L1 процессора остаётся заполненным кодом наиболее часто выполняемого пути (fast path). 👉 @Cpportal
Решето Эратосфена позволяет найти все простые числа до примерно 8 миллионов, используя всего 1 МБ памяти. Каждое число представлено одним битом, а составные числа помечаются с помощью простых побитовых операций. Этот метод до сих пор используется в генераторах простых чисел и при выборе оптимальных размеров хеш-таблиц. 👉 @Cpportal
Интервьюер: Поменяйте местами два целых числа в C без использования третьей временной переменной и без риска арифметического переполнения. Системный программист:
В C, если вам нужен макрос, который при каждом развёртывании в пределах файла генерирует гарантированно уникальное имя переменной или структуры, в GCC и Clang есть малоизвестный встроенный макрос __COUNTER__. Он автоматически увеличивает своё значение на единицу (0, 1, 2, 3...) каждый раз, когда препроцессор обрабатывает его. 👉 @Cpportal
Именованные инициализаторы (designated initializers) в C позволяют задавать значения только тех элементов массива, которые вам нужны. Все остальные элементы автоматически инициализируются нулями, что делает создание разреженных таблиц простым и удобным. 👉 @Cpportal
В ядре Linux используется хитрый макрос, позволяющий выявлять недопустимые условия ещё на этапе компиляции. Если проверка не проходит, макрос создаёт массив с отрицательным размером, что заставляет компилятор выдать ошибку. 👉 @Cpportal
Комментарии
Комментариев пока нет
Комментарии пишут вошедшие — так видно, кто автор.
Войти