Pull to refresh
55
0
Костя Д. @godzie

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

Send message

Компилятор за выходные: лексер и парсер

Level of difficultyMedium
Reading time12 min
Views14K

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

Сегодня я публикую две статьи разом, поскольку по дороге меня довольно круто занесло, и получился небольшой спин-офф. Очень рекомендую к прочтению :)

Ну а тема этой статьи - автоматическое построение синтаксического дерева aka лексер и парсер.

Читать далее
Total votes 39: ↑39 and ↓0+39
Comments44

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

Level of difficultyMedium
Reading time12 min
Views8.9K

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

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

Читать далее
Total votes 54: ↑51 and ↓3+48
Comments23

Timed wait events in PostgreSQL

Level of difficultyHard
Reading time7 min
Views3K

перевод второй статьи известного специалиста в области Oracle Фрица Хугланда на тему трассировки postgresql при помощи bpftrace (первую статью я перевёл ранее см. Использование bpftrace для трассировки выполнения запросов в postgres)

Читать далее
Total votes 6: ↑6 and ↓0+6
Comments1

О динамическом программировании на пальцах

Level of difficultyEasy
Reading time9 min
Views22K

Как динамическое программирование может упростить нашу жизнь? Как можно оптимизировать решение задач?

Сегодня мы разберем динамическое программирование на пальцах с примерами на Python!

Усаживайтесь поудобнее, леди и джентльмены!

Вперед!
Total votes 24: ↑19 and ↓5+14
Comments17

Шпаргалка по модели памяти С++11

Reading time9 min
Views14K

Модель памяти представляет из себя спецификацию допустимого поведения многопоточных программ, работающих с разделяемой памятью (shared memory) [1]. Наиболее примитивной моделью является последовательная согласованность (sequential consistency), где все инструкции из всех потоков образуют общий порядок (или, по крайней мере, его видимость), согласованный с порядком выполнения программы в каждом потоке [2].

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

Читать далее
Total votes 23: ↑20 and ↓3+17
Comments0

На что способен хороший отладчик

Reading time13 min
Views7.3K

Порой приходится слышать: «Отладчики бесполезны, гораздо целесообразнее иметь дело с логированием и модульными тестами». Подозреваю, что многие из разделяющих такое мнение думают, будто отладчик только и может, что расставлять точки останова на определённых строках, пошагово просматривать код и проверять значения переменных. Притом, что любой годный отладчик действительно всё это может, на самом деле это только верхушка айсберга. Задумайтесь: мы уже вполне можем наткнуться на код, которому около 40 лет; наверняка же с тех пор что-то изменилось?  

Tl;dr — в этом эпизоде дедовского нытья вы узнаете, что хороший отладчик поддерживает различные виды точек останова, предлагает широкие возможности визуализации данных, имеет среду REPL для выполнения выражений, может показывать зависимости между потоками и контролировать их выполнение, может подхватывать изменения в исходном коде и применять их без перезапуска программы. Также он может проходить код от конца к началу и перематывать состояние программы до любого момента в истории её выполнения. Можно даже записать весь ход управления программы и визуализировать поток управления и историю потока данных.

Читать далее
Total votes 34: ↑33 and ↓1+32
Comments10

5 советов, которые помогут при переносе кода на платформы, отличные от х86

Reading time8 min
Views3.5K

Легко написать код, который компилируется, компонуется и нормально работает на x86, но не работает на других процессорах, например Power. Обычно причина в том, что такой код изначально не был предназначен для платформ, отличных от x86. В статье разбираем отличия x86 и Power, которые могут нарушить сборку или снизить производительность. Делимся инструментами, которые помогут выявить и устранить проблемы.

Читать далее
Total votes 21: ↑20 and ↓1+19
Comments15

Пишем обобщённую хеш-таблицу с открытой адресацией на чистом C

Reading time28 min
Views17K

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

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

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

Читать далее
Total votes 30: ↑26 and ↓4+22
Comments38

CAP двенадцать лет спустя: как изменились «правила»

Reading time23 min
Views6.1K


