Как стать автором
Обновить
98.02

Rust *

Мультипарадигмальный компилируемый язык

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

LL(*) парсер с использованием Rust макросов

Время на прочтение10 мин
Количество просмотров6.7K
Wow. Such Rust. Much macro.

Wow. Such Rust. Much macro. © картинка - Твиттер аккаунт Servo


Язык Rust стремительно набирает обороты. Кто-то пророчит ему стать заменой C/C++, кому-то он просто нравится. Я скорее принадлежу ко второй группе. Разработчики стараются сделать его удобным и безопасным. В нем есть конструкции и принципы, которые еще не скоро появятся в "плюсах", ввиду инерции комитета и множества других причин. Поэтому, для всех личных проектов я предпочитаю использовать именно Rust.


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


Однажды, когда я в очередной раз застрял с синтаксическим анализатором (он же "парсер"), я подумал, что уж очень много я пишу однотипного кода. И этот однотипный код один в один ложится на грамматику в форме Бэкуса — Наура (БНФ).


Немного подумав, я решил, что мне надо написать генератор кода на основе грамматики. И для этой задачи как нельзя хорошо подходят макросы в Rust.


В статье описана реализация LL(*) парсера с использованием макросов. И реализован парсер простых математических выражений.


В итоге парсер для БНФ грамматики:


expr ::= sum
sum  ::= mul "+" sum | mul "-" sum | mul
mul  ::= atom "*" mul | atom "/" mul | atom
atom ::= "(" expr  ")" | number | neg;
neg  ::= "-" atom

Можно сгенерировать с помощью серии макросов:


rule!(expr, sum);
rule!(sum, or![
     and![(mul, token('+'), sum) => make_operator],
     and![(mul, token('-'), sum) => make_operator],
     mul
]);
rule!(mul, or![
     and![(atom, token('*'), mul) => make_operator],
     and![(atom, token('/'), mul) => make_operator],
     atom
]);
rule!(atom, or![
    and![(token('('), expr, token(')')) => |_lbrace, stat, _rbrace| Some(stat)],
    num,
    neg
]);
rule!(neg, and![(token('-'), atom) => |_, number| Some(Box::new(expression::Expression::Negate(number)))]);
Читать дальше →

Rust: for и итераторы

Время на прочтение6 мин
Количество просмотров16K
(предыдущая статья)

В данной статье мы обсудим for циклы, а так же родственные понятия итераторов и «итерируемых объектов».

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

Как стать властелином отладчика: помогут ELF, DWARF и много магии

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

Привет, Хабр! Меня зовут Константин, я работаю в команде файлового доступа в YADRO. Помимо основной работы, я пишу в open source, работаю над несколькими проектами — в том числе над дебаггером BugStalker (BS) на Rust. 

В этой статье речь пойдет о разработке дебаггеров. Расскажу, какие технологии лежат в основе любого популярного отладчика и как с их помощью реализуются точки останова или функции step. Особое внимание уделим нюансам отладки Rust-кода и поддержке Rust в дебаггерах.

Если уже решили писать свой отладчик, дочитайте до конца — там будет аналитика, которая поможет не наступить на Rust-грабли.

Читать далее

Как устранить первопричину уязвимостей безопасности памяти

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

Уязвимости безопасности памяти остаются серьёзной угрозой для защиты ПО. Мы, работники Google, считаем, что путь к крупномасштабному устранению этого класса уязвимостей и к защищённому ПО заключается в Safe Coding — подходе secure-by-design, отдающем приоритет переходу на безопасные по памяти языки.

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

Также мы приведём обновлённую статистику того, как благодаря переходу на безопасные по памяти языки, процент уязвимостей безопасности памяти в Android упал за шесть лет с 76% до 24%.
Читать дальше →

Учимся летать: симуляция эволюции на Rust. 2/5

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



Это вторая часть серии статей по разработке симуляции эволюции с помощью нейронной сети и генетического алгоритма.






В этой статье мы заложим основы нашего проекта и реализуем простую FFNN (feedforward neural network — нейронная сеть прямого распространения), которая впоследствии станет мозгом. Мы также рассмотрим множество тонкостей и идиом, которые встречаются в коде Rust, включая тесты.


Готовы? Тогда поехали.

Читать дальше →

Выпуск Rust 1.56.0 и 2021 редакция

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

Команда Rust рада сообщить о новой версии языка — 1.56.0. С этим выпуском также стабилизируется 2021 редакция. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.56.0 вам достаточно выполнить следующую команду:


rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.

Читать дальше →

Выпуск Rust 1.42.0: шаблоны срезов и более удобные сообщения о панике

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

Команда Rust рада сообщить о выпуске новой версии, 1.42.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.42.0 вам достаточно выполнить следующую команду:


rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.


Что вошло в стабильную версию 1.42.0


Основными нововведениями Rust 1.42.0 являются более удобные сообщения о панике в случае вызова unwrap, шаблоны срезов, объявление устаревшим Error::description и многое другое. Смотрите подробности выпуска для дополнительной информации.

Читать дальше →

Rust новости #3 (ноябрь 2018)

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

КДПВ про Rust2018


Предлагаю вашему вниманию субъективную подборку ржавых новостей за ноябрь. В этой подборке: Rust 2018, RustRush, видео с конференций, Amazon Lambda и Firecracker, квизы, переход exonum на actix-web, 10 причин использовать Rust.


Результаты Rust опроса 2018


график из опроса про сложность изучения тем


Опубликованы результаты ежегодного Rust-опроса (обсуждение), который шел с августа.

Читать дальше →

Игрушечный фронтенд для LLVM, написанный на Rust: Руководство для начинающих

Время на прочтение12 мин
Количество просмотров13K
Примечание переводчика
Приведённый в статье код скомпилирован с достаточно старыми версиями крейтов peg и peg_syntax_ext. Для текущих версий в исходники нужно внести минимальные изменения. Я вставил изменённые участки в спойлеры по тексту статьи. Для сборки кода установите компилятор nightly Rust.
Полный исходник с моими правками можно скачать здесь: https://github.com/arktur04/rust-llvm-toy-frontend


В настоящее время я работаю над компилятором, который написан на Rust, и порождает LLVM IR. LLVM API выглядит немного пугающе для новичков, и по нему не так много руководств (и все они на C++, поэтому не вполне очевидно, как сделать то же самое на Rust). Я бы хотел, чтобы кто-то протянул мне руку помощи, когда я начинал всё это, и эта статья является тем, что я хотел бы показать самому себе в то время.



В Rust наилучшая возможность взаимодействия с LLVM — через крейт llvm-sys. Один добрый человек разместил документацию к нему здесь. Конечно, вам следует также изучить руководство по LLVM, так как оно поможет вам понять, как LLVM “думает”. Этот пост, в основном, является переводом на Rust подмножества из этого руководства.

Полный исходный код для этого руководства находится здесь.
Читать дальше →

Вышел Rust 0.10

Время на прочтение1 мин
Количество просмотров20K
image

Rust — компилируемый мультипарадигмальный язык, позиционируется как альтернатива С/С++ с уклоном в параллельные вычисления, безопасность и удобство работы с памятью.

Что нового в Rust 0.10:
Читать дальше →

Какие изменения нужны языку Rust, чтобы писать асинхронный код стало проще

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

Асинхронное программирование — мощный инструмент. Но экосистема Rust продолжает активно развиваться, и пока язык далёк от идеала. В частности, по этой причине многие считают, что асинхронное программирование в Rust — это боль. Однако некоторые не только критикуют, но и предлагают. Среди таких людей автор данной статьи. 

Здесь я расскажу о некоторых ранее предложенных идеях и свяжу их с новыми предложениями. Я проведу некий мысленный эксперимент и постараюсь ответить на вопрос «Что мы могли бы сделать с асинхронным программированием в Rust, если бы нам дали полный карт-бланш?». 

Непродуманное внесение изменений в Rust может разрушить его. Поэтому всё нужно делать аккуратно, учитывая плюсы и минусы. Допускаю, что некоторые предложения могут вызвать негативную реакцию. Я отношусь к этому с пониманием и прошу читателя подойти к изучению этого материала максимально непредвзято.

Потоки vs Асинхронность


Писать асинхронный код зачастую сложнее, чем просто использовать потоки. Но с потоками мы не можем получить выигрыш в производительности, так как они слишком прожорливые. В процессе переключения между разными потоками и обмена данными между ними возникает много накладных расходов. Даже поток, который сидит и ничего не делает, использует ценные системные ресурсы. Чаще всего, асинхронный код работает гораздо быстрее. Но не всегда:

Например, этот echo server написан с использованием потоков. Он работает быстрее своей асинхронной версии — для случая, когда количество одновременных подключений не превышает 100.
Читать дальше →

Закладывая фундамент будущего Rust

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

Rust был задуман в 2010 (в зависимости от того, как вы считаете, можно сказать, что в 2006!) как проект в Mozilla Research, но его долгосрочной целью было создание самостоятельного проекта. В 2015, вместе с выпуском Rust 1.0, появилось управление, независимое от Mozilla. С тех пор Rust работает как автономная организация, а Mozilla выступает в качестве известного и постоянного финансового и юридического спонсора.


Mozilla была и продолжает восторгаться от возможности широкого использования и поддержки языка Rust многими компаниями в отрасли. Сегодня многие компании, как крупные так и малые, используют Rust более разнообразными и значительными способами: от Amazon’s Firecracker до Fastly’s Lucet, в критических службах, которые "снабжают энергией" Discord, Cloudflare, Figma, 1Password и многие, многие другие.


Во вторник, 11 августа 2020 года, Mozilla объявила о реструктуризации компании и увольнении около 250 сотрудников, включая активных участников Rust и Rust сообщества. Понятно, что эти увольнения породили множество путаницы и неуверенности в отношении Rust. Цель этого поста — решить эти проблемы. Также у нас есть важное объявление, о котором сказано дальше!

Читать дальше →

Пишем операционную систему на Rust. Реализация страничной памяти (новый вариант)

Время на прочтение29 мин
Количество просмотров8K
В этой статье разберёмся, как реализовать поддержку страничной памяти в нашем ядре. Сначала изучим различные методы, чтобы фреймы физической таблицы страниц стали доступны ядру, и обсудим их преимущества и недостатки. Затем реализуем функцию преобразования адресов и функцию создания нового сопоставления.

Этот цикл статей опубликован выложен на GitHub. Если у вас какие-то вопросы или проблемы, открывайте там соответствующий тикет. Все исходники для статьи лежат в этой ветке.

Ещё одна статья о страничной организации памяти?
Если вы следите за этим циклом, то видели статью «Страничная память: продвинутый уровень» в конце января. Но меня раскритиковали за рекурсивные таблицы страниц. Поэтому решил переписать статью, применив иной подход для доступа к фреймам.

Читать дальше →

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

QtCreator и его использование в качестве IDE для Rust

Время на прочтение3 мин
Количество просмотров14K
В общем попросил я у коллеги маленький гайд по тому как настроить QtCreator в качестве IDE для Rust и с его разрешения выкладываю. Сам Я использую CLion и позже напишу о том как с ним дела обстоят на этом поприще. Мопед не мой. Я просто разместил объяву. (с)

Что нужно современному программисту в первую очередь? Развитое абстрактное мышление? Сильный бэкграунд в математике? Возможно стрессоустойчивость??

Конечно же нет! Самое главное — хорошая IDE.

image

Если вы тоже, попытавшись осилить Rust, взгрустнули, взглянув на areweideyet
— добро пожаловать под кат.
Читать дальше →

Выпуск Rust 1.26

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

Команда разработчиков Rust рада сообщить о выпуске новой версии Rust: 1.26.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.


Если у вас установлена предыдущая версия Rust с помощью rustup, то для обновления Rust до версии 1.26.0 вам достаточно выполнить:


$ rustup update stable

Если у вас еще не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.26.0 можно ознакомиться на GitHub.


Что вошло в стабильную версию 1.26.0


Последние несколько выпусков имели ряд относительно небольших улучшений. Тем не менее, мы продолжали работу над многими другими вещами и теперь они начинают выходить в стабильной версии. Версия 1.26, возможно, самая богатая нововведениями со времен выпуска Rust 1.0. Давайте их рассмотрим!


Второе издание книги "Язык программирования Rust"


Почти 18 месяцев Кэрол, Стив и другие работали над полной переработкой книги "Язык программирования Rust". С момента написания первой книги мы узнали много нового о том, как люди изучают Rust, так что новая версия книги теперь лучше во всех отношениях.

Читать дальше →

Rust: зачем нужны макросы

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

Как-то я сказал своему коллеге, что в Rust имеются макросы, ему показалось, что это плохо. Раньше у меня была такая же реакция, но Rust показал мне, что макросы не обязательно плохи.


Где и как их уместно применять? Смотрите под катом.

Читать дальше →

Rust: «Небезопасные абстракции»

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

Ключевое слово unsafe является неотъемлемой частью дизайна языка Rust. Для тех кто не знаком с ним: unsafe — это ключевое слово, которое, говоря простым языком, является способом обойти проверку типов (type checking) Rust'а.


Существование ключевого слова unsafe для многих поначалу является неожиданностью.
В самом деле, разве то, что программы не "падают" от ошибок при работе с памятью,
не является особенностью Rust? Если это так, то почему имеется легкий способ обойти
систему типов? Это может показаться дефектом языка.


Но не все так просто, детали — под катом.

Читать дальше →

Выпуск Rust 1.17

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

Команда Rust рада представить выпуск Rust 1.17.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.


Если у вас установлена предыдущая версия Rust, то для обновления достаточно выполнить:


$ rustup update stable

Если у вас ещё не установлен Rust, то вы можете установить rustup c соответствующей страницы нашего веб-сайта и ознакомиться с подробным примечанием к выпуску 1.17.0 на GitHub.


Что вошло в стабильную версию 1.17.0


Выпуск Rust 1.17.0 в основном вносит небольшие улучшения, преимущественно касающиеся удобства использования. Например, время жизни 'static теперь автоматически подразумевается для констант или статических переменных. При создании константы или статической переменной:


Читать дальше →

Архитектура браузерного движка Servo

Время на прочтение8 мин
Количество просмотров12K
От переводчика. Позвольте представить на суд хабрасообщества перевод части документации о браузерном движке Servo. Этот движок разрабатывается сообществом Mozilla на языке Rust, и является, пожалуй, самым большим активным проектом на этом языке. В этом документе рассказывается об архитектуре движка, как разработчики используют Rust совместно с C++ и с какими трудностями они столкнулись при разработке. Оригинал доступен в wiki проекта на github.

Это очень поверхностный обзор архитектуры Servo. Servo остаётся прототипом, и некоторые части архитектуры ещё не представлены в виде кода. Некоторые важные аспекты системы ещё не были подробно рассмотрены.

Обзор и цели



Читать дальше →

Rust на примерах. Часть 1

Время на прочтение7 мин
Количество просмотров54K
Этот цикл статей является вольным переводом книги «Rust by Example», которую пишет Хорхе Апарисио на Github.

На момент написания этого топика автор книги создал 49 глав, в первой части будет перевод первых пяти. Убедитесь, что Rust установлен и под рукой имеется документация.

Давайте начинать!
Читать дальше →