This repository has been archived on 2025-08-04. You can view files and clone it, but cannot push or open issues or pull requests.
rhaj/_archive/rhai_engine/rhaibook/patterns/serialize-ast.md
2025-04-04 08:28:07 +02:00

87 lines
2.0 KiB
Markdown

Serialize an AST
================
{{#include ../links.md}}
In many situations, it is tempting to _serialize_ an [`AST`], so that it can be loaded and recreated
later on.
In Rhai, there is usually little reason to do so.
```admonish failure.small "Don't Do This"
Serialize the [`AST`] into some format for storage.
```
```admonish success.small "Do This"
Store a copy of the original script, preferably compressed.
```
Storing the original script text, preferably compressed (via `gzip` etc.) usually yields much smaller data size.
Plus, is it possibly faster to recompile the original script than to recreate the [`AST`] via
deserialization.
That is because the deserialization processing is essentially a form of parsing, in this case
parsing the serialized data into an [`AST`] – an equivalent process to what Rhai does, which
is parsing the script text into the same [`AST`].
Illustration
------------
The following script occupies only 42 bytes, possibly less if compressed.
That is only slightly more than 5 words on a 64-bit CPU!
```rust
fn sum(x, y) { x + y }
print(sum(42, 1));
```
The [`AST`] would be _much_ more complicated and looks something like this:
```json
FnDef {
Name: "sum",
ThisType: None,
Parameters: [
"x",
"y"
],
Body: Block [
Return {
Expression {
FnCall {
Name: "+",
Arguments: [
Variable "x",
Variable "y"
]
}
}
}
]
}
Block [
FnCall {
Name: "print",
Arguments: [
Expression {
FnCall {
Name: "sum",
Arguments: [
Constant 42,
Constant 1
]
}
}
]
}
]
```
which would take _much_ more space to serialize.
For instance, the constant 1 alone would take up 8 bytes, while the script text takes up only one byte!