Эта статья впервые появилась в журнале Computer и подготовлена InfoQ & IEEE Computer Society.


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


За десятилетие, прошедшее с появления теоремы, разработчики и исследователи использовали теорему CAP (а иногда и злоупотребляли ею) как повод для изучения широкого спектра новых распределенных систем. Движение NoSQL также использовало её в качестве аргумента против традиционных баз данных.


В теореме CAP говорится, что любая сетевая система с общими данными может иметь не более двух из трех желаемых свойств:


  • согласованность (С), эквивалентная наличию единственной актуальной копии данных;
  • высокая доступность (A) этих данных (для обновлений); и
  • устойчивость к сетевым разделениям (P).

Такое толкование CAP помогало разработчикам быть открытыми для более широкого диапазона систем и компромиссов; действительно, за последнее десятилетие возникло множество новых систем и много споров об относительных достоинствах согласованности и доступности. Формулировка «2 из 3» всегда вводила в заблуждение, поскольку имела тенденцию чрезмерно упрощать противоречия между свойствами. Но сейчас такие тонкости имеют значение. CAP запрещает лишь крошечную часть проектного пространства: идеальная доступность и согласованность при наличии разделений, которые встречаются редко.

Читать дальше →
Total votes 24: ↑17 and ↓7+10
Comments11

Пособие по программированию модулей ядра Linux. Ч.5

Reading time15 min
Views6.2K

Пятая часть последней версии руководства по написанию модулей ядра от 2 июля 2022 года. В ней мы разберемся, как в ядре реализована совместная работа процессов и потоков, узнаем, какую роль в этом играет режим ожидания (sleep), рассмотрим возможные способы избежания коллизий и взаимных блокировок, а также познакомимся с назначением и использованием атомарных операций.
Читать дальше →
Total votes 36: ↑36 and ↓0+36
Comments1

Руководство по CMake для разработчиков C++ библиотек

Reading time18 min
Views76K

Данное руководство позволит читателю составить полную картину того, как организовать сборку C++ библиотек с использованием современных возможностей CMake. Предполагается, что читатель имеет представление о базовых понятиях из мира CMake и динамических/статических C++ библиотек, так как в руководстве они могут не объясняться.

Читать далее
Total votes 71: ↑71 and ↓0+71
Comments49

Разработка драйвера сетевого адаптера для Linux. Часть 1

Reading time25 min
Views25K

В этой статье мы рассмотрим как устроен драйвер сетевого адаптера для Linux.

Cтатью разделим на две части.

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

Хотя при разработке драйверов необходимо использовать стандартные ядерные фреймворки, такие как clock, reset, libphy и пр., поначалу мы будем работать с адаптером напрямую через регистры состояния и управления. Это позволит нам детально разобраться с аппаратной частью.

Во второй части статьи приведем драйвер к нормальному виду, с использованием стандартных фреймворков и описанием того, что надо указать в Device Tree, и рассмотрим как передавать сетевые пакеты.

Нам нужна макетная плата с сетевым адаптером, на которую можно поставить Linux. Возьмем Orange Pi Zero на платформе Allwinner H2+. В состав платформы входят четыре процессорных ядра Cortex-A7, поддерживается ОЗУ стандартов LPDDR2, LPDDR3, DDR3, широкий спектр соединений и интерфейсов, в том числе сетевой адаптер, для которого мы будем разрабатывать драйвер. Подробное описание платформы тут, документация на платформу Allwinner H3 Datasheet.

Читать далее
Total votes 71: ↑71 and ↓0+71
Comments19

Пишем наш первый модуль для ядра Linux

Reading time14 min
Views18K
image

Пожалуй, ядро Linux сегодня – это самый вездесущий (и по-прежнему недооцененный) программный код. На нем основаны все дистрибутивы Linux (что очевидно), но это далеко не все. Кроме того, на ядре Linux работает огромная масса встроенного ПО практически везде. У вас есть микроволновка? Вероятно, она работает на ядре Linux. Посудомоечная машина? Тоже. Вы состоятельный человек и приобрели автомобиль Tesla? Может быть, вы найдете в ней какие-то баги и исправите их, в таком случае, можете отправить патч им на Github, где лежит код для модели S и модели X. Электронная начинка МКС, благодаря которой станция не падает на Землю смертельно опасным и разрушительным огненным болидом — конечно же, тоже работает под Linux. Ядро легковесно. Наверное, именно поэтому оно так хорошо работает в условиях низкой гравитации.
Читать дальше →
Total votes 28: ↑24 and ↓4+20
Comments23

Кинотерапия — более 150 фильмов, которые пересматривают

Reading time6 min
Views53K

Фильмы - это лекарство для психики. Что включается у нас в голове, когда мы смотрим фильм? Возможно превратить просмотр кино в индивидуальную психотерапию?

Для начала отделим мух от котлет. Психолог, психотерапевт, психиатр и невролог чем они отличаются? Самое простое отличие в том, что психолог не является врачом. Психотерапевт, психиатр и невролог - это врачи.

Читать далее
Total votes 54: ↑30 and ↓24+6
Comments141

IO_URING. Часть 1. Введение

Reading time13 min
Views29K

Всем привет! Наверное, многие уже слышали о новом интерфейсе ядра Linux — io_uring. Это новый способ работы с асинхронным I/O (и не только) в Linux. Кстати, новый он не только из-за даты выхода в свет, но и в плане подходов, которые предлагает разработчику.

Заинтересовало? Более подробно разберемся под катом.

Читать далее
Total votes 37: ↑36 and ↓1+35
Comments37

Подсчёт слов

Reading time24 min
Views14K

В статье рассказывается о решении задачки с собеса в одну российскую IT-контору.

В первые месяцы ковидной эры так случилось, что на моей текущей на тот момент работе всем уполовинили зарплату и я, недолго думая, пошёл на рынок труда. На собесе в одну известную российскую IT-компанию я получил эту задачу. Задачку нужно было просто решить: решить корректно, не "убив" при этом скорость "так, чтобы совсем ужас был".

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

Читать далее
Total votes 39: ↑39 and ↓0+39
Comments19

Хакерский квест RUVDS подходит к концу, но сразиться за главный приз 142 857 рублей еще не поздно

Reading time18 min
Views4.3K

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

Напомним, с чего всё началось: участники уже раскрыли секрет «Загадочной визитки», которую разобрали до последнего волокна и в результате залетели в блокчейн, а далее и в межпланетную файловую систему с новой порцией загадок.
Читать дальше →
Total votes 26: ↑26 and ↓0+26
Comments0

Экстремальная настройка производительности HTTP: 1,2M API RPS на инстансе EC2 с 4 виртуальными процессорами (vCPU)

Reading time54 min
Views18K

Прим. перев.: автор данного исследования — Marc Richards, Solutions Architect и DevOps-инженер — продемонстрировал потрясающую настойчивость и тщательность в тотальной оптимизации производительности веб-приложения. Получившийся материал — кладезь полезных знаний для расширения своего кругозора в области оптимизации, особенностей сетевого стека в Linux и не только, даже вне зависимости от практической заинтересованности в конечном результате автора. Приготовьтесь к по-настоящему длинному техническому путешествию с обилием терминологии, увлекательных графиков и полезных ссылок.

Читать далее
Total votes 75: ↑75 and ↓0+75
Comments7

Автоматическое разрешение конфликтов с помощью операциональных преобразований

Reading time9 min
Views8.5K
image

Автоматическое разрешение конфликтов в среде с более, чем одним ведущим узлом (в данной статье под ведущим узлом понимается узел, который принимает запросы на изменение данных) – очень интересная область исследований. Существует несколько различных подходов и алгоритмов, в зависимости от области применения, и в данной статье будет рассмотрена технология Операциональных Преобразований (Operational Transformations, OT) для разрешения конфликтов в приложениях совместного редактирования, таких как Google Docs и Etherpad.
Читать дальше →
Total votes 14: ↑13 and ↓1+12
Comments3

Information

Rating
Does not participate
Date of birth
Registered
Activity