
Earcut - базовый, почти учебный алгоритм триангуляции, но при некоторых раскладах он обгоняет более "продвинутые" решения.
Мультипарадигмальный компилируемый язык
Earcut - базовый, почти учебный алгоритм триангуляции, но при некоторых раскладах он обгоняет более "продвинутые" решения.
Недавно я работал над достаточно большим проектом на Rust. К моему удивлению, мне никак не удавалось заставить тесты работать правильно.
Команда cargo test
запускала выполнение всех тестов в репозитории, но спустя пару миллисекунд все тесты завершались сбоями из-за не очень знакомой мне ошибки:
Io(Os { code: 24, kind: Other, message: "Too many open files" })
К счастью, описание ошибки достаточно понятно, поэтому я смог за приемлемое время разобраться в её причинах. Я начал копаться и в процессе исследований кое-чему научился.
Всем привет! Я Влад Лунин, занимаюсь анализом сложных угроз в экспертном центре безопасности Positive Technologies. В последнее время часто приходится сталкиваться с вредоносным ПО (ВПО), написанном на Rust, поэтому хочу поделиться своим опытом реверса исполняемых файлов, написанном на этом языке. ВПО бывает как очень простое, так и очень сложное в своей реализации, и чаще всего эта сложность обусловлена особенностями Rust. Расскажу, какие подходы применяю для успешного реверса, а также про сложности, с которыми сталкивался, и как их преодолевал.
Почему люди не используют типы чаще? Возможно все связано с тем, что опытные разработчики перестали использовать нерабочие паттерны, не оставляя за собой следов для новичков. В этой статье более детально разбирается недавно удаленный мной код с паттерном, который я называю «утка‑дублер». Вы сможете проследить процесс разработки типа, а также причину его удаления. Также мне хотелось бы попросить разработчиков на Rust документировать и делиться своими ошибками, чтобы мы все могли на них учиться.
Trait'ы в Rust — это один из ключевых инструментов абстракции. Они позволяют определить поведение, которое можно реализовать для различных типов. Trait'ы обеспечивают способ выразить «что умеет делать» тип, не указывая его точной природы. В этой главе мы детально разберём базовые конструкции trait'ов и шаг за шагом перейдём к их применению в контексте динамической диспетчеризации.
В своей предыдущей статье [перевод на Хабре] я говорил о множестве недостатков C++, которые, по сути, устранил Rust. Благодаря этому код теперь легко использовать правильно и сложно использовать неверно. Я не говорил о безопасности по памяти, просто привёл пример того, что пользователь функции не может случайно поменять местами аргументы количества и цены.
На написание статьи меня вдохновил доклад Мэтта Годболта о том, как можно сделать интерфейсы C++ более надёжными: Correct by Construction: APIs That Are Easy to Use and Hard to Misuse. Вам стоит его посмотреть!
В той статье я сказал, что Rust гораздо лучше помогает разработчику, возможно, благодаря тому, что у него были десятки лет, чтобы учиться. В конце концов, первая версия C++ была выпущена в начале 80-х, а Rust — в начале 2010-х. Если дать C++ несколько десятков лет для обучения, то, разумеется, появятся новые структуры, которые будут обладать высоким качеством и которые сложно использовать неправильно.
Но так ли это?
Два варианта абстрактного синтаксического дерева (AST) для выражения a * b + c.
Арены, также называемые регионами, повсюду встречаются в современных языках программирования. Есть такая разновидность арен, которая одновременно супер-проста и удивительно эффективна при работе с компиляторами и тому подобными инструментами. Может быть, именно по причине такой простоты эта элементарная техника не попадалась мне во многих курсах по компиляторам — и вообще в теоретическом минимуме по информатике, если уж на то пошло. В этом посте я познакомлю вас с этой идеей, а также с её многочисленными достоинствами.
Многие по-разному понимают, что такое арены или регионы, поэтому здесь я собираюсь называть интересующую меня разновидность этих структур данных «выровненной», а сам процесс — «выравниванием» (flattening). Выровненная арена содержит всего один тип, то есть, в сущности, это обычный массив. В таком массиве можно обойтись индексами, тогда как обычно для работы с массивом требуются указатели. Здесь мы поговорим прежде всего о выравнивании абстрактных синтаксических деревьев (AST), но вообще описанная идея применима с любой структурой данных, отягощённой указателями.
Чтобы изучить выравнивание, мы дважды напишем простейший интерпретатор: сначала как обычно, а затем с применением выравнивания. Логика поста прослеживается по коду из этого репозитория, где можно сравнить две ветки. Здесь важнее всего отметить, что изменения минимальны, но при этом микробенчмарки показывают, что после выравнивания код работает в 2,4 раза быстрее. Благодаря выравниванию не только повышается производительность, но и сам код становится эргономичнее, на чём я также остановлюсь.
В этом разделе статьи мы разберём структуру и логику кода игры, которую мы разработали с нуля на языке Rust с использованием библиотеки macroquad
. Мы рассмотрим ключевые модули: игрок, враги, карта, взрывы, игровой цикл и UI.
Какое-то время назад memorysafety.org объявил о конкурсе по повышению производительности rav1d
— порта AV1-декодера dav1d
на Rust.
Моя фамилия Равид, совсем как название декодера, поэтому я решил, что будет забавно попробовать (хоть я и, вероятно, не смогу участвовать в конкурсе).
Эта статья посвящена двум найденным мной небольшим улучшениям производительности (первый PR, второй PR) и рассказу о том, как я их нашёл.
Привет, Хабр!
Сегодня рассмотрим проблемную тему в Rust: управление владением в структурах с циклическими ссылками, таких как графы и деревья. Особое внимание уделим комбинации Rc<RefCell<T>>
и тому, как избежать зацикливания с помощью Weak
.
В данной статье мы рассмотрим архитектуру и реализацию Telegram-бота Kalorik, написанного на языке программирования Rust. Этот бот предоставляет пользователям возможность анализировать свой рацион питания, получая автоматический расчёт калорий, макроэлементов и индекса массы тела. Особенностью проекта является использование современного стека на основе tokio
, sqlx
, teloxide
, а также продуманная архитектура с учётом масштабируемости.
Rust 1.87.0 и 10 лет Rust!
Команда Rust празднует 10-летие Rust в Утрехте, Нидерланды, и рада сообщить о новой версии языка — 1.87.0!
Сегодняшний день релиза выпал на 10-летний юбилей выхода Rust 1.0!
Спасибо мириадам участников, кто работал или работает над Rust. Выпьем за ещё многие десятилетия впереди! 🎉
Как обычно, новая версия включает в себя все изменения, которые были внесены в бета-версию за последние шесть недель согласно последовательному и регулярному циклу выпуска. Мы следуем ему начиная с Rust 1.0.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.87.0 вам достаточно выполнить команду:
Полиморфизм — сколько в этом слове красивого и даже таинственного. Происходит от греческого πολύμορφος что означает — многообразный. В программировании это понятие встречается часто и обыденно для понимания большинством программистов. Но так ли это на самом деле?
Мы продолжаем рассказывать о проектах Зимней школы RISC-V, организованной YADRO. Возможно ли создать программный генератор на базе открытой архитектуры, используя физически неклонируемые функции (PUF) динамической памяти? Команда из БГУИР — Никита Малявко, Ксения Трубач, Михаил Кулик, Павел Шлык — в своем проекте проверила гипотезу о наличии PUF в динамической памяти и создала модель одноканального источника шума. Затем реализовала постобработку и тестирование, измерила производительность генератора и оптимизировала код.
В прошлом году, просматривая пул-реквесты по поводу компилятора Rust, я обратил внимание на #126013. В нём к некоторым пакетам компилятора добавлялась проверка unreachable_pub. Естественно, меня это заинтересовало, так как на тот момент я о такой проверке не знал. Но, разобравшись с её описанием, я тем более удивился, так как эта проверка показалась мне абсолютным нонсенсом! Поговорив об этом с авторами пул-реквеста, я осознал, что, пожалуй, достаточно странно представляю себе, как устроена видимость в Rust. Как минимум, я воспринимал её не «так, как она была задумана».
Эта тема показалась мне достаточно интересной, чтобы раскрыть её в блоге. В этой статье я коротко объясню, как именно работает видимость в Rust, а потом опишу два достаточно разных способа её использовать. Если вы знаете, как в Rust устроена видимость, можете смело пропускать введение и переходить к главной теме. Оговорюсь, что в этом посте я просто вывалил различные мысли на данную тему, скопившиеся у меня, так что не ожидайте найти здесь каких-либо супер-откровений :).
Я наблюдаю за тем, как люди снова и снова совершают одни и те же ошибки при изучении Rust. Ниже представлены мои мысли (в порядке важности) о том, как можно упростить себе процесс обучения. Моя цель — помочь вам сэкономить время и избежать разочарования.
Расслабьтесь
Перестаньте сопротивляться. Это самый важный урок.
Примите то, что для изучения Rust требуется освоение совершенно иной и непривычной вам ментальной модели. В языке есть куча новых концепций, например, сроки жизни, владение и система трейтов. В некоторых случаях для вас будут новыми дженерики, сопоставление с образцом или макросы.
Темп обучения не особо зависит от вашего ума и предыдущего опыта программирования. Главнее всего ваше отношение к языку.
Я видел разработчиков-джунов, прекрасно справлявшихся с Rust без предварительного обучения, и сениоров, которые боролись с ним неделями/месяцами или полностью капитулировали. Забудьте о своей гордыне.
С недавнего времени в QEMU появилась экспериментальная возможность создания моделей устройств на языке Rust, вместо традиционного C. Меня эта тема очень заинтересовала, и я не смог пройти мимо и не попробовать не создать модель устройства PCI на этом языке. За основу взял реализацию EDU на C.
Делюсь, через что мне пришлось пройти, и что из этого вышло. Эта часть посвящена разбору интеграции Rust в QEMU.
Всем привет! Моя первая статья получилась... слабой. Постарался сделать работу над ошибками и заодно ответить на вопросы, возникшие в комментариях. Прошу дать мне второй шанс!
Первый блин комом)
Всем привет! Пишу свою первую статью — не судите строго:‑)
Сегодня хочу рассказать вам о своём проекте, а точнее показать его в деле. Надеюсь, вам будет интересно!
Всем привет. Я студент 2 курса магистратуры Университета ИТМО факультета «Школа разработки видеоигр». В своей выпускной работе «Анализ и разработка алгоритма Shadow Mapping направленных источников света для систем с несколькими GPU» я перенёс вычисление Cascaded Shadow Maps на вторую видеокарту и получил 40% прироста к производительности.