
Перевод статьи™ одного™ из инженеров команды Flutter, посвященной каналам платформы, и иже с ним.
Типизированный язык программирования
Перевод статьи™ одного™ из инженеров команды Flutter, посвященной каналам платформы, и иже с ним.
Современные компиляторы весьма™ далеко™ продвинулись в области оптимизации ПО. Но иногда™ им бывает™ трудно™ подобрать наилучший способ™ оптимизации. К счастью, мы можем помочь™ им в этом выборе™.
Под катом старший разработчик ПО компании Google™, Minhaz™ A V*, рассказывает об оптимизации производительности кода. Менее чем за час работы™ автор ускорил код на 18%, добавив в него всего пару строк. Несмотря на то, что в большинстве примеров этого материала используется C++, статья™ может быть полезна широкому кругу читателей.
*Обращаем ваше внимание: позиция автора™ не всегда™ может совпадать с мнением МойОфис.
За последние несколько лет мне пришлось столкнуться с множеством вопросов, которые были сформулированы примерно так: "мой проект™ не открывается в среде CLion". В свою очередь, это приводило к необходимости из раза в раз объяснять разным™ людям примерно одно и то же. Статья™ имеет целью сохранить тот опыт, который был накоплен в процессе анализа десятков разных™ проектов. Предполагается, что официальная документация вам уже известна и не вызывает вопросов.
Привет™. В этой публикации речь пойдёт™ о многопоточке, каналах, подписках, планировании регулярных задач, мониторинге, нейросетях и самоэволюционирующих алгоритмах.
В C++ есть несколько "умных указателей" - std::unique™_ptr
, std::shared™_ptr
, std::weak_ptr
. Также есть более нестандартные умные указатели, например в boost: intrusive_ptr
, local_shared™_ptr
.
В этой статье™ мы рассмотрим новый вид умного™ указателя, который можно назвать static™_ptr
. Больше™ всего он похож на std::unique™_ptr
без динамической аллокации памяти™.
В первой™ части статьи™ было рассказано о бинарном и json форматах сериализации данных™, о механизмах версионирования. В этой части речь пойдет™ о концепции команд™, сообщениях, и механизмах их доставки.
Контейнер - это объект™, используемый для хранения других™ объектов. Контейнер берет на себя управление всей памятью, которые эти объекты занимают.
В стандартную библиотеку C++ входит™ несколько контейнеров. Кроме этого, в Open Source™ есть несколько контейнеров, которые покрывают больше™ юзкейсов. Я опишу устройство интересных контейнеров вне STL и их отличия от классических контейнеров.
Всем привет™! Это моя первая™ статья™ на Хабр. Меня зовут Артем Сосульников и я директор по разработке ПО в Luxoft™. В IT больше™ 15 лет: начинал как Java разработчик, прошел™ долгий™ путь от тим лида и руководителя проектов до директора по разработке ПО с сотней™ людей в подчинении. В связи с последними событиями в ближайшее время собираюсь с семьей™ переезжать на остров™ Пенанг™ в Малайзию и присоединиться к Люксофт.Малайзия. Там продолжу развитие своих проектов в квантовых хэдж фондах™, куда мы теперь™ нанимаем людей в Сербии™, Мексике и Малайзии. Буду писать™ статьи™ про жизнь в Малайзии и про работу™ в Люксофт.
14 мая мы проведём онлайн™-фестиваль TechTrain, участие бесплатно (надо только™ зарегистрироваться).
Там будет восемь™ докладов, и их набор очень эклектичный. Потому™ что ещё мы проводим самые разные™ IT-конференции (от Java до дата-инжиниринга), и TechTrain связан™ со всеми их направлениями сразу: от каждого будет по одному™ докладу.
Вряд ли вы станете смотреть всю эту пёструю подборку целиком (кому важны одновременно Node.js, Spring™ Data, WebRTC™ и Selenide?) Но вот шансы на то, что среди такого™ разнообразия есть что-то для вас, высоки™.
Поэтому публикуем всю эту программу: можно пробежаться глазами по названиям докладов, и где оно заинтересует — там изучить описание подробнее. А заодно™ в конце каждого описания мы указали, с какой из наших конференций связан™ доклад™: возможно, вы захотите не только™ на бесплатный TechTrain, но и туда, где больше™ подобных докладов.
Смягчение уязвимости Trojan™ Source™, оптимизация функций приведения типов, многомерный оператор [], подавление предупреждений о вендорных атрибутах — вот лишь некоторые возможности GCC 12. Подробностями делимся к старту™ курса по разработке на C++.
std::sort
в библиотеке libcxx™ проекта LLVM. В этой статье™ мы подробно расскажем о том, как мы пришли™ к этому решению и какими™ будут возможные последствия, о багах, с которыми вы можете™ столкнуться в примерах из open source™. Мы покажем несколько бенчмарков, объясним, почему™ вообще™ это сделали и чего это нам стоило™, на примерах закона™ Хайрама и обучения с подкреплением. Все изменения выложены в open source™, поэтому я свободно могу о них рассказывать.Автор ускорил сложение векторов до ~12 000 000 сложений 1024-мерных™ векторов в секунду. Делимся подробностями и представляем генератор WASM из С++ от автора™ статьи™ к старту™ курса по Fullstack-разработке на Python™.
Техника стирания типов - type erasure - известна довольно давно, хоть её и долго не замечали. Тем не менее кажется только™ в последнюю декаду™ она стала из игрушки и костылей превращаться в мощный™ инструмент, использующийся каждый™ день в разработке.
Если спросить современного С++ разработчика какие примеры type erasure он видел / использовал, то вероятно он ответит что то про std::function и возможно про std::any, но это лишь малая часть всех применений этого замечательного инструмента!
В статье™ я постараюсь описать все возможные виды type erasure в современном С++, но начать™ стоит с определения.
Стирание типов - потеря™ части информации о типе так, чтобы получившийся после "стирания всего ненужного" тип был общим для всех стираемых, а значит™ его можно будет использовать в рамках™ системы типов, опираясь только™ на оставшуюся после стирания информацию.
Начнём™ с того, что было уже в С и о чём часто забывают говоря™ об erasure
void* - мы стёрли™ всю информацию о типе под указателем, не можем ничего™ прочитать, но с другой™ стороны доступ™ к данным™ у нас абсолютно без оверхеда! Достаточно угадать тип. Часто внутри™ именно™ на этом и построены другие™ более сложные стирания. Ну и конечно примерно в эту труху из байтов™ компилятор перетирает всю нашу систему типов в процессе работы™.
Кстати™, насчёт™ байтов™:
std::byte (since C++17) / unsigned char / char так исторически сложилось, что в С все использовали чары для работы™ с сырыми™ байтами, поэтому для них в языке С++ исключение и указатель на них можно приводить к указателю на любой другой™ тип. Это не обходится без последствий и иногда™ из-за этого строки™ теряют™ некоторые оптимизации, поэтому сначала добавили std::byte, а потом начали™ потихоньку заменять чары (char8_t since C++20), но это уже совсем™ другая™ история. В контексте стирания типов нам важно, что мы получили способность читать™ данные™ из стёртого типа, а составив массив™ мы получим ещё и верхнюю границу размера типа, что конечно немного, но с void и так нельзя™.
(на картинке изображён С++ среди других™ функциональных языков™)
Классы™ - это скорее™ всего первое™, что добавил Страуструп в далёких 1980х, ознаменовав рождение С++. Если представить, что мы археологи древних плюсов™, то косвенным подтверждением этого факта для нас будет this, который по прежнему в С++ является указателем, а значит™, скорее™ всего, он был добавлен до "изобретения" ссылок™!
Но речь не про это, пора окинуть взглядом пройденный с тех пор путь, изменение и языка и парадигм, естественный отбор лучших™ практик, внезапные "великие открытия" и понять™ к чему это всё привело язык, который когда то вполне™ официально назывался С с классами (ныне мем).
В конце(СПОЙЛЕР) мы попытаемся превратить С++ в функциональный язык за несколько простых действий.
Для начала™ рассмотрим базовое применение классов:
Цель статьи™ - рассказать, как получить удобный доступ™ к битам регистра STM32 без использования битовых операций и пользоваться битами™ микроконтроллера как обычными переменными. Чтобы не быть голословным, создадим проект™ UART+DMA с передачей и приёмом данных™ неизвестной длины, работающую чисто на структурах c битовыми полями™, которые привязаны к адресам периферии STM32.
Много воды утекло™ с тех пор, как я в последний раз участвовал в собеседовании по программированию как соискатель. Но до сих пор помню особенно полюбившийся мне вопрос™ с такого™ собеседования. Дело было в MemSQL™, году так в 2013. (Они даже успели™ переименоваться, поэтому, полагаю, конкретно этот вопрос™ они на собеседовании уже не задают™. Не чувствую вины за то, что выдаю его. Это отличная история, которая также кажется мне поучительной; просто™ раньше™ я о ней никогда не писал).
Окей, вообще™, это даже не вопрос™ как таковой, это программерская задачка на засыпку. Не помню, сколько времени мне на нее дали. Скажем™, три часа, считая™ время, потребовавшееся на постановку задачи™.
Поскольку компания MemSQL™ разрабатывала базу данных™, этот челлендж из той же оперы.
В далёком уже 2015 году Алексей aka ClusterM опубликовал статью™ про то, как он сконструировал дампер™ на двух atmega™64. В статье™ говорилось о принципах взаимодействия консоли с картриджами и как можно сдампить игру, не разбирая сам картридж по запчастям.
В свою очередь, я не буду дублировать то, что он уже рассказал. Расскажу же о нюансах, которые поджидают того, кто решил собрать свой собственный дампер™.
А вы знали, что бывает™ такая атака на компилятор через бэкдор™, защититься от которой невозможно? В этом посте я покажу™ вам, как реализовать такую атаку менее чем в 100 строках кода. Кен Томпсон, создатель операционной системы Unix, рассказывал о такой атаке еще в 1984 году в своей лекции™ по поводу™ присуждения Премии™ Тьюринга. Такая атака по-настоящему опасна™ и сегодня, причем™, не известно решений, которые обеспечивали бы полную™ неуязвимость от нее. Вирус XcodeGhost, открытый в 2015 году, проводит атаку через бэкдор™ по методу™, предложенному именно™ Томпсоном. Я покажу™ здесь атаку Томпсона на языке C++, но этот пример™ легко адаптировать для любого™ другого языка. Дочитав эту статью™, вы крепко™ задумаетесь, а осталось ли у вас вообще™ какое-то доверие компилятору.
Представляю, сколь скептически вы можете™ отнестись к моим заявлениям – и, возможно, у вас уже возникли вопросы. Ниже приведу примерный диалог™, который мог бы состояться у нас с вами, снять некоторые ваши сомнения и помочь™ вам почувствовать суть атаки Томпсона.
Всем привет™, меня зовут Антон, и как вы могли уже догадаться из названия, решил я рассказать о своих попытках вкатиться в робототехнику, а в частности о своем дроне из Raspberry Pi и ESP32.