Все потоки
Поиск
Написать публикацию
Обновить
224.05

C *

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

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

Неожиданное взаимодействие предсказания ветвлений и подсистем памяти

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

Это 15-я статья в серии, посвящённая оптимизации подсистем памяти. Остальные доступны здесь (англ.).

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

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI?

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


Зачастую в процессе разработки собственных устройств или моддинга уже существующих, встаёт задача выполнения стороннего кода: будь то ваши собственные программы с SD-флэшек, или программы, написанные другими пользователями с помощью SDK для вашего устройства. Тема компиляторов и кодогенерации достаточно сложная: чтобы просто загрузить ELF или EXE (PE) программу, вам нужно досконально разбираться в особенностях вашей архитектуры: что такое ABI, релокации, GOT, отличие -fPIE от -fPIC, как писать скрипты для ld и т. п. Недавно я копал SDK для первых версий Symbian и основываясь на решениях из этой ОС понял, каким образом можно сделать крайне «дешевую» загрузку любого нативного кода практически на любом микроконтроллере, совершенно не вникая в особенности кодогенерации под неё! Сегодня мы с вами: узнаем, что происходит в процессе загрузки программы ядром Linux, рассмотрим концепцию, предложенную Symbian Foundation и реализуем её на практике для относительно малоизвестной архитектуры — XTensa (хотя она используется в ESP32, детали её реализации «под капотом» для многих остаются загадкой). Интересно? Тогда добро пожаловать под кат!
Читать дальше →

Язык Janet для смертных. Часть 2 — Компиляция и создание образов

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

Это перевод небольшой книги о языке Janet за авторством Иана Генри (Ian Henry). В этой небольшой книге подробно раскрываются различные аспекты работы с языком, обьяснение синтаксиса и некоторых приемов программирования.

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

Читать далее

Как я создавал автокликер для приложения «ДругВокруг»

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

Социальные сети и мессенджеры последнее время завоевали большую популярность среди пользователей интернета. Одной из таких соцсетей было приложение «ДругВокруг». Точнее, было в моём обиходе. Стояло оно у меня на компьютере с Windows XP в 2016 году. В то время у меня возникла идея сделать одну интересную программу для работы с этим приложением...

Читать далее

Быстрый парсинг 8-битных целых чисел

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

Допустим, вам нужно быстро распарсить 8-битные целые числа (0, 1, 2, …, 254, 255) из строки ASCII/UTF-8. Задача взята из проекта simdzone под руководством Йероена Коеккоека (NLnet Labs). Дана строка и её длина: например, ’22’ и длина 2. Наивное решение на C может выглядеть так:

Читать далее

Отец пингвинов и гигант мысли: Линус Торвальдс

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

Привет, хабр! Новогодняя суета уже постигает своей кульминации, католическое Рождество прошло, а на хабре идёт АДМ (анонимный дед мороз), а также одно уникальное событие - день рождения филантропа, миллионера, мецената, гиганта мысли и отца русской финской демократии - Линуса Бенедикта Торвальдса. 28 декабря является днем рождения нашего Линуса!

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

Читать далее

4 миллиарда операторов if

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

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

В современном мире, где ИИ постепенно заменяет программистов, отнимая у них работу и совершая переворот в том, как мы подходим к рассуждениям о коде, нам, возможно, следует быть более открытыми к мыслям людей, недавно пришедших в нашу отрасль? На самом деле, показанный выше код — идеальный пример компромисса между временем и задействованной памятью. Мы жертвуем временем и в то же время памятью и временем компьютера! Поистине чудесный алгоритм!

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

Читать далее

Первый взгляд на производительность реализации floating-point GEMM для CPU на языке Mojo

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

Сравниваем производительность реализаций floating-point GEMM из OpenBLAS, Eigen и MKl с реализацией на новом языке программирования Mojo.

Читать далее

Разбор примера BLE Audio от Nordic Semiconductor (или переходник I2S->BLE-Audio)

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

Обзор технологии беспроводной передачи данных BLE 5.3.
Представлен разбор примера Ble Audio от Nordic Semiconductor для микроконтроллера nRF5340. Это пример передачи звука по Bluetooth 5.3.

Читать далее

Отслеживание изменений в директории с помощью Inotify

Время на прочтение4 мин
Количество просмотров9.7K
Столкнулся с задачей, где необходимо было отслеживать в ОС Linux изменение файла в директории на чистом С++. Так как чистый С++, Qt с его QFileSystemWatcher сразу отпадал, из-за того что необходимо было подключать QObject. В итоге решил пользоваться линуксовой функцией Inotify.
Читать дальше →

Игровая легенда из 90-х: Как работала 3dfx Voodoo «под капотом»? Пишем 3D-приложение с нуля на Glide

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


Полагаю, многие мои читатели так или иначе знакомы с такими видеокартами, как 3dfx Voodoo. Эти легендарные графические ускорители из середины\конца 90-х годов был чуть ли не в каждой второй сборке для игр, а о их производительности слагали легенды. До сих пор есть относительно небольшое сообщество фанатов ретро-игр, которые ценят, любят и собирают с цветмета те немногие видеокарты от 3dfx, что остались в СНГ. Однако обзоров на 3dfx Voodoo много, тестов игр — тоже, а вот материала «простыми словами» о его внутренней архитектуре и более того, практической части с написанием 3D-игры практически нет! Недавно я прикупил себе Voodoo 3, и начал зубрить Programmer's Manual с желанием запилить что-нибудь эдакое… Статью я долго и упорно готовил дабы успеть к новому году и сегодня у нас с вами: краткая история компании 3dfx, подробный разбор архитектуры видеочипов 3dfx «под капотом», что должен был уметь программист 3D-графики в 90х и написание 3D-приложения на Glide полностью с нуля. Интересно? Тогда жду вас в статье!
Читать дальше →

Так сколько на самом деле строк на C нужно, чтобы выполнить a + b в Python?

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

Это ответ на статью «Сколько строк на C нужно, чтобы выполнить a + b в Python?» где количество строк так и не указано. Сразу оговорюсь покрывать все сценарии для python по количеству строк я не собираюсь — слишком много вариантов, слишком лень. Но вот вопрос, сколько питону нужно строк, что бы сложить 2 числа, например "4+5"? Будет ли разница, если сохранять эти числа в переменные или нет? Сегодня мы получим ответы на эти вопросы.

Добро пожаловать под кат.

Предновогоднее шоу: Топ 10 ошибок в C и С++ проектах в 2023 году

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

Вот уже выпал снег, на дворе декабрь, а значит и Новый Год где-то рядом. В преддверии праздников мы решили показать вам наиболее интересные ошибки, которые мы смогли найти в коде популярных Open Source проектов. Наши авторы написали много познавательных статей, разобрали множество ошибок в коде, и теперь мы подведём итоги.

Читать далее

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

CLI'нический парсинг

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

Каждый программист однажды получает по голове необходимостью парсить аргументы командной строки и вот это наконец случилось со мной - так почему бы не использовать это как возможность (написать какую-то дичь) (CLI парсер)? Скажу сразу - мы тут чтобы развлекаться, потому требования к парсеру будут... Интересные

Читать далее

Зачем Программисту Микроконтроллеров Математическая Статистика? (или так ли хороши UWB трансиверы?)

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

Настал день, когда мне для работы программистом микроконтроллеров наконец пригодилась математическая статистика из ВУЗ(овского) курса по теории вероятностей.

Есть очень интересная технология для автоматического радиоизмерения расстояния. Технология основана на UWB трансиверах. Позволяет измерять время пролёта радиоволны.

В этом тексте написал как я исследовал измерения расстояния, при помощи ASICа UWB трансивера DWM1000.

Читать далее

Реализация многофункционального терминального интерфейса для МК AVR

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

В данной статье речь пойдёт о разработке многофункционального терминального интерфейса для МК (на примере МК Atmega32 и терминала HyperTerminal. Многофункциональность в моём случае будет заключаться в обработке управляющих символов и управляющих последовательностей с целью реализации не только командного функционала, но и истории вводимых команд. Я постараюсь максимально приблизить свой интерфейс к интерфейсу командной строки Windows. Большая часть статьи - подробный комментарий программного кода, который может быть доступен даже начинающим в программировании. Никакого ООП нет - только элементы языка Си.

Читать сначала

Сколько строк на C нужно, чтобы выполнить a + b в Python?

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

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

В этой статье мы опустимся на один уровень ниже и посмотрим, что же происходит внутри среды исполнения Python для выполнения простого действия a + b. Иными словами, мы узнаем о подробностях реализации типов, операторов и динамической диспетчеризации в CPython.

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

Читать далее

Как оптимизировать код на С для x86-процессоров: подсистема кэша и памяти, инструкции AVX-512

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

Меня зовут Андрей Бакшаев, я ведущий инженер-программист в YADRO. Моя команда занимается разработкой и оптимизацией математических библиотек под архитектуру x86. До этого я 15 лет работал в Intel. Значительная часть моих задач заключалась в том, чтобы реализовывать некоторые алгоритмы обработки изображений и сигналов в довольно известной математической библиотеке IPP, максимально эффективно используя возможности процессоров. Я также исследовал производительность этих алгоритмов в процессорах на ранней стадии проектирования. 

В статье я поделюсь своим опытом оптимизации низкоуровневого кода на языке C. Рассмотрим подсистему кэша и памяти процессоров и новые инструкции AVX-512. Разберем пример ускорения копирования байтового массива данных и посмотрим, как векторизованный код позволяет сократить время работы широко используемого алгоритма замены байтов по таблице с 619 до 34 мс, то есть примерно в 18 раз. 

Читать далее

Как собрать Си программу в OS Windows

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

Иногда возникает ситуация, когда надо что-то посчитать согласно сложному алгоритму прямо на LapTop PC. При этом сам алгоритм написан на Си.

Это может быть цифровой фильтр, дискретное преобразование Фурье, генератор QR кода, кусок линейной алгебры с векторами, какое-то тригонометрическое вычисление, программный модулятор, статистическая обработка случайной величины.

Да всё, что угодно! То есть Вы хотите использовать язык Си как гибкий и быстрый калькулятор в Windows.

В этом тексте представлено минимальное окружение для сборки Си кода в Windows.

Читать далее

CH32V003 первый проект. Мигаем OLED дисплеем и делаем измеритель концентрации CO2

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

В последнее время разработчики электроники испытывают трудности с поставками электронных компонентов. Одним из решений данной проблемы является переход на "исконно китайскую" элементную базу. Это решение подкупает ценой и доступностью, но пугает плохой документацией и небольшим количеством информации на понятных нам языках. В данной публикации расскажу о любопытном микроконтроллере на ядре RISC-V и сделаю простое первое устройство - датчик концентрации углекислого газа в воздухе/мигалку OLED дисплеем и светодиодом (куда ж без мигалки светодиодом). В репозитории размещен проект для тех, кто захочет воспользоваться данными наработками.

Читать далее

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