The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Google переписал на языке Rust прошивку pvmfm, используемую в Android, opennews (??), 10-Окт-23, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


18. "Google переписал на языке Rust прошивку pvmfm, используемую ..."  –2 +/
Сообщение от Аноним (18), 10-Окт-23, 12:05 
Сейчас даже println! не могут нормально реализовать в макросах, так и пишет коментарием, что встроено глубоко в компилятор.
Ответить | Правка | Наверх | Cообщить модератору

37. "Google переписал на языке Rust прошивку pvmfm, используемую ..."  +5 +/
Сообщение от morphe (?), 10-Окт-23, 12:25 
println можно макросами реализовать, format тоже, и вообще все такие макросы, что не должны возвращать значение зависимое от borrowed данных. Смотри все крейты для логгирования в Rust, они же представляют свои альтернативы println.

А вот format_args в текущем виде действительно полагается на магию, поскольку у него скоуп заимствования шире чем возвращаемое значение, условно

let a = format_args!(...);

Должен раскрываться в

let _a = data_for_format(...);
let a = args(&data);

Однако если ты делаешь свой макрос, то тебе не обязательно пытаться повторить поведение format_args, поскольку если твой макрос будет сам переменную объявлять:

my_format_args!(a, ...);

То он сможет семартику полностью повторить, пускай и с чуть другим синтаксисом.

Ответить | Правка | Наверх | Cообщить модератору

232. "Google переписал на языке Rust прошивку pvmfm, используемую ..."  +/
Сообщение от morphe (?), 10-Окт-23, 22:32 
В простых случаях его даже сейчас можно перевести на процедурный макрос:
    let a = 1;
    let b = 2;
    let c = a + b;
    format_args!("{a} + {b} = {c}")
Раскрывается в
        let a = 1;
        let b = 2;
        let c = a + b;
        Arguments::new_v1(&["", " + ", " = "],
            &[Argument::new_display(&a),
                        Argument::new_display(&b),
                        Argument::new_display(&c)])
Где new_v1, new_display - обычные функции, без магии:
  new_v1: https://doc.rust-lang.org/src/core/fmt/mod.rs.html#307
  new_display: https://doc.rust-lang.org/src/core/fmt/rt.rs.html#82-98
Ответить | Правка | Наверх | Cообщить модератору

201. "Google переписал на языке Rust прошивку pvmfm, используемую ..."  +1 +/
Сообщение от Анонем (?), 10-Окт-23, 20:02 
Это факт. Непонятно почему коммент минусят? В исходниках println реально есть комментарий, что это магия компилятора.
Ответить | Правка | К родителю #18 | Наверх | Cообщить модератору

209. "Google переписал на языке Rust прошивку pvmfm, используемую ..."  +1 +/
Сообщение от Fyjy (?), 10-Окт-23, 20:12 
Вот комментарии и код макроса println
  https://doc.rust-lang.org/src/std/macros.rs.html#85
с 85 по 139 строку.
Ты не мог бы подсказать, где именно этот самый комментарий?
Ответить | Правка | Наверх | Cообщить модератору

221. "Google переписал на языке Rust прошивку pvmfm, используемую ..."  +/
Сообщение от Додо (?), 10-Окт-23, 21:00 
Наверное, здесь?
https://doc.rust-lang.org/src/core/macros/mod.rs.html#904-907
/* compiler built-in */
Ответить | Правка | Наверх | Cообщить модератору

228. "Google переписал на языке Rust прошивку pvmfm, используемую ..."  +1 +/
Сообщение от morphe (?), 10-Окт-23, 22:23 
> Наверное, здесь?
> https://doc.rust-lang.org/src/core/macros/mod.rs.html#904-907
> /* compiler built-in */

То, что оно реализованно как compiler built-in, не означает что оно не может быть реализовано процедурным макросом.
Многие интринзики компиляторов GCC/Clang же тоже можно реализовать напрямую через asm вставки, но это не сделано по разным причинам.

format_args же так реализован потому что с таким синтаксисом, который у него есть, его не получится реализовать, можно только если он сам будет объявлять переменную со структурой Arguments: https://www.opennet.ru/openforum/vsluhforumID3/131737.html#37.
Однако даже когда вопросы с этим разрешат (По идее это часть https://github.com/rust-lang/rust/issues/54727), не факт что стандартную реализацию переведут, поскольку специальная обработка компилятором позволяет также сильно сократить время компиляции, которое у Rust и так не маленькое.

А format_args! много где используется. format!, println!, writeln! и прочее в стандартной библиотеке (Они реализованы как обычные макросы использующие format_args!, а не как built-in), и вся экосистема для логов (Крейты tracing, log) также его используют.

Ответить | Правка | Наверх | Cообщить модератору

237. "Google переписал на языке Rust прошивку pvmfm, используемую ..."  +/
Сообщение от Додо (?), 11-Окт-23, 00:56 
Просили подтверждение, что этот макрос работает на магии (вместо конкретных исходников на самом Rust) - получите. Я ж не отрицаю, что аналогичный функционал можно реализовать средствами самого языка.
Тут вопрос должен быть скорее другой: зачем это сделано именно так, а не иначе?
А фишка в том, что format_args раскрывается на этапе компиляции, а не выполнения, в отличие от других языков. Благодаря этому достигается бо́льшая скорость выполнения кода (не нужно тратить время на разбор шаблона при каждом вызове printf), но недостатком является невозможность использовать произвольный шаблон из переменной (для этого уже нужно разбирать шаблон вручную).
Ответить | Правка | Наверх | Cообщить модератору

238. "Google переписал на языке Rust прошивку pvmfm, используемую ..."  +1 +/
Сообщение от morphe (?), 11-Окт-23, 01:16 
> А фишка в том, что format_args раскрывается на этапе компиляции, а не
> выполнения, в отличие от других языков.

Это да, но это не причина по которой он является built-in. В Rust есть процедурные макросы, которые позволяют реализовать точно такой же функционал, т.е на этапе компиляции генерировать код не по шаблону, те же #[derive(...)] являются процедурными макросами.
И format_args с чуть изменённым синтаксисом можно было бы сделать тоже процедурным макросом.

Вот например есть крейт ufmt, реализующий форматирование с намного меньшим количеством кода (Это полезно для embedded): https://docs.rs/ufmt/latest/ufmt/macro.uwriteln.html
И это как раз аналог writeln!(), но реализованный не через built-in format_args!, а как процедурный макрос.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру