Дзеркало для Rust: звіт про відображення під час компіляції

Дзеркальна скляна куля сидить на корені дерева, сфотографована догори ногами щоб відображення всередині скляної кулі виглядало правою стороною вгору. Відображення показує небо та дерева навколо лісистої місцевості.

З потужною системою ознак, константами часу компіляції та обмеженнями типу where-and-:-style для типів і констант підхід Rust до загальних функцій був оновлюючою зміною порівняно з будь-якою іншою системою моделей Дикого Дикого Заходу. помилки під час виклику з C++. Крім того, його система макросів була вкрай необхідною заміною для слабкої системи макросів C, дозволяючи користувачам послідовно та надійно генерувати код під час компіляції, дедалі потужніші процедурні макроси ("макроси proc"). ”) піклуються про деякі з важчі завдання розширення мови. Але…

Як і C, Rust, можливо, занадто багато покладається на макроси (proc) і методи генерації коду, щоб уникнути усунення щирих недоліків у мові, створюючи набагато більший час компіляції під час попереднього завантаження на невідповідних етапах компіляції, щоб компенсувати відсутність мови і функції бібліотеки. З цією метою ми розпочали роботу над специфікацією, формалізацією та потенційною інтеграцією (яка може бути не повністю завершена в рамках цієї роботи) набору базових мовних примітивів, які ми називаємо introwospection, які ми сподіваємось зробити доступними під модулі core::introwospection і std::introwospection у Rust.

Ця стаття може витратити непристойну кількість часу на міркування, осмислення, критику, порівняння, проповідування та прагнення до тієї чи іншої функції, функції, ідіоми чи здібності.

Як загальна відмова від відповідальності, хоча ми розмовляли з багатьма людьми в конкретних місцях про те, як досягти того, про що ми тут напишемо та повідомимо, слід чітко зазначити, що «Жодна особа, згадана тут, не має жодної зареєстрованої посади підтримки для цієї роботи . Якими б не були наведені нижче заяви, важливо визнати, що ми маємо на увазі одну й лише одну мету для цього проекту, і що ця мета була розроблена виключно згідно з нашими власними ідеалами та зусиллями – ідеалами Shepherd Oasis. Наші думки належать нам і не відображають будь-яку іншу юридичну особу, особу, проект та/або організацію, згадану в цьому звіті.

Однією з найважливіших речей, яку Shepherd's Oasis хоче ввімкнути, є безмежно цінний і масштабований код. Наприклад, у головному ящику серіалізації, представленому в екосистемі Rust, serde, ми хочемо дозволити коду від Девіда Толнея (або одного з 159/майбутніх учасників), щоб мати змогу впоратися з цим:

0 struct Item { 1x: i32, 2 роки: i32, 3} 4 5 fn main() { 6 let point = Point { x: 1, y: 2 }; 7 8 // Перетворення точки на рядок JSON. 9 // все ще працює. 10 let serialized = serde_json::to_string(&point).unwrap(); 11 12 // Серіалізовані покази = {"x":1,"y":2} 13 println!("serialized = {}", serialized); 14}

Це флагманський приклад serde, але з деякими дуже важливими змінами. Наведений вище код не вимагає:

#[вивести(…)]; impl Серіалізація для точки { … }; і жодних ідіом build.rs, "newtype" чи інших махінацій для створення коду чи реалізації інтерфейсів.

Для цього ми хочемо, щоб serde міг написати щось подібне до загального коду (нескомпільованого, з використанням нереалізованого синтаксису, не ретельно перевіреного) трохи нижче як базову реалізацію для Serialize, його характерної риси серіалізації для будь-якого задана структура або перерахування:

0 використовуйте std::introspection::*; 1 використання serde::ser::{ 2 Серіалізація, Серіалізатор, 3 SerializeTupleStruct, SerializeStruct, 4 SerializeTupleVariant, SerializeStructVariant, 5 Помилка 6}; 7 8 Структура DefaultSerializeVisitor 9 де 10 S: серіалізатор, 11 T: Серіалізувати +? розмірний 12 { 13 серіалізатор: &mut S, 14 значення: &T, 15} 16 17 pub trait Serialize { 18 fn serialize( 19 &self, серіалізатор: 20S, значення: &T 21 ) -> Результат ...

Дзеркало для Rust: звіт про відображення під час компіляції
Дзеркальна скляна куля сидить на корені дерева, сфотографована догори ногами щоб відображення всередині скляної кулі виглядало правою стороною вгору. Відображення показує небо та дерева навколо лісистої місцевості.

З потужною системою ознак, константами часу компіляції та обмеженнями типу where-and-:-style для типів і констант підхід Rust до загальних функцій був оновлюючою зміною порівняно з будь-якою іншою системою моделей Дикого Дикого Заходу. помилки під час виклику з C++. Крім того, його система макросів була вкрай необхідною заміною для слабкої системи макросів C, дозволяючи користувачам послідовно та надійно генерувати код під час компіляції, дедалі потужніші процедурні макроси ("макроси proc"). ”) піклуються про деякі з важчі завдання розширення мови. Але…

Як і C, Rust, можливо, занадто багато покладається на макроси (proc) і методи генерації коду, щоб уникнути усунення щирих недоліків у мові, створюючи набагато більший час компіляції під час попереднього завантаження на невідповідних етапах компіляції, щоб компенсувати відсутність мови і функції бібліотеки. З цією метою ми розпочали роботу над специфікацією, формалізацією та потенційною інтеграцією (яка може бути не повністю завершена в рамках цієї роботи) набору базових мовних примітивів, які ми називаємо introwospection, які ми сподіваємось зробити доступними під модулі core::introwospection і std::introwospection у Rust.

Ця стаття може витратити непристойну кількість часу на міркування, осмислення, критику, порівняння, проповідування та прагнення до тієї чи іншої функції, функції, ідіоми чи здібності.

Як загальна відмова від відповідальності, хоча ми розмовляли з багатьма людьми в конкретних місцях про те, як досягти того, про що ми тут напишемо та повідомимо, слід чітко зазначити, що «Жодна особа, згадана тут, не має жодної зареєстрованої посади підтримки для цієї роботи . Якими б не були наведені нижче заяви, важливо визнати, що ми маємо на увазі одну й лише одну мету для цього проекту, і що ця мета була розроблена виключно згідно з нашими власними ідеалами та зусиллями – ідеалами Shepherd Oasis. Наші думки належать нам і не відображають будь-яку іншу юридичну особу, особу, проект та/або організацію, згадану в цьому звіті.

Однією з найважливіших речей, яку Shepherd's Oasis хоче ввімкнути, є безмежно цінний і масштабований код. Наприклад, у головному ящику серіалізації, представленому в екосистемі Rust, serde, ми хочемо дозволити коду від Девіда Толнея (або одного з 159/майбутніх учасників), щоб мати змогу впоратися з цим:

0 struct Item { 1x: i32, 2 роки: i32, 3} 4 5 fn main() { 6 let point = Point { x: 1, y: 2 }; 7 8 // Перетворення точки на рядок JSON. 9 // все ще працює. 10 let serialized = serde_json::to_string(&point).unwrap(); 11 12 // Серіалізовані покази = {"x":1,"y":2} 13 println!("serialized = {}", serialized); 14}

Це флагманський приклад serde, але з деякими дуже важливими змінами. Наведений вище код не вимагає:

#[вивести(…)]; impl Серіалізація для точки { … }; і жодних ідіом build.rs, "newtype" чи інших махінацій для створення коду чи реалізації інтерфейсів.

Для цього ми хочемо, щоб serde міг написати щось подібне до загального коду (нескомпільованого, з використанням нереалізованого синтаксису, не ретельно перевіреного) трохи нижче як базову реалізацію для Serialize, його характерної риси серіалізації для будь-якого задана структура або перерахування:

0 використовуйте std::introspection::*; 1 використання serde::ser::{ 2 Серіалізація, Серіалізатор, 3 SerializeTupleStruct, SerializeStruct, 4 SerializeTupleVariant, SerializeStructVariant, 5 Помилка 6}; 7 8 Структура DefaultSerializeVisitor 9 де 10 S: серіалізатор, 11 T: Серіалізувати +? розмірний 12 { 13 серіалізатор: &mut S, 14 значення: &T, 15} 16 17 pub trait Serialize { 18 fn serialize( 19 &self, серіалізатор: 20S, значення: &T 21 ) -> Результат ...

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